リモートのサーバにSSH接続のための公開鍵を設定する

:::note info
この記事内では、SSHを利用するユーザのノートパソコンなどを**ローカル**、SSHで接続する先のサーバなどを**リモート**と呼称しています。

厳密にはSSHの**クライアント**などと呼ぶのでしょうが、イメージがしやすいようにこの呼称にしています。
:::

## 要約
詳細な説明は記事の先を確認してください。IPアドレスやキーの名前は各自のものに読み替えてください。

```shell:ローカル
cd ~/.ssh
ssh-keygen -f key_test
scp ./key_test.pub リモートのユーザ名@リモートのアドレス:
```

ローカルで`~/.ssh/config`を編集
```shell:ローカルの~/.ssh/config
Host TestServer
    HostName リモートのアドレス
    IdentityFile ~/.ssh/key_test
    User リモートのユーザ名
```

初めて場合のみ

```shell:リモート
cd ~
mkdir .ssh
chmod 700 .ssh

cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
```

初めての場合と追加の場合どちらも

```shell:リモート
cd ~
cat key_test.pub >> ~/.ssh/authorized_keys
rm key_test.pub
```

## 背景
リモートにあるサーバなどにSSHでアクセスする際、認証方法としてパスワードによる認証と公開鍵による認証があります。今まで、研究室の実験用のサーバや個人利用のサーバを利用するにあたって、高セキュリティが求められている訳ではなかったため、設定が簡易だった**パスワード認証**を主に使ってSSHを利用して来ました。ですがこの間、各サーバで公開鍵認証を使えるように設定したので、この機にその方法をまとめておきます。

## 動機
パスワード認証から公開鍵認証に移行する動機として、もちろんセキュリティの向上もありますが、一番は**めんどくさい操作を無くしたい**というのがありました。

というのも、パスワード認証の場合、当たり前ですが毎回パスワードを手作業で入力する必要があります。このパスワード入力の繰り返し作業が面倒でした。

一方、公開鍵認証であれば、設定をしておけばSSH接続時の内部処理でローカルの秘密鍵を使った認証をしてくれるため、**毎回パスワードを入力するというような操作をせずに済みます**。これが楽で嬉しいなと思っていました。

## 手順
### ローカル環境で認証鍵のキーペアを生成する
公開鍵認証に使用するキーペアは、ホームディレクトリの下の`.ssh`フォルダに置かれることが一般的かと思います。`.ssh`フォルダがない場合は、先に`mkdir ~/.ssh`などでフォルダを作成しておいてください。

今回は説明のため、`-f`オプションを使って生成されるキーペアの**ファイル名を指定**しました。

途中、パスフレーズを聞かれるかと思いますが、特に必要がなければ**何も入力せずにエンターを2度押して進めましょう**。

```shell:ローカル
cd ~/.ssh
ssh-keygen -f key_test
```

これで`key_test`と`key_test.pub`という2つのファイルができたかと思います。このうち`key_test.pub`の方が公開鍵で、これからリモートに持ってくものになります。

:::note info
`~/.ssh`の`~`はホームディレクトリの意味で、Windowsなら`C:¥Users¥ユーザ名`、Macなら`/Users/ユーザ名`、Ubuntuなどでは`/home/ユーザ名`のパスに対応します。
ターミナルやPowerShellで`cd ~`のように実行すると、このホームディレクトリに移動できます。
:::

### リモート先に公開鍵をアップロードする
生成した公開鍵をリモートにアップロードします。ファイルの転送には`scp`コマンドを利用します。[`ssh-copy-id`というコマンドをインストールして利用する方法](https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6)もあるようですが、Windowsのデフォルトでは使えないので、ここは基本のLinuxのコマンドのみで進めたいと思います。

```shell:ローカル
cd ~/.ssh
scp ./key_test.pub リモートのユーザ名@リモートのアドレス:

例)
scp ./key_test.pub hoge@192.168.0.1:
```

**scpコマンドの最後のコロン**`:`を見落とさないようにお気をつけください。

これで、リモート先のhogeユーザの**ホームディレクトリ**に、先ほど生成した公開鍵がアップロードされました。ローカルの公開鍵`key_test.pub`は消してしまっても構いません。

### リモート先で公開鍵を認証用に設定する
次にリモート環境で公開鍵を認証用に設定します。リモートに今までのパスワード認証などで接続し、ターミナルで以下を進めます。

**リモート先に初めて公開鍵の設定をする場合**は以下のコマンドを実行します。ホームディレクトリに`.ssh`フォルダを作り、その中に`authorized_keys`というファイルを作成しています。これらは**適切なパーミッションが設定されている必要がある**ので、それぞれ`chmod`コマンドで変更しています。

```shell:リモート
cd ~
mkdir .ssh
chmod 700 .ssh

cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
```

そして、公開鍵の新規登録あるいは追加の場合のどちらにも共通する操作です。以下のコマンドで公開鍵を`~/.ssh/authorized_keys`のファイルに公開鍵を書き込みます。

この`authorized_keys`ファイル内に書かれている公開鍵が、今後、認証で利用される鍵になります。**複数の鍵を登録できるので、追記のリダイレクト**(`>>`)で書き込んでいます。

```shell:リモート
cd ~
cat key_test.pub >> ~/.ssh/authorized_keys
rm key_test.pub
```

### ローカルで公開鍵認証を利用するように設定する
最後に、ローカルでSSH接続時に公開鍵認証を利用するように設定します。特に今回はキーペアのファイル名を変更しているため、どの鍵を使用するかを設定しておかないといけません。

`~/.ssh`フォルダにまだ`config`ファイルがなければ作成します。

```shell:ローカル
cd ~/.ssh
touch config
```

そして、config内に以下のように設定を記述します。

```shell:ローカルの~/.ssh/config
Host 接続先のエイリアス（任意の名前）
    HostName リモートのアドレス
    IdentityFile 秘密鍵のパス
    User リモートのユーザ名

例）
Host TestServer
    HostName 192.168.0.1
    IdentityFile ~/.ssh/key_test
    User hoge
```

これで、ローカルで`ssh TestServer`のように実行し、パスワードを入力せずにログインができるようになっていればOKです。

## 参考

https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432

https://qiita.com/tag1216/items/5d06bad7468f731f590e

https://qiita.com/HamaTech/items/21bb9761f326c4d4aa65

https://qiita.com/lucifer22/items/b60c6f5d7ff2077fe599

https://qiita.com/kazokmr/items/754169cfa996b24fcbf5

https://qiita.com/jinnai73/items/f1822f2e4d567847e215