パスワード無しでsshするための設定

複数台のサーバにLinuxをインストールしたときに、サーバ間でsshするときにいちいちパスワード入力するのが面倒なので、パスワード入力を省略するための設定方法をメモしておきます。

鍵ペアを作成する

ssh-keygenコマンドで秘密鍵と公開鍵の鍵ペアを作成します。以下の例では、暗号化の方式にRSAを指定しています。

[testu1@base0 ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/testu1/.ssh/id_rsa): (リターンだけ入力する)
Created directory '/home/test/testu1/.ssh'.
Enter passphrase (empty for no passphrase): (リターンだけ入力する)
Enter same passphrase again: (リターンだけ入力する)
Your identification has been saved in /home/test/testu1/.ssh/id_rsa
Your public key has been saved in /home/test/testu1/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:LBFGmitvctbTPE82gyYAvgHNcIjtoY/bP2TCjPlMUvA testu1@base0
The key's randomart image is:
+---[RSA 3072]----+
|oo. .+ |
|+=o + . |
|.=+.o . |
|.oE. . o |
| O+ o . S |
|= *=oo + . |
| Bo+= + * = |
|. +=. + = o |
| … . |
+----[SHA256]-----+

このコマンドを実行すると、3箇所入力を求められるところがあります。1つ目は鍵の保管場所ですが、デフォルト($HOME/.ssh)のままで良いので、そのままリターンを入力します。2つ目と3つ目は、秘密鍵を読み出すためのパスワードなのですが、今回はパスワードを入力するのを省略するのが目的なので、ここもそのままリターンを入力します(すなわちパスワード無し)。

鍵の長さを4096bitにしてセキュリティをより強固に

鍵の長さは、デフォルトでは2048bitが選択されます。更に厳しい条件にしたいのであれば、4096bit等を指定して鍵を作成して下さい。

[testu1@base0 ~]$ ssh-keygen -t rsa -b 4096

ssh-keygenコマンドを実行すると、ホームディレクトリの下に .ssh ディレクトリが作成されて、秘密鍵 id_rsa と公開鍵 id_rsa.pub が作成されます。

[testu1@base0 ~]$ ls -al .ssh
total 8
drwx------ 2 testu1 testg 38 Mar 30 09:58 .
drwx------ 5 testu1 testg 118 Mar 30 09:58 ..
-rw------- 1 testu1 testg 2602 Mar 30 09:58 id_rsa
-rw-r--r-- 1 testu1 testg 566 Mar 30 09:58 id_rsa.pub

更にセキュアな ed25519 を使う

最近では、鍵暗号化方式にEd25519 (楕円曲線暗号を基にした鍵アルゴリズムで高速かつ高いセキュリティを有する)が使われることもあります。Ed25519に対応した鍵ペアの作成方法は、以下の通りです。

[testu1@base0 ~]$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/testu1/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/testu1/.ssh/id_ed25519
Your public key has been saved in /home/testu1/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:zavNZqeRsBwR6HFkd8H7TKXs1kIm5acpKnfBNX5bLYI testu1@base0
The key's randomart image is:
+--[ED25519 256]--+
| o+ ..o. |
| o..o .. . .|
| . o. = o |
| . + o X .|
| S oo @ *.|
| . +Eo= @ =|
| o +. = +o|
| .+=.o . |
| .=++ |
+----[SHA256]-----+

Ed255119で作成した鍵ファイルは以下の通りになります。

[testu1@base0 ~]$ ls -al .ssh/
total 8
drwx------ 2 swx swx 69 Nov 23 03:56 .
drwxr-x--- 4 swx swx 137 Nov 18 19:50 ..
-rw------- 1 swx swx 399 Nov 23 03:56 id_ed25519
-rw-r--r-- 1 swx swx 91 Nov 23 03:56 id_ed25519.pub

公開鍵をリモートホストのauthrized_keysにコピーする

例えば、ローカルホスト base0 から リモートホスト ood0 にsshする際に、パスワード無しでログインしたいとします。この場合は、リモートホストood0の $HOME/.ssh/authorized_keys というファイルに、ローカルホスト base0 で作成した公開鍵を登録します。正確な表現で説明すると、パスワード無しで秘密鍵を作成しているので、公開鍵認証でsshログインする際にパスワードが求められない、ということです。

リモートホストood0に、$HOME/.ssh/authorized_keys ファイルが存在しなければ、ローカルホストbase0の公開鍵 id_rsa.pubをコピーすればOKです。既に存在している場合は、

cat id_rsa.pub >> ~/.ssh/authorized_keys

のようにして、ファイルの末尾に追加して下さい。
また、ローカルホスト側からの公開鍵転送とリモートホストのauthorized_keysへの追加を同時に行いたい場合は、以下ローカルホスト側で以下のコマンドを実行してもOKです(この例のユーザ名はtestu1, リモートホストood0のIPアドレスは 192.168.1.204 です)。

[testu1@base0 ~]$ ssh-copy-id -i .ssh/id_rsa.pub testu1@192.168.1.204

フィンガープリントの登録を省略したい

パスワード無しでsshログインできるようになっても、初回のログインで、フィンガープリントを登録しても良いかどうか(yes/no)の入力を求められるのは面倒です。また、リモートホストの $HOME/.ssh/known_hosts に一度登録されると、ローカルホスト側で鍵を変更した場合に、sshログインすることができなくなります。
このような面倒を避けるには、以下のオプションを付けてsshコマンドを実行するのが良いです。これらのオプションを付与すると、リモートホスト側でknown_hostsファイルへのフィンガープリント登録が行われません。

[testu1@base0 ~]$ ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ood0

毎回、このようなオプションを付与するのが面倒なので、私はsshnoというaliasを.bashrcに登録して使っています。

alias sshno='ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null'

ssh接続において、必ずこのオプションを付けるということであれば、~/.ssh/config で以下の設定をしてしまうのが良いかもしれません。

Host *
  StrictHostKeyChecking no
  UserKnownHostsFile    /dev/null
広告主へのリンク
ミニPCのお勧め

おウチでLinuxを勉強するのに、ミニPCはどうですか。
仮想環境(KVM)使えば、仮想マシンを複数起動できますし、とても安価にシステム構築の練習ができます。ミニPCはとっても静かで消費電力も小さいので部屋で常時起動させています。

このブログにおける関連リンク

犬でも分かる sshポートフォワーディング
犬でも分かる sshポートフォーワーディング2: リバーストンネル
犬でも分かるsshのProxyJump

コメント

タイトルとURLをコピーしました