このスクラップは限定公開です
Open12

ssh雑メモ

ハガユウキハガユウキ

Secure Shell(セキュア シェル、SSH)は、暗号や認証技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。パスワードなどの認証を含むすべてのネットワーク上の通信が暗号化される。

SSHプロトコルを実装したオープンソースソフトウェアとしてOpenSSHが有名。
https://ja.wikipedia.org/wiki/Secure_Shell

ハガユウキハガユウキ

昔の暗号鍵は、暗号化の仕方がわかったら復号もできるから、公開するとまずかった。
しかし、暗号化の仕方がわかっても復号がわからない暗号鍵が出てきてから、公開しても問題ないって状況になった。
https://nishiohirokazu.hatenadiary.org/entry/20140809/1407556873

ハガユウキハガユウキ

署名とは、行為者がある行為をする際に、自分で自分の氏名を書くこと
https://ja.wikipedia.org/wiki/署名
https://dictionary.goo.ne.jp/word/自署/

デジタル署名は、電子メールに自分の筆跡でサインしたり捺印するイメージ。
デジタル署名を使う理由としては、以下2点が挙げられる

  • 情報が改ざんされていないか証明するため
  • ちゃんと本人から送られてきたことを証明するため

情報が改ざんされていたら、誤った口座に送金をしたりする恐れがある。自分に来た情報が信用できなくなるから、インターネットの信用性が落ちて情報社会として終わる。
ちゃんと本人から送られてきたことを証明できないと、偽物になりすましされて嘘の指示が送られてくる必要があって、それもまずい。

https://www.yamanjo.net/knowledge/internet/internet_18.html

ハガユウキハガユウキ

デジタル署名をするとき、秘密鍵は絶対本人以外に公開してはダメ。
それをすると、「秘密鍵で暗号化して送信してきた = 本人に違いない」っていうロジックが成立しなくなるから。

ハガユウキハガユウキ

フィンガープリントとは、やりとりするデータに対してハッシュ関数を使用して作成した、ハッシュ値のこと。

デジタル署名は、データのフィンガープリントを公開鍵暗号方式でやり取りすることで実現している。

  1. 受信者に事前に公開鍵を渡す。
  2. 送信者はデータのフィンガープリントを作成してそのフィンガープリントを秘密鍵で暗号化する。
  3. 暗号化したフィンガープリント(= デジタル署名)とデータを受信者に送る。
  4. 受信者は暗号化されたフィンガープリントを公開鍵で復号して(復号してもよくわかんない文字)、送られてきたデータからフィンガープリントを作成する。
  5. フィンガープリントが一致するか検証して、一致するなら秘密鍵でデジタル署名が作られたという意味になるので、①ちゃんと本人から送られてきたかつ②内容が改ざんされていないことが理解できる

https://www.infraexpert.com/study/security5.html
https://www.yamanjo.net/knowledge/internet/internet_18.html

ハガユウキハガユウキ

gptに聞いたsshのざっくりとしたフロー

  1. クライアント側で秘密鍵と公開鍵を作って、公開鍵をサーバーに配置する
    • サーバーの ~/.ssh/authorized_keys に登録。
  2. クライアントがsshでサーバーに接続する
  3. サーバーはクライアントに対して公開鍵を提示するので、その鍵が~/.ssh/known_hostsに含まれているかを確認して、ちゃんと通信したいサーバーかどうかを検証する(サーバー認証)
    • このファイルには「以前接続したサーバーの公開鍵(ホスト鍵)」が保存されている
    • yesと答えると、その鍵が known_hosts に登録されて、次回からは自動で検証される
  4. クライアント側でサーバー認証後、ディフィー・ヘルマン鍵共有などの仕組みを使って、クライアントとサーバーしか持たない共有鍵を作成する。
    • これで共有鍵暗号化方式で通信内容を暗号化して通信することが出来る
    • 暗号化していない状態でユーザーデータをサーバーに送りたくないので、鍵交換のプロセスはユーザー認証前に行う。
      ---- 以降の通信データはこの共有鍵を使って暗号化される ----
  5. サーバーは秘密鍵を持っている本人かどうかを確かめるための “署名対象となるデータを共有鍵で暗号化してクライアントに送る。
  6. クライアントは共有鍵でデータを復号して、そのデータに対して秘密鍵で署名を作って、データと署名を共有鍵で暗号化して送る。
  7. サーバーは共有鍵で送られたデータを復号して、公開鍵で署名を復号 & データに対してhash関数でフィンガープリントを作成して、2つが一致するか検証する(ユーザー認証)。一致したらサーバーに登録した本人と通信していると分かるので、以降はそのユーザーで通信を開始できる。
ハガユウキハガユウキ

クライアントが自分でチャレンジを作って署名しても、それが「本物の本人」かどうかサーバーは検証できない(=証明にならない)

gptがこれを言っていたがあまり理解できてない

今wiki見ると同じこと書いてるな。

SSHの暗号通信はいわゆるハイブリッド暗号であり:

  • 鍵交換アルゴリズム(ディフィー・ヘルマン鍵共有など)で共通鍵暗号のセッション鍵を生成し
  • 共通鍵暗号(トリプルDES、AESなど)で通信を暗号化し
  • 公開鍵暗号(RSAやDSA)でホストやユーザ認証を行なう
    認証方式は公開鍵認証の他にも、パスワード認証、ワンタイムパスワードなどが提供されており、各個人/企業の情報セキュリティポリシーに合わせて選択できる。

https://ja.wikipedia.org/wiki/Secure_Shell