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 さえ許可すれば ftpssh 版である sftp が使えるので、実質問題はないはず。
ただし、基本的に全員が ssh のシェルをたたけるというのは危ない。
ほとんどの人はファイルのアップロードで sftp を使うだけなので、そういう人は sftp だけを許可するように設定する。

1. rssh のインストール

まず rssh をインストールする

そして /etc/rssh.conf の allowsftp と書いてある行を有効にする。
これで /etc/passwd に書いてあるデフォルトシェルとして /usr/bin/rssh を指定しておけば、そのユーザーアカウントは sftp しか出来ないようになる。

2. chroot の設定

次に sftp でも、結構色々なファイル(設定ファイルとかも)を見られてしまうので、ホームディレクトリに chroot して余計なファイルにはアクセス出来ないように設定する。


SSH においてホームディレクトリを chroot するには二種類の方法がある。

  • OpenSSH に chroot 機能を組み込む
    • /etc/passwd でホームディレクトリを /home/./hana-p とかにすると /home に chroot され /home より下が見えなくなる。
  • 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 

まとめ

paypalフィッシング詐欺にサーバーを利用されたのは結構ショックだったけど、
サーバー側での簡単でそれなりに効果的なセキュリティ対策が出来たと思う。
こういった時になるべくアドホックな対応はしないで、きちんと調べる事を調べておくべきだ〜ってスタンスなので、
今回もかなり調べて、そして考えた。
そのおかげで、かなり勉強になったし、Linuxファイアウォールの設定方法も少しは理解できるようになった。
いつかそういった知識が仕事でも役立つかな。


でも、でも・・・これにかな〜り時間を取られてしまった。。。疲れたよ〜