TT Lab
はじめる
学ぶ 学習パス コース

SSHとファイル転送

鍵認証を立てる

TT Labで続きを見る

目標

SSH鍵を作成して権限を合わせ、authorized_keysに登録して実際に接続します。そして、command=制約が付いた鍵が、本当にそのコマンドだけを実行するかを確認します。

なぜ重要なのか

公開鍵認証の失敗の大半は、暗号学ではなくファイルの権限の問題です。~/.sshがgroup-writableだと、sshdは鍵を静かに拒否して、パスワードを尋ねます。他のユーザーがauthorized_keysに自分の鍵を入れられてしまうからです。つまり、権限がそのまま認証ポリシーです。そしてcommand=制約は、デプロイの自動化では事実上必須です。CIサーバーの鍵が流出しても、その鍵では指定されたコマンド1つしか実行できないようにできます。

このラボ環境では、127.0.0.1:2222に本物のsshdが起動しています。同じPodの中ですが、SSHの観点では完全な2台目のサーバーです。

ステップ

  1. /root/.ssh/id_labhubに、ed25519の鍵ペアを、パスフレーズなしで作成してください。
  2. /root/.sshは700、/root/.ssh/id_labhubは600、/root/.ssh/id_labhub.pubは644に、権限を合わせてください。
  3. 先ほど作成した公開鍵を/root/.ssh/authorized_keysに追加してください。ファイルの権限は600である必要があります。
  4. ssh-keyscanで127.0.0.1のポート2222のホスト鍵を取得し、/root/.ssh/known_hostsに登録してください。
  5. その鍵でroot@127.0.0.1:2222に接続し、リモートでhostnameを実行して、結果を/root/ssh/connect.txtに保存してください。
  6. /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に保存してください。
  7. /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に保存してください。
  8. /root/ssh/keys.txtを作成してください。authorized_keysに登録されたすべての鍵のフィンガープリント一覧を含める必要があり、最低でも2行ある必要があります。

参考

鍵ペアの作成

/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には、ファイル内の鍵のフィンガープリントを一覧表示するオプションがあります。コメントも一緒に表示されます。