多数のマシン間の相互接続用にたくさんの公開鍵と秘密鍵を作成し管理する

**パスワード認証よりも便利で安全な公開鍵認証によるSSH接続。linux・Windowsマシンからlinuxサーバ・githubへのログインができるようにするための準備の手順をまとめる。**

わかってしまえば難しいことではないが、鍵の形式がいくつもあったり、どれをコピーするんだったか混乱したり、慣れていないとそれなりに迷うところが多いのが鍵周りの準備作業である。とくに接続先がいくつもあったりすると、鍵の管理にもちょっとしたコツがいる。

ここでは、以下に述べる前提と方針の元で、各クライアントマシンとサーバで何をすべきなのかを簡潔かつ包括的に述べる。


# 前提

* 接続先とするマシン、接続元となるマシンがそれぞれ複数台ある。
* 接続先の一つはgithubである。
* github以外の接続先は全てOpenSSHが使えるlinux機である。
* 接続元にはlinux機とwindows10機がある。

# 方針

* 接続元：先＝複数：複数となり、多数の鍵ファイルの管理が必要となるため、それぞれのファイル名は`接続元マシン名-接続先マシン名`で統一することにする[^1]。
* 原則として接続元側で鍵ファイル生成作業を行なう。
* 可能な限り鍵の暗号化形式としてed25519を採用する。
* ログインやマシン間ファイルコピーを簡単に行うため、またcronを使ったマシン間のファイルバックアップ自動化の必要性に鑑み、パスフレーズの都度入力を要しない鍵作成を行う。

秘密鍵は厳重な管理が必要で、みだりにコピーしたり移動したりすべきものではない。作ったその場所に静置しておくべきである。したがって、ホスト側ではなくクライアント（接続元のマシン）で鍵作成を行い、公開鍵のみをホスト側に渡してあげるのが理にかなっている。

暗号化方式はいろいろある。2020年現在最強最新の方式はed25519らしいので、可能な限りこれを選択する。しかし古いバージョンのOpenSSHでは使えないこともあるようだ。その場合はECDSAを、それもダメならRSAを試してみる。DSAは避けたほうが良い。

パスフレーズを設定したほうがセキュリティが強固になることは確かだろう。だが、ログインを試みる都度タイプを強制されるのは面倒だ。それに「盗聴」を気にするなら結局パスワードと同じことになってしまうではないか。さらに、rsyncを使ったマシン間での無人定期バックアップなどが困難になる。これは多数のマシンを同時かつ連携的な運用したいとき致命的な欠点である。そこで、パスフレーズは一切使わないことを方針とする。

# 鍵の作成

## linux機で作成

接続元となるマシン上でコマンド`ssh-keygen`を使って秘密鍵・公開鍵のペアを作る。

```
cd ~/.ssh
ssh-keygen -t ed25519 -f mini-github 
```
この例は、`mini`と名付けられている小型linux機とgithubとでデータ共有しようとしている状況を示している。`-f`オプションで鍵ファイルの名前を指定する。前述のように`接続元ー接続先`を原則とする。

途中でパスフレーズの入力などを求められるが、前述の方針に従い、何も入力せずにただリターンを押して先に進む。

上記の操作で、いま手元に2つの鍵ファイルができているはず。

ここで公開鍵の実体を今一度確認しよう。`.pub`という拡張子がついている方だ。こちらをサーバ側にコピーする。sftpを使ってファイル転送する手もあるが、「コピペ」の方が手っ取り早いだろう。

拡張子がついていないのが秘密鍵で、これは作ったところにできるだけ触らないようにおいておく。

## windows機で作成

筆者はwindows機上のSSHクライアントとして[RLogin](http://nanno.dip.jp/softlib/man/rlogin/)を愛用している。タブブラウザ式に複数の接続先画面を切り替えられるところがいい。

Rloginは鍵作成機能を内蔵しており、マウスでメニューを選択していけば簡単に鍵ファイルのペアが作れる。

まずServer Select → 左側のメニューから、サーバー → プロトコルを選択。
画面中の「認証キー」ボタンをクリックする。

![rlogin_keygen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/6eccf271-055e-7860-63cc-2f5244ac7480.png)

すると、鍵のタイプその他が選択できる画面に至る。鍵ファイルの名前はこの画面の「任意の名前が指定できます」の項で設定する。

![rlogin_keygen2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/c6f03a90-f62c-7a21-c611-de8cbdccb928.png)

「任意の名前で…」のところは前述の通り`接続元ー接続先マシン名`にしておこう。署名方式など今一度確認の上、作成ボタンをクリックする。

パスフレーズ入力の画面になる。前述の通り空欄にしたままOKボタンを押す。

ひとつ前の前の画面に戻るが、今新しく作った認証キーの表示が一番上に追加されているのが分かるはずだ。
この新しいキーが選択されている状態で「公開鍵」ボタンをクリックすると、公開鍵の内容確認の窓が出現する。

OKボタンを押せばその公開鍵の内容がクリップボードに入る。

![1_240511a.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/66bf390c-29a2-a7f2-e48b-c60a1e63166a.png)

## linuxサーバへのコピー

公開鍵の内容は、~/.ssh/authorized_keysの中に、一行一鍵の形式で追記していく。

0. 作成元がlinuxの場合、端末ソフトを開き、`less hoge.pub`などと実行して公開鍵の内容を表示する[^2]。windowsの場合はDOS窓で`type hoge.pub`するか、エディタで当該公開鍵ファイルを開く。
1. 公開鍵の内容をマウスでドラッグして選択しコピーする。
0. 転送先linuxサーバの`~/.ssh/authorized_keys`をエディタで開く。
0. 上でコピーしたテキストをファイルの末尾にペーストする。

[^2]: もちろん表示できさえすればlessでもcatでもエディタでも何でもいい。

## githubへのコピー

公開鍵を作ってその内容をコピーするところまでは前述の「サーバへのコピー」と同じ要領で進める。

ブラウザを開いてgithubにログインし、画面右上のアイコンをクリックすると、プルダウンメニューが現れる。そこから、settings → SSH and GPG keys と進む。

![github-key2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383429/003970a7-97d2-23f4-65ff-4133c5d2d5a3.png)

new SSH keyをクリックすると、鍵の新規登録のページに至る。さきほどコピーした内容を貼り付け、わかりやすい名前（普通は鍵ファイル名でいいだろう）をつけて保存する。

# おわりに

以上で、お使いのマシン間で自由にログインができるようになるはず。

次は.ssh/confをいじって更に簡単にログインができるようにしてみるといいだろう。`ssh`コマンドによるリモートマシンの直接的遠隔操作や、マシン間のファイル転送が、非常にスムーズにできるようになる。

[^1]: 例えば手元のマシンがmylinuxで接続先がgithubであれば、公開鍵ファイルは`mylinux-github.pub`となる。