sshを便利にする公開鍵暗号:仕事で使える魔法のLAMP(4)
前回までに、VPSにリモートログインする準備ができました。しかし、固定IPアドレスのコンピュータからでしか接続できないという問題が残っています。今回はこの問題の解決に役立つ公開鍵認証について解説します(編集部)
sshの接続元を限定できないなら公開鍵認証
前回までで、初期状態のサーバを安全にしておくため、最低限やっておくべき設定が終わりました。他人や攻撃者からのsshログインを制限する方法として、接続元のIPアドレスを限定するという手法を紹介しましたが、IPアドレスが固定でないと使えません。一般向けのインターネット接続環境では、IPアドレスが固定されていないことも多く、sshのアクセス元を限定できないという人も多いでしょう。
そこで今回は、公開鍵認証について解説します。公開鍵認証であれば原理上本人しかログインできないため、接続元をIPアドレスで限定できない状況でも安全にsshを利用できます。公開鍵認証を有効にした上でパスワード認証を禁止すれば、パスワード総当たりの攻撃を防ぐことができます。
また、公開鍵認証はパスワード入力が不要になるという利点から、自動的なシステム間の連携などにも使うテクニックです。セキュアなWebサイトを構築するのに使うSSLも同じ原理に基づいています。使い方をマスターしておいて損はないでしょう。LAMPという話題からはちょっと脱線しますが、お付き合いください。
公開鍵認証は技術を理解してから使う
公開鍵認証を利用するための手順を説明する前に、その仕組みを説明しておきたいと思います。安全を確保するためにどうすればいいか、あるいは何が危険なのかを理解しないまま取り扱うのは、それ自体がリスクとなるからです。
公開鍵認証は、公開鍵暗号という暗号技術に基づいた認証方法です。そこで、まずはこの暗号技術の概念を解説することにします。
ところで、暗号などの分野では送信者や受信者のことを、アリスとボブという名前で呼ぶ慣習があります。送信者などとよぶよりも分かりやすいですから、ここからはアリスとボブでいきます。
まず、共通鍵暗号を理解する
暗号といえば、いちばんイメージしやすいのは共通鍵暗号でしょう。zipなどのアーカイブファイルを暗号化するのに利用されたことがある方も多いと思います。1970年代から80年代にかけ、公開鍵暗号が実用化されるまでは、暗号といえば共通鍵暗号のことでした。
共通鍵暗号では、暗号化と復号に同じ鍵を使います。アリスがある鍵で暗号化したとすると、そのデータを受け取ったボブは同じ鍵を持っていないと復号できないのです(図1)。鍵をアリスとボブの間の秘密としておかなければならないことから、秘密鍵暗号ともいいます。
暗号としての安全性を確保するには、鍵が盗まれないようにしなければなりません。突き詰めれば、ボブとアリスは直接に会って鍵を共有しなければならないということでもあります。鍵の共有に何らかの通信手段を利用すれば、盗聴されてしまう危険性について考える必要もあります。最初から離れた場所にいるような相手に、安全に鍵を渡すことはかなり困難なことなのです。
これを鍵配送問題といいます。加えて、安全のためには鍵を定期的に新しいものに交換しなければなりませんので、なおさら鍵配送問題は重くのしかかります。鍵のけた数によっては総当たりで鍵を破ることもできますし、さまざまな情報から鍵を分析するような攻撃手法もあるためです。
2つの鍵を利用する公開鍵暗号
この配送問題を解決するために考え出されたのが公開鍵暗号です。公開鍵暗号では2つの鍵のペアを使います。ペアの一方の鍵で暗号化すると、もう一方の鍵でしか復号できないという特徴があるのです。また、鍵ペアの片割れからもう一方を導き出すことは困難になっているので、安全性は極めて高いと言えます。
再びボブとアリスに登場してもらって、公開鍵暗号の暗号化と復号の流れを解説します。ボブは鍵ペアのうち一方をアリスに渡しておき、もう一方は自分だけの秘密にしておきます。アリスはボブから渡された鍵を使って暗号化します。そうするとそのデータを復号できるのは、鍵の片割れをもっているボブだけとなります(図2)。ボブの他に復号できる人はいません。
つまり、ボブがアリスに渡した鍵は、仮に誰に知られたとしても暗号が破られる恐れはないのです。これを公開してもよい鍵、すなわち公開鍵と呼びます。公開鍵は盗聴されたとしても問題ないので、どのような手段でも送付できるでしょう。つまり鍵配送問題は公開鍵暗号を使うことで解決できるのです。
鍵ペアのもう一方の、ボブが秘密にしている鍵は秘密鍵と呼び、こちらはボブが厳重に秘密にしておかなければなりません。この秘密鍵で復号するのですから、秘密鍵が流出してしまっては元も子もないわけです。そのため、さらなる安全対策として、秘密鍵を共通鍵暗号で暗号化しておき、使うときに復号するのが普通です。
公開鍵暗号の安全性は、公開鍵から秘密鍵を割り出せないような、数学的な性質に基づいています。例えば広く使われているRSA暗号では、大きな数の素因数分解が困難であるという性質を利用しているのです。とはいえ、マイクロプロセッサの性能はどんどん向上しており、鍵のけた数が小さいと、それだけ破られる可能性が高くなります。現在では2048bit程度の大きさの鍵を使うのが普通です。
なお、公開鍵暗号は共通鍵暗号の弱点である鍵配送問題をクリアしましたが、取って代わったわけではありません。共通鍵暗号に比べ、公開鍵暗号は「重い」、つまり処理に時間がかかるのです。そのため実際には、共通鍵暗号の鍵をやりとりするために公開鍵暗号を使い、通常の通信は共通鍵暗号で暗号化することがほとんどです。sshだけでなく、SSL(Secure Socket Layer)でも同じ方法でデータを暗号化しています。
2つの鍵を利用する公開鍵暗号
さて、こんどはボブが自分の秘密鍵で暗号化してアリスに送付する、というシーンを考えてみましょう。この場合、アリスは受け取った暗号化データをボブの公開鍵を使って復号できます。しかし、公開鍵はアリス以外にも持っている人がいるかもしれません。
これでは暗号としての役には立ちません。しかし、その暗号データがボブの公開鍵で復号できるということが確認できるなら、間違いなくボブが暗号化したものである、ということの証明にはなります。
例えばボブが、自分で作った書類などのデータと、秘密鍵でそのデータを暗号化したデータを一緒に送付すれば、その書類データは間違いなくボブが作った物であるということを証明できるのです。これがいわゆる電子署名の原理です(図3)。
sshの公開鍵認証は、この電子署名を応用しています。sshサーバ側にはあらかじめユーザーの公開鍵を、sshクライアント側には秘密鍵を設定しておきます。ユーザーがクライアントで接続すると、サーバはランダムな情報をクライアントに提示します。クライアントはこの情報を秘密鍵で暗号化してサーバに送ります。つまり署名して返答するということです。これを復号して、サーバが送信した情報と同一であると分かれば、正当なユーザーであると判断できるわけです。
秘密鍵を不正に扱えば、「なりすまし」が可能ということもここまでくれば明らかでしょう。繰り返しになりますが、秘密鍵は所有者が厳重に管理しなくてはなりません。社会生活に例えると、印鑑や、文字通りのサインに近いものがあります。事実、電子政府においては実印と同じ効力を発揮します。
以上が公開鍵暗号の基本です。sshを実際に設定して利用する方法は次回に解説します。
- CMakeでMySQLをビルドしてみる
- MySQLのビルドに欠かせないCMakeを準備する
- いよいよMySQL編、ソースからビルドすべきか?
- PHPでセッションを利用するための設定
- クライアントがアクセスできる範囲を制限する
- エラーメッセージをどう扱うか?
- ファイルのアップロードを制限する
- リクエストデータを受け取る変数の扱い
- マジッククオート機能には頼らない
- 安全を考えてPHPの実行時設定を調整する
- Apacheの設定ファイルでPHPの設定を変える
- PHPの設定ファイルを作って配置してみる
- PHPスクリプトを実行できるようにする準備
- PHPエクステンション組み込みの仕上げ
- 単純なデータを管理するDBMを使えるようにする
- エクステンションの組み込み状況を確認する
- PHPでデータベースを使う準備をする
- XMLを処理できるようにする
- エクステンションを有効にしてビルドに挑戦!
- PHPテスト失敗の原因を追究する
- 早速PHPをビルド! そしてテスト!
- PHP編に突入! まずはソースをダウンロード
- 設定ファイルを作成してApacheを動作させる
- 設定ファイルや公開ドキュメントの配置を考える
- 1つのサーバに複数の仮想サーバ?
- Apacheの設定ファイルを記述する前に
- サードパーティのApacheモジュールをビルドする
- 認証DBにアクセスするライブラリを組み込む
- Apache同梱ソフトウェアに引数を渡してビルド
- OpenSSLをビルドしてApacheで利用する
- proxyやsslのモジュールを使ってみる
- ライブラリが足りなくてビルドできないときは?
- Apache HTTP Serverのビルドを始めよう
- configureでソフトウェア固有の設定を変更してみる
- configureの設定を変更してみる
- 配布パッケージの中身と、configureの役目を知る
- ダウンロードファイルが真正なものであるかを確認
- Makefileをいろいろ書き換えながらビルドしてみよう
- makeを使ってソフトウェアをビルドしてみよう
- ダイナミックリンクとスタティックリンク
- 「ビルド」という作業は何を指しているのか
- 公開鍵認証でsshを安全に使う
- sshを便利にする公開鍵暗号
- アクセス制限の設定とCentOSのアップデート
- サーバに接続して、一般ユーザーのアカウントを作る
- LAMP環境、自分で作りませんか?
Copyright © ITmedia, Inc. All Rights Reserved.