CentOS サーバー運用 OpenSSH

(最終更新日時:2012-10-29 00:26:12)
当サイトでは、ネットワーク経由でサーバーに接続して行うシェル操作を OpenSSH による SSH(Secure Shell) のみに制限しています。 (※Telnet による接続は許可していません。

SSHによる接続認証は公開鍵方式のみとし、パスワード認証を禁止します。
また、root での接続も禁止するようにします。
必ず一般ユーザーで接続し、rootで操作する必要のあるときは、suでrootに切り替えるか、sudoによりroot権限でコマンドを実行します 。
さらに、pam.dの設定により、wheelグループユーザーのみsuコマンドが使用できるように制限しています。

※ 以下の内容は openssh-5.3p1-81.el6.x86_64 を対象に記述しています。

設定

定義ファイルを編集します。
# vi /etc/ssh/sshd_config
----------(vi ここから)----------
       :
#ListenAddress 0.0.0.0
ListenAddress 0.0.0.0                                         # IPv4のみ有効にしています
#ListenAddress ::
       :
#PermitRootLogin yes
PermitRootLogin no                                            # rootによるログインを禁止します
       :
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no                                     # パスワード認証は行いません
       :
#ChrootDirectory none

AllowGroups 接続を許可するgroup                               # 必要に応じて追加します
AllowUsers  接続を許可するuser                                # 必要に応じて追加します

# no default banner path
       :
----------(vi ここまで)----------

不正接続ログ対策

リモート接続を行うようにする関係で、SSHの接続ポートを外部に開放しておかなければなりません。
そのため、どうしても辞書攻撃によるアタックを受けることになります。
アタックそのものは、パスワード認証を許可していませんので防ぐことができるのですが、アタックの記録が大量にログに記録されてしまいます。
そこで、アタックを行ってきたIPアドレスを iptables で一定時間接続拒否するようにします。

以前は http://search.luky.org/linux-users.a/msg04927.html で進戸氏が紹介されている hosts.allowspawnを使用した方法で行っていました。
現在はログ監視ツール swatch による方法に変更しています。
詳細は当サイトの記事 swatch を参照してください。

起動

ファイアーウォール iptables にSSH接続を許可するよう設定を追加します。
# vi /usr/local/sbin/firewall.sh
----------(vi ここから)----------# --- (INPUTチェイン) ---# SSH接続を許可
iptables -A INPUT -i $EXTIF -p tcp --dport  22 -j CHK-SYNFLOOD# --- (OUTPUTチェイン) ---# SSH接続を許可
iptables -A OUTPUT -o $EXTIF -p tcp --sport  22 -m state --state ESTABLISHED -j ACCEPT----------(vi ここまで)----------

# firewall.sh                                                 # 設定を反映させます

sshdを起動します。
# chkconfig sshd on
# service   sshd start

公開鍵の保存

SSH接続は公開鍵方式のみを許可しています。
公開鍵方式では、接続を許可したクライアントの公開鍵を、接続先であるサーバーに保存しておく必要があります。

秘密鍵と公開鍵の鍵セットはクライアント側、サーバー側どちらで作成しても構いませんが、当サイトでは原則的にクライアント側で作成することにしています。
その理由として、クライアント側では1組の鍵だけを管理すればいいので、鍵管理の負荷が少なくなります。
また、持ち出されるのが公開鍵のみになりますから、セキュア面でも安全です。

クライアント側での鍵セット作成は、Windowsであれば PuTTY・鍵セットの作成 を、 Linuxクライアントであれば、後述する 鍵セットの作成 を参照してください。
Windowsクライアントで PuTTY 以外を利用されていて、鍵セットを作成することができない場合は、サーバー側で Linuxクライアントで鍵セット作成を代行して、作成された鍵セットをWindowsクライアントユーザーに渡します。

クライアント側から渡された公開鍵を保存することにより、SSHによる接続クライアントとして許可されます。

(※接続するユーザーを sshuser としています。Linuxアカウントの存在しないユーザーは接続することができません。)
# su - sshuser

$ # .ssh ディレクトリが存在しない場合は作成します
$ mkdir .ssh
$ chmod 700 .ssh

$ # PuTTYの『公開鍵の保存』で作成した公開鍵の場合、IETF SECSH形式になっていますので、OpenSSH方式に変換します
$ cd .ssh
$ ssh-keygen -i -f PuTTYの公開鍵ファイル > id_rsa.pub
$ rm  PuTTYの公開鍵ファイル

$ # 公開鍵に管理用のコメントを付加します。
$ # 既にコメントが付加されている場合、上書きして構いません。
$ vi id_rsa.pub
----------(vi ここから)----------
ssh-rsa ...(中略)...== 末尾に空白を1つ空けて任意の管理用コメントを追加
----------(vi ここまで)----------

$ cat id_rsa.pub >> authorized_keys
$ rm  id_rsa.pub

$ exit

鍵セットの作成

Linuxクライアントとして他のサーバーへSSH接続するための鍵セットは、以下により作成します。
(※接続するユーザーを sshuser としています)
# su - sshuser

$ # 鍵セットを作成します。-C は管理用のコメントです。
$ ssh-keygen -t rsa -C "SSH Connection User : sshuser"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/users/sshuser/.ssh/id_rsa): [Enter]
Created directory '/home/users/sshuser/.ssh'.
Enter passphrase (empty for no passphrase): パスフレーズ
Enter same passphrase again: パスフレーズ再入力
     :
$ exit
接続するユーザーのホームディレクトリ配下にある.sshディレクトリ内に id_rsa.pubid_rsa が作成されています。
id_rsa.pub が公開鍵ですので、接続先サーバーへ渡して接続を許可してもらいます。

フィードバック

記事の内容についてのご質問、ご指摘、その他ご意見等は、Weblog/Twitter にて受け付けております。

System House ACT Weblog 内記事 : サーバー運用情報 OpenSSH

トラックバックまたはコメントにてお寄せください。

Twitter では .@systemact 宛につぶやいてください。
また、こちら から、この記事についてつぶやくことができます。
a System House to build an Accounting system by the Computer Technology