OpenSSH運用

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

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

設定

定義ファイルを編集します。
# vi /etc/ssh/sshd_config

       :
#ListenAddress 0.0.0.0
ListenAddress 0.0.0.0                                    # IP-V4 のみ有効にしています
#ListenAddress ::
       :
#PermitRootLogin yes
PermitRootLogin no                                       # root によるログインを禁止します
       :
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no                                # パスワード認証を行いません
       :
#ChrootDirectory none

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

# no default banner path
       :

不正接続ログ対策

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

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

起動

ファイアーウォール iptables に SSH 接続を許可するよう設定を追加します。
# vi /usr/local/sbin/firewall.sh
# --- (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
# firewall.sh                                            # 設定を反映させます

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

公開鍵の保存

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

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

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

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

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

$ # .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
ssh-rsa ...(中略)...== 末尾に空白を1つ空けて任意の管理用コメントを追加

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

$ exit

鍵セットの作成

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

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

フィードバック

記事の内容についてのご質問、ご指摘、その他ご意見等は、Weblogにてお願いしています。

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

トラックバックまたはコメントにてお寄せください。
 
a System House to build an Accounting system by the Computer Technology