sshポート番号を変更してパスワード認証を無効にした

VPSでいろいろ試す際に短いID & 短いパスワードの一般ユーザーを作って1週間ほど放置していたら、さっくりとログインされて不正アクセスの踏み台に使われてしまったようで、VPS事業者経由で警告メールが届いてしまいました。さすがインターネッツは怖いなと思ったわけですが、このままじゃマズいので一般的な侵入対策を勉強して導入しました。

なお、侵入されたサーバーはテストアカウントに侵入されただけだと思いますが不安なので消して、以降は新規作成したVPSでやっています。






## 原因と対策

どうやら以下のような認識でいないとダメなようです。
- sudoersでなくても短いID & passwordはダメ
- 辞書攻撃されるので類推可能な単語を使うpasswordはダメ
- sshポート番号がデフォルトの22番のままなのもダメ
- rootログインが可能なままなのもダメ
- 要らないポートは閉じておくべき
- ポートサーチ対策もあった方が良い

短いパスワードは論外なんですが、単語の組み合わせから成るパスワードは長いパスワードでも辞書攻撃を受けると短いのと変わらなくなるのでログインされてしまうようです。rootユーザーを乗っ取れば何でも出来るようになるのもみんな知っているのでrootログイン可能なままだといつかはログインされてしまうのでroot権限をもつ別のアカウントを作ってrootログインを禁止すべきですし、sshポートがデフォルトで22番なのも知られているのでそのままだと攻撃の頻度が増してしまいます。

ちなみにsshを22番ポートのままにしとくとどれぐらいヤバイかは5分放置してlastbコマンドするとすぐ分かります。5分で144回ノックされてます。それなりに桁数が多いパスワードを置いてあるrootであってもそのうちやられちゃいそうです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/d4efad0f-f205-ddb4-f421-ef17aab09be2.png)

というわけで、以下のような対策を行いました。
1. 鍵認証に変更してパスワードログインを無効にする
2. sshポート番号を変更する
3. rootログインを無効にする
4. ufwでfirewallを設定する













## 実施環境
Windows10 + teraterm
VPS: ubuntu18.04




## sudoユーザーを作成する

rootでログインしてSUDOが実行できるユーザーアカウントを作ります。既に作ってある場合は不要です。以下でhogeというユーザーを作れます。

```ruby:terminal
adduser hoge
```
なお、間違って作成したアカウントhogeをadduserで作成したフォルダごと消去するには以下を実行します。

```ruby:terminal
sudo userdel -r hoge
```
hogeというユーザーを%sudoグループに追加してsudoが実行出来るようにします。

```ruby:terminal
sudo usermod -aG sudo hoge
```
グループに追加できたか確認しておきます。

```ruby:terminal
# id hoge
uid=1000(hoge) gid=1004(hoge) groups=1004(hoge).27(sudo)
```
最後に.27(sudo)とあるので追加できているようですので、一旦ログアウトします。

```ruby:terminal
exit
```
再度tera termを実行して次は作成したアカウントhogeでログインします。





## 1. 鍵認証に変更してパスワードログインを無効にする

鍵認証を設定していきます。鍵認証を設定したい相手サーバーにsudoユーザーでログインして、メニューバーの設定から「SSH鍵生成」を選択します。鍵生成メニューが開きますのでデフォルトのままRSA 2048ビットで生成します。鍵だけでパスフレーズなしにも出来ますが一応パスフレーズも設定しておきます。

生成した鍵ファイルをメニューの下にある公開鍵の保存ボタン、秘密鍵の保存ボタンを押して保存先を指定することで鍵を保存できます。ほんとはProgram Files(x86)/teratermに置きたいんですが、teratermから直接置くことができないので、一旦デスクトップやマイドキュメントに保存します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/e9c95c79-65ca-5c41-596b-a383ffd5741c.png" width = 50%>
保存した鍵ファイル2つをc:\Program Files(x86)\teratermに移動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/8afb88c0-2ebf-be3e-4582-226843080756.png)
保存した鍵のうち、公開鍵の方（標準だとid_rsa.pub）をteratermにドラッグ＆ドロップすればログインしているサーバーにアップロードできます。選択肢が出てきますがSSH接続であるSCPを選びましょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/f6994e73-723b-e91d-50fe-28fdfbb4d5bf.png" width = 50%>
鍵がちゃんとあるか確認してみます。

```ruby:terminal
$ ls
id_rsa.pub
```
ありました。このファイルの内容を~/.ssh/authorized_keysに置けば鍵認証できるようになります。まず、~/.ssh/ディレクトリがあるか確認してみましょう。

```ruby:terminal
$ ls -d ~/.ssh
/home/hoge/.ssh
```
ディレクトリがあったようです。ない場合は以下でディレクトリを作ります。

```ruby:terminal
$ mkdir ~/.ssh
$ sudo chmod 700 .ssh
```
続いて、id_rsa.pubの内容をauthorized_keysにコピーします。

```ruby:terminal
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ sudo chmod 644 ~/.ssh/authorized_keys
```
これで鍵認証できるようになった筈ですから、teratermを一旦exitしてから再度起動します。下のように、RSA鍵を使うにチェックを入れて、秘密鍵のパスを指定します。パスフレーズは鍵を作ったときに入力した文字列です。OKをクリックすればSSH接続でログインできる筈。
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/5a4a077c-fb71-d8ac-fcfc-f9ee75f74b33.png" width=50%>

ssh接続権限についての設定ファイルは/etc/ssh/sshd_configになります。これを書き換えてパスワード認証を無効にします。

```ruby:terminal
sudo vim /etc/ssh/sshd_config
```

```ruby:/etc/ssh/sshd_config変更前
PasswordAuthentication yes
```

```ruby:/etc/ssh/sshd_config変更後
PasswordAuthentication no
```
sshdを再起動するまで反映されませんが、同じファイルをまだ変更しますのでこのまま続けていきます。












































































































## 2. sshポート番号を変更する
上記と同様に/etc/ssh/sshd_configを書き換えます。

sshdのポート番号がデフォルトで22番になってますので10行目ぐらいに以下のような記載があります。これを予約されてない49152～65535番のどこかに変更します。下では50100番に変更しています。

```ruby:terminal
sudo vim /etc/ssh/sshd_config
```
sshdのポート番号がデフォルトで22番になってますので10行目ぐらいに以下のような記載があります。これを予約されてない49152～65535番のどこかに変更します。下では50100番に変更しています。

```ruby:/etc/ssh/sshd_config変更前
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
```

```ruby:/etc/ssh/sshd_config変更後
#Port 50100
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
```

## 3. rootログインを無効にする
上記と同様に/etc/ssh/sshd_configを書き換えます。

```ruby:/etc/ssh/sshd_config変更前
PermitRootLogin yes
```

```ruby:/etc/ssh/sshd_config変更後
PermitRootLogin no
```

以下でsshdの設定ファイルの変更を反映します。

```ruby:terminal
$ service ssh restart
```















































# 4. ufwでfirewallを設定する

標準でfirewall機能がありますが、デフォルトでは無効になっています。また、ポートの設定などもされていないので、必要なポートだけ開けるよう設定して有効にします。

htmlポート(80番)、htmlsポート(443番)を許可します。htmlとhtmlsを使わないようなら許可しないままでも大丈夫です。

```ruby:terminal
$ sudo ufw allow 80
$ sudo ufw allow 443
```
sshポート(上で設定したポート番号)は高頻度でログインしようとしたらブロックするようにします。

```ruby:terminal
$ sudo ufw limit 50100
```
使わなくなった22番ポートを明示的にブロックし、allowされてないポートもデフォルトでブロックする。

```ruby:terminal
$ sudo ufw deny 22
$ sudo ufw default deny
```
最後にufwを有効にして完成です。

```ruby:terminal
$ sudo ufw enable
```
statusを確認しておきます。

```ruby:terminal
$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         DENY        Anywhere
50100                      LIMIT       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
1234                       ALLOW       Anywhere
22 (v6)                    DENY        Anywhere (v6)
50100 (v6)                 LIMIT       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
1234 (v6)                  ALLOW       Anywhere (v6)
```
正しく設定できたようなので作業中のターミナルを開いたままで、別のterminalでログインできるか確認しておきます。もしsshポートを間違って設定していたら二度とsshログインできなくなっちゃいますから必ず確認するようにしましょう。


これで最低限の対策は取れたと思います。