実験環境: Ubuntu18.04 リモートサーバー + WSL 2 ローカル
評価の説明#
-
-
評価中に使用するデータはこちら:評価サービスの公開鍵
-
追加:免密ログインの本質は何ですか?
最終的な効果#
【ローカルでのテスト】
-
-
ssh ホスト名で免密ログインが可能です
-
また、緑色です :)
実現のプロセス#
2 つのステップ⭐#
【鍵ペアの生成👉公開鍵のコピー】
- ① ローカルの WSL 2 で鍵ペアを生成します(.pub 拡張子は公開鍵です)、ここでは RSA 暗号化アルゴリズムを選択します
ssh-keygen -t rsa
-
- ssh-keygen --help を使用して鍵のタイプなどの情報を確認できます
- 通常、パスフレーズ(秘密鍵を暗号化するためのもの)は設定する必要はありませんが、免密ログイン時にパスワードを入力する場合を除きます
- ② 公開鍵をリモートサーバーに設定します、1 つのコマンドで完了します
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 ファイルが存在しない場合は、自分で作成してください
- 【重要】の 2 つの【権限】は特定の設定が必要です:.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 免密ログインの原理と実装—— 掘金
【ここではパスワードログインと免密ログインの 2 つの方法の具体的なプロセスが言及されています】
- パスワードログイン
-
- リモートサーバーの公開鍵を使用してパスワードを暗号化します
-
- 免密ログイン
-
- 送信プロセスでは秘密鍵は公開されません
-
パスワードログインは免密ログインよりも簡単で、接続時にパスワードログインの方が速いです
しかし、免密ログインの方がより安全です:
- ① パスワードは破られやすいです
- ② 記事を参照すると、免密ログインには「中間者攻撃」のリスクがないと述べていますが、私は完全に同意しません
- 両方の方法はまず.ssh/known_hosts を使用してマシンを識別します
- ただし、免密ログインでは公開鍵の一致がさらに行われるため、免密ログインの方が安全です
- 【注意】ただし、これはローカルの公開鍵が中間者に盗まれていない場合です
追加の説明#
- ssh -v ten:より詳細なプロセスが表示されます
- インターネット上には広く流布している図がありますが、詳細なエラーがあります:
-
- リクエスト情報はユーザー名と IP ではありません❌、ローカルの公開鍵です
- 公開鍵には IP が保存されていません [それはリスクをもたらすでしょう]、保存されているのはローカルのユーザー名とホスト名です
- ローカルまたはリモートサーバーの公開鍵からユーザー情報 [ユーザー名とホスト名] を削除しても、免密 SSH 接続はできます
- これからわかるように、リモートサーバーは公開鍵文字列自体を検証しています!
-
考察ポイント#
- クラウドサーバーに初めてログインしたときに表示される身元確認は何ですか?
-
- ECDSA キーの指紋とは何ですか?リモートサーバーからのキーの指紋であり、ssh をインストールしたマシンごとに異なる指紋があります
- yes を入力すると、指紋の関連情報がローカルの.ssh/known_hosts に保存され、次回接続時に偽のマシンが存在する場合に警告が表示されます
- 初回接続時に中間者がいる場合、おめでとうございます
- 参考:リモートホストの SSH 指紋を検証する—— ブログ
-
追加#
-
ssh-copy-id の使用方法
- ローカルの現在のユーザーの公開鍵をリモートマシンのホームディレクトリ /.ssh に直接コピーします
-
- より簡単で直接的であり、特定の公開鍵や特定のポートを指定することもできます
-
sshd_config の詳細な設定説明には man sshd_config を使用できます
-
⭐パスワードログインを無効にするには、/etc/ssh/sshd_config の PasswordAuthentication を no に変更します
-
- sshd サービスを再起動します:systemctl restart sshd.service、有効になります
-
-
公開鍵の場所は /etc/ssh/sshd_config の AuthorizedKeysFile で設定できます
-
- デフォルトでは、ユーザーのホームディレクトリの対応する場所で公開鍵を検索します
-
-
ChanllengeResponseAuthentication とは何ですか?
-
ChallengeResponseAuthentication no
# 任意のタイプのパスワード認証を許可します!したがって、login.conf で指定された認証方法はすべて適用できます!
# ただし、現在は PAM モジュールを使用して認証を管理することを好むため、このオプションを no に設定できます!
参考資料#
- SSH Login Without a Password——howchoo
- ssh 免密登录踩坑及解决—— 码农家园
- authorized_keys の権限を 644 に設定することを提案しています。ファイルの所有者が root であるためです。または、ファイルの所有者を変更することもできます [個人的には後者の方が安全だと思います]
- 文字接口联机服务器:SSH 服务器—— 鸟哥的 Linux 私房菜
- ssh 修改登录端口禁止密码登录并免密登录—— 简书
- SSH 用公钥验证可以阻止中间人攻击么?—— 知乎
- できません。初回接続時の known_hosts の検証によって行われます