SSH:リモートアクセスを保護する
SSHハンドシェイク、ホスト鍵認証、SSHがリモートセッションを保護する仕組みを確認します。
「SSH:リモートアクセスを保護する」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
SSH-1とSSH-2:非推奨化の経緯
元のSecure ShellプロトコルであるSSH-1には、能動的な攻撃者が検知されることなく暗号化されたセッションに任意のデータを挿入できる、根本的な設計上の欠陥がありました。2006年にRFC 4251-4254として公開されたプロトコルの全面的な再設計であるSSH-2では、トランスポート層、認証層、接続層を分離し、HMACを使用したより強力な完全性チェックを導入することで、これらの弱点に対処しました。SSH-1は非推奨であり、現代のサーバーでは有効にすべきではありません。
SSHトランスポート層:暗号化と完全性
SSHトランスポート層プロトコルは、初期鍵交換を処理し、暗号化され完全性が保護された通信チャネルを確立します。鍵交換(通常はECDH)、ホスト認証(通常はEd25519またはRSA)、対称暗号化(通常はAES-256-CTRまたはChaCha20-Poly1305)、MAC(通常はHMAC-SHA2-256)のアルゴリズムをネゴシエーションします。以降のすべてのパケットは、ネゴシエーションされたアルゴリズムを使用して暗号化され、完全性が検証されます。
SSHユーザー認証層
トランスポート層が保護されると、ユーザー認証層はユーザーがサーバーに身元を証明する方法をネゴシエーションします。一般的な方法は、パスワード(ユーザーがパスワードを入力し、トランスポート層を通じて暗号化された状態で送信されます)、公開鍵(ユーザーが、サーバーに登録された対応する公開鍵の秘密鍵を所有していることを証明します)、GSSAPI(エンタープライズ環境向けのKerberosシングルサインオン統合)の3つです。
SSH接続層:多重化されたチャネル
SSH接続層は、単一の暗号化されたトランスポート接続上で複数の論理チャネルを多重化します。一般的なSSHセッションでは、対話型シェル用に1つのチャネルを使用します。追加のチャネルでは、ポートフォワーディング、X11フォワーディング、SFTPファイル転送をサポートしており、すべて同じ認証済み暗号化接続を共有します。チャネルリクエストを使用すると、クライアントは擬似端末の要求、環境変数の設定、特定のコマンドの実行を行えます。
ホスト鍵の検証とTOFU
SSHサーバーに初めて接続すると、クライアントはサーバーのホスト鍵を受け取り、それを信頼するかどうかを決める必要があります。デフォルトのポリシーはTrust On First Use(TOFU)です。ユーザーは鍵のフィンガープリント(通常はSHA256:...のようなハッシュとして表示されます)の確認を求められ、承認するとknown_hostsファイルに保存されます。次回以降の接続では、保存された鍵とサーバーが提示する鍵が比較され、一致しない場合は中間者攻撃の可能性を示す厳しい警告が表示されます。
known_hostsと鍵のフィンガープリント
~/.ssh/known_hostsに保存されるknown_hostsファイルは、ホスト名とIPアドレスをキーとしてサーバーのホスト鍵を管理するデータベースです。各エントリは、サーバーのアドレスと公開鍵を関連付けます。サーバーの鍵が変更されると、サーバーが再インストールされた場合でも、攻撃者がサーバーになりすましている場合でも、SSHは接続を拒否して警告を表示します。管理者は、規模の大きい環境でTOFUによる信頼判断を避けるために、証明書ベースのホスト認証を使用します。
パスワードなしログインのためのauthorized_keys
公開鍵認証では、ユーザーの公開鍵をサーバー上の~/.ssh/authorized_keysに保存します。ユーザーが接続すると、サーバーは公開鍵で暗号化したチャレンジを送信します。対応する秘密鍵を持つ人だけが正しく応答できるため、秘密鍵やパスワードを送信せずに身元を証明できます。秘密鍵がネットワーク経由で送信されず、フィッシングで盗まれることもないため、パスワードより安全です。
SSH鍵アルゴリズム
SSH鍵アルゴリズムには、一般的に使用される3つの系統があります。3072ビットまたは4096ビットのRSA鍵は、すべてのサーバーと互換性があります。NIST P-256曲線を使用するECDSAは、同等の安全性でRSAより高速ですが、P-256のセキュリティパラメータには懸念が示されています。Edwards曲線デジタル署名アルゴリズムを基盤とするEd25519は、現代の推奨方式です。高速で256ビットの小さな鍵を使用し、強力なセキュリティ特性を備え、特殊なパラメータに関する懸念もありません。
SSHの歴史:ポート22とTatu Ylönen
ヘルシンキ工科大学のフィンランド人研究者であるTatu Ylönenは、大学のネットワークに対するパスワード盗聴攻撃によって数百件の認証情報が漏えいした後、1995年にSSHを開発しました。telnet(23)とftp(21)の間にあることから、ポート22を選びました。SSHは、これら2つの安全でないプロトコルに取って代わりました。YlönenはSSH Communications Securityを設立し、その後IETFを通じてSSH-2をオープン標準として公開しました。現在主流の無償実装であるOpenSSHは、1999年にOpenBSDプロジェクトによって作成されました。
SSHエージェントと鍵フォワーディングのセキュリティ
SSHエージェントは、復号済みの秘密鍵をメモリ上に保持するバックグラウンドプロセスです。これにより、パスフレーズを再入力せずに複数のサーバーへシングルサインオンできます。エージェントフォワーディング(-Aフラグ)は、エージェント接続をリモートサーバーへ転送することでこの機能を拡張し、内部サーバーへの1ホップのアクセスを可能にします。ただし、エージェントフォワーディングにはセキュリティ上のリスクがあります。侵害されたリモートサーバーは、転送されたエージェントを使って、あなたになりすまして他のサーバーへ認証できます。エージェントフォワーディングの代わりにProxyJumpを使用してください。
SSHのセキュリティ強化に関するベストプラクティス
安全なSSH設定には、rootログインの無効化(PermitRootLogin no)、公開鍵のみを使用するためのパスワード認証の無効化(PasswordAuthentication no)、Ed25519ホスト鍵の使用、SSH-2プロトコルのみの有効化、アイドル状態のセッションタイムアウトの設定、AllowUsersまたはAllowGroupsによる許可ユーザーの制限が含まれます。また、自動スキャンによるノイズを減らすための隠蔽策として、デフォルトポートを変更する方法もあります。Fail2banなどのツールは、認証に繰り返し失敗したIPアドレスをブロックします。
SSHの認証方式
SSHの公開鍵認証は、なぜパスワード認証より安全だと考えられているのですか。
SSH:要点
SSH-2は、欠陥のあるSSH-1に取って代わり、トランスポート層、認証層、接続層を分離しました。トランスポート層は暗号化と完全性をネゴシエーションします。ユーザー認証では、パスワード、公開鍵、GSSAPIをサポートします。ホスト鍵の検証にはTOFUとknown_hostsを使用します。推奨される鍵アルゴリズムはEd25519です。エージェントフォワーディングにはセキュリティ上のリスクがあるため、代わりにProxyJumpを使用してください。セキュリティ強化には、rootログインとパスワード認証の無効化などが含まれます。
よくある質問
「SSH:リモートアクセスを保護する」レッスンは無料ですか?
はい。「SSH:リモートアクセスを保護する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「SSH:リモートアクセスを保護する」で何を学びますか?
SSHハンドシェイク、ホスト鍵認証、SSHがリモートセッションを保護する仕組みを確認します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「SSH:リモートアクセスを保護する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 安全なプロトコルを構成するもの
- SSH:リモートアクセスを保護する
- SFTPとSCP:安全なファイル転送
- DNSSEC:DNS応答を認証する