この記事では、SSHサーバーへログインする際のユーザー認証に、公開鍵認証を使うための設定方法を説明します。
SSHの公開鍵認証は、サーバーへのログイン時に秘密鍵と公開鍵のペアを使ってユーザーを認証します。公開鍵はサーバーへ登録し、秘密鍵はユーザーが保管します。ログインの際は、この秘密鍵が必要なので、秘密鍵さえ漏洩しなければサーバーへ不正アクセスされる恐れはありません。万が一秘密鍵が漏洩しても、秘密鍵にパスフレーズが設定されていれば、パスフレーズが解読されるまで不正アクセスを遅らせることもできます。
公開鍵と秘密鍵のペアを作成する
公開鍵認証を利用するには、まず公開鍵と秘密鍵のペアを作成する必要があります。鍵ペアの作成は、ssh-keygenコマンドで行います。引数として鍵の種類を指定することができます。
最近のSSHでは、利用できる鍵の種類としてrsa、dsa、ecdsa、ed25519があります。SSHで公開鍵認証の使い方を紹介しているWebサイトでは、鍵としてRSAを使用しているものも多いですが、今なら鍵としてecdsaやed25519を使うといいでしょう。これらは安全性も高く、鍵長も短くて済みます。個人的にはed25519が良いと思います。
ここではクライアントマシンのtaroユーザーが、SSHサーバーにhanakoユーザーでログインする場合を例に説明します。 まずクライアントマシンでtaroが鍵を作成します。次の例はed25519の鍵ペアを作成します。
$ ssh-keygen -t ed25519
コマンドを実行すると、最初に鍵のファイル名の入力を求められます、 デフォルトのファイル名(/Users/taro/.ssh/id_ed25519)とする場合は何も入力せずにEnterを押します。 変更する場合はファイルパスを指定します。
Enter file in which to save the key (/Users/taro/.ssh/id_ed25519):
次にパスフレーズの入力を求められます。何も入力せずにEnterを押すと空のパスフレーズで鍵が作成されます。 セキュリティのためにパスフレーズは設定した方が良いでしょう。
Enter passphrase (empty for no passphrase): Enter same passphrase again:
以下はデフォルトのファイル名で作成した場合の鍵ファイルです。pubが付いているのが公開鍵で、付いていない方が秘密鍵です。
$ ls -l .ssh/id_ed25519* -rw-------. 1 taro taro 444 Apr 24 00:04 .ssh/id_ed25519 -rw-r--r--. 1 taro taro 93 Apr 24 00:04 .ssh/id_ed25519.pub
秘密鍵は、誤って書き換えてしまわないように、パーミッションを400に設定しておきます。
$ chmod 400 .ssh/id_ed25519
公開鍵をSSHサーバへ登録する
ssh-copy-idコマンドを使った公開鍵の登録
次に公開鍵をSSHサーバへ登録します。登録はssh-copy-idコマンドを使うのが簡単です。 登録する公開鍵(.ssh/id_ed25519.pub)およびログインするユーザ(hanako)とサーバー(foo.example.com)を次のように指定します。
$ ssh-copy-id -i .ssh/id_ed25519.pub hanako@foo.example.com
コマンドを実行するとパスワードの入力が求めれますので、hanakoのパスワードの入力します。 処理が成功すれば登録完了です。
これで公開鍵認証の設定は終了です。SSHで接続してみましょう。次のように秘密鍵のパスフレーズが尋ねられるので、設定したパスフレーズを入力するとログインできます。
$ ssh hanako@foo.example.com Enter passphrase for key '/home/taro/.ssh/id_ed25519':
手動で公開鍵を登録する
ssh-copy-idコマンドを使わなくても公開鍵は登録することができます。 ここでは手動で公開鍵を登録する方法を見ていきます。 ssh-copy-idコマンドが実際どのようなことを実施しているかわかり、トラブルシューティングにも役立つでしょう。
まず、SSHサーバーに公開鍵を転送します。ここではhanakoのホームディレクトリに転送します。
$ scp .ssh/id_ed25519.pub hanako@foo.example.com:
次に、SSHサーバーにhanakoでログインして作業をします。 公開鍵はログインするユーザー(この例ではhanako)のホームディレクトリ内の「.ssh/authorized_keysファイル」に登録します。 hanakoのホームディレクトリに.sshディレクトリが存在しない場合はパーミッション700で作成します。
$ cd $ mkdir -m 700 .ssh $ cat id_ed25519.pub >> .ssh/authorized_keys $ chmod 600 .ssh/authorized_keys $ rm id_ed25519.pub
公開鍵は次のコマンド部分でauthorized_keysファイルに(もしファイルがなければ新規作成されて)追記されます。
$ cat id_ed25519.pub >> .ssh/authorized_keys
その後、authorized_keysファイルは第三者が書き込みできないようにパーミッションを600に設定しておきます。 公開鍵ファイルはもう必要ないので最後に削除します。
作成後のファイルは以下の通りです。
$ ls -ld .ssh drwx------. 2 hanako hanako 29 Apr 24 00:16 .ssh $ ls -l .ssh/authorized_keys -rw-------. 1 hanako hanako 93 Apr 24 00:16 .ssh/authorized_keys
これで登録は完了なので、いったんログアウトしてから再度ログインしてみましょう。
公開鍵の登録削除
authorized_keysには、1つの公開鍵が1行に登録されます。 したがって、登録した公開鍵を削除するにはauthorized_keysの該当の行を削除するだけです。 エディタなどでauthorized_keysを開いて削除したい公開鍵の行を削除します。
sshd_configの設定
SSHサーバーに公開鍵認証を使ってログインするには、サーバー側で公開鍵認証を使うように設定されていなければなりません。 デフォルトでは公開鍵認証を使用するように設定されてますが、うまくいかない場合は設定を確認してください。
SSHサーバーの設定ファイル/etc/ssh/sshd_configで「PubkeyAuthentication」が明示的にnoに設定されている場合、公開鍵認証は使われません。 明示的にyesに設定されているか、PubkeyAuthenticationの設定自体がない場合(その時のデフォルト値はyes)、公開鍵認証が使われます。
PubkeyAuthentication yes
公開鍵認証を設定した後のSSHサーバーの設定変更
SSHサーバーへ公開鍵認証でログインできるようになりましたが、この後は要件に合わせてSSHサーバーの設定を見直しましょう。
例えば、SSHサーバーへのログインを公開鍵認証だけに限定するため、パスワード認証のログインを禁止したり、rootユーザーでのログインを禁止したりします。このような設定については「SSHサーバーのセキュリティ強化のため最低限設定しておくべきもの」で紹介しています。
おわりに
一般に公開鍵認証はパスワード認証より安全と認知されています。誤解のないよういうとパスワード認証のセキュリティが決して低いわけではありません。パスワードが漏洩しないようにきちんと管理し、十分な強度のパスワードを設定すればセキュリティは非常に高くなります。しかし、利便性を優先するなどで、なかなか十分な対応ができていないことも多いので、世間的にはパスワード認証のセキュリティは低いと思われているのだと思います。
一方、公開鍵認証を利用していれば必ずしも安全というわけではないことも心に留めておいた方が良いでしょう。公開鍵暗号方式の重要なファクターとしてアルゴリズムと鍵長があります。ハードウェアの向上により、今は安全であるアルゴリズムも安全とは言えなくなる日がきます。アルゴリズムに脆弱性が見つかることもあります。鍵長も長いほど安全ですが、同じ理由により未来永劫安全なわけではありません。また、鍵長を長くするとパフォーマンスへの影響も懸念されます。