前回は、管理者が利用するアカウントの設定を行った。今回は、sshd の設定を行う。UNIX 系のホスティングサービスを管理する方法として用意されているのは、以下の方法の組み合わせが多い。
- root 権限を持ち完全に自由
- ftp でファイル転送ができる
- システム管理用の GUI を利用する
今回は「root 権限を持ち完全に自由」なホスティングサービスを選んでいるので、管理方法は自由だ。リモートログインして管理する場合方法は TELNET や SSH、ファイルを転送する方法は FTP や rsync、SSH、GUI の管理ツールを利用したいのであればWebminを利用すればよい。Webmin は高機能で GUI で操作できるので便利なのだが、システムを完全に制御したいこのでリモートログインして管理する。セキュリティを考慮すると TELNET は不安なので、通信が暗号化され認証に公開鍵暗号を利用できる SSH を選択した。
対象
内部用サーバー
外部用サーバー
OS
CentOS release 5.10
SSH の要件
SSH 経由で不正にログインされると、システム全体を制圧されてしまう可能性が高い。セキュリティを考慮して、以下の要件を満たすように設定を行う。
- root によるログインを拒否する
- パスワード認証を拒否する
- プロトコルバージョン2を利用する
- 待ち受けポートを変更する
SSH は、パスワード認証、公開鍵認証、ワンタイムパスワードなど、いろいろな認証方法を用意している。パスワード認証は特に設定も必要もなく、ほとんどのクライアントが対応しているので便利だが、総当たり攻撃に弱い。総当たり攻撃に強く、設定が容易な公開鍵認証を利用する。
プロトコルバージョンは1と2があるが、1は脆弱性が発見されているため2に限定する。待ち受けポートの変更は、セキュリティの向上に大きく寄与するものではないが、スクリプトキディによる不正ログインの試みを避けるぐらいの意味がある。
SSH クライアント
管理者の端末が、UNIX 系の OS(Mac OSX を含む)であれば、ssh のクライアントは標準で用意されているだろう。Windows を利用している場合は、クライアント用アプリケーションPuTTYや、FileZilla、WinSCPなどを利用する必要がある。PuTTY を利用する人は多いと思うので、PuTTY の設定方法についても触れる。
認証用の鍵の生成
サーバー側の設定
公開鍵認証を利用するには、ssh-keygen を使ってアカウントごとに鍵を作成する必要がある。管理者用のユーザーでログインして、ssh-keygen で公開鍵と秘密鍵を作成する。「-t」オプションは鍵の種類の指定で、プロトコルバージョン1で使う「rsa1」、プロトコルバージョン2で使う「dsa」「ecdsa」「rsa」を利用できる。利用したい鍵の種類が特別にある場合を除き、現時点では rsa で問題ない。
パスフレーズは、鍵の不正利用を防ぐために利用時に入力するフレーズになる。鍵を利用するときに入力を促されるので、パスフレーズを入力した場合は文字列を覚えておく必要がある(空にする場合は文字列を入力せずエンターキーを押す)。
[root@server ~]$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/[user]/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/[user]/.ssh/id_rsa. Your public key has been saved in /home/[user]/.ssh/id_rsa.pub. The key fingerprint is: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx [user]@[hostname]
鍵の生成に成功すると、公開鍵「id_rsa.pub」と秘密鍵「id_rsa」ができる。公開鍵は「~/.ssh/authorized_keys」のファイル名でサーバー側に保持し、秘密鍵はクライアント側に保持する。公開鍵のファイルは sshd の設定で任意に指定できるが、一般的なデフォルトの設定である「.ssh/authorized_keys」の前提で設定を行っている。
[root@server ~]$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
また、「~/.ssh」ディレクトリのパーミッションは「0600」に設定する必要があるので、確認して必要に応じてパーミッションを変更する。
[root@server ~]$ chmod 600 .ssh
クライアント側の設定
SSH で鍵による認証行う場合、クライアント側はログイン時にパスワードではなく秘密鍵が必要になる。先ほどサーバー側で生成した「id_rsa」をクライアントにコピーする。なお、Windows で PuTTY を利用する場合は、PuTTY Key Generator を利用して PuTTY 形式に変換する必要がある。
- <PuTTY をインストールしたディレクトリ>\puttygen.exe を起動
- 「Conversions」メニューの「Import key」で秘密鍵を指定
- 「Save private key」ボタンを押下して PuTTY 形式の秘密鍵を生成
接続確認
設定が完了したら、クライアントから認証鍵を使って SSH でログインできることを確認する。UNIX 系の ssh クライアントの場合は、「-i」オプションで秘密鍵のファイルを指定する。
ssh -i [private_key] -l [user] [host]
Windows で PuTTY を利用している場合は、PuTTY の接続時の設定で「Connection」-「SSH」-「Auth」にある「Private key file for authentication」で秘密鍵のファイルを指定する。
sshd の設定
認証鍵でログインできることを確認したら、要件に合うように sshd の設定を変更する。sshd の設定ファイルは、「/etc/ssh/sshd_config」だ。一般ユーザーは変更できないため、su で root にスイッチして作業する。
[root@server ~]# su - [root@server ~]# vi /etc/ssh/sshd_config
sshd_config には、デフォルトの設定が記述されている。注意が必要なのは、一般的にコメントアウトされている設定がデフォルトであるということだ。たとえば、「#PasswordAuthentication yes」という行があったら、パスワード認証を拒否する設定になっているのではなく、パスワード認証が有効になっている可能性が高い。設定したい内容は、デフォルトの設定に依存するのではなく、意識して設定する必要がある。設定するのは、以下の4項目だ。
Port [ポート番号] Protocol 2 PermitRootLogin no PasswordAuthentication no
上から順に、ポート番号の変更、プロトコルバージョン2に限定、root アカウントの拒否、パスワード認証の拒否の設定を行っている。設定を行ったら、sshd を再起動する。
[root@server ~]# /etc/init.d/sshd restart
最後に、クライアントから「root でログインできないこと」「パスワード認証でログインできないこと」を確認したら sshd の設定は完了だ。ポート番号を変更した場合、クライアント側で接続時にポート番号を指定しなければならないので注意しよう。
ピンバック: iptables の設定(1) | UB Lab.