[AWS]サーバーがssh攻撃を受けていたのでポートを変更した

## はじめに
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`にあります。
初期状態ですと以下のようになっているかと思います。

```:/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を追加します。

```:/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
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ルールを追加します。
![Selection_931.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/3ea1a36d-8dcc-2376-7150-22063e48950b.png)

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番を指定を削除します。

```:/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 2222
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
...
```

そしたら変更を反映させるために再度sshdを再起動します。

```
$ sudo service sshd restart
```

AWSのセキュリティグループからも以下のように22番を削除します。
![Selection_932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81962/1df24d85-e3a6-59e5-50e5-bfb0f61e8b99.png)

これで再度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だとセキュリティグループ）で弾いておくべきだと。
少しでも皆様のセキュリティ意識が高まる一助となりますように。