OpenSSHの概要を知る

what

[hoge@fuga ~]$ ssh baz@xxx.xxx.xxx.xxx
Permission denied (publickey).
[hoge@fuga ~]$ 

Permission denied (publickey). って何?


ってことで、OpenSSHについて知らなすぎるので知る。


勉強材料

書籍「入門OpenSSH」にお世話になりました。
Amazon CAPTCHA


OpenSSHでユーザーがログインするまでの流れ

一般ユーザーがクライアントを用いてサーバーにログインを試みると、クライアントとサーバーデーモンのあいだで2種類の確認作業(認証)が行われます:

 1.そのサーバが本当に「ユーザのログインしたいサーバ」であるかどうかを確認する、ホスト認証。
 2.そのユーザがサーバにログインする資格があるかどうかを確認する、ユーザ認証。

ホスト認証の仕組み

クライアントはサーバに接続した瞬間に、まず暗号化された通信を介してそのサーバのホスト鍵(host key)を確認し、それが本当に自分のログインしたいサーバであるかどうかを確かめます。ホスト鍵はホスト公開鍵とホスト秘密鍵に分かれており、クライアント上には通常known_hostsと呼ばれるファイルがあり、ここには特定のIPアドレス(とホスト名)を持つサーバのホスト公開鍵が登録されています。ホスト秘密鍵はサーバマシン内のディスクに格納されており、ネットワーク上に持ち出されることはありません。クライアントは、まずこのknown_hostsファイル内に登録されているホスト公開鍵と、サーバから送られてくるホスト公開鍵を照合し、サーバが実際にこのホスト公開鍵に対応するホスト秘密鍵を持っているかどうか確認します。この確認には公開鍵暗号技術が使われており、サーバは実際のホスト秘密鍵をネットワーク上に送信することなく、ホスト秘密鍵の所有をクライアント側に証明できるようになっています。

known_hosts ファイルはユーザごとにもっています。

/root/.ssh/known_hosts
/home/hoge_user/.ssh/known_hosts

上記のような感じです。


ホスト認証は通常(最初の1回目を除いて)クライアントによって自動的に行われます。ホスト認証を行うためには、クライアントはログインする先のホスト公開鍵をあらかじめ知っておく必要があります。ところが、あるホストにはじめてログインする場合、そのホスト公開鍵はまだknown_hostsファイルには登録されていません。
そのため、クライアントはサーバが送ってきたホスト公開鍵の指紋(fingerprint)をユーザに提示し、これが本当にユーザの接続したいサーバのものであるかどうか確認を求めるのです。一般にあるデータの「指紋」とは、そのデータの特徴をあらわすように作られた短い文字列や数値のことをさします。もしホスト公開鍵が何者かによって改ざんされていればその指紋は違った値になるはずなので、改ざんが判明します。なおOpenSSHで「鍵の指紋」という場合、それはすべて公開鍵の指紋を意味します。
結論から言うと、ユーザがこの質問に答えるためにはネットワーク以外の通信方法をつかわなければなりません。セキュリティについて本当に心配している場合は、本来このときサーバ側の管理者に(電話などで)問い合わせて、この指紋で正しいかどうかを確認する必要があります。

ユーザー認証の仕組み

クライアントが正しいサーバを確認したら、つぎはサーバの方が正しいユーザかどうかを確認する番です。これをユーザ認証といいます。OpenSSHのユーザ認証には大きくわけて2つの方法があります:

 1.ユーザがあらかじめ登録したパスワードを使った認証(パスワード認証)
 2.ユーザがあらかじめ登録した秘密鍵・公開鍵ペアを使った認証(公開鍵認証)

 どちらもユーザが特定の(そのユーザにしか知りえない)情報を持っているかどうかを確認することによって、そのユーザにログインする資格があるかどうかを判断しています。なお、OpenSSHここで挙げたパスワード認証と公開鍵認証のほかに、Hostbased認証と呼ばれるユーザ認証の方式がサポートされています。


 OpenSSHでは上の2つの認証方法に加えて「認証エージェント(authentication agent)」によるユーザ認証をサポートしています。認証エージェントとはユーザにかわって認証を行ってくれるプログラムのことで、これはOpenSSHクライアントと通信して公開鍵認証を行います。この際、クライアントは認証エージェントとサーバの間で暗号化された通信を自動的に中継します。

sshdを安全に設定する

 sshdサーバデーモンは、起動時にOpenSSH設定ファイル用のディレクトリにあるsshd_configファイルを読み込みます。通常このファイルのパーミッションはrootだけが読み込み、および変更できるように設定されています。
 このファイルはテキスト形式で、各行にひとつの設定項目が書かれています。

設定ファイルの文法をチェックする

# /絶対パス名/sshd [-d] -t

(-d オプションを指定するとデバック出力を表示します)


システム全体でパスワード認証を禁止する

 システム全体でパスワード認証を禁止するには、sshd_config設定ファイルのPasswordAuthentication設定項目にnoを指定します。また、PAMが使用可能になっている場合はPAMのチャレンジ・レスポンス認証がパスワード認証と同じ機能を持っているため、challengeResponseAuthenticationにもnoを指定して禁止する必要があります。

特定のユーザのログインを禁止する

 OpenSSHのデフォルト設定では、sshdはすべてのユーザをログインさせるようになっています。しかし、サーバにログインするユーザや、そのユーザの所属するグループがあらかじめわかっている場合には、ログインできるユーザやグループを制限しておくことをおすすめします。これによってパスワード推測攻撃による被害を最小限におさえることができるからです。
 sshd_config設定ファイルのAllowUsers, DenyUsers, AllowGroups, DenyGroupsの各種設定項目を使えば、特定のユーザやグループのログインを禁止したり、あるいは特定のユーザやグループだけをログインさせることができます。

特定のユーザ・グループのログインを禁止する
DenyUsers [ユーザ名1] [ユーザ名2] ...
DenyGroups [グループ名1] [グループ名2] ...
特定のユーザ・グループのログインのみを許可する
AllowUsers [ユーザ名1] [ユーザ名2] ...
AllowGroups [グループ名1] [グループ名2] ...

 AllowUsersやAllowGroupsは、そのユーザ(あるいはそのユーザが所属するグループ)だけがログインできることを意味します。したがって、AllowUsersやAllowGroups設定項目を指定した場合、ここに載っていないユーザやグループは必ずログインが禁止されます。
 また、これらの設定項目では、つねに「禁止」が「許可」よりも優先します。
 なお、OpenSSHではrootだけは特別扱いしており、たとえrootをAllowUsersやAllowGroupsで許可していても、次項で説明する PermitRootLogin設定項目の値によってはrootログインが禁止されます。

Rootのログインを禁止する

 OpenSSHでは、いくつかの条件を設定しながら、リモートホストからのrootログインを禁止あるいは許可することができます。この条件は sshd_config 設定ファイル PermitRootLogin 設定項目によって指定できます。

※いっさいのrootログインを禁止する

PermitRootLogin no
強制的コマンドを実行するときのみrootログインを許可する
PermitRootLogin forced-commands-only
rootログインを許可する

公開鍵認証のみを許可する場合

PermitRootLogin without-password

公開鍵認証・パスワード認証ともに許可する場合

PermitRootLogin yes

システム全体で特定のホストからのみログインを許可する

 tcp_wrappersをサポートするようにコンパイルされたOpenSSHでは、システム全体でログインを許可するクライアントを特定のホストに限定することができます。tcp_wrappers をサポートする OpenSSH はクライアントの接続時に /etc/hosts.allow ファイルと /etc/hosts.deny ファイルを検査し、接続が許可されていないホストであることが分かればただちに通信を遮断します。


IPアドレスやホスト名による制限の有効性はそれほど高くありません。攻撃の危険性を引き下げることはできますが、攻撃者はIPアドレスDNSを詐称することで、依然としてここで説明する制限を回避することができてしまうのです。


sshd_config 設定ファイルのAllowUsersやDenyUsers設定項目の場合とは逆に、これらのファイルでは「許可」が「禁止」よりも優先されることに注意してください。

基礎知識はこの辺にして、エラーを対処してみる

[hoge@fuga ~]$ ssh baz@xxx.xxx.xxx.xxx
Permission denied (publickey).
[hoge@fuga ~]$ 

「Permission denied (publickey). 」でググってみる。



http://lunatear.net/archives/000300.html
を発見。

>publickey接続だったのでpublickeyファイル(~/.ssh/id_rsa)のパーミッションがおかしいのかと思ったらちゃんと600になってるし

publickey接続??

publickey接続とは

http://www.nabe.bne.jp/linux/ssh.html

ようるすに、公開鍵認証でやってくれってことですね。



まとめ

とりあえず、今回は、OpenSSHの簡単な概要を知ることが目的なので、公開鍵認証を使ったログインはまた別途。