SSH接続　WinからRaspberryPi　最低限のラズパイセキュリティ設定等

### 背景
---
RaspberryPiを使う時、メインPCのディスプレイに繋ぐと切り替えだったりが面倒するので、
多くの場合はリモートデスクトップやVNC等で無線接続して使うことが多いと思います。

ただ、VNC等のGUIでの接続だと動きが遅かったり、解像度の関係で見えにくい場合があるので、
簡単な操作の場合はCUIで接続できると便利です。

というわけで今回はSSHでのCUI接続の覚書です。

### なぜSSH
---
CUIでの接続はSSH以外にもTelnetやrlogin等があるが、通信の暗号化やサーバー認証がされないため、基本SSHが安全で代表的なCUIでの接続手段になる。

しかもWin10もRaspberryPi4にも最初からSSHが使えるから手軽だ。

そういえばWin10では何も考えずにSSHが使えていたけど、最初から使えたっけ？
と思って調べてみたら2017年のWindows10 Updateで公式にSSHがサポートされるようになった様。

下記引用(https://softantenna.com/blog/windows-10-fall-creators-upadte-open-ssh-support/)

### 環境
---
・RaspberryPi4
・Win10のPC
（同じローカルネットワーク内に接続されている）

### まずはラズパイのセキュリティ対策
---
RaspberryPiの初期SSHポートは22になっており、IPが割れると接続されてしまうので、変更しておきます。

ラズパイ側で下記コマンドを実行。
（もしくは、WinPCから下記SSH接続コマンドでPort 22に接続して設定もOK）
```
$sudo nano /etc/ssh/sshd_config
```

```
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

#Port 22 これを＃外して任意のPortに変更
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
```

再起動します。
```
$ reboot
```

WinPCから接続できることを確認
```
$ssh 「ラズパイのユーザー名」@「ラズパイのIP」 -p 「設定したSSHポート番号」

(Ex:ssh pi@192.168.000.000 -p 22)
```
確認できたら下記コマンドで終了
```
$ exit
```

### SSH公開鍵認証とは
---
前でやった通り基本SSHではパスワード認証ですが、
パスワードがバレたり盗まれる可能性があるので、
公開鍵認証方式といった、カギを所持しているかの判定をする認証方式が推奨されています。

要はパスワードを盗んだ誰かがアクセスしようとしても、その人のPCにカギが無ければアクセスさせないという方式です。

基本攻撃する側は、力業で片っ端から接続トライを自動実行するような総当たり攻撃をしているので、
公開鍵認証であれば、少なくとも誰かのターゲットにされない限りは安心できそうです。

後は、SSH公開鍵認証の際にパスワードを設定しないこともできますので、接続を楽にしたい場合等にも用いられます。

### 公開鍵認証の設定方法：クライアント側（Win10）
---
まずクライアント側のPC(Win10)で鍵を作成します。
基本はUsers/.ssh以下に置くので、今回も下記コマンドで鍵を置くディレクトリを作成します。
```
$ mkdir ~/.ssh/raspberrypi
```
rsa方式で鍵を作成します。
```
$ ssh-keygen -t rsa
```
下記のように聞いてくるので、先ほど作成したraspberrypiのディレクトリを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2510530/1b088b0c-ca58-9fdf-f0f1-f8b095d631ff.png)

その後パスワードなどを設定すると(しなくても大丈夫です。接続を楽にしたい場合は無しで)、無事".ssh/raspberrypi"配下に

`秘密鍵：id_rsa`
`公開鍵：id_rsa.pub`

が生成されますので、下記のコマンドで公開鍵の`id_rsa.pub`をraspberryPiの方に送ります。
この時はまだ公開鍵認証設定をしていないので、普通にssh接続の際にパスワードが聞かれます。
この時はパスワードで普通に承認してください。
```shell_session
$ scp -P 「Port番号」 ~/.ssh/raspberrypi/id_rsa.pub pi@192.168.000.000:~
```
最後にSSHをする際にどの鍵を読み込むかを設定します。
設定ファイルは`~/.ssh/config`にあります。
(ない場合はsshディレクトリ直下に作成してください)
```
Host my_raspberrypi
  HostName raspberrypi
  User pi
  IdentityFile ~/.ssh/raspberrypi/id_rsa
```
この後のホスト側の設定が終わった後`my_raspberrypi`の名前でSSH接続できるようになります。


### 公開鍵認証の設定方法：ホスト側（raspberrypi）
---
ここからホスト側（raspberrypi）での操作になります。
先ほどルートディレクトリに公開鍵をコピーしたので、然るべき場所へ移動させ、鍵を使う設定を行います。

まずは接続
```shell_session
$ ssh pi@192.168.000.000 -p 「さっき設定したPort番号」
```
次にssh公開鍵を管理するディレクトリを作成
```shell_session
$ sudo mkdir ~/.ssh/authorized_keys
```
そこに先ほどルートディレクトリにコピーされている公開鍵をコピー
```shell_session
$ mv ~/id_rsa.pub ~/.ssh/authorized_keys
```
SSH接続で鍵を使う場合は、ディレクトリへの権限設定が必要になるため、下記の通り設定します。
```shell_session
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
```
最後にsshd_configを設定変更して、sshの鍵接続を有効にします。
```
$ sudo vi /etc/ssh/sshd_config

下記の行の＃を外して公開鍵認証を有効化します。
#AuthorizedKeysFile      .ssh/authorized_keys .ssh/authorized_keys2

また、下記の行で＃を外してyes -> noとすれば、パスワード認証をOffに出来ます。
#PasswordAuthentication yes
```
あとは設定を反映させるために下記コマンドを実行すれば完了です。
```
$ sudo /etc/init.d/ssh restart
```

### 公開鍵認証で接続（win10）
---
下記コマンドで実際にSSH公開鍵認証で接続してみます。
```shell-session
$ ssh my_raspberrypi
```

無事入れましたでしょうか？
以上で公開鍵認証を使った、Win10からRaspberryPiへの接続でした。
読んでいただいた方、ここまでお付き合い頂きありがとうございます！