OpenSSHをよりセキュアに設定する方法を以下のサイトを参考にまとめました。
Securing OpenSSH
を参考にし、下記設定を行いました。
なお、本記事ではCentOS6.2の環境で確認した結果を示しています。
以下、上記の設定方法について記述します。なお、設定変更後はsshdサービスを下記コマンドでリスタートしています。
# service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ]
※目次をクリックすると目次の下部にコンテンツが表示されます。
ログインを制限
①rootユーザーのログインを制限する
# vi /etc/ssh/sshd_config PermitRootLogin no
②SSHでログインできるユーザーを制限する
例)
“unyo8″と”unyo9″というユーザーのみ許可する場合
# vi /etc/ssh/sshd_config AllowUsers unyo8 unyo9
SSHプロトコル1を無効にする
SSHはプロトコル1とプロトコル2の二つを使用できますが、プロトコル1はセキュリティが弱いので、使用する特別な理由が無い限りは無効にします。
/etc/ssh/sshd_configで下記のようにプロトコル1の指定ははずします。
Protocol 2
●動作確認
TeraTermでSSH接続する際、SSHバージョンをSSH1を指定して接続すると”プロトコルバージョンが一致しません”と表示される事を確認しました。
/etc/ssh/sshd_configで下記のようにプロトコル1の指定ははずします。
Protocol 2
●動作確認
TeraTermでSSH接続する際、SSHバージョンをSSH1を指定して接続すると”プロトコルバージョンが一致しません”と表示される事を確認しました。
デフォルト(22番ポート)以外のポートを使用
デフォルトでは、sshはtcpの22番ポートを使用してネットワーク接続します。
攻撃者もそれを知っているので、22番ポートをスキャンしてsshサービスが実行されているか確認しようとします。
上記を防ぐため、sshを22番ポート以外のポートに変更して運用することもできます。
代わりにどのポートを使用するかですが、1024以上の使われていないポートが適しているようです。
●変更方法
①使用していないポートを確認
/etc/servicesファイル内で設定されていない1024以上のポート番号を探す。
②”netstat -an | grep ポート番号”を実行し、使用されていないことを確認する。
③/etc/ssh/sshd_configファイルにポート番号を設定
例)ポート番号2345を設定する場合
Port 2345
④iptablesにsshを設定している場合は、ポート番号を22から変更し、iptablesをリスタート
※CentOS6以降で、SELinuxを有効にしている場合は、下記のようにして設定を追加する必要があるとの事です。
$ semanage port -a -t ssh_port_t -p tcp 2345
攻撃者もそれを知っているので、22番ポートをスキャンしてsshサービスが実行されているか確認しようとします。
上記を防ぐため、sshを22番ポート以外のポートに変更して運用することもできます。
代わりにどのポートを使用するかですが、1024以上の使われていないポートが適しているようです。
●変更方法
①使用していないポートを確認
/etc/servicesファイル内で設定されていない1024以上のポート番号を探す。
②”netstat -an | grep ポート番号”を実行し、使用されていないことを確認する。
③/etc/ssh/sshd_configファイルにポート番号を設定
例)ポート番号2345を設定する場合
Port 2345
④iptablesにsshを設定している場合は、ポート番号を22から変更し、iptablesをリスタート
※CentOS6以降で、SELinuxを有効にしている場合は、下記のようにして設定を追加する必要があるとの事です。
$ semanage port -a -t ssh_port_t -p tcp 2345
iptablesでSSH接続を制限
1)特定のIPアドレスからのみSSHに接続する場合
下記のように許可するIPアドレスを指定します。
iptables -A INPUT -p tcp -s 192.168.1.1 –dport 22 -j ACCEPT
2)送信元アドレスが固定されていない場合(recentモジュール使用)
インターネットから送信元アドレスが特定できない状態で接続を許可している場合、総当たり攻撃(brute force attack)のリスクがあります。
recentモジュールを使用して、1分間に4回以上の接続を試みた場合は許可しないようにする例を示します。
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –set –name ssh –rsource
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent ! –rcheck –seconds 60 –hitcount 4 –name ssh –rsource -j ACCEPT
1行目のルールは、新規接続のIPアドレスを記録しています。
2行目のルールは、このIPアドレスが60秒間の間に4回以上の接続を試みているかチェックし、そうでない場合は接続を許可します。
このルールを使用する場合は、インプットチェーンのデフォルトのDROPポリシーが必要です。
3)送信元アドレスが固定されていない場合(limitモジュール使用)
limitモジュールを使って、1分間に許可する接続回数を3回に制限する設定例を示します。
iptables -A INPUT -p tcp –dport 22 –syn -m limit –limit 1/minute –limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 –syn -j DROP
1行目のルールで、直近1分間に3回以上の接続をしていなければ許可しています。
3回以上の接続をしている場合は、2行目のルールでドロップされます。
下記のように許可するIPアドレスを指定します。
iptables -A INPUT -p tcp -s 192.168.1.1 –dport 22 -j ACCEPT
2)送信元アドレスが固定されていない場合(recentモジュール使用)
インターネットから送信元アドレスが特定できない状態で接続を許可している場合、総当たり攻撃(brute force attack)のリスクがあります。
recentモジュールを使用して、1分間に4回以上の接続を試みた場合は許可しないようにする例を示します。
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent –set –name ssh –rsource
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -m recent ! –rcheck –seconds 60 –hitcount 4 –name ssh –rsource -j ACCEPT
1行目のルールは、新規接続のIPアドレスを記録しています。
2行目のルールは、このIPアドレスが60秒間の間に4回以上の接続を試みているかチェックし、そうでない場合は接続を許可します。
このルールを使用する場合は、インプットチェーンのデフォルトのDROPポリシーが必要です。
3)送信元アドレスが固定されていない場合(limitモジュール使用)
limitモジュールを使って、1分間に許可する接続回数を3回に制限する設定例を示します。
iptables -A INPUT -p tcp –dport 22 –syn -m limit –limit 1/minute –limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp –dport 22 –syn -j DROP
1行目のルールで、直近1分間に3回以上の接続をしていなければ許可しています。
3回以上の接続をしている場合は、2行目のルールでドロップされます。
認証方式をパスワード認証から公開鍵認証へ
公開鍵認証を使用し、パスワード認証を無効にする事によってパスワード攻撃を防ぐ事ができます。
1)秘密鍵と公開鍵を作成して配置
以下の手順でクライアントマシンでSSHの公開鍵、秘密鍵ペアを作成し、公開鍵をサーバーのauthorized_keysファイル内にコピーします。
(Tera Termの場合)
①メニューから「設定」→「SSH鍵生成」
②設定項目を適宜設定する。
デフォルトは下記のようになっていました。
・鍵の種類 RSA
・ビット数 2048
③「生成」ボタン押下
鍵が生成されます。
④公開鍵と秘密鍵をファイルに保存
パスフレーズ欄を空欄のままで秘密鍵を保存をすると”空のパスフレーズを使用しますか?”と聞かれます。
パスフレーズを設定しない場合は、そのクライアントマシンを使用できる人は誰でもSSH接続が出来てしまいます。必要に応じてパスフレーズを設定します。
⑤上記公開鍵ファイルをサーバー内のユーザーホームディレクトリ内のauthorized_keysファイル内にコピーする。
例)公開鍵ファイル名がid_rsa.pubの場合
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
⑥サーバー内のファイルのパーミッション設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
(WinSCPの場合)
①WinSCP同梱のPuTTY Key Generatorを起動
②設定項目を適宜設定する。
デフォルトは下記のようになっていました。
・タイプ SSH-2 RSA
・ビット数 1024
③「Generateボタン」押下
ウィンドウ内でマウスを動かしながら作成が終了するまで待つ
④公開鍵が生成されるので、サーバー内のユーザーホームディレクトリ内のauthorized_keysファイル内にコピーする。
”Public key for pasting in to OpenSSH authorized_keys file”欄の文字列をコピーしてサーバー内の~/.ssh/authorized_keysファイル内にコピーする。
⑤クライアントマシンで秘密鍵をファイルに保存
「Save private key」ボタンを押下。
パスフレーズ欄を空欄のままで秘密鍵を保存をすると”Are you sure you want to save this key without a passphrase to protect it?”と聞かれます。
パスフレーズを設定しない場合は、そのクライアントマシンを使用できる人は誰でもSSH接続が出来てしまいます。必要に応じてパスフレーズを設定します。
⑥サーバー内のファイルのパーミッション設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
2)パスワード認証を無効にする
デフォルトでは、sshは最初にキーを使って認証を試み、キーが無い場合や認証が失敗した場合はパスワード認証に切り替えます。
上記(1)の設定で公開鍵認証が正常に実施できるようになったらパスワード認証は無効にします。
# vi /etc/ssh/sshd_config
PasswordAuthentication no
1)秘密鍵と公開鍵を作成して配置
以下の手順でクライアントマシンでSSHの公開鍵、秘密鍵ペアを作成し、公開鍵をサーバーのauthorized_keysファイル内にコピーします。
(Tera Termの場合)
①メニューから「設定」→「SSH鍵生成」
②設定項目を適宜設定する。
デフォルトは下記のようになっていました。
・鍵の種類 RSA
・ビット数 2048
③「生成」ボタン押下
鍵が生成されます。
④公開鍵と秘密鍵をファイルに保存
パスフレーズ欄を空欄のままで秘密鍵を保存をすると”空のパスフレーズを使用しますか?”と聞かれます。
パスフレーズを設定しない場合は、そのクライアントマシンを使用できる人は誰でもSSH接続が出来てしまいます。必要に応じてパスフレーズを設定します。
⑤上記公開鍵ファイルをサーバー内のユーザーホームディレクトリ内のauthorized_keysファイル内にコピーする。
例)公開鍵ファイル名がid_rsa.pubの場合
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
⑥サーバー内のファイルのパーミッション設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
(WinSCPの場合)
①WinSCP同梱のPuTTY Key Generatorを起動
②設定項目を適宜設定する。
デフォルトは下記のようになっていました。
・タイプ SSH-2 RSA
・ビット数 1024
③「Generateボタン」押下
ウィンドウ内でマウスを動かしながら作成が終了するまで待つ
④公開鍵が生成されるので、サーバー内のユーザーホームディレクトリ内のauthorized_keysファイル内にコピーする。
”Public key for pasting in to OpenSSH authorized_keys file”欄の文字列をコピーしてサーバー内の~/.ssh/authorized_keysファイル内にコピーする。
⑤クライアントマシンで秘密鍵をファイルに保存
「Save private key」ボタンを押下。
パスフレーズ欄を空欄のままで秘密鍵を保存をすると”Are you sure you want to save this key without a passphrase to protect it?”と聞かれます。
パスフレーズを設定しない場合は、そのクライアントマシンを使用できる人は誰でもSSH接続が出来てしまいます。必要に応じてパスフレーズを設定します。
⑥サーバー内のファイルのパーミッション設定
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys
2)パスワード認証を無効にする
デフォルトでは、sshは最初にキーを使って認証を試み、キーが無い場合や認証が失敗した場合はパスワード認証に切り替えます。
上記(1)の設定で公開鍵認証が正常に実施できるようになったらパスワード認証は無効にします。
# vi /etc/ssh/sshd_config
PasswordAuthentication no