ssh　公開鍵認証方式のやり方

今回，ubuntuでノートパソコンからデスクトップパソコンにリモート接続するための方法をメモとして作成しました．

以下4つのサイトを主に参考にさせて頂きました．
[公開鍵認証でssh接続するための設定手順](https://www.virment.com/how-to-connect-to-server-by-ssh-with-publickey/)
[SSHは22番ポートで通信しちゃダメ！ポート変更してVPSサーバーの安全を守ろう！](https://www.braveryk7.com/change-22-port/)
[configを書くことでsshを便利で簡単にしよう！](https://koejima.com/archives/583/)
[SSHでリモートホストに接続する前にやっておくと便利なことは？ ssh-keygenコマンド](https://www.atmarkit.co.jp/ait/articles/1503/20/news007.html)
作成して頂いた方々，ありがとうございました．
また，ここでは詳しい説明を省かせて頂きます．

## クライアント側(ノートパソコン)の作業
初めに公開鍵と秘密鍵を作成するための準備をします．(もしsshがインストールされていない場合はクライアント側とサーバー側の両方をしてください．) 
.sshディレクトリは初期で入っている方もいるかもしれません．(自分はそうでした)
chmod で権限を700に設定します．
cd .ssh　で.sshのディレクトリに入ります．

```
$ mkdir .ssh
$ chmod 700 .ssh/
$ cd .ssh
```

権限が700になっていることを確認してください．ディレクトリの確認方法は以下になります．

```
$ ls -al ~/
```

権限変更(700)が正しい場合はこのようになります．

```
drwx------  27 xxx   staff    864 12 20 10:43 .ssh
```

間違っている場合はこのような例になります．

```
drwxr--r--  27 xxx   staff    864 12 20 10:43 .ssh
```


---

.ssh/に入っていることを確認してから公開鍵と暗号鍵を作成します．コードは以下になります．
オプションの -t　は鍵タイプを指定しています．-b は鍵の長さを指定しており，4096bitです．

```
$ ssh-keygen -t rsa -b 4096
```
上のコードを入力するとディレクトリの名前を決定するように指示がでます．何も書かずEnterを押すと，デフォルトでid_rsaという名前になります．

```
$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
```

その後，パスワードの設定になります．確認も一度あります．

```
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

パスワード設定後に~/.sshの中に

```
$ ls
id_rsa id_rsa.pub
```

これがあれば大丈夫です．また，秘密鍵のid_rsaの権限が600になっていることを確認します．
400でも大丈夫だそうです．

```
$ ls -al ~/
```

* 正しい場合(600)
* 
```
-rw-------  1 xxx  staff  1823 12  6 18:15 /Users/xxx/.ssh/id_rsa
```

* 間違っている場合(例)
* 
```
drwxr--r--  1 xxx  staff  1823 12  6 18:15 /Users/xxx/.ssh/id_rsa
```


---

次に，公開鍵id_rsa.pubの中身を、サーバ側に登録します。cat で中身を確認して
メモ帳などにコピーしてください．(下のものは例ですので自分の公開鍵をコピーしてください)

```
$ cat id_rsa.pub
ssh-rsa AAAAAAAACCCCDDDDDDfaljetlame/kgwae/A:Fp:ePEI:TJP"e'ptoi/pRpydAbTfWLAF:pikp;i;jugYgywriYWVRIYQWRKQlirkg,w;reg;ogleowvdgvbiuqceqLuSFyS08r/Glmak8YwyufYrF29CXajV+ZxcnG/OLoPstHEi1ENrP8JhbaJose0EDvL4V1AW9ITG+dgmyqtFf4okzP6xZru16sbSin9YH46KeAMVdV07DBACXnF/o0zbi4rekLeuBSqfu11SK8u7O0MFoXQLXkBKjlKv+NHddAHzzhbymyX3ieuuvDkAp1SG2oXF/mH8VQCdUNA70Ff3D+8byIdUQN8oK+j1pfz/p1Jr1d1NGR5c+frnAgjACEyaQcSe8adQmCU+aETKQmaweorjtawp0rg000q0qpwifoqw0w-- username@mypc
```

## サーバー側(デスクトップ)の作業
.sshというディレクトリを作成して権限を700に設定します．権限の確認は上記で説明した方法で行なえます．

```
$ mkdir .ssh
$ chmod 700 .ssh/
$ cd .ssh
```

.ssh/の中にauthorized_keysというファイルを作成します．私はemacsというエディタで行いました．

```
$ emacs authorized_keys
```

そして，authorized_keysファイルの中に，先程クライアント側で作成した公開鍵id_rsa.pubの中身をペーストします．usbメモリーなどで持ってきてください．複数公開鍵を登録したい場合は改行して別のものをペーストします．
また，authorized_keysの権限を600に設定します．

```
chmod 600 authorized_keys
```

以上でリモート接続する準備は終了です．

## ssh接続できるか確認
クライアント側からサーバにssh接続します．以下のコマンドで接続します．ディレクトリは.sshに入って行います．

```
$ ssh -i id_rsa vpsusername@xxx.xxx.xxx.xxx
```

サーバ側に登録済のユーザ名vpsusernameとサーバのIPアドレスxxx.xxx.xxx.xxxが必要です．
-i id_rsaで秘密鍵を使って公開鍵認証によるssh接続を指定しています。
もしssh-keygenでの秘密鍵の作成時にパスフレーズを設定した場合は入力してください．
## configに書き込みssh接続を省略(クライアント側)
オプションをつけていると面倒くさいので省略します.
~/.sshの中にconfigファイルを作成します．
configには

```
Host name
  HostName xxx.xxx.xxx.xxx
  Port 22
  IdentityFile ~/.ssh/id_rsa
  User vpsusername
```

このような感じで書くと

```
$ ssh name
```

でオプションをつけずにリモート接続できます．(複数のサーバ側を登録することもできます)
## ポート番号変更(サーバー側)
デフォルトのポート番号22では危険ですので変更します．ポート番号は使用されていないものにしてください．
ポート番号は0~65535番まで存在しています．
例：
21番（FTP）
22番（SSH）
25番（SMTP）
80番（HTTP）
110番（POP3）
123番（NTP）

1023番以下は既に使われている物が多く、1023番以上、65535番以下にするのが良いかもしれません．ポート番号が空いているか調べるにはlsofコマンドで出来ます．また，wikipediaなどにも載ってあります．


---

話がそれましたが，/etc/ssh/sshd_configがsshの設定ファイルです．

```
$ sudo emacs /etc/ssh/sshd_config
```

以下のように変更してください．

```
#（変更前）
# Port 22
# （変更後）
Port 10022 
```

sshd_config変更後は以下でsshを再起動します．

```
$ sudo systemctl restart ssh
```
これで変更が完了しました.