Published
- 4 min read
sshの接続ポート番号を変更することで、意図しない不正アクセスを防ぐ方法
検証背景
EC2を建てて、ssh接続するポート番号を22のデフォルトにしておくと、
以下の様な不正アクセスを試みるログが残ることがある。
Nov 8 09:25:43 ip-xxx-xx-x-xxx sshd[2210]: Invalid user admin from xxx.xxx.xxx.xxx
Nov 8 09:25:43 ip-xxx-xx-x-xxx sshd[2210]: input_userauth_request: invalid user admin [preauth]
Nov 8 09:25:43 ip-xxx-xx-x-xxx sshd[2210]: Received disconnect from xxx.xxx.xxx.xxx: 11: Bye Bye [preauth]
こうした不正アクセスを防ぐため、sshのポート番号を変更するだけでも効果があるとのことで、実際に1週間ほどEC2を放置してみた。
検証環境
- OS : Ubuntu14.04
- Instance Type : t2.micro
設定内容
そのため、/etc/ssh/sshd_config の下記の部分を書き換え、service ssh restart を行う。
# What ports, IPs and protocols we listen for
Port 22
# What ports, IPs and protocols we listen for
Port 10022
- [Tips]
sshを再起動するときは、いったん22と10022の両方をセキュリティグループに登録しておき、新しいセッションで10022に接続できることを確認した後、
sshを再起動したセッションを閉じる方が混乱せずにすむ
結果
注)個人検証のために、SSHの接続を一時的に全許可するだけのハニーポットを準備したときの結果です。
ホスト名などが外に漏れているサーバであれば、これが数万数十万件の規模で不正アクセスがきます。
不正アクセス件数
PORT | 不正アクセス数 |
---|---|
22(default)}1835 | |
10022 | 0 |
20022 | 0 |
ポート番号を変更するだけで、見事に不正アクセス数がなくなった。
#他の運用中サーバでも、1700~2200ぐらいは不正アクセスを試みた記録が残っている
- ユーザごとの不正アクセス件数
不正アクセスを試みようとしている主なユーザは、以下のようなユーザであった。
test,admin,guestなどは結構作りがちだが、パスワード認証とかだと破られる可能性があるので、注意しておいた方がよさげ。
回数(10回以上のものを抜粋) | ユーザ |
---|---|
151 | test |
143 | admin |
75 | nagios |
63 | guest |
54 | zabbix |
32 | user |
24 | ubnt |
24 | apache |
21 | tomcat |
20 | zxin10 |
20 | oracle |
16 | hadoop |
14 | postgres |
14 | git |
13 | weblogic |
13 | web |
13 | pi |
13 | ftpuser |
12 | zhaowei |
12 | mysql |
12 | ftp |
11 | informix |
対応方針
AWSのデザインパターンの一つ、CDP:OnDemand Bastionパターンを使う。
必要なタイミングで踏み台サーバを起動する
可能であれば、これが一番やりやすい方針だと思うけど、
OnDemand Bastionについて基本的なところおさらいを見ていると、やはり踏み台サーバを常時稼動させておきたいという要件も出てくる。
踏み台サーバのポートだけ変更しておく
下図のような構成で、踏み台サーバだけsshのポート番号を変更しておけば、
不正アクセスも防げ、かつVPC内部のssh接続はデフォルトの22ポートが利用できる。
appサーバに接続する際は、~/.ssh/config
に以下のような定義を記載しておく。
Host bastion.test
HostName [bastion.testのPublic IP]
User ubuntu
Port 10022
Identityfile ~/.ssh/test.pem
Host app.test
User ubuntu
Port 22
Identityfile ~/.ssh/test.pem
ProxyCommand ssh bastion.test -W [app.testのPrivate IP]:22
この状態で、$ssh app.test
と接続すれば、bastion.test経由でapp.testまでsshでログイン可能となる。