~~SLIDESHOW thesis~~
sshの公開鍵認証について考えてみよう
↑タイトル横右端のスライドっぽい絵をクリックしたらスライド表示になります.JavaScript有効にしてくださいね.
<div style="line-height: 1.2em; font-weight: bold; font-size: 1.2em;"><a href="http://www.ten-forward.ws/">加藤泰文 / TenForward</a></div>
<script language="javascript">
var foodiv;
if (document.getElementById) {
foodiv = document.getElementById('footer');
} else {
foodiv = document.footer;
}
foodiv.innerHTML = '<h1>sshの公開鍵認証について考えてみよう</h1><h2>第2回関西アンカンファレンス 2011.01.08</h2>';
</script>
自己紹介
加藤泰文
-
Twitter:
<a href="http://twitter.com/ten_forward/">@ten_forward</a>
Wassr:
<a href="http://wassr.jp/tenforward/">@tenforward</a>
Plamo Linux メンテナ
Jetspeed2 ドキュメント翻訳
Asterisk ユーザ会
ssh の公開鍵認証が意外に理解されていない事件に何度か遭遇しました.
おさらい ~ ssh
おさらい ~ 暗号
暗号で防ぐモノ.
秘密が漏れる(盗聴)こと
改ざん
なりすまし
否認
おさらい ~ 公開鍵暗号
暗号化と復号に別個の鍵(手順)を使い,暗号化の為の鍵を公開できるようにした暗号方式
誰にでも公開可能な「公開鍵」と密かに持っておく「秘密鍵」の鍵ペア
公開鍵から秘密鍵を得ることは非常に難しい (現実的な時間内で無理)
共通鍵暗号 … 鍵の配送問題
RSA暗号 … 電子署名にも使える
話はそれますが
ssh を使わないと
ssh で暗号化
とりあえず ssh で通信を暗号化する.
ホスト認証 (通信相手が確認可能)
パスワード認証 (ユーザ認証)
ssh で公開鍵認証
公開鍵をサーバに登録
アクセス時に秘密鍵を持っている事を宣言
サーバは秘密鍵に対応する公開鍵があるかどうか確認し,本当に秘密鍵を持っているかどうかの証明を求める
秘密鍵の所有を証明する
サーバでその証明を確認
ssh で公開鍵認証
ここで ssh の公開鍵認証に関する勘違いの事例を見て何が間違っているか考えてみましょう.
事例 (1)
サーバ管理者とアプリケーションの管理者が分かれているサーバ環境で管理を行うケースでのエンジニア同士の会話…
<color blue>サーバ管理者</color> : 「アプリケーションやコンテンツの管理は ssh 経由で行います.セキュリティを考えて ssh は公開鍵認証のみ許可します.公開鍵を root ユーザに登録しますので,アクセスして管理を行って下さいね」
<color green>アプリ管理者</color> :「秘密鍵と公開鍵を作成しましたので送りますね! 秘密鍵のパスワードは xxxxx です! 登録お願いします」
メールで公開鍵と<color red>秘密鍵が</color>送られてきました.
事例 (2)
公開鍵認証のみ有効の ssh サーバでアプリを管理しているサーバで,アプリ管理者がサーバにアクセスできなくなってサーバ管理者に相談… アプリ管理者の公開鍵は root ユーザに登録されています.
<color green>アプリ管理者</color>: 「サーバにアクセスできなくなりました.調べてもらえますか? 私のパスワードは xxxxx です」
それぞれ何が間違っていたでしょう?
それぞれの管理者は何を勘違いしていたのでしょう?
仕組みをちゃんと理解して,その意味を考えて使いましょう.(sshに限らず)
秘密鍵の扱い
秘密鍵は文字通り「秘密」にしているから秘密鍵であって,人に渡したら秘密鍵でなくなります.
サーバ上の 1 ユーザに対して複数の公開鍵が登録出来るので共用の鍵ペアという運用はやめて個人ごとのものにしましょう.
事例(1)の <color green>アプリ管理者</color> は,公開鍵だけ渡せば問題はないことを理解していなかったのでしょう.
パスフレーズ(1)
パスフレーズ(2)
秘密鍵がもれてもパスフレーズがもれなければ,最悪の自体は回避可能です.しかし,事例(1)の<color green>アプリ管理者</color>のように秘密鍵とパスフレーズを同時に外部に出してしまっては,本人以外が秘密鍵を使用可能になるので秘密鍵になりません.:(
事例(2)の<color green>アプリ管理者</color>は,秘密鍵は自分の所だけにあって,パスフレーズだけ教えているので,秘密鍵は「秘密」のままなので,とりあえずは問題はありません.
しかし,パスフレーズだけ <color red>サーバ管理者</color> に教えても,秘密鍵をサーバ管理者が持っていないのですから,まったく意味のない行為をしている事になります.
まとめ
参考
ありがとうございました