SSHに秘密鍵・公開鍵でログインする - 乗っ取られ無いために･･･

今までにも、この手の記事は、多いですが自分用の備忘録です。
ただ、VPSサーバーや専用サーバーを借りたら、セキュリティ対策として一番最初にやっておきたいし、やってない人は、今からでも遅くないので、やっておいた方がいい･･･。

# やること
- SSHのポートを変える
- SSHに秘密鍵でログインできるようにし、通常のパスワードでログインできないようにする。
- rootで直接ログインできないようにする。

# 環境
クライアントOS：Windows10
SSHクライアント：TeraTerm
サーバーOS：CentOS 7

## SSHのポートを変える

ポートの変更はセキュリティの基本！ということで、SSHのポートを変更してみます。

まず最初に、使う予定のポートを開放しておきます。
例では**2222**に変更していますが、適宜、読み替えてください。

```sh
firewall-cmd --add-port=2222/tcp --zone=public --permanent
```

設定が終わったら、設定を忘れずに読み込ませます。

```sh
firewall-cmd --reload
```

```vim:/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 ::
:
```

SSHを再起動させます。

```sh
systemctl restart sshd
```

**念のため接続中のターミナル(TeraTerm)は閉じず**に、別のターミナルで新しいポートで接続できるか確認します。

接続ができることを確認したら、最後にSSHのデフォルトのポートは閉めてしまいます。

```sh
firewall-cmd --remove-service=ssh --zone=public --permanent
firewall-cmd --reload
```


## TeraTermで、秘密鍵・公開鍵を作る

TeraTermを起動し[設定] -> [SSH鍵生成]をクリック
デフォルトでは、RSA-2048になってますが、**RSA-4096**をに変更します。
（ **ECDSA-521**を使った方がセキュリティ的には高いかもしれませんが、この記事では取りあえずRSA-4096を利用します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226626/9c9a340b-83b4-f0cb-034f-4df8e36a963c.png)

何か計算が終わったら、鍵のパスフレーズ等の入力ができるようになります。
**鍵のパスフレーズを入力せずに鍵を保存すると、秘密鍵だけでログインができるようになります。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226626/9a9a8cf4-18f5-f894-10a6-c63d35c1e0fc.png)

セキュリティ的には、パスフレーズを入れるべきです。
パスフレーズを入れなければ、秘密鍵の保存時に警告がでます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226626/75efac9e-7f16-c825-fa91-bfca3fc1a337.png)

終わったら、TeraTermを一旦閉じます。

公開鍵：id_rsa.pub
秘密鍵：id_rsa
ができている事を確認しておきます。
**秘密鍵は、絶対に無くしてはいけませんし、流出させてはいけません**

## 公開鍵をサーバーに設置する

公開鍵を設置する場所は、以下のファイル内です。
/home/{ユーザー名}/.ssh/authorized_keys

フォルダ・ファイルが無い場合は、作ります。

```sh
mkdir /home/{ユーザー名}/.ssh/
cd /home/{ユーザー名}/.ssh/
```

```sh
vi authorized_keys
```

authorized_keysの中に公開鍵（id_rsa.pub）を貼り付けます。

```vim:/home/{ユーザー名}/.ssh/authorized_keys
ssh-rsa ABCDEFGABCDEFGABCDEFGABCDEFGABCDEFGABCDEFG....
```


```sh
chown -R {ユーザー名} /home/{ユーザー名}/.ssh/
```

パーミッションを変更します

```sh
chmod 700 /home/{ユーザー名}/.ssh/
chmod 600 /home/{ユーザー名}/.ssh/authorized_keys
```

これまでの作業を{ユーザー名}以外で行っていた場合は、
これらのディレクトリ・ファイルの所有者を{ユーザー名}に変更しましょう。

## 秘密鍵でログインできるかテストする

TeraTermを起動して、ログインを試します。
(portを変更してない場合はTCPポートは22です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226626/bb3c7ce8-27cf-f20e-c3e7-b179467b8a51.png)


ユーザー名と認証方式を入力します。認証方式は、「RSA/DAS/ECDSA/ED25519鍵を使う」を選択します。
（上記の公開鍵・秘密鍵を作成時に「鍵のパスフレーズ」を入力して鍵を作成した場合は、ここで「パスフレーズ」も入力します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226626/e1ccd522-4af5-1fb9-66f0-e4a42ab8ffad.png)


無事にログインできれば、大丈夫です。
ログインできない場合は、公開鍵のコピーがうまくいっているか･･･、フォルダ・ファイルのパーミッションや所有者が間違っていないか･･･を確認しましょう。

ここでログインできない場合は、ここから下に書いてある『パスワード認証の制限』や『rootログインの制限』は、行わないでください。
二度とログインできなくなる可能性があります。

## SSHのパスワード認証をできないようにする

/etc/ssh/sshd_config 内の「PasswordAuthentication」を「no」に書き換えます。

```vim:/etc/ssh/sshd_config
:
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no <-追記
:
```

SSHを再起動してます。

```sh
systemctl restart sshd
```

## SSHにrootで直接ログインできないようにする

秘密鍵がないとログインできなくはなっていますが、念のためrootに直接ログインできないようにしておきます。
/etc/ssh/sshd_config 内の「PermitRootLogin」を「no」に書き換えます。

```vim:/etc/ssh/sshd_config
:
#LoginGraceTime 2m
#PermitRootLogin yes
PermitRootLogin no <-追記
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
:
```

SSHを再起動します。

```sh
systemctl restart sshd
```


これで、作業は以上です。

enjoy!


## （おまけ）アタックによく使われるユーザー名は･･･

サーバーを立ち上げた直後からSSHに侵入しようと試みてくる不届き者は多数います！
立ち上げ後1時間で、私のサーバーにアタックしてきたユーザー名をご紹介します。

admin / user / git / oracle / gituser / odoo / ansible / ec2-user / test / ubuntu / demo / spark / jenkins / debian / ftpadmin / webadmin / svn / student / www / weblogic / db2inst1 / usuario / support / pi / ubnt

などです。これらのユーザー名は早々に狙われますので、できるだけ使わないようにしましょう。
pi とか･･･ラズパイで使われるユーザーですから･･･ラズパイを外部公開している人は要注意ですよ！
意外とrootでのアクセスは居なかった･･･。

では、今度こそ！
enjoy!!