Geecul

Geekに踊ってカルチャーと寝る

OpenSSHについて調べてみた

サーバー周りを触るようになると、

SSH鍵の生成や交換も自分でやる必要が出てきた。

LPIC1の取得時に勉強したきりで、理解があやふやになっていた部分もあるので改めて勉強してまとめてみる。

SSHとは

SSH(Secure Shell)とは、安全にネットワーク上の他のサーバー等にログインするためのプロトコル。

"安全"の部分は通信経路の暗号化によって行われる。

OpenSSHとは

SSHプロトコル利用のためのソフトウェア。

サーバー、クライアントの役割を備えたソフトウェア。

現在の最新バージョンは8.0。

SSHとOpenSSHの違い

SSHはプロトコルで、OpenSSHはソフトウェア。

SSHという安全な通信をするための決まりや仕組みがSSH。

SSHという決まり、仕組みを実際に使えるようにしたソフトウェアの一つがOpenSSH。

UML図にすると下のように表現できるかな。

OpenSSHはSSHの実現方法の一つなので、もちろん他にもソフトウェアはあって、

例えばTera TermやRSIT(Reflection for Secure IT)もSSHを実現したソフトウェアの一つとなる。

f:id:youzine:20190914191420j:plain

SSLとSSHの違い

SSH:リモート先のシェルとの接続を暗号化する。認証を伴う。
SSL:インターネット上の通信を暗号化する。認証を伴わない。

SSLは認証はなく、公開鍵方式による暗号化のみ。
認証ではなくて、公開鍵基盤という仕組みを利用した場合に接続先の公開鍵の実在証明は行われる。

※ここらへん、こんがらがってくる理由の一つが、
OpenSSHを利用するためにはOpenSSLも導入しないといけないということ!

仕組み

OpenSSHはクライアントからサーバーにログインが試みられると2種類の認証、ホスト認証とユーザー認証が行われる。  

●ホスト認証

接続先のサーバーが正しいサーバーかを確認する。
事前にサーバーとの間で交換していた公開鍵がクライアントの known_hoss ファイルに書き込まれているので、
known_hostsの内容とサーバーから送られてきた公開鍵を比較して、
同じものであれば接続先が想定していたサーバーとして認証する。

●ユーザー認証

サーバー側が接続元のクライアントが正しいユーザーかを確認する。
SSHのユーザー認証ではパスワード認証と、公開鍵認証がよく使われる。

パスワード認証:文字通りユーザーが入力するパスワードが接続先サーバーに存在するユーザーのパスワードと同じか確認する。

公開鍵認証:接続元の公開鍵をあらかじめ接続先サーバーにあるログインユーザーの~/.ssh/authorized_keysファイルに登録しておく。
接続元が接続先サーバーに接続する際に公開鍵を送り、サーバー側で~/.ssh/authorized_keysファイルの内容と比較して同じか確認する。

これらの認証を正常に終えると、接続先サーバーでシェルの操作が行えるようになる。

実践:ホスト認証→パスワード認証

ubutnu1サーバー:SSHクライアント (192.168.179.9)
ubutnu2サーバー:SSHサーバー (192.168.179.10)

一度もSSH接続していないので、/etc/known_hostsファイル、 ~/.ssh/authorized_keys ファイルが作られていない

f:id:youzine:20190915123321p:plain
ubuntu1初期状態
f:id:youzine:20190915123322p:plain
ubuntu2初期状態

f:id:youzine:20190915131210p:plain
ubuntu1からubutnu2へuser2としてssh接続。初回接続でubuntu2のホスト鍵がないので、本当に接続していいか聞かれる(ホスト認証)。この時に正しいユーザーかどうか確認するためにパスワードを聞かれる(ユーザー認証)。

f:id:youzine:20190915130052p:plain
ubutnu2のssh接続を終了し、ホームディレクトリを確認すると、known_hostsファイルが作られ、中にubntu2のホスト公開鍵が登録されていることが確認できる
f:id:youzine:20190915130228p:plain
ubuntu2でhost公開鍵を確認するとubutnu1のuser1ホームディレクトリに作成されたknown_hostsの内容と同じことが確認できる

f:id:youzine:20190915131819p:plain
再度ubuntu1からubutnu2へssh接続すると、ubutnu2のホスト鍵を既に持っているので、ubutnu2が接続先として正しいかは聞かれない。ホスト認証は裏で実行され、ユーザー認証のためのパスワード確認が行われる。

実践:鍵交換

f:id:youzine:20190915133019p:plain
ubutnu1にてuser1の公開鍵と秘密鍵のペアを作成する。保存場所と鍵を使用する際のパスフレーズの設定を促されるが今回は設定しない。作成後~/.ssh下に鍵ペアができる。
f:id:youzine:20190915133742p:plain
ubuntu1のuser1の公開鍵をubuntu2のuser2のホームディレクトリに転送する

f:id:youzine:20190915134513p:plain
ubuntu2のuser2でubntu1のuser1から公開鍵が送られてきたことを確認。.sshディレクトリがないので作成する。
f:id:youzine:20190915135008p:plain
ubuntu1のuser1公開鍵を.ssh/authorized_keysに記載する(ここではファイルがないので作成している)

実践:ホスト認証→公開鍵認証

f:id:youzine:20190915135451p:plain
ubuntu1のuser1の公開鍵はubuntu2のuser2のauthorized_keysに記載されている。そのためubutnu1のuser1がubuntu2のuser2へssh接続すると、裏でホスト認証とユーザー認証が行われるためパスワード認証の必要がない。

感想

とりあえず調べて、やってみて、あやふやだった部分が解決した。
それはいいんだけど、記事書くの意外としんどかったな(笑)
記事用に環境構築したり、画面キャプチャしたり。Quitaとかめちゃくちゃ更新している人すごいわ。

記載内容に誤りとか、何かアドバイスがあればご教示ください!

リンク

OpenSSH公式https://www.openssh.com/

ja.wikipedia.org ja.wikipedia.org www.unixuser.org

RFC(Requets for Comment)
RFC 4250 - The Secure Shell (SSH) Protocol Assigned Numbers
RFC 4251 - The Secure Shell (SSH) Protocol Architecture
RFC 4252 - The Secure Shell (SSH) Authentication Protocol
RFC 4253 - The Secure Shell (SSH) Transport Layer Protocol
RFC 4254 - The Secure Shell (SSH) Connection Protocol
RFC 4255 - Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints
RFC 4256 - Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)
※英語でこんなにいっぱい読めない!(時間と体力的に)