実験環境:Ubuntu18.04 リモートサーバー + WSL 2 ローカル
評価説明#
-
-
評価中に必要なデータはここにあります:評価サービスの公開鍵
-
追加:免密ログインの本質とは何か?
最終結果#
【ローカルでテスト】
-
-
ssh ホスト名、すでに免密ログイン可能
-
また緑 :)
実現プロセス#
二段階⭐#
【鍵ペアを生成👉公開鍵をコピー】
- ① ローカル WSL 2 で公開鍵と秘密鍵を生成 [.pub 拡張子が公開鍵]、ここでは RSA 暗号アルゴリズムを選択
ssh-keygen -t rsa
-
- ssh-keygen --help を使用して鍵の種類などの情報を確認できます
- 一般的に passphrase [秘密鍵の暗号化に使用] を設定する必要はありません。免密ログインのたびにパスワードを入力したい場合を除いて
- ② 公開鍵をリモートサーバーに設定、一つのコマンドで可能
ssh-copy-id ten
-
- ここで使用されている ten はリモートサーバーのエイリアス(ユーザー名はローカルユーザーがデフォルト、そうでない場合は hz@ten の形式を使用)で、具体的な設定方法は《Linux 入門及び使用》ノートまとめ ——5 基本システム —— 追加知識点:ssh ニックネームを使用してクラウドホストにログイン
- または
ssh-copy-id ユーザー名@IP
の形式を使用することもでき、以下の ten とユーザー名 @IP は同等です
🔚これで免密ログインが実現し、クラウドホスト ten に接続してテスト
ssh ten
ssh-copy-id の細分ステップ#
ssh-copy-id の効果を手動で実現したい場合は、以下のステップを参考にしてください:
- ローカルの公開鍵をリモートサーバーのホームディレクトリにコピー
scp ~/.ssh/id_rsa.pub ten:
- ssh でリモートサーバーのホームディレクトリにログインし、公開鍵の内容を鍵の設定ファイルに追加
cat id_rsa.pub >> .ssh/authorized_keys
rm id_rsa.pub # 削除可能
-
- authorized_keys には複数の異なる公開鍵を保存できます。各行が一つに対応します
- .ssh ディレクトリと authorized_key ファイルがない場合は、自分で作成してください
- 【重要】は両者の【権限】で、特定の設定が必要です:.ssh ディレクトリは所有者のみが全権限を持ち、authorized_keys ファイルは所有者のみが読み書き権限を持つように設定してください。そうでないと、免密ログインは成功しにくくなります
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
🔚これで免密ログインも実現しました
【権限要件】
- man sshd を参考にしてください
-
- 安全のため、権限設定が要件を満たさない場合、公開鍵ファイルを使用できません
-
追加説明#
- 自分のマシンとリモートサーバーの /etc/ssh/sshd_config の PubkeyAuthentication を yes に設定し、変更後は sshd サービスを再起動する必要があります:systemctl restart sshd.service
- 免密ログインしたいリモートサーバーのユーザーの【ホームディレクトリ】の適切な位置に公開鍵を置いてください
免密ログインの本質#
プロセス⭐#
- ローカルが SSH 接続を開始し、ローカルの公開鍵を送信
- リモートサーバーは公開鍵を受け取り、ローカルの公開鍵と比較
- 一致すれば、サーバーは公開鍵で「ランダムな文字列」を暗号化し、ローカルに返送
- ローカルは秘密鍵で「ランダムな文字列」を復号し、結果を再びサーバーに送信
- 一致すれば、接続が確立
❗ 参考SSH 免密ログインの原理と実現—— 掘金
【ここではパスワードログインと免密ログインの二つの方式の具体的なプロセスについて言及されています】
- パスワードログイン
-
- リモートサーバーの公開鍵を使用してパスワードを暗号化
-
- 免密ログイン
-
- 伝送過程では秘密鍵が露出しない
-
パスワードログイン方式は免密ログイン方式より簡単で、接続時に速いです
しかし、免密ログインはより安全です:
- ① パスワードは識別されやすい
- ② 参考記事では免密ログインには「中間者攻撃」のリスクがないと述べていますが、私は完全には同意しません
- 両者はまず.ssh/known_hosts を使用してマシンを識別します
- 免密ログインは公開鍵の一致が一回多く、免密ログインはより安全です
- 【注意】ただし、これはローカルの公開鍵が中間者に盗まれていない場合に限ります
追加説明#
- ssh -v ten:より詳細なプロセスを見ることができます
- インターネット上には広く流布している図がありますが、細部に誤りがあります。以下の通りです:
-
- リクエスト情報はユーザー名と IP ではなく❌、ローカルの公開鍵です
- 公開鍵には IP は保存されていません [そうでないとリスクが生じる]、保存されているのはローカルのユーザー名とホスト名です
- ローカルまたはリモートサーバーの公開鍵からユーザー情報 [ユーザー名とホスト名] を削除しても、依然として免密 SSH 接続が可能です
- つまり、リモートサーバーが検証しているのは公開鍵文字列そのものです!
-
考察ポイント#
- クラウドホストに初めてログインした際の認証は何ですか?
-
- ECDSA キーのフィンガープリントとは何ですか?リモートサーバーからの鍵のフィンガープリントで、ssh をインストールした各マシンには独自のフィンガープリントがあります
- yes と入力すると、フィンガープリントに関する情報がローカルの.ssh/known_hosts に保存され、次回接続時に偽装機が存在する場合は警戒を促します
- もし初回接続時に偽装機 [中間者] 攻撃があれば、おめでとうございます、あなたは当選しました
- 参考リモートホスト SSH フィンガープリントの検証—— ブログ
-
追加#
-
ssh-copy-id の使用
- ローカルのユーザーの公開鍵をリモートマシンのホームディレクトリ /.ssh 下の authorized_keys ファイルに直接コピーします
-
- より簡単で直接的で、特定の公開鍵や特定のポートを指定できます
-
man sshd_config を使用して sshd_config の具体的な設定説明を確認できます
-
⭐パスワードログインを無効にするには、/etc/ssh/sshd_config の PasswordAuthentication を no に変更します
-
- sshd サービスを再起動:systemctl restart sshd.service で有効になります
-
-
公開鍵の位置は /etc/ssh/sshd_config の AuthorizedKeysFile で自分で設定できます
-
- デフォルトではユーザーのホームディレクトリの対応する位置で公開鍵を探します
-
-
ChallengeResponseAuthentication とは何ですか?
-
ChallengeResponseAuthentication no
# すべてのタイプのパスワード認証を許可します!したがって、login.conf で規定された認証方式はすべて適用可能です!
# しかし、現在私たちは PAM モジュールを使用して認証を管理することを好むため、このオプションは no に設定できます!
参考資料#
- SSH パスワードなしでのログイン——howchoo
- ssh 免密ログインの落とし穴と解決—— プログラマーの家
- ここでは authorized_keys の権限を 644 に設定することが提案されていますが、ファイルの所有者は root です;ファイルの所有者を変更することもできます [後者の方が安全だと思います]
- テキストインターフェースオンラインサーバー:SSH サーバー—— 鳥哥の Linux 私房菜
- ssh ログインポートを変更してパスワードログインを禁止し、免密ログインを実現—— 簡書
- SSH の公開鍵認証は中間者攻撃を防げるか?—— 知乎
- できません。最初の接続時の known_hosts 検証によって回避されます