SSHとGPG
設定は正しいのに公開鍵でログインできない。原因の多くは ~/.ssh のパーミッションです。sshd は権限の緩い鍵を何も言わずに無視します。試験でも定番の出題です。
鍵は2つできる。サーバーへ置くのは公開鍵のほう
ssh-keygen を実行すると2つのファイルができます。id_ed25519 が秘密鍵、id_ed25519.pub が公開鍵です。秘密鍵は絶対に外へ出さず手元に置いたままにし、サーバーへ置くのは公開鍵のほうです。
| オプション | 意味 |
|---|---|
-t <type> | 鍵の種類。rsa ed25519 ecdsa |
-b <bits> | 鍵長。RSA なら 2048 以上、推奨は 4096 |
-f <path> | 出力先のパス。-N はパスフレーズ |
-p | 既存の鍵のパスフレーズを変更する。-C はコメント |
-l -f <pub> | 鍵のフィンガープリントを表示する |
~/.ssh は 700、authorized_keys は 600
| ファイル | 場所 | 役割 | 権限 |
|---|---|---|---|
~/.ssh | 両方 | 鍵と設定の置き場 | 700 |
~/.ssh/id_ed25519 | クライアント | 秘密鍵 | 600 |
~/.ssh/id_ed25519.pub | クライアント | 公開鍵 | 644 |
~/.ssh/authorized_keys | サーバー | 接続を許す公開鍵の一覧 | 600 |
~/.ssh/known_hosts | クライアント | 接続先のホスト鍵の記録 | 644 |
グループや他人に書き込み権があると、sshd は安全でないと判断して鍵を無視します。公開鍵の登録は authorized_keys へ1行として追記する形ですが、リモートへ送るなら ssh-copy-id user@host がパーミッションまで面倒を見てくれます。
known_hosts は接続先サーバーのホスト鍵を記録するファイルです。記録と異なるホスト鍵が提示されると警告を出して接続を止めます。中間者攻撃への対策で、サーバーを再構築して鍵が変わったときは ssh-keygen -R <host> で該当行を消します。
秘密鍵にパスフレーズを付けると安全ですが、接続のたびに入力を求められます。ssh-agent は復号した鍵をメモリに預かるデーモンで、ssh-add で預ければ以降は省略できます。ssh-add -l が一覧、-D が全削除です。
sshd_config はサーバー側、ssh_config はクライアント側
| 項目 | 意味 |
|---|---|
Port | 待ち受けポート |
PermitRootLogin | root の直接ログインの可否。no / yes / prohibit-password |
PasswordAuthentication | パスワード認証を許すかどうか |
PubkeyAuthentication | 公開鍵認証を許すかどうか |
AuthorizedKeysFile | 公開鍵一覧のパス。PermitEmptyPasswords は空パスワードの可否 |
公開鍵認証を必須にする定番の締め方は、PermitRootLogin prohibit-password と PasswordAuthentication no の組み合わせです。変更後は systemctl reload ssh などで反映します。サーバー自身の身元を示すホスト鍵は /etc/ssh/ssh_host_* に置かれ、known_hosts に記録されるのはこの公開鍵です。
GPG は暗号化と署名で使う鍵が逆
GPG は公開鍵暗号でファイルやメールの暗号化と署名を行います。鍵ペアの考え方は SSH と同じで、公開鍵は配ってよく、秘密鍵は自分だけが持ちます。用途は2つあり、使う鍵が逆になります。暗号化するときは受信者の公開鍵で暗号化し、受信者が自分の秘密鍵で復号します。署名するときは自分の秘密鍵で署名し、検証する側が署名者の公開鍵で確かめます。ここを取り違えるのが典型的な間違いです。
コマンドは --gen-key で鍵ペア作成、--list-keys と --list-secret-keys で一覧、--export -a と --import で書き出しと取り込み、--sign と --verify で署名と検証、--encrypt -r <ID> と --decrypt で暗号化と復号です。鍵束は ~/.gnupg 配下です。なお、この学習環境には gpg が入っていないため実機演習はありません。
試験で狙われるところ
サーバーに置くのは公開鍵です。~/.ssh は 700、authorized_keys は 600 で、緩いと鍵が無視されます。サーバー側の設定は sshd_config で、クライアント側の ssh_config とは別物です。そして暗号化は相手の公開鍵、署名は自分の秘密鍵です。