SSHで鍵認証するための秘密鍵・公開鍵ペアを作成する方法

公開鍵の暗号方式、どれを使うか?

SSHで使える公開鍵の暗号方式は「RSA」「DSA」「ECDSA」「EdDSA」があります。

結果から書くと、互換性を重視するならばRSA(2048bit、4096bit)がトラブルがなく利用できます。特にこだわりがなければRSAがいいでしょう(RSAはSSHで鍵を作成する際のデフォルトの公開鍵暗号方式です)。

セキュリティを重視するのであればEdDSAがおすすめです。

DSAはセキュリティが完全ではないためOpenSSH 7.0から無効化されています。ECDSAはDSAと比較して暗号的にセキュリティレベルが向上しているわけではないため、利用は推奨しません。

将来的に公開鍵暗号方式の主流は「RSA」から「EdDSA」に移行する予定です。

公開鍵の作成方法

現時点で一番安定して利用できるRSAと将来的に有望なEdDSAでの公開鍵の作成方法を解説します。

パスフレーズは省略できますが、強固なパスフレーズを設定することをおすすめします。

RSA

RSAは現時点でスタンダードな暗号化方式なのでオプションを付けずにssh-keygenコマンドを実行するとRSAで公開鍵と秘密鍵のペアが作成されます。明示的にRSAを指定する場合は-t rsaオプションを使います。RSAの場合は2048bitもしくは4096bitの鍵長を指定しましょう。

4096bitのRSA鍵を作成する場合はssh-keygen -t rsa -b 4096を実行します。

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

ファイル名を変更していない場合は秘密鍵が「~/.ssh/id_rsa」、公開鍵が「~/.ssh/id_rsa.pub」というファイル名で作成されます。

EdDSA

よりセキュアな鍵を作成したい場合はEdDSAを使います。EdDSAで鍵を作成する場合は-t ed25519で公開鍵の暗号化方式を指定します。

ssh-keygen -t ed25519を実行して鍵を作成してみます。

[root@rocky9 ~]# ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:V4eUr6zahaaBkNJ00ldjAm09fkxT2ymZ9SAaLeXcXQM root@rocky9
The key's randomart image is:
+--[ED25519 256]--+
|      .o..=o+E+o.|
|     .  o++B=++==|
|    o o....==*+.+|
|   o + .  ..o.o  |
|  . +   S .o .   |
|   . . . . .o    |
|      . . o..    |
|         =..     |
|        o..      |
+----[SHA256]-----+
[root@rocky9 ~]#

ファイル名を変更していない場合は秘密鍵が「~/.ssh/id_ed25519」、公開鍵が「~/.ssh/id_ed25519.pub」というファイル名で作成されます。

鍵認証でログインする準備

鍵認証でログインしたい場合はリモートログイン先の.ssh/authorized_keysに公開鍵を追加する必要があります。

公開鍵認証はセキュアという印象が強いのですが(そのように解説している方もいらっしゃいます)、鍵を盗まれたりWEBアプリケーションの脆弱性などで攻撃者が.ssh/authorized_keysに自分の公開鍵を追加した場合は簡単に侵入を許してしまうので注意してください。

個人的には強固なパスワード、もしくは二要素認証を取り入れた上で公開鍵認証を無効化した方がセキュアだと思います。

不審な鍵、見覚えのない鍵が追加されていないか定期的にチェックしましょう。

ssh-copy-idコマンドを使う

手動で追加しても良いのですが、現在リモートログインできる場合はssh-copy-idコマンドを使うと安全に.ssh/authorized_keysへ公開鍵を追加できます。

[foo@rocky9 ~]$ ssh-copy-id 192.168.0.3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/foo/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
foo@192.168.0.3's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.0.3'"
and check to make sure that only the key(s) you wanted were added.

[foo@rocky9 ~]$

ユーザー名を指定したい場合はssh-copy-id username@192.168.0.3のようにユーザー名を指定します(「@」の前の箇所がユーザー名の指定箇所)。

また、鍵を指定したい場合は-iオプションで指定します。ファイル名に「.pub」を付けない場合は自動的に「.pub」が付加されます。

[foo@rocky9 ~]$ ssh-copy-id -i .ssh/id_ed25519 192.168.0.3
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
foo@192.168.0.3's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.0.3'"
and check to make sure that only the key(s) you wanted were added.

[foo@rocky9 ~]$

-iオプションは公開鍵のファイル名が「秘密鍵ファイル名.pub」という命名規則を想定しているため、この命名規則に沿わないファイル名の場合は-iオプションの実行は失敗します。

手動で.ssh/authorized_keysに公開鍵を追加する

手動で公開鍵をリモートログイン先の.ssh/authorized_keysに追加することも可能です。ファイルが存在しない場合は新規に作成します。

注意点として.ssh/authorized_keysのパーミッションは600に設定しておきましょう。620622660662666のように自分以外のユーザーが書き込み可能な状態であると鍵認証は無効化されます。

まとめ

ssh用の鍵を作成する場合は面倒でも強固なパスフレーズを設定しましょう。

ログインを楽にするためにパスフレーズなしの鍵を作成している環境を知っていますが、これは非常に危険です。また、弱いパスフレーズも注意が必要です。

秘密鍵が漏れた場合、弱いパスフレーズはパスワードクラッカーを動作させることによって比較的簡単に特定されますので、強固なパスフレーズで鍵を守ってください。