Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

SSH公開鍵の生成・設定の方法

たかが公開鍵、されど公開鍵。「公開鍵 生成」でググるとたくさん出てくるんだけど、やり方が色々ありすぎて新人に適当に検索させるとあれこれ迷ってしまうので、ここにまとめておきます。

参考記事

公開鍵とは

サーバやGitHubなどのリモートサービスにsshでログインする際、通常のパスワード形式を用いると、パスワードが何らかの理由で漏洩した場合に他人にログインされる危険があります。そしてパスワードは常に漏洩の危険があります。
これに対して公開鍵形式の場合は、パスワードに関連付けられた「鍵と錠前」を生成します。パスワードを知っており、かつ鍵を持っている人のみがログイン可能であるため、よりセキュアになります。
この「鍵と錠前」のことを秘密鍵と公開鍵と呼びます。この二つはセットになっており、同時に生成されます。
公開鍵は錠前なので、ログインしたいサーバ上に置きます。公開鍵は他人に見られてもかまいません。
秘密鍵は鍵なので、自分だけが持っておくものです。他人に見られてはいけません。  

公開鍵の作成方法

ここではLinuxでのやり方に統一します。暗号化方式はRSAを用います。Windows10の場合はWSL、Macの場合はMacターミナル上で作業してください。
Windows10でWSLを未インストールの方は以下を参考にインストールしてください。

【WSL入門】第1回 Windows 10標準Linux環境WSLを始めよう:ITの教室 - @IT

既存の公開鍵が存在するかチェック

公開鍵はデフォルトでは~/.sshに生成・保管されます(~/はホームディレクトリ)。 既に作成済みの公開鍵を上書きしないよう、まずは公開鍵を持っているか調べてみましょう。

$ ls ~/.ssh

RSA形式の場合、秘密鍵id_rsa、公開鍵はid_rsa.pubという名前で保存されています。これらのファイルが無いか、または~/.sshディレクトリ自体が存在しない場合は、公開鍵はまだ生成されていません。

公開鍵・秘密鍵の生成

以下のssh-keygenコマンドで公開鍵と秘密鍵が生成されます。 鍵長はデフォルトの2048で良いのですが、ここではよりセキュアな4096を指定することにします。

$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/rnakato/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/rnakato/.ssh/id_rsa.
Your public key has been saved in /home/rnakato/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:6KfApJsjSs/tj6FPQioHS2MWk4fYlnJXaCp9uowg8Ac rnakato@RyuHomePC
The key's randomart image is:
+---[RSA 4096]----+
|     ..          |
|..o.o.           |
|o*=+.            |
|o+E..  .         |
|oB =. . S        |
|*o*+..           |
|==o+oo. .        |
|=.*o=.oo         |
|o.o=o=o.         |
+----[SHA256]-----+

パスフレーズの入力を求められますが、ここで入力したものがサーバにログインする際のパスワードになります。 サーバ上にあるアカウントのパスワード(sudoなどで利用するもの)とは別であることに注意してください。

パスワードは5文字未満だとエラーになります。しかし空パスワードはOKのようです(謎ですが…)。 当然ですが、空パスワードや容易に推測可能な単純なパスワードは危険ですので、十分複雑なパスワードを指定してください。

終了後再び$ ls ~/.sshを実行し、id_rsaid_rsa.pubが生成されていれば成功です。

公開鍵を使ったログイン

公開鍵の設定自体はサーバサイドで行われるものなので、ユーザの設定は不要です。 サーバ管理者に公開鍵を送付すれば準備OKです。

Linuxシェル上だと、以下のような感じでログインするでしょう。

$ ssh rnakato@hostname

何も指定しなかった場合、秘密鍵~/.ssh/id_rsaが自動的に利用されます。秘密鍵の場所が違ったり、ファイル名が異なる場合は以下のように明示的に指定しましょう。

$ ssh rnakato@hostname -i <秘密鍵>

公開鍵は複数のサーバで共用可能です。その場合すべて同じ秘密鍵とパスワードを用いてログインすることが可能です。 逆に秘密鍵を無くしたりパスワードを忘れて作り直したという場合は、サーバ上の公開鍵もすべて新しいものに更新する必要があります。

秘密鍵パーミッション

秘密鍵は「誰にも見られない」ことが暗黙に想定されているので、秘密鍵パーミッションがオープン過ぎる場合、以下のようなエラーになり、ログインできません。

$ ssh rnakato@hostname
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '/home/rnakato/.ssh/id_rsa' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
bad permissions: ignore key: /home/rnakato/.ssh/.ssh/id_rsa
Permission denied (publickey).

この場合は以下のようにパーミッションを400に変更すればログインできるようになります。

$ chmod 400 ~/.ssh/id_rsa