CentOS 7でsshdを動作させていますが外部からの不正アクセスが絶えません。
port:22から別のポートに変更するだけで格段にアクセスが減るのですが、外出先でリモート接続する場合にそのポートが通過できるか等を考慮して22で動作させています。
手っ取り早くアクセス制限する方法としてTCP Wrapperを使用しました。
2.6.2. TCP Wrapper の設定ファイル – Red Hat Customer Portal
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sect-Security_Guide-TCP_Wrappers_and_xinetd-TCP_Wrappers_Configuration_Files.html
(RHEL 6のドキュメントです。RHEL 7を見つけられませんでした。)
ちなみに/etc/hosts.allow, /etc/hosts.denyは即反映されます。
リモートで編集する場合は十分注意しないと接続できなくなる可能性もあります。
- 許可するIP(/etc/hosts.allow)
- 拒否するIP(/etc/hosts.deny)
- logrotate
今回は/etc/hosts.allow.sshdを新規に作成して、このファイルにまとめて許可IPを記述することにしました。
1 2 3 4 |
# vi /etc/hosts.allow sshd: 192.168.100. sshd: /etc/hosts.allow.sshd |
/etc/hosts.allow.sshdはサービス名は記述しないでネットワークだけです。
1 2 |
xxx.xxx. xxx.xxx.xxx.0/255.255.255.0 |
すべて拒否とし、ログを作成します。これで許可IPからは接続でき、それ以外はすべて拒否になります。
1 2 3 |
# vi /etc/hosts.deny sshd: ALL : spawn /bin/echo `/bin/date +"%%F %%T"` access denied to %h>>/var/log/sshd-deny.log |
ログはこんな感じです。
1 2 |
2017-05-15 11:11:32 access denied to xxx.xxx.xxx.240 2017-05-15 11:12:38 access denied to xxx.xxx.xxx.25 |
だとシステムのロケールに合わせるので日時が日本語で出力されます。これではスクリプトで処理する場合に面倒なので書式を設定しています。/bin/date
1 2 |
2017年 5月 8日 月曜日 15:02:37 JST access denied to xxx.xxx.xxx.14 2017年 5月 8日 月曜日 15:03:22 JST access denied to xxx.xxx.xxx.218 |
1 2 3 4 5 6 7 8 |
# vi /etc/logrotate.d/ssh-dney /var/log/sshd-deny.log { weekly rotate 4 missingok notifempty } |
昨日は103のIPから538回のアクセスを拒否しています。
1 2 3 4 |
# grep 2017-05-14 /var/log/sshd-deny.log* | cut -d" " -f6 | sort | uniq | wc -l 103 # grep 2017-05-14 /var/log/sshd-deny.log* | cut -d" " -f6 | wc -l 538 |