SSHの辞書攻撃対策
前回の書き込みからずいぶん時間がたっちゃったけど、SSHの辞書攻撃対策について、こんな感じで設定してみました。
ファイアウォール設定の見直し
まず、ファイアウォールの設定をちゃんと行う。
いや、今までももちろん設定はしてたんだけど、もっと細かく設定することにした。
具体的には
- ローカルネットワーク(192.168.0.*) からのアクセスを許可
- http/https/smtp のポートは解放
- 上記以外の韓国・中国・台湾・香港・インド・インドネシアからのアクセスを遮断(*)
- ping は一応許可する
- ssh はデフォルトのポート番号(22)を使わずに、別のポートに変更する(例えば12345など)
- プロキシやsocksによってはポート番号が22じゃないと駄目な時があるので、そのプロキシサーバーのIPからのみポート22へのアクセスを解放する
という感じです。
(*) このサイトを参考にしました。
http://www.hakusan.tsg.ne.jp/tjkawa/lib/krfilter/index.jsp
設定するにあたって、以下のスクリプトを作りました。
(Red Hat Enterprise Linux WS release 3 で実行してます。
他のディストリビューションでも iptables がインストールされてれば大丈夫でしょう)
#!/bin/sh iptables -F iptables -Z iptables -X /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack_ftp iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # ローカルネットワークからのアクセスを許可 iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # http/https/smtpパケットを許可 iptables -A INPUT -p tcp --dport http -j ACCEPT iptables -A INPUT -p tcp --dport https -j ACCEPT iptables -A INPUT -p tcp --dport smtp -j ACCEPT # 関連パケットを許可 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # アクセスを拒否するIPリストを設定 iptables -N KRFILTER iptables -N KRFILTERED sh ./deny_ip.txt sh ./deny_ip_extra.txt iptables -A KRFILTERED -j DROP iptables -A INPUT -j KRFILTER # pingを許可 iptables -A INPUT -p icmp -j ACCEPT # ssh(22) を特定プロキシからのみ許可 iptables -A INPUT -p tcp -s <プロキシのIP> --dport ssh -j ACCEPT # ssh(12345) を許可 iptables -A INPUT -p tcp --dport 12345 -j ACCEPT iptables -A INPUT -j DROP iptables -A INPUT -j LOG --log-prefix 'iptables: '
このスクリプトを iptables.sh という名前で保存し、
http://www.hakusan.tsg.ne.jp/tjkawa/lib/krfilter/index.jsp
のIPフィルタリングするシェルスクリプト(ALL.sh.txt)をダウンロードし、同じディレクトリに deny_ip.txt という名前で保存します。
また ALL.sh.txt ではカバーできていない IP もあるので、その指定を追加できるよう deny_ip_extra.txt というファイルも用意しておきます。
次に ssh をポート22とポート12345で受け付けるように /etc/ssh/sshd_config に以下の記述を追加します。
Port 22 Port 12345 # ssh の受信ポートはいくつでも設定可能
そして /etc/init.d/ssh restart で設定を反映させます。
上記で設定したポート番号を使って ssh でログインできることが確認できたら、
再度 su - で root になり、iptables.sh を実行します(deny_ip.txt のIPリストが多いためちょっと時間がかかります)
iptables.sh を実行後は # /etc/init.d/iptables status で設定された内容を確認できます。
ちゃんと設定されて動作を確認できたら # /etc/init.d/iptables save と実行すると今の設定が保存され、次回起動時にはその設定が読み込まれるようになります。
この辺りの説明は
が非常に参考になりました。
#ちなみにこのサイト、色々なLinuxプログラムの動作や設定方法をめちゃめちゃ丁寧に説明しているので、
#いつもお世話になってます。
とここまで設定したところ、ssh に関する怪しいアクセスはすべてシャットアウトされるようになりました。
ちなみに iptables.sh の最後から二行目の
iptables -A INPUT -j DROP
をコメントアウトすると、明示的に DROP と設定したもの以外でフィルタリングされたものがログに残るようになります。
その状態で何日かログを見てみると、しょっちゅうよくわからんポート番号でアクセスする輩がいるみたいです。
特に多かったのが ms-sql-m (udp/1434) へのアクセス。
Microsoft 製品のセキュリティホールを突いたアクセスで、もちろん自分のサーバーはLinuxだからまったく関係ないんだけど、MS関係のアクセス、結構多いね。
IISのセキュリティホールを突くようなアクセスもしょっちゅうあるし。
これじゃ怖くてMS関係のサーバーは public な所には公開できないなぁ。
ユーザーアカウント設定の見直し
ということで、ssh のアクセス自体をファイアウォールでフィルタリングでシャットアウトした後は、
アカウントの管理を見直した。
このサーバーは結構多くの人が使ってて多くのアカウントが存在して、実は ftp を使ってもらってたんだけど、
この機に ftp を禁止した。
基本的に ssh さえ許可すれば ftp の ssh 版である sftp が使えるので、実質問題はないはず。
ただし、基本的に全員が ssh のシェルをたたけるというのは危ない。
ほとんどの人はファイルのアップロードで sftp を使うだけなので、そういう人は sftp だけを許可するように設定する。
1. rssh のインストール
まず rssh をインストールする
- http://www.sdri.co.jp/rssh/index.html
- http://www.linux.or.jp/JM/html/rssh/man1/rssh.1.html
- http://www.linux.or.jp/JM/html/rssh/man5/rssh.conf.5.html
そして /etc/rssh.conf の allowsftp と書いてある行を有効にする。
これで /etc/passwd に書いてあるデフォルトシェルとして /usr/bin/rssh を指定しておけば、そのユーザーアカウントは sftp しか出来ないようになる。
2. chroot の設定
次に sftp でも、結構色々なファイル(設定ファイルとかも)を見られてしまうので、ホームディレクトリに chroot して余計なファイルにはアクセス出来ないように設定する。
SSH においてホームディレクトリを chroot するには二種類の方法がある。
- OpenSSH に chroot 機能を組み込む
- rssh の chroot 機能を使う
- /etc/rssh.conf に chrootpath = "/home" と書く
今まで vsftp を使っていたが、これが /etc/passwd を使って chroot の指定をしていたため、
それを踏襲し OpenSSH の chroot 機能を使う事にする。
OpenSSH で chroot 機能を使うには、OpenSSH をリビルドして再インストールする必要があった。
参考:http://fedorasrv.com/openssh_chroot.shtml
そして /home 以下に chroot するため、以下のファイルを /home 以下にコピーした。
#余計なファイルも含まれてるかもしれない。。。
[root@infostc home]# find ./bin ./etc ./lib ./usr -not -type d ./bin/bash ./etc/passwd ./etc/group ./etc/localtime ./etc/ld.so.cache ./etc/ld.so.conf ./etc/rssh.conf ./lib/libnss_compat.so.2 ./lib/libnsl.so.1 ./lib/libnss_files.so.2 ./lib/ld-linux.so.2 ./usr/libexec/openssh/sftp-server ./usr/libexec/rssh_chroot_helper ./usr/bin/rssh ./usr/bin/scp ./usr/lib/libz.so.1 ./usr/lib/libcrypt.so ./usr/lib/libc.so.6 ./usr/lib/libresolv.so.2 ./usr/lib/libdl.so.2 ./usr/lib/ld-linux.so.2 ./usr/lib/libcrypt.so.1 ./usr/lib/libnsl.so.1 ./usr/lib/libutil.so.1 ./usr/lib/libcrypto.so.4 ./usr/kerberos/lib/*
これで、例えばアカウント名が hana-p、ホームディレクトリが /home/./hana-p で、デフォルトシェルが /usr/bin/rssh にしておけば、hana-p は sftp しか出来ないし /home 以下のファイルしかアクセスできなくなる。
最終的に /etc/passwd の記述はこんな感じになりました。
hana-p:x:1000:1000::/home/./hana-p:/usr/bin/rssh