公開鍵認証方式を使ってパスワード無しにsshでログインする

UNIX

サーバーにログインする際などに利用する ssh ですが、telnet や rlogin と比べて単にセキュアにログインできるだけではありません。色々と便利な機能があるうちの一つに、パスワード無しでログインできるものがあります。

認証方式について

ssh を使っていると、rlogin と同じようにユーザ名とパスワードでログインすることも結構あります。しかし ssh の主な認証方式はあくまでも公開鍵を用いた方式(publickey)となります。

RFC4252的には、公開鍵を用いた方式(publickey)がMUSTで、パスワードを用いた方式(password)がSHOULDです。

方式が複数あるとどれがセキュアなのという議論になりがちですが、実はどちらも一緒です。

パスワードは送られるとき暗号化されていますが、サーバーでは平文に変換されます。もしサーバーがハッキングされているのであればパスワードが盗まれてしまう可能性もあるかもしれません。しかしハッキングされているくらいなら、すでにパスワードが守るべきデータが盗まれている状況なので、平文の期間は問題にする必要はないでしょう。

公開鍵認証方式について

ssh の公開鍵認証方式では、クライアント側においてある秘密鍵を使って、接続ごとに異なるセッション識別子を含むデータに署名をして、サーバーに送りつけます。サーバーはすでに置いてある公開鍵を使って署名が正しいか検証を行い、正しければ認証します。

秘密鍵と公開鍵の準備

秘密鍵と公開鍵を生成するのは、ssh-keygen でできます。

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/foo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/foo/.ssh/id_rsa.
Your public key has been saved in /home/foo/.ssh/id_rsa.pub.
The key fingerprint is:
87:33:f0:11:f0:14:8b:29:30:36:ca:e4:cb:a5:ac:04 foo@bar
The key's randomart image is:
+--[ RSA 2048]----+
| .=   ..+.       |
|+o +   = o       |
|Eo .. + +        |
|+ +  . o o       |
| *      S .      |
|o        +       |
|.                |
|                 |
|                 |
+-----------------+

オプションは色々ありますが、基本的にデフォルトのRSA-2048で十分です。

暗号化タイプは、RSA以外にも、DSA、ECDSA、ED25519が選択できます。暗号化タイプだけをみると、強いのはエドワーズ曲線デジタル署名アルゴリズムのED25519でしょう。

ビット数は暗号化タイプによって異なりますが、RSAの場合は、768bits以上が設定可能です。2048bitsあれば計算量的安全な範囲です。ED25519は256bitsのみです。

ビット数まで含めると、ED25519よりもRSA-4096のほうが強度的には強いです。でも繰り返しですが、RSA-2048で十分解読不能な範囲です。

パスフレーズについて

鍵を作るときにパスフレーズを要求されるのですが、何も入力しなければパスフレーズなしになります。

このパスフレーズは秘密鍵を読み込むときに必要になります。ワードではなくフレーズですので、比較的長い文字列も入力可能です。

パスフレーズを設定しない

ここまできてやっと本題ですが、パスフレーズを設定していると秘密鍵を読み込むときにパスフレーズが必要になるので、ssh でログインする際にサーバー側のパスワードではなく、秘密鍵のパスフレーズの入力をすることになります。

とういうことで、秘密鍵が安全な場所においてある前提で、いちいちパスフレーズを入力することが面倒であるのであれば、パスフレーズを設定しないほうが良いです。

公開鍵を転送する

公開鍵認証してログインする先のサーバーに、公開鍵を置いておかなくてはいけませんが、公開鍵を転送するのは以下のコマンドでできます。

# ssh-copy-id foo@baz

これで、bazというサーバーのユーザーfooのホームにある、.ssh/authorized_keysに公開鍵が安全に登録されます。

パスワード無しにログインしてみる

以上でパスワード無しでログインできるようになっています。

# ssh foo@baz

どうしても秘密鍵にパスフレーズを設定したい場合

秘密鍵にパスフレーズが設定されていないと落ち着かない環境の場合は、秘密鍵にパスフレーズをつけてもパスワード無しでログインする方法もあります。

その場合、ssh-addでssh-agentに鍵を登録して、ssh-agentを起動しておきます。

# ssh-add ~/.ssh/id_rsa
# eval `ssh-agent`

これをセッション起動のスクリプトのどこかに記述しておけば良いです。

まとめ

ssh でパスワードを入力したくない場合は、秘密鍵のパスフレーズを空にして秘密鍵と公開鍵を生成して、公開鍵をサーバーにコピーして公開鍵認証方式を用います。秘密鍵のパスフレーズが設定されていると、ログイン時にパスフレーズが要求されますので、設定しないことです。

どうしても秘密鍵のパスフレーズを設定したいのであれば、ssh-agentを使ってください。

コメント