(Amazon Linux 2の)sshd_configとauthorized_keysを学ぶ

# 内容
初期Amazon Linux 2の/etc/ssh/sshd_config設定を色々と変更しつつsshd_configについて学んでいく。
ついでにauthorized_keysも。

## ちょっとだけsshd_configを学ぶ

### 取り敢えず使いそうなところの設定

| 意味 |   該当箇所 |
|:-----------------|------------------:|
| パスワード認証   | PasswordAuthentication |
| チャレンジレスポンス認証  | ChallengeResponseAuthentication   |
| 公開鍵認証  | PubkeyAuthentication   |
| rootログイン | PermitRootLogin |
| 接続ポート | Port XX(基本22) |
| SSH接続バージョン | Protocol |

### Amazon Linux 2の初期設定

```ruby:設定

#Port 22

#PubkeyAuthentication yes
# the setting of "PermitRootLogin without-password".

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
PasswordAuthentication no

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication no

#PermitRootLogin yes

```

### どういう設定が良いのか
を調べてみた所共通して多く出てきたのが以下設定。

・rootログインの禁止
・パスワード認証の禁止
・公開鍵認証の
・SSH接続Verison 2のみ許可
・チャレンジレスポンス認証を無効化

| 推奨値 | 設定値 |  推奨値との比較  |
|:-----------------|------------------:|:------------------:|
| rootログインの禁止   | #PermitRootLogin yes |     ×    |
| チャレンジレスポンス認証  | ChallengeResponseAuthentication no |     〇   |
| 公開鍵認証の許可 | #PubkeyAuthentication yes |     〇    |
| SSH接続Verison 2のみ許可 | 設定見つけられず |     ？    |
| パスワード認証の禁止 | PasswordAuthentication no |     〇    |

ここで、×と？だったものに関して接続を試してみるとどうなるのかを検証。
## rootログインの禁止
/etc/ssh/sshd_configのrootログインに関する設定値は以下であった

```
#PermitRootLogin yes
```

ただし、公式サイトでは以下のように記載されている。
[Amazon Linux 2](https://aws.amazon.com/jp/amazon-linux-2/)

>**デフォルトで安全**
Amazon Linux 2 では、SSH キーペアの使用およびリモートルートログインの無効化により、リモートアクセスが制限されています。また、Amazon Linux 2 では、必須ではないにもかかわらずインスタンスにインストールされるパッケージの数が削減されるため、セキュリティの脆弱性のリスクを抑えることができます。深刻度が "緊急" または "重要" であるセキュリティアップデートは、初回起動時に自動的に適用されます。

試してみないと良く分からないので試してみます。

![ss_002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/66efe99a-4a34-e501-3778-08cfe466b765.jpeg)
![ss_003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/d0ed61fe-db1d-d841-709f-e2f5be7d2c39.jpeg)


Tera Termを使用して、ユーザーを**root**とし接続してみます。
......
.......
........
.........

```
Please login as the user "ec2-user" rather than the user "root".
```

＿人人人人人人＿
＞　ナニコレ　＜
￣Y^Y^Y^Y^Y^Y^￣

結果、公式通りrootでのログインはできなかったが、rootログイン時に出力される上記の文は
どこに設定されているのかは知っておきたかったので色々と調べてみた所以下に設定されていることが分かりました。

```
/root/.ssh/authorized_keys
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"ec2-user\" rather than the user \"root\".';echo;sleep 10" ssh-rsa <文字列> <キーペア名>
```

上記が何かというとauthorized_keysのオプションで、色々設定できるらしいです。初めて知りました。
今回の場合だとssh-rsaの前に記載されています。

| オプション |  意味 |
|:-----------------|------------------:|
|no-port-forwarding  | ポート転送禁止の設定 |
|no-agent-forwarding  | 認証エージェント転送禁止の設定  |
|no-X11-forwarding  | X11(画面)転送禁止の設定  |
| command="command" | 実行可能なコマンドの設定 |

オプション消したらrootでログインできるのでは...？
という事で、バックアップを取得してからssh-rsaより前を削除してみます。

```
# cp -p /root/.ssh/authorized_keys /root/.ssh/authorized_keys_yyyymmdd
# ls -a /root/.ssh/
# vi /root/.ssh/authorized_keys
# cat /root/.ssh/authorized_keys
# systemctl restart sshd.service

```
authorized_keysの設定が反映されたので、新しくSSH接続を試してみます。
※無いとは思いますが何かあって入れなくなると困るので現在の接続は保ったままとします。

![ss_005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/5814afa2-ee5f-18d3-b324-125e08434020.jpeg)
できました。
念のためにユーザ確認をしてみます。

```
# whoami
root
```
ログインすることができました。
authorized_keysのオプションを無くした状態でsshd_configの**#PermitRootLogin yes**を以下のように変更するとどうなるのかを試してみます。
(変更前)
**#PermitRootLogin yes**

(変更後)
**PermitRootLogin no**


sshd_configのバックアップを作成して、バックアップがあるかを確認します。
その後設定を変更して、設定反映をします。

```
# cp -p sshd_config sshd_config_yyyymmdd
# ls -l
# vi /etc/ssh/sshd_config
# systemctl restart sshd.service
```

それでは新しい接続でrootのログインを試してみます。
![ss_003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/d0ed61fe-db1d-d841-709f-e2f5be7d2c39.jpeg)

![ss_006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/c591d626-e60e-3b54-9222-a5a48f82a055.jpeg)

**認証に失敗しました。再試行してください**と表示されてrootにログインすることができなくなりました。
なので、デフォルトでauthorized_keysのオプションによりログインが出来なくなっていて、
そのオプションを削除するとsshd_configにてPermitRootLogin noとなっていないため
rootでログインできることが分かりました。

## 結果

| sshd_config | authorized_keys | 接続可否 |
|:-----------------|------------------:|:------------------:|
| #PermitRootLogin yes | オプション有 | × |
| #PermitRootLogin yes | オプション無 | 〇 |
| PermitRootLogin no | オプション有 | × |
| PermitRootLogin no | オプション無 | × |

sshd_configでPermitRootLogin noと設定した方が良いことが分かる。

## SSH接続Verison 2のみ許可

Tera TermでSSHバージョン(V)を[**SSH1**]を選択して[OK]を押下します。
![ss_000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/c89e8900-23cb-73ef-7415-9e1a325c6b62.jpeg)

![ss_001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510919/1c2bfbc5-d222-dd9e-18c1-77227ada76fe.jpeg)

...
....
.....

＿人人人人人人＿
＞　できない　＜
￣Y^Y^Y^Y^Y^Y^￣

/etc/ssh/sshd_configにはProtocolの設定がなかったが何故だろうと思い調べた所
OpenSSH 7.4でSSH v1は廃止されたとのこと。つまり何もせずともSSH v2となる。
[OpenSSH 7.4/7.4p1 (2016-12-19)](https://www.openssh.com/txt/release-7.4)
> * This release removes server support for the SSH v.1 protocol.

Amazon Linux 2はどのバージョンなのかを確認してみる。

```
# ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
```

OpenSSH 7.4p1でした。


## 結果
OpenSSH_7.4よりSSH v1が廃止されたため、特に何もせずともSSH v2となっていた。

# 終わり
最後にもう一度比較してみたいと思います。

| 推奨値 | 設定値 |  推奨値との比較  |
|:-----------------|------------------:|:------------------:|
| rootログインの禁止   | #PermitRootLogin yes |     〇    |
| チャレンジレスポンス認証  | ChallengeResponseAuthentication no |     〇   |
| 公開鍵認証の許可 | #PubkeyAuthentication yes |     〇    |
| SSH接続Verison 2のみ許可 | 設定見つけられず |     〇    |
| パスワード認証の禁止 | PasswordAuthentication no |     〇    |

初期Amazon Linux 2の設定は何も設定しなくても上記の推奨値に関しては問題ないことが分かった。
知らないことだらけだったためとても勉強になった。