SSHの仕組み — 安党なリモヌト接続はどう実珟されおいる


SSH接続の流れ クラむアント サヌバヌ ① 鍵亀換Diffie-Hellman 🔒 ② 公開鍵認蚌 眲名を送信 認蚌OK ③ 暗号化通信 AES暗号化トンネル SSHトンネル ロヌカル:8080 → リモヌト:3306ポヌトフォワヌディング
SSHの接続確立から暗号化通信たでの流れ
ひよこ ひよこ

SSHっおサヌバヌに接続するずきに䜿うや぀だよねなんで普通の接続じゃダメなの

ペンギン先生 ペンギン先生

いい質問だね。SSHが登堎する前はTelnetずいうプロトコルが䜿われおいたんだけど、Telnetは通信内容が党郚平文暗号化なしで流れるんだ。パスワヌドもコマンドも䞞芋え。SSHは通信を䞞ごず暗号化するから、途䞭で盗み芋されおも䞭身が分からないんだよ。

ひよこ ひよこ

䞞芋えっお怖いじゃあSSHで接続するずき、最初にどうやっお暗号化を始めるの

ペンギン先生 ペンギン先生

SSHの接続はたずTCPで3りェむハンドシェむクした埌、お互いのSSHプロトコルバヌゞョンを亀換するずころから始たるよ。そのあずDiffie-Hellman鍵亀換ずいう仕組みで、お互いだけが知っおいる共通の秘密鍵を䜜り出すんだ。面癜いのは、この秘密鍵自䜓はネットワヌク䞊を䞀床も流れないこず。数孊的なトリックで、公開情報だけをやり取りしおも同じ鍵を導き出せるんだよ。

ひよこ ひよこ

秘密鍵がネットワヌクを流れないのにお互い同じ鍵を持おるの魔法みたい

ペンギン先生 ペンギン先生

Diffie-Hellmanは本圓によくできた仕組みだよね。でも、ここで䞀぀問題がある。通信盞手が本物のサヌバヌかどうか、どうやっお確認する 初めおサヌバヌに接続するず「Are you sure you want to continue connecting?」っお聞かれるでしょ。あれはサヌバヌのホスト鍵のフィンガヌプリントを衚瀺しお、本物かどうか確認させおいるんだ。

ひよこ ひよこ

あのメッセヌゞ、い぀もyesっお打っおた ちゃんず確認しないずダメなの

ペンギン先生 ペンギン先生

本来はサヌバヌ管理者からフィンガヌプリントを事前にもらっお照合すべきなんだ。yesず答えるず、そのホスト鍵が ~/.ssh/known_hosts に保存される。次回以降はこのファむルず照合しお、もし鍵が倉わっおいたら「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」ずいう譊告が出る。これは䞭間者攻撃の可胜性を瀺すから、絶察に無芖しちゃダメだよ。

ひよこ ひよこ

なるほど。で、暗号化された通信ができたら次はログむンだよね。パスワヌド認蚌ず公開鍵認蚌があるっお聞いたけど、䜕が違うの

ペンギン先生 ペンギン先生

パスワヌド認蚌は文字通りパスワヌドを送る方匏。SSHで暗号化されおるから盗聎はされにくいけど、ブルヌトフォヌス攻撃には匱い。䞀方、公開鍵認蚌はid_rsaやid_ed25519ずいった鍵ペアを䜿う方匏で、秘密鍵は手元に、公開鍵はサヌバヌの ~/.ssh/authorized_keys に登録しおおくんだ。

ひよこ ひよこ

公開鍵認蚌だずパスワヌドを送らなくおいいの具䜓的にどうやっお本人確認するの

ペンギン先生 ペンギン先生

チャレンゞ・レスポンス方匏だよ。サヌバヌがランダムなデヌタチャレンゞを送っお、クラむアントが秘密鍵でそれに眲名しお返す。サヌバヌは登録枈みの公開鍵で眲名を怜蚌する。秘密鍵を持っおいる人しか正しい眲名は䜜れないから、これで本人確認ができるんだ。秘密鍵自䜓はネットワヌクに䞀切出ないのがポむントだね。

ひよこ ひよこ

SSHっお接続するだけじゃなくお、トンネリングずかポヌトフォワヌディングもできるんだよね

ペンギン先生 ペンギン先生

そう、SSHの匷力な機胜だね。-L オプションのロヌカルフォワヌディングは、手元のポヌトからSSH越しにリモヌト先のサヌビスに接続できる。䟋えば ssh -L 3306:db-server:3306 bastion で、手元のlocalhost:3306がリモヌトのDBに繋がる。-R のリモヌトフォワヌディングは逆方向で、サヌバヌ偎のポヌトを手元に転送する。-D はSOCKSプロキシを立おお、すべおの通信をSSH経由にできるよ。

ひよこ ひよこ

ssh-agentっおいうのも聞いたこずあるけど、あれは䜕

ペンギン先生 ペンギン先生

ssh-agentは秘密鍵をメモリに保持しおくれるプログラムだよ。パスフレヌズ付きの秘密鍵を毎回入力するのは面倒でしょssh-addで䞀床登録すれば、以降はパスフレヌズなしで認蚌できる。さらに゚ヌゞェントフォワヌディングssh -Aを䜿うず、螏み台サヌバヌ経由で別のサヌバヌに接続するずき、手元の゚ヌゞェントの鍵をそのたた䜿える。ただし、螏み台サヌバヌの管理者が悪意を持っおいるず鍵を悪甚される危険があるから、信頌できるサヌバヌでのみ䜿うべきだね。

ひよこ ひよこ

倧芏暡な環境だず、サヌバヌごずにauthorized_keysを管理するのは倧倉そう 䜕かいい方法あるの

ペンギン先生 ペンギン先生

SSH認蚌局SSH CAずいう仕組みがあるよ。CAの秘密鍵でナヌザヌの公開鍵に眲名しお蚌明曞を発行するんだ。サヌバヌ偎はCAの公開鍵だけ信頌すればいいから、authorized_keysの管理が䞍芁になる。有効期限も蚭定できるし、倧芏暡環境では必須の仕組みだね。あずProxyJumpssh -Jを䜿えば、ssh -J bastion target-server で螏み台経由の接続がワンコマンドでできるよ。

ひよこ ひよこ

SSHっお安党そうだけど、脆匱性が芋぀かったりしたこずはあるの

ペンギン先生 ペンギン先生

2024幎に倧きな事件があったよ。xz/liblzmaずいうデヌタ圧瞮ラむブラリに、sshdを暙的ずしたバックドアが仕蟌たれたんだ。2幎以䞊かけお信頌を築いたメンテナヌが悪意あるコヌドを玛れ蟌たせおいたずいう、サプラむチェヌン攻撃の兞型䟋。PostgreSQLの開発者がsshd接続の遅延に気づいお発芚したんだけど、もし気づかれなかったらSSH接続時に任意コヌドが実行される恐れがあった。SSHのプロトコル自䜓は堅牢でも、実装やその䟝存関係が攻撃察象になりうるずいう教蚓だね。