Service

sshdの確認しておくべき設定項目

セキュアな認証のためにsshdを動かすので、ここで設定に問題があると致命的なセキュリティ問題になります。sshdの設定ファイルは/etc/ssh/sshd_configです。

Protocol
デフォルトは2,1です。バージョン2優先ですが、1も許可しています。どうしてもバージョン1を許可しなければならない状況でない限り、Protocol 2を指定して2だけにしてしまいましょう。
PermitRootLogin
rootログインの許可オプションですが、デフォルトだとyesです。外部から直接rootでログインする必要など無くすべきで、noを指定しておきましょう。
PasswordAuthentication
パスワード認証の許可オプションで、デフォルトでyesです。全てのユーザに公開鍵認証を適用する場合はパスワード認証をnoにすると良いでしょう。
PermitEmptyPasswords
パスワード無しを許可するオプションで、デフォルトでnoです。何らかのセキュリティを確保しない限り許可してはいけません。

sshの便利な設定

SSHクライアントの設定ファイルは、システムレベルで/etc/ssh/ssh_configに、ユーザレベルで~/.ssh/configです。サーバが許可している項目でもクライアント側で許可してなければ利用できません。

Host [ホスト名]
次にHostが来るまでの設定項目を一致したホストに限定します。sshやscpで入力するホスト名と一致する必要があり、?や*のワイルドカードが使えます。Host *とすればグローバル設定となります。

以下はグローバルHost *に設定すると良いでしょう。

ForwardX11 yes(デフォルト:no)
X11転送を行う設定です。おそらく初期設定でyesにされているかもしれません。これが設定されればssh接続の際に-Xを付ける必要がありません。
TCPKeepAlive yes(デフォルト:yes)
ssh接続が自動切断されないように、KeepAliveメッセージを送信します。ただ、最近のルータでは無視されてしまうことがあります。
ServerAliveInterval 20(デフォルト:0)
サーバに暗号化通信路を利用して、生存確認メッセージを送る間隔です。0であればメッセージを送りません。SSH2でのみ有効で一定間隔でパケットが流れるため自動切断対策にも有効です。
ServerAliveCountMax 5(デフォルト:3)
ServerAliveIntervalが設定されている場合に、SSH通信が切断されと判断するまでの失敗回数です。よってサーバが応答しなくなってから、ServerAliveInterval×ServerAliveCountMaxの時間が経過すると切断されたと判断されます。
Protocol 2(デフォルト:2,1)
SSHのバージョンを指定します。2のみに強制してしまった方がより安全です。

以下は特定のホスト名に対して利用すると良いでしょう。

HostName [ホスト名]
実際のホスト名を指定します。Hostに省略となるエイリアスを設定することになります。
User [ユーザ名]
リモートのユーザ名が違う場合にをユーザ名を指定します。Hostと併用します。
ForwardX11Trusted yes(デフォルト:no)
X転送が信頼されたものとし、リモートプロセスからローカルのXへ完全なアクセスが提供されます。リモートにX転送にアクセス出来てしまうようなユーザが居る場合、ローカルのXにアクセスされてしまう危険があります。

例えば以下の様にHost設定を並べる事になります。

Host web
        HostName www.hogehoge.too.long.*****.jp
        User webadmin
Host ftp
        HostName ftp.hogehoge.too.long.*****.jp
        User ...

公開鍵認証

あなたが普段利用しているのはパスワード認証でしょうか?もしそうなら、少しでも強固な認証方式を採用してみませんか?

鍵を作成するのはどのコンピュータであっても構いませんが、基本的にはクライアントで公開鍵/秘密鍵を生成して、サーバへ公開鍵を送付します。クライアントにはアルゴリズムにつきひとつの公開鍵/秘密鍵があればよく、公開鍵はどの様に(メール添付やftpでもOK)配布しても構いません。逆に秘密鍵は秘匿しておかなければなりません。

鍵を生成するツールは、ssh-keygenです。鍵の種類にはSSH1のRSA1とSSH2のRSA/DSAがあり、デフォルトではSSH2のRSAが生成されます。DSAを利用する場合は-t ”dsa”を指定します。またコメントに-C "ユーザ名など"(デフォルトではユーザ名@コンピュータ名.ドメイン名)を指定して、サーバで登録する際に分かりやすくしておきます。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/weise/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/weise/.ssh/id_rsa.
Your public key has been saved in /home/weise/.ssh/id_rsa.pub.
The key fingerprint is:
34:13:d9:bb:9a:31:f3:f8:52:e4:f9:a3:b9:ae:2a:dc weise@*****.localdomain

秘密鍵のパスフレーズを入力した場合は、万が一に秘密鍵が漏洩した場合でもパスフレーズ認証によってセキュリティが確保されます。デフォルトで生成されるファイル名は以下の通りです。

種類(-tオプション)秘密鍵公開鍵
rsa~/.ssh/id_rsa~/.ssh/id_rsa.pub
dsa~/.ssh/id_dsa~/.ssh/id_dsa.pub
rsa1(SSH1用)~/.ssh/identity~/.ssh/identity.pub

サーバが(公開鍵認証では無く)パスワード認証も許可していれば、この段階でscpで送信できます。でなければメールやUSBメモリなどを駆使してください。ここでサーバ側の~/.sshにid_rsa.pubがあるかもしれませんが、これはサーバ側コンピュータの公開鍵なので間違って上書きしないように注意してください。

$ scp ~/.ssh/id_rsa.pub [user@]host:

ここから、サーバ側での作業です。生成した公開鍵はサーバ側のログインするユーザの~/.ssh/authorized_keysに追加します。

$ cat id_rsa.pub >> ~/.ssh/authorized_keys

公開鍵となるauthorized_keysファイルは644に、またホームディレクトリは755以下、秘密鍵は600以下でないといけません。つまり認証にかかわるファイルが他のユーザから変更されないかどうかsshサーバが確認しています。

$ chmod 644 ~/.ssh/authorized_keys

sshdサーバで公開鍵認証を許可しているか確認しておきましょう。SSH1であればRSAAuthenticationを、SSH2ではPubkeyAuthenticationをyesにします。どちらもデフォルトでyesなので、拒否していなければ問題ありません。そのほかAuthorizedKeysFileオプションで、公開鍵ファイルへのパスを任意指定することができます。

全ての認証を公開鍵認証に切り替えるとPasswordAuthenticationをnoにすることができ、秘密鍵が無い状態でログインしようとすると以下の様に拒否されます。

Permission denied (publickey,gssapi-with-mic).

秘密鍵を配布する場合

クライアント側となるユーザがいる場合で、ユーザに公開鍵/秘密鍵を生成する知識が無い場合やクライアントにssh-keygenが無い場合に生成してあげる必要がでてきます。

鍵を生成するときに鍵ファイル名を指定します。~/.sshに置かれるid_rsaなどのファイルは、そのサーバ側コンピュータでのユーザがSSHクライアントとなる場合のために用意されるものです。-C "ユーザ名"も指定しておくとauthorized_keysファイルが見易くなります。

Enter file in which to save the key (/home/weise/.ssh/id_rsa): id_rsa_user

ファイル名を相対パス指定すると、ssh-keygenを実行したディレクトリに置かれます。

$ ls -la id_rsa_user*
-rw------- 1 weise weise 1675 11月 17 22:47 id_rsa_user
-rw-r--r-- 1 weise weise  404 11月 17 22:47 id_rsa_user.pub

公開鍵は上記と同様にauthorized_keysファイルに追加します。

また秘密鍵をクライアントに配布しなければなりません。SSH認証でクライアントに接続できるなら、scpでコピーしても構わないでしょう。ですがメール添付をしてはいけません。他にもftpやhttpなどの暗号化されてない経路で秘密鍵を送信しては、秘密鍵が秘匿できません。USBメモリやフロッピーなどを駆使してください。

鍵ペアが複数になった場合

鍵をサーバ管理者に生成してもらった場合など、鍵ペアが複数になって秘密鍵も複数になり、~/.ssh/id_rsaファイルなどを管理しなければなりません。デフォルトでは~/.ssh/id_rsaですが、必要に応じてファイル名を変えて、SSHクライアントで随時秘密鍵を指定します。

saver1にはデフォルトの鍵で接続

$ ssh saver1.*****.jp

saver2には専用鍵で接続

$ ssh saver2.*****.jp -i ~/.ssh/id_rsa_user

秘密鍵パスフレーズの変更

公開鍵認証におけるパスフレーズは、直接サーバへの認証に使われるものではありません。秘密鍵を復号化する際にキーとなるものです。公開鍵を変更しなくても秘密鍵のパスフレーズを変更する事が出来ます。

ssh-keygenで、パスフレーズ変更オプション-pと秘密鍵ファイルを-fで指定します。

$ ssh-keygen -p -f ~/.ssh/id_rsa
Enter old passphrase:
Key has comment '/home/weise/.ssh/id_rsa'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

もし秘密鍵が漏洩した場合は、パスフレーズの変更だけでは意味がありません。古いものを破棄して、新たな公開鍵/秘密鍵ペアを作成する必要があります。

ssh-agentの注意

デフォルトのままGnomeを利用していれば、gnome-sessionはssh-agentを起動している事でしょう。

/usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients

これはSSH認証をssh-agentが起動してから終了するまで、認証を記憶しておくアプリケーションです。ssh-addコマンドで秘密鍵を追加しパスフレーズを入力します。ファイル名を省くとデフォルトのファイルを扱います。

$ ssh-add ~/.ssh/id_rsa

公開鍵認証の場合は一度パスフレーズを入力して認証成功すると、ssh-agentは復号化された秘密鍵を保持します。ssh-agentを終了するまでパスフレーズの入力が不要になります。自宅であれば良いかもしれませんが、オフィスなどでPCから席を立つ場合に、誰かが勝手にパスフレーズ無しでリモートサーバにログインされてしまうかもしれません。

ssh-agentの便利性と危険性を理解した上で、席を立つときに必ずgnome-screensaverの機能などでシステムをロックします。その習慣が出来なければ、ssh-agentを起動させないようにしてしまうべきでしょう。