理想未来ってなんやねん

娘可愛い。お父さん頑張る。

ConoHaを使い始めたときにやっておくべきこと(前編)

ConoHa設定時のメモ。
ConoHaだけでなく、RHELLinux全般に通じる設定です。

sshホストキーの再生成

OSを再インストールした際に気がついたのですが、OSを再インストールしてもホストキーが変わらないらしく何の警告もなく繋げてしまう。
おそらくテンプレートイメージにホストキーが入っていて、全利用者同じホストキーが使われているのではないかと思います。

この問題は既に世の中的に言われていることのようです。

仮想サーバーの初期設定に脆弱性、同一ホストキーで“丸見え”に | 日経 xTECH(クロステック)
http://doruby.kbmj.com/totoro_blog/20130624/vps_ssh_

対策としてはsshホストキーを再生成すること。
ホストキーを削除して、sshdを再起動しなおせば再生成されます。

$ sudo rm -f /etc/ssh/ssh_host_*key*
$ sudo service sshd restart
Stopping sshd:                                             [  OK  ]
Generating SSH1 RSA host key:                              [  OK  ]
Generating SSH2 RSA host key:                              [  OK  ]
Generating SSH2 DSA host key:                              [  OK  ]
Starting sshd:                                             [  OK  ]

Macなどsshコマンドで繋いでいる場合、ホストキーが変わると~/.ssh/known_hostsの公開鍵も変更しなければなりません。
以下は、クライアントでの作業です。

$ ssh-keygen -R XXX.XXX.XXX.XXX
$ ssh XXX.XXX.XXX.XXX

ちなみに小ネタですがホストキーのチェックを無くすには、次の方法でできます。

$ ssh XXX.XXX.XXX.XXX -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 

ホスト名の変更

初期だとIPアドレスがホスト名になっているので変更します。

# hostname myconoha
# sed -i -e '/^HOSTNAME=.*$/d' /etc/sysconfig/network
# echo 'HOSTNAME='`hostname` >> /etc/sysconfig/network
# sed -i -e 's/^\(127\.0\.0\.1.*\)$/\1 '`hostname`'/g' /etc/hosts

ユーザーの作成

rootでログインするのは宜しくないので、ユーザーを作成します。

# useradd -G wheel myuser
# passwd myuser
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

秘密鍵及び公開鍵の生成。
既にある鍵を使う場合は、~/.ssh/authorized_keys に秘密鍵を追記します。

# su - myuser
$ ssh-keygen -t rsa
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ cat ~/.ssh/id_rsa
$ rm -f  ~/.ssh/id_rsa
$ exit

rootになれるユーザーをwheelグループに限定する

デフォルトだと誰でもrootになれるので変更しておきます。

# sed -i -e "s/^#\(auth\s\+required\s\+pam_wheel\.so.*\)/\1/g" /etc/pam.d/su
# echo "SU_WHEEL_ONLY yes" >> /etc/login.defs

wheelがsudoを使えるようにしておく

# sed -i -e "s/^#\s\+\(%wheel\s\+ALL\=(ALL)\s\+ALL\)/\1/g" /etc/sudoers

この時点で作成したユーザーでログインしてrootになれること、sudoコマンドを使えることを確認しておきます。

iptablesの設定

/etc/sysconfig/iptablesを編集しiptablesの設定を行います。
下記の例ではsshdhttpd、MTA、MRAで使用するポートをを空けていますが、必要に応じてカスタマイズして下さい。

sshはできるだけ不要な攻撃を避けるため22から10022にへのポート変更を考慮しています。
sshdの設定変更前に22番を閉じてしまうと失敗した時に繋げなくなってしまうので、両方空けておいて成功後に22番を閉じるのが良いかと思います。
(ポートを変更しない場合は、下記設定の10022番ポートは必要ありません。)

又、sshブルートフォース対策として同一IPから180秒に5回アクセスがあった場合、該当IPからのアクセスを600秒間REJECTするようにしています。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:SSHBRUTEFORCE - [0:0]
:RH-Firewall-1-INPUT - [0:0]
:SSHCHECK - [0:0]
-A INPUT -p tcp -m multiport --dport 22,10022 -j SSHCHECK
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A SSHBRUTEFORCE -m recent --set --name badSSH --rsource -j LOG --log-prefix "iptables SSH REJECT " --log-level 7
-A SSHBRUTEFORCE -j REJECT --reject-with icmp-port-unreachable
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -j ACCEPT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -p tcp  -m multiport --dport 22,10022 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m multiport --dport 25,465,587 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m multiport --dport 80,443 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m multiport --dport 110,143,993,995 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
-A SSHCHECK -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state RELATED,ESTABLISHED -j ACCEPT
-A SSHCHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 600 --name badSSH --rsource -j REJECT --reject-with icmp-port-unreachable
-A SSHCHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 180 --hitcount 5 --name sshconn --rsource -j SSHBRUTEFORCE
-A SSHCHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m recent --set --name sshconn --rsource
-A SSHCHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ACCEPT
COMMIT

変更後、下記のコマンドで設定を反映させます。

# service iptables restart

sshdの設定強化

sshdの設定も変えておきます。

  • rootでのログイン禁止
  • パスワード認証禁止
  • X11転送も禁止
  • 作業中にブチブチ切れないようにクライアント生存チェックを有効にする。
  • sshの接続ポートをデフォルトの22から別のポートに変更する(推奨)
# sed -i -e 's/^\(PasswordAuthentication\).*/\1 no/' /etc/ssh/sshd_config
# sed -i -e 's/^#\(PidFile .*\)$/\1/' /etc/ssh/sshd_config
# sed -i -e 's/^\(X11Forwarding\) .*$/\1 no/' /etc/ssh/sshd_config
# sed -i -e 's/^#\(ClientAliveInterval\) .*$/\1 15/' /etc/ssh/sshd_config
# sed -i -e 's/^#\(ClientAliveCountMax\) .*$/\1 3/' /etc/ssh/sshd_config
# sed -i -e 's/^\(PermitRootLogin\) .*$/\1 no/' /etc/ssh/sshd_config
# sed -i -e 's/^\(UsePAM\) .*$/\1 no/' /etc/ssh/sshd_config
# service sshd restart
sshdのポートを22番以外に変更した場合

sshブルートフォース攻撃対策として、sshの接続ポートをデフォルトの22番から10022番に変更しておきます。

# sed -i -e 's/^#\(Port\) .*$/\1 10022/' /etc/ssh/sshd_config

設定後、sshdを再起動して変更を反映。

# service sshd restart

sshの接続を切らずに、別のターミナルを開いて10022番ポートで問題なく繋がるか確認します。
問題なく繋がるか確認し、問題ないようであればiptablesの22番ポートを塞ぎます。

# sed -i -e 's/22,10022/10022/g' /etc/sysconfig/iptables
# service iptables restart

今日のところはここまで。