はじめに
AWSに構築していたVPNサーバー(Shadowsocks)がsshブルートフォースアタックを受けていたので、対応のために22番のsshポートを変更したので、その変更例を示します。
最近繋がりずらいなと思っていてログを見たら、悲惨なことになっていたのがきっかけです。
インスタンスはCentOSのAmazon Linux 2です。
sshdへの接続ログは CentOSなので/var/log/secure
にあります。
adminやuser、fake,butterなど色々なユーザー名で試しに来ていますね。clouderaやhadoopなんてのもありました。
各種サーバーに利用されるデフォルトのユーザー名を利用しているようです。以下は一部ログの抜粋です。
このようなログが数千行とありました。暇あったら解析したいと思います。
sshd[323]: Invalid user admin from 37.49.224.132 port 35940
sshd[323]: input_userauth_request: invalid user admin [preauth]
sshd[323]: Received disconnect from 37.49.224.132 port 35940:11: Bye Bye [preauth]
sshd[323]: Disconnected from 37.49.224.132 port 35940 [preauth]
sshd[325]: Invalid user cloudera from 37.49.224.132 port 38668
sshd[325]: input_userauth_request: invalid user cloudera [preauth]
sshd[325]: Received disconnect from 37.49.224.132 port 38668:11: Bye Bye [preauth]
sshd[325]: Disconnected from 37.49.224.132 port 38668 [preauth]
sshd[327]: Received disconnect from 37.49.224.132 port 40988:11: Bye Bye [preauth]
sshd[327]: Disconnected from 37.49.224.132 port 40988 [preauth]
sshd[329]: Invalid user butter from 37.49.224.132 port 43376
sshd[329]: input_userauth_request: invalid user butter [preauth]
sshd[329]: Received disconnect from 37.49.224.132 port 43376:11: Bye Bye [preauth]
sshd[329]: Disconnected from 37.49.224.132 port 43376 [preauth]
ということで22番ポートを塞ぐ手順を記載しておきます。
ポートの変更
sshの設定ファイルは /etc/ssh/sshd_config
にあります。
初期状態ですと以下のようになっているかと思います。
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...
このファイルを編集します。今回はssh接続変更先のポートを2222に変更する例を示します。
まず、22番のコメントアウトを外します。そしてその下にもう一行、2222番を指定したPortを追加します。
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 22
Port 2222
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...
いきなり22番を塞いで、2222でも接続できなくなると困りますので、デフォルトの22番を残したまま新しいポートでも接続できるかをテストして、OKでしたら22番を塞ぐというステップを取ります。
sshd再起動
変更を反映させるためにsshdを再起動します。
$ sudo service sshd restart
ファイアーウォールの変更
これは人それぞれだと思いますが、AWSならSecurityGroupの変更です。
今回はポート2222番のTCPルールを追加します。
22番ポートはデフォルトsshのポートです。上記の設定で22番と2222番をssh用に開けておきます。
接続テスト
新しいターミナルを開いて、両方のポートで入れることを確認しましょう。sshコマンドでのポート指定は-p
です。指定していない場合はデフォルトの22番で繋ぎに行きます。
もともと繋いであるターミナルはそのままにしましょう。失敗したときのためです。
ssh -i path/to/pem ec2-user@IPADDRESS -p 2222
ssh -i path/to/pem ec2-user@IPADDRESS
22番ポートを削除
2222番ポートでも無事入れることが確認できましたら、以下のようにsshd_config
の22番を指定を削除します。
# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
Port 2222
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...
そしたら変更を反映させるために再度sshdを再起動します。
$ sudo service sshd restart
AWSのセキュリティグループからも以下のように22番を削除します。
これで再度22番と2222番へのssh接続を試してみます。
ssh -i path/to/pem ec2-user@IPADDRESS -p 2222
ssh -i path/to/pem ec2-user@IPADDRESS
2222番で接続できて、22番で接続できなければ成功です。
さいごに
今まで個人用サーバーでは22番はssh用にいつも開けていました。よくはないと思っていなかったのですが、どうせ認証できないだろうから大丈夫かなと思っていました。
ですが、今回攻撃を受けているのを発見して、考えが変わりました。
サーバーでのssh認証以前の段階(AWSだとセキュリティグループ)で弾いておくべきだと。
少しでも皆様のセキュリティ意識が高まる一助となりますように。