SSHでリモートサーバーに接続するときの認証方法には、公開鍵認証とパスワード認証の2種類があります。
この記事では、公開鍵認証の方法について解説します。初期設定はちょっと面倒で敬遠されがちだけどデキるエンジニアはみんな使っているといわれています。キーペアの作成から、ログインのしかた、SSHの設定まで、すべて網羅しております。
公開鍵認証とパスワード認証の違い
公開鍵認証 | パスワード認証 | |
---|---|---|
初期設定 | ちょっと面倒 | 不要 |
ログインの簡単さ | 簡単 | パスワードの入力が必要 |
セキュリティ | 高い | 場合による |
公開鍵認証を使用する場合は、最初に公開鍵と秘密鍵のキーペアを作成する必要があります。これがちょいと面倒で、公開鍵認証を敬遠する人もいると思いますが、それさえ乗り越えれば、ログインの簡単さ、セキュリティともに、パスワード認証よりも優れています。
パスワード認証は、接続のたびにパスワードを入力する必要がありますが、公開鍵認証はその必要がありません(ただし、パスフレーズを設定した場合はパスフレーズの入力が必要です)。
パスワード認証は、他者によって推測可能なクソパスワードだった場合に、簡単に不正アクセスされてしまいます。一方、公開鍵認証の場合、鍵を他者が推測することはほぼ不可能なのでセキュリティが高いといえます。つまり、アホなお前が考えた覚えやすいパスワードと、コンピュータが生成した完全に無作為な秘密鍵、どっちが安全かということです(暴言)。
鍵の生成と登録
まずは、公開鍵認証を利用するための初期設定です。以下の手順に従ってください。
- クライアント側で、キーペア(公開鍵と秘密鍵)を生成する。
- サーバに公開鍵を登録する。
クライアントでキーペアを生成
クライアント側で以下のコマンドを実行します。対話形式ですが、すべてenterでOKです。
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): #鍵の保存場所
Enter passphrase (empty for no passphrase): #パスフレーズ
Enter same passphrase again: #パスフレーズの確認
Your identification has been saved in /Users/username/.ssh/id_rsa
Your public key has been saved in /Users/username/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx username@mac.local
The key's randomart image is:
+---[RSA 3072]----+
| xxxxxx|
| xxxxxxx|
| xxxxxxxx|
| xxxxxxxxxx|
| xxxxxxxxxx |
| xxxxxxxx |
| xxxxxxxxxx |
| xxxxxxxxxx |
|xxxxxxxx |
+----[SHA256]-----+
3行目で鍵の保存場所を聞かれるのでそのままenterします。変更すると後々ややこしくなります。4、5行目でパスフレーズの入力を求められます。設定したほうがセキュリティは高くなりますが、接続のたびにパスフレーズを入力することになります。パスフレーズを設定しないことも可能です。私は設定しない派です。真面目な人は設定しましょう。
これで、~/.ssh
の下に秘密鍵と公開鍵が生成されました。~/.ssh/id_rsa
が秘密鍵です。秘密の鍵なので誰にも教えないようにしてください。~/.ssh/id_rsa.pub
が公開鍵です。これは他人に見られても問題ありません。
ssh-keygenのオプション
ssh-keygen
コマンドでよく使うオプションは下記のとおりです。
オプション | 説明 | 初期値 |
---|---|---|
-t | 暗号方式を指定する。dsa |ecdsa |ed25519 |rsa | rsa |
-b | 作成する鍵のビット数を指定する。rsa は1024 以上。ecdsa は256 、384 、521 のいずれか。それ以外の暗号方式はは固定長なので指定しない。 | rsa は3072 ecdsa は256 |
-f | 秘密鍵(と公開鍵)の場所とファイル名を指定する。 | ~/.ssh/id_rsa |
暗号方式の選択
さて、暗号方式はどれを選べばいいの?と思ったでしょ。解説しますね。
暗号方式 | 説明 |
---|---|
dsa | 長い歴史を持つため互換性は高い。ただし、セキュリティ面で難アリ。非推奨。 |
ecdsa | dsa の改良版。dsa より高速。 |
ed25519 | 比較的新しい暗号方式。セキュリティは高く、高速。 |
rsa | 長い歴史を持つため互換性は高い。ビット長が長ければセキュリティも問題なし。ただし低速。 |
というわけで、互換性を重視するならばrsa
、セキュリティとパフォーマンスを重視するならばed25519
がおすすめです。オプションを指定したコマンドの例は下記のとおりです。
#rsaを使用する場合(これはオプションを何も指定しない場合と同じです)
% ssh-keygen -t rsa -b 3072
#ed25519を使用する場合
% ssh-keygen -t ed25519
なお、rsa
とecdsa
は-b
オプションで鍵のビット数を指定することができます。ビット数は長いほうがセキュリティが高くなりますが、動作速度は遅くなります。
サーバに公開鍵を登録
クライアント側で秘密鍵と公開鍵を生成したら、公開鍵をサーバーにコピーします。公開鍵をサーバーに転送するための便利なコマンドがあるので使いましょう。
% ssh-copy-id username@hostname
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/username/.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
(username@hostname) Password for username@hostname:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'username@hostname'"
and check to make sure that only the key(s) you wanted were added.
1行目のusername
はSSHのログインユーザー名です。hostname
は接続先のホスト名です。5行目でパスワードの入力を求められますので、SSHのログインパスワードを入力します。
もし、デフォルト以外の場所に公開鍵を生成した場合は、-i
オプションを使って指定します。
% ssh-copy-id -i /path/to/id_xxx.pub username@hostname
以上で、サーバーへの公開鍵の登録は完了です。サーバーに~/.ssh/authorized_keys
というファイルが生成され、そこに公開鍵が記述されます。~/.ssh/authorized_keys
がすでに存在する場合は、このファイルに公開鍵が追記されます。
SSHでのログイン
SSHでログインするには、下記のコマンドを実行します。
% ssh username@hostname
パスフレーズを設定していなければ、ぬるりとログインできるはずです。パスフレーズを設定している場合は、パスフレーズを聞かれるので、入力しましょう。
もし、デフォルト以外の場所に秘密鍵を生成した場合は、-i
オプションで指定します。
% ssh -i /path/to/id_xxx username@hostname
SSHの設定
サーバーの設定
サーバー側のSSHの設定ファイルは、/etc/ssh/sshd_config
にあります。もしかしたら、OSによっては違うかもしれませんが、大体ここにあります。この設定ファイルで、公開鍵認証を利用する設定とパスワード認証を禁止する設定をしてみましょう。
#公開鍵認証を許可
PubkeyAuthentication yes
#公開鍵の場所の設定
AuthorizedKeysFile .ssh/authorized_keys
#パスワード認証の禁止
PasswordAuthentication no
#チャレンジレスポンス認証の禁止
ChallengeResponseAuthentication no
チャレンジレスポンス認証を許可していると、実質的にはパスワード認証ができてしまいます。なので、パスワード認証を禁止するならば、チャレンジレスポンス認証も禁止しましょう。
設定ファイルを修正したら、忘れずにsshdのリロードまたはリスタートをしましょう。
# service sshd reload
クライアントの設定
ログインするときに、ユーザー名とホスト名をいちいち指定するの面倒じゃありませんか?私は面倒です。というわけで、簡単にログインできるように設定しましょう。
クライアント側のSSHの設定ファイルは、~/.ssh/config
です。なければ作ってください。以下のように記述します。
Host 任意の名前
HostName 接続先ホスト名
User ユーザー名
Port SSHのポート番号
IdentityFile 秘密鍵のパス
すると、以下のコマンドでSSH接続ができるようになります。あら、便利。
% ssh 任意の名前
さいごに
以上、SSHで公開鍵認証をする方法についてお届けしました。
つい先日、「えー!?まだパスワード認証使ってるの?パスワード認証が許されるのって小学生までだよね!」と女学生が言っているのを見かけました。公開鍵認証を導入して、オトナの階段をのぼってみませんか。
でわでわ
無料で利用できるプログラミング学習サービスをお探しならば Code Lesson はいかがでしょうか。プロのエンジニアが監修した学習ロードマップで効率的に学習、AIに質問、最後にクイズで理解度をチェックできます。
コメント