ユーザがLinuxにSSHでログインするときに必要な認証のひとつがホスト認証だ。
このページではホスト認証について紹介していこう。
目次
SSHにおけるホスト認証
なりすまし
SSHでは初期設定でもユーザがログインするまでに二つの認証を行う。一つが「ユーザ認証」そしてもう一つが「ホスト認証」である。
ユーザ認証というのは文字通り「ユーザ名」と「パスワード」でログインを行うことだ。これはLinuxを使う上で必ずやるログインだ。
SSHではユーザ認証の他にホスト認証というものを行なう。このホスト認証はサーバの正当性を確保するための認証だ。「そのホスト(サーバ)が本当にログインするべきサーバなのか?」を確認する。
下記のように接続先のホストになりすました偽物にアクセスし、重要なデータを奪われないためだ。
対策
このなりすましからクライアントを守るためにログインしているコンピュータ街としているホストかどうかを確認する。
SSHでは通信の開始時にSSHサーバ側からクライアントに対してホスト間認証用の公開鍵(とよばれるデータ)が送信される。
公開鍵は秘密鍵と呼ばれる固有のペア鍵を持っていて、これを元に正しい接続先かを確認できる。はじめは難しいかもしれないが、操作をしていくうちにだんだん理解できるだろう。
クライアントは「~/.ssh/know_hosts」に公開鍵の情報が記録される。これらが「公開鍵暗号技術」を使用して認証されホスト認証が完了し、その後ユーザ認証に移り、ログインすることになる。
ちなみに順序としては「ホスト認証」「ユーザ認証」の順で認証手続がおこなわれることになる。
実際にログインしてみる
SSHでサーバにログインするには、各クライアントと各サーバが、適切にインストールおよび設定されている状態で、クライアントから「ssh」コマンドを使用してサーバにログインする。
$ ssh -l <ユーザ名> <サーバアドレス>
という書式になる。
インストールおよび初期設定に関しては以下のページを参照してほしい。
「SSHのインストールと設定」
各サーバにおいて初回接続時には、以下のようなメッセージが表示されるが、これは「~/.ssh/know_hosts」に公開鍵の情報記録が存在しないため、鍵の正当性が確保出来ないそのため表示される。初回接続このメッセージは問題ない。
「Are you sure you want to continue connecting (yes/no)?」
ここでは「Yes」と回答する。すると「~/.ssh/know_hosts」に情報が記録されるため、二回目以降はこの質問がされることはない。いきなりユーザパスワードを求められるようになる。
サーバのアカウントとパスワードを打ち込めば無事にログインできるはずだ。
もしサーバ側もクライアント側もSSH関係の設定を変更した覚えがないにもかかわらず、初回時と同じような質問がなされた場合、サーバ側のなりすまし、つまり不正なホストへ誘導されている可能性があるので厳重注意しよう。
鍵を確認する
「フィンガープリント」日本語に訳すと「指紋」である。ホスト認証においてフィンガープリントが一致していれば「問題なし」と認識される。フィンガープリントの情報はサーバ側の「/etc/ssh/ssh_host_<暗号形式>_key.pub」に記録されており
# ssh-keygen -l -f /etc/ssh/ssh_host_<暗号形式>_key.pub
とすると確認ができる。
初回接続時などに表示されるフィンガープリントは念のため覚えておくと、トラブルのときに助けになる。
なお同じディレクトリ内に存在する「ssh_host_<暗号形式>_key」というファイル、これが秘密鍵である。これは文字通り外部にもれてはいけない秘密のキーである。
もしファイルが偽造された可能性、もしくはなりすましがある場合以下のようなメッセージが表示される。この場合もホストに異常がある状態である。サーバ側の管理に連絡をいれるか、もしくは管理者なら接続先などを確認すること。
公開鍵暗号とは?
冒頭で「公開鍵暗号技術」という単語を使用したが、「よくわからない」という方もいらっしゃるだろう、イメージをつかんでもらうためにごく簡単に解説する。
「公開鍵暗号」は「暗号化するための鍵」と「復号化するための鍵」を別々に用意するという特徴をもっている。具体的な手順をあげる、「公開鍵暗号を使用したマーガレットとアリスのやり取り」である。
- マーガレットが手元で公開鍵と秘密鍵を生成する。秘密鍵は大切にしまっておく。
- マーガレットは公開鍵をアリスへ送信する。この時公開鍵は流出しても問題にならない。
- アリスはマーガレットからもらった公開鍵を使用してメッセージを暗号化する。
- マーガレットは暗号化されたメッセージを受取、秘密鍵で復号化する。
簡潔にいうと「公開鍵で暗号化」し「秘密鍵で復号化」しているのである。公開鍵は暗号化するための鍵なので、通信経路上で盗聴されても問題ない。また公開鍵暗号は「非対称暗号」ともよばれる。
なぜ公開鍵暗号を使用するのか?「鍵配送問題」
例えばアリスとマーガレットが「相手と秘密の文章をやり取りしたい」といった場合「手元で暗号化した文章」があり、それを「複合化するための鍵」が必要になる。
- マーガレットが手元で暗号化した文章をアリスへ送る。
- しかしこのままではアリスは、複合化するための鍵を持っていないので、暗号化されてきた文章は読むことが出来ない。
- そこでアリスはマーガレットに「複合するための鍵」を要求することになる。
- マーガレットはアリスに鍵を転送する。
一見問題なさそうに見えるかもしれないが、もし3の時点で通信を第三者が盗見していた場合、複合するための鍵を第三者が知ることが出来てしまうのである。
一般的にこれは「鍵配送問題」といわれる。
この問題を解決するために公開鍵暗号が使用されるのである。
暗号形式について
rsa1
古いSSH環境で接続にしようしていた暗号形式であり、脆弱性があるため、基本的に使用してはならない。
rsa
RSAは共同開発者の「Rivest」「Shamir」「Adleman」の頭文字を取ったものである。
大きな素因数分解に現代のコンピュータは時間がかかる。それを利用し「計算量的」に安全が確保できることを根拠にしている。
4096bitと長い鍵長が選択できる。モダンなSSH2環境ならサポートしている。
dsa
DigitalSignatureAlgorithmの略である。アメリカ政府標準の方式として使われてきた暗号形式である。モダンなSSH2環境で確実に使用できる暗号形式だが、鍵長が1024bitと少々短い。
ecdsa
EllipticCurveDigitalSignatureAlgorithmの略である。
DSAの変種であり、鍵長が短かくても安全性を確保出来るようになっている。モダンなSSH2環境ならサポートしている。
基本的に環境がecdsaをサポートしているのならばecdsaを使用することを検討したほうがいいだろう。
まとめ
このページではLinuxでSSH接続する際のホスト間認証についてお伝えした。
少々難しい部分もあるが、「公開鍵と秘密鍵というペアで鍵が用意される」「これを認証に使って、安全にログインすることができる」ということをまずは理解しておこう。
コメント