鍵認証を立てる
目標
SSH鍵を作成して権限を合わせ、authorized_keysに登録して実際に接続します。そして、command=制約が付いた鍵が、本当にそのコマンドだけを実行するかを確認します。
なぜ重要なのか
公開鍵認証の失敗の大半は、暗号学ではなくファイルの権限の問題です。~/.sshがgroup-writableだと、sshdは鍵を静かに拒否して、パスワードを尋ねます。他のユーザーがauthorized_keysに自分の鍵を入れられてしまうからです。つまり、権限がそのまま認証ポリシーです。そしてcommand=制約は、デプロイの自動化では事実上必須です。CIサーバーの鍵が流出しても、その鍵では指定されたコマンド1つしか実行できないようにできます。
このラボ環境では、127.0.0.1:2222に本物のsshdが起動しています。同じPodの中ですが、SSHの観点では完全な2台目のサーバーです。
ステップ
/root/.ssh/id_labhubに、ed25519の鍵ペアを、パスフレーズなしで作成してください。/root/.sshは700、/root/.ssh/id_labhubは600、/root/.ssh/id_labhub.pubは644に、権限を合わせてください。- 先ほど作成した公開鍵を
/root/.ssh/authorized_keysに追加してください。ファイルの権限は600である必要があります。 ssh-keyscanで127.0.0.1のポート2222のホスト鍵を取得し、/root/.ssh/known_hostsに登録してください。- その鍵で
root@127.0.0.1:2222に接続し、リモートでhostnameを実行して、結果を/root/ssh/connect.txtに保存してください。 /root/.ssh/configにHost lab2ブロックを作成してください。HostName 127.0.0.1、Port 2222、User root、IdentityFile /root/.ssh/id_labhub、IdentitiesOnly yesの5行が入っている必要があります。そして、ssh lab2 hostnameが成功することを確認して、/root/ssh/alias.txtに保存してください。/root/.ssh/id_restrictedに2つ目のed25519鍵を作成し、その公開鍵をauthorized_keysに追加してください。ただし、行の一番先頭にrestrict,command="/bin/hostname"オプションを付けます。その鍵でssh -i /root/.ssh/id_restricted -p 2222 root@127.0.0.1 idを実行すると、idではなくhostnameの結果が出力される必要があります。その出力を/root/ssh/restricted.txtに保存してください。/root/ssh/keys.txtを作成してください。authorized_keysに登録されたすべての鍵のフィンガープリント一覧を含める必要があり、最低でも2行ある必要があります。
参考
ssh-keygen -t ed25519 -N '' -f <경로>で、パスフレーズなしの鍵を作成します(プレースホルダーはパスです)。ssh-keyscan -p 2222 127.0.0.1 >> /root/.ssh/known_hostsの形で、ホスト鍵を登録します。ssh-keygen -lf /root/.ssh/authorized_keysで、ファイル内のすべての鍵のフィンガープリントを表示できます。- よくある間違い1: ステップ3で
>で上書きして、既存の鍵が消えてしまう場合です。必ず>>を使ってください。 - よくある間違い2: ステップ7で、オプションと鍵の間にカンマを入れる場合です。オプション一覧と鍵のタイプの間はスペースです。
鍵ペアの作成
/root/.ssh/id_labhubに、ed25519の鍵ペアを、パスフレーズなしで作成してください。
ssh-keygenの-tで種類を、-fで出力パスを、-Nでパスフレーズを指定します。自動採点のために、パスフレーズは空にしておいてください。
権限を合わせる
/root/.sshは700、/root/.ssh/id_labhubは600、/root/.ssh/id_labhub.pubは644に、権限を合わせてください。
ディレクトリとファイルの推奨権限は違います。公開鍵だけは、他の人が読んでもかまいません。
公開鍵の登録
先ほど作成した公開鍵を/root/.ssh/authorized_keysに追加してください。ファイルの権限は600である必要があります。
authorized_keysは、公開鍵を1行ずつ入れたテキストファイルです。既存の行を消さずに、追記してください。
ホスト鍵の登録
ssh-keyscanで127.0.0.1のポート2222のホスト鍵を取得し、/root/.ssh/known_hostsに登録してください。
ssh-keyscanにはポートを指定するオプションがあり、標準でないポートは、known_hostsに角括弧の表記で入ります。
鍵で接続する
その鍵でroot@127.0.0.1:2222に接続し、リモートでhostnameを実行して、結果を/root/ssh/connect.txtに保存してください。
-iで鍵を、-pでポートを指定します。リモートで実行するコマンドを引数として付けると、接続後すぐにそのコマンドが実行されます。
クライアント設定でエイリアスを作る
/root/.ssh/configにHost lab2ブロックを作成してください。HostName 127.0.0.1、Port 2222、User root、IdentityFile /root/.ssh/id_labhub、IdentitiesOnly yesの5行が入っている必要があります。そして、ssh lab2 hostnameが成功することを確認して、/root/ssh/alias.txtに保存してください。
HostブロックにHostName、Port、User、IdentityFile、IdentitiesOnlyを入れます。そうすると、オプションなしで、エイリアスだけで接続できます。
コマンド制限の鍵を作る
/root/.ssh/id_restrictedに2つ目のed25519鍵を作成し、その公開鍵をauthorized_keysに追加してください。ただし、行の一番先頭にrestrict,command="/bin/hostname"オプションを付けます。その鍵でssh -i /root/.ssh/id_restricted -p 2222 root@127.0.0.1 idを実行すると、idではなくhostnameの結果が出力される必要があります。その出力を/root/ssh/restricted.txtに保存してください。
authorized_keysの行の先頭に、オプションをカンマで並べます。restrictですべてをオフにして、commandで1つだけを許可してください。
登録された鍵の監査
/root/ssh/keys.txtを作成してください。authorized_keysに登録されたすべての鍵のフィンガープリント一覧を含める必要があり、最低でも2行ある必要があります。
ssh-keygenには、ファイル内の鍵のフィンガープリントを一覧表示するオプションがあります。コメントも一緒に表示されます。