PacSec2008 at 青山ダイヤモンドホール 振る舞いに基づく SSH ブルートフォース対策 平成 20 年 11 月 13 日 TOMOYO Linux Project 半田哲夫 TOMOYO is a registered trademark of NTT DATA CORPORATION in Japan. Linux is a trademark of Linus Torvalds. Other names and trademarks are the property of their respective owners.
はじめに 遠隔管理などで利用される SSH サービスへの不正なログインを許してしまうと 情報漏えいだけでなく 踏み台やトロイの木馬の設置のような被害が生じます 近年の攻撃手法は高度化 洗練化されてきており 従来の防御手法だけでは対処しきれない可能性が増えてきています アクセス制御機能を強化した OS を用いて 全く新しい防御手法を紹介します 例として TOMOYO Linux を利用します 2008.11.13 1
準備 : フローチャート この図の見方はご存じですよね? 1 2 No Yes 3 4 2008.11.13 2
準備 : 状態遷移図 この図の見方はご存じですよね? B B C A D B A C D C E E A 2008.11.13 3
準備 :Linux における状態遷移図の例 /sbin/init を起点にツリー状に広がります /sbin/init /sbin/mingetty /etc/rc.d/rc.sysinit /etc/rc.d/rc.sysinit /sbin/mingetty /bin/login /bin/login /sbin/start_udev /sbin/start_udev /bin/unicode_start /bin/unicode_start /bin/kbd_mode /bin/kbd_mode /bin/setfont /bin/setfont 2008.11.13 4
準備 :TOMOYO Linux とは 状態遷移をデザインし強制するツール プログラムの中で発生するプログラムの実行要求を監視し その可否を制限する プログラムの実行により状態遷移を行う リクエストを観測し制限するツール プログラムの中で発生するファイルの読み書き要求を監視し その可否を制限する プログラムの実行要求やファイルのオープン要求によりプロセスの内部状態を更新する 2008.11.13 5
準備 :SSHセッションの種類 対話型シェルセッション シェルが提供され 自由にコマンドを入力できる 自由に資源にアクセスできる 非対話型シェルセッション シェル起動時に -c で指定されたコマンドが実行される scp や sftp など 非シェルセッション シェルが提供されない ポートフォワーディングなど /usr/sbin/sshd /bin/bash /bin/bash?????? 2008.11.13 6
知識に基づく認証 従来の対策 ブルートフォース攻撃の対象になります ログイン認証を突破されないことを前提とした対策 突破される確率を減らす ファイアウォールと連動して認証に失敗したクライアントを一定期間再接続禁止にする 公開鍵認証を用いる 攻撃の分散化やパスワード 秘密鍵の漏洩が始まっています 2008.11.13 7
提案する対策 振る舞いに基づく認証 状態遷移を活用します 従来のログイン認証を突破されることを前提とした対策 従来のログイン認証から先を制限します とりあえずログインシェルを与えてみて 期待通りの振る舞いをするかどうかを観察します 労働契約における試用期間をイメージしてください 2008.11.13 8
従来の対策のフロー ログイン認証までをカスタマイズする SSH サーバがクライアントからの接続を受け付ける ログイン認証を行う 成功 失敗 作業を行う SSH サーバとの接続を切断する 2008.11.13 9
提案する対策のフロー ログイン認証から先をカスタマイズする SSH サーバがクライアントからの接続を受け付ける ログイン認証を行う 成功 失敗 振る舞いを検査 正常 不審 作業を行う SSH サーバとの接続を切断する 2008.11.13 10
扉をあけて 常識は捨ててください なんでもあり の世界です あなた自身のアイデアを実装してください 新しい世界の始まりです セキュアな世界へようこそ! 2008.11.13 11
ケース1: 対話型シェルセッション 打鍵タイミングを利用します 利用するもの 自作プログラム /bin/timeauth /usr/sbin/sshd /bin/bash /bin/bash /bin/timeauth /bin/timeauth /bin/bash?????? /bin/bash?????? 2008.11.13 12
ケース 1: 対話型シェルセッション 2008.11.13 13
ケース 1: 対話型シェルセッション 2008.11.13 14
ケース 1: 対話型シェルセッション 2008.11.13 15
ケース 1: 対話型シェルセッション 2008.11.13 16
ケース 1: 対話型シェルセッション 2008.11.13 17
ケース 1: 対話型シェルセッション 2008.11.13 18
ケース 1: 対話型シェルセッション 2008.11.13 19
ケース 1: 対話型シェルセッション 2008.11.13 20
ケース 1: 対話型シェルセッション Password is PacSec 2008.11.13 21
ケース 1: 対話型シェルセッション Password is PacSec NG. Go away! 2008.11.13 22
ケース 1: 対話型シェルセッション 2008.11.13 23
ケース 1: 対話型シェルセッション 2008.11.13 24
ケース 1: 対話型シェルセッション Password is 2008.11.13 25
ケース 1: 対話型シェルセッション Password is P 2008.11.13 26
ケース 1: 対話型シェルセッション Password is Pa 2008.11.13 27
ケース 1: 対話型シェルセッション Password is Pa c 2008.11.13 28
ケース 1: 対話型シェルセッション Password is Pa c S 2008.11.13 29
ケース 1: 対話型シェルセッション Password is Pa c Se 2008.11.13 30
ケース 1: 対話型シェルセッション Password is Pa c Se c 2008.11.13 31
ケース 1: 対話型シェルセッション Password is Pa c Se c 2008.11.13 32
利点 ケース 1: 対話型シェルセッション 使える要素が制限されない RFC などの標準に従う必要がない どんな要素を使っているかを秘匿できる 想定外の認証方式 侵入者が思いも付かない方法を使える パスワード文字数が少なくても タイミング情報と組み合わせることでブルートフォースを無意味に 2008.11.13 33
ケース1: 対話型シェルセッション 難点 アクセス制御機能を強化した OS が必要 ログインシェルから実行できるコマンドを制限するため MAC( 強制アクセス制御 ) と呼ばれる機能を利用 Round Trip Time が大きいと使いにくい 外国からのアクセスを防ぐのには好都合? 2008.11.13 34
ケース2: 対話型シェルセッション ワンタイムパスワードとメールを利用します 利用するもの SMTPサーバ 自作プログラム /bin/mailauth /usr/sbin/sshd /bin/bash /bin/bash /bin/mailauth??? /bin/mailauth /bin/bash /bin/bash????????? 2008.11.13 35
ケース 2: 対話型シェルセッション 2008.11.13 36
ケース 2: 対話型シェルセッション 2008.11.13 37
ケース 2: 対話型シェルセッション 2008.11.13 38
ケース 2: 対話型シェルセッション 2008.11.13 39
ケース 2: 対話型シェルセッション 2008.11.13 40
ケース 2: 対話型シェルセッション 2008.11.13 41
ケース 2: 対話型シェルセッション 2008.11.13 42
ケース 2: 対話型シェルセッション 2008.11.13 43
ケース 2: 対話型シェルセッション 2008.11.13 44
ケース 2: 対話型シェルセッション 2008.11.13 45
ケース 2: 対話型シェルセッション 2008.11.13 46
ケース 2: 対話型シェルセッション 2008.11.13 47
ケース 2: 対話型シェルセッション 2008.11.13 48
ケース 2: 対話型シェルセッション 2008.11.13 49
ケース 2: 対話型シェルセッション 2008.11.13 50
ケース 2: 対話型シェルセッション 2008.11.13 51
ケース 2: 対話型シェルセッション 2008.11.13 52
ケース 2: 対話型シェルセッション 2008.11.13 53
ケース 2: 対話型シェルセッション Password is 2008.11.13 54
ケース 2: 対話型シェルセッション Password is 2008.11.13 55
ケース 2: 対話型シェルセッション Password is 2008.11.13 56
ケース 2: 対話型シェルセッション Password is 2008.11.13 57
ケース 2: 対話型シェルセッション Password is 2008.11.13 58
ケース 2: 対話型シェルセッション 2008.11.13 59
ケース 2: 対話型シェルセッション 2008.11.13 60
ケース 2: 対話型シェルセッション 2008.11.13 61
ケース 2: 対話型シェルセッション 2008.11.13 62
ケース 2: 対話型シェルセッション 2008.11.13 63
ケース 2: 対話型シェルセッション 2008.11.13 64
ケース 2: 対話型シェルセッション 2008.11.13 65
ケース 2: 対話型シェルセッション 2008.11.13 66
ケース 2: 対話型シェルセッション 2008.11.13 67
ケース 2: 対話型シェルセッション 2008.11.13 68
ケース 2: 対話型シェルセッション 2008.11.13 69
ケース 2: 対話型シェルセッション 2008.11.13 70
ケース 2: 対話型シェルセッション Password is 2008.11.13 71
ケース 2: 対話型シェルセッション Password is 2008.11.13 72
ケース 2: 対話型シェルセッション Password is 2008.11.13 73
ケース 2: 対話型シェルセッション Password is 2008.11.13 74
ケース 2: 対話型シェルセッション Password is 2008.11.13 75
ケース 2: 対話型シェルセッション 2008.11.13 76
ケース 2: 対話型シェルセッション 2008.11.13 77
ケース 2: 対話型シェルセッション 2008.11.13 78
ケース 2: 対話型シェルセッション 2008.11.13 79
ケース 2: 対話型シェルセッション 2008.11.13 80
ケース 2: 対話型シェルセッション 2008.11.13 81
ケース 2: 対話型シェルセッション 2008.11.13 82
ケース 2: 対話型シェルセッション 2008.11.13 83
ケース 2: 対話型シェルセッション 2008.11.13 84
ケース 2: 対話型シェルセッション 2008.11.13 85
ケース 2: 対話型シェルセッション Password is 2008.11.13 86
ケース 2: 対話型シェルセッション Password is 2008.11.13 87
ケース 2: 対話型シェルセッション Password is 2008.11.13 88
ケース 2: 対話型シェルセッション Password is 2008.11.13 89
ケース 2: 対話型シェルセッション Password is NG. Go away! 2008.11.13 90
利点 ケース 2: 対話型シェルセッション ワンタイムパスワードを生成したプロセス自身が検証も行う 時刻やカウンタなどの同期機構が不要 プロセスの消滅と同時にワンタイムパスワードも失効 ワンタイムパスワードが侵入者以外に漏洩しても問題にならない プロセスを生成したユーザ以外には何の価値もない 2008.11.13 91
難点 ケース 2: 対話型シェルセッション メールを受信できる必要がある 携帯電話のようなメール受信端末を所持していること メールを送信できる必要がある SMTP サーバや Web サーバのメール送信 CGI などが利用可能なこと 2008.11.13 92
ケース3: 非対話的シェルセッション 環境変数の有無やその内容を利用します 利用するもの SSH サーバの AcceptEnv ディレクティブ SSH クライアントの SendEnv ディレクティブ 自作プログラム /bin/env_check TOMOYO Linux の execute_handler ディレクティブ /usr/sbin/sshd /bin/env_chk /bin/env_chk /bin/bash /bin/bash 2008.11.13 93
ケース 3: 非対話的シェルセッション SSH サーバがクライアントからの接続を受け付ける ログイン認証を行う 成功 SSH サーバが環境変数を設定する 失敗 SSHサーバが execute_handler 認証成功を起動する失敗環境変数の検査を行う成功ログインシェルを起動する 要求されたコマンドを実行する SSH サーバとの接続を切断する 2008.11.13 94
ケース 3: 非対話的シェルセッション 2008.11.13 95
ケース 3: 非対話的シェルセッション 2008.11.13 96
ケース 3: 非対話的シェルセッション 2008.11.13 97
ケース 3: 非対話的シェルセッション 2008.11.13 98
ケース 3: 非対話的シェルセッション 2008.11.13 99
ケース 3: 非対話的シェルセッション NG. Go away! 2008.11.13 100
ケース 3: 非対話的シェルセッション Use this environ. 2008.11.13 101
ケース 3: 非対話的シェルセッション Use this environ. OK. Ready. 2008.11.13 102
ケース 3: 非対話的シェルセッション Use this environ. OK. Ready. 2008.11.13 103
ケース 3: 非対話的シェルセッション Use this environ. OK. Ready. 2008.11.13 104
利点 ケース 3: 非対話的シェルセッション クライアントからは透過に見える コマンドラインでの操作が不要 標準入出力の扱いが不変 環境変数をパスワードの代わりに使える 環境変数名を秘密にできる 環境変数の内容に応じて権限を分割することも可能 対話的シェルセッションを開始する前に適用することも可能 2008.11.13 105
難点 ケース 3: 非対話的シェルセッション TOMOYO Linux 専用 execute_handler を備えているのは TOMOYO Linux だけ SSH クライアントが環境変数を送信する機能 (SendEnv) をサポートしていない可能性 2008.11.13 106
ケース 3: 非対話的シェルセッション 応用例 : 環境変数による権限分割 /usr/sbin/sshd 玄関 ログインシェル /bin/bash /usr/libexec/openssh/sftp-server 読み書きモード 2008.11.13 107
ケース 3: 非対話的シェルセッション /usr/sbin/sshd 再検査 ダミー /bin/env_chk /bin/rw-sftp 読み書きモード 読み込み専用モード ダミー /bin/ro-sftp /bin/bash /usr/libexec/openssh/sftp-server /bin/bash /usr/libexec/openssh/sftp-server 2008.11.13 108
ケース4: 非対話的シェルセッション 独自のレイヤーを構築します 利用するもの scp や sftp コマンドの -S オプション 振る舞いを監視するためのサーバ側プログラム 振る舞いを指定するためのクライアント側プログラム TOMOYO Linux の execute_handler ディレクティブ 2008.11.13 109
ケース 4: 非対話的シェルセッション アプリケーション層 振る舞い指示機能 ( 独自プログラム ) 1 アプリケーション層 振る舞い監視機能 ( 独自プログラム ) /usr/bin/ssh /usr/sbin/sshd 2008.11.13 110
ケース 4: 非対話的シェルセッション アプリケーション層 アプリケーション層 振る舞い指示機能 ( 独自プログラム ) 1 2 振る舞い監視機能 ( 独自プログラム ) /usr/bin/ssh /usr/sbin/sshd 2008.11.13 111
ケース 4: 非対話的シェルセッション アプリケーション層 アプリケーション層 振る舞い指示機能 ( 独自プログラム ) 1 3 2 振る舞い監視機能 ( 独自プログラム ) /usr/bin/ssh /usr/sbin/sshd 2008.11.13 112
ケース 4: 非対話的シェルセッション アプリケーション層 アプリケーション層 振る舞い指示機能 ( 独自プログラム ) 1 3 2 4 振る舞い監視機能 ( 独自プログラム ) /usr/bin/ssh /usr/sbin/sshd 2008.11.13 113
ケース 4: 非対話的シェルセッション アプリケーション層 アプリケーション層 振る舞い指示機能 ( 独自プログラム ) 1 3 5 2 4 振る舞い監視機能 ( 独自プログラム ) /usr/bin/ssh /usr/sbin/sshd 2008.11.13 114
ケース 4: 非対話的シェルセッション アプリケーション層 アプリケーション層 振る舞い指示機能 ( 独自プログラム ) 1 3 5 2 4 Go! 振る舞い監視機能 ( 独自プログラム ) /usr/bin/ssh /usr/sbin/sshd 2008.11.13 115
ケース 4: 非対話的シェルセッション アプリケーション層 アプリケーション層 /usr/bin/ssh /usr/sbin/sshd 2008.11.13 116
利点 ケース 4: 非対話的シェルセッション 標準の機能で利用できない要素 ( 標準入出力やコマンドラインパラメータなど ) を使える 環境変数と組み合わせて利用できる 独自認証対応の可否に応じた権限分割ができる 2008.11.13 117
難点 ケース 4: 非対話的シェルセッション クライアント側にもプログラムを用意する必要がある 2008.11.13 118
PAM ではできないの? 自由度 難易度が違います 標準入出力やパラメータなどを独占できるので 他の PAM モジュールとの干渉が起こりません 誰にでも作ることができます RFC などの標準に縛られません 2008.11.13 119
PAM ではできないの? クライアント側の対応が不要です PAM の場合はクライアントが対応していないと使えません PAM を通過後に実行される処理 ( シェルなど ) に対応していないクライアントはありえません 2008.11.13 120
PAM ではできないの? 強制することができます 他の PAM モジュールの設定や実行結果により省略される心配がありません 生じうる状態遷移が MAC により規定されているので 想定外の抜け道 ( バッファオーバーフローやコマンドインジェクション ) の心配がありません 外部プログラムの助けを借りるのが容易です 2008.11.13 121
まとめ ホスト内での認証なので独自プロトコルを利用可能です アイデアの勝負です 利用可能な要素は無限にあります 正しい振る舞い ( 状態遷移 ) を知られない限りブルートフォースは不可能です 安価に構築でき 負担の少ない方法を選べます 2008.11.13 122
ケース5: 非シェルセッション クライアントプログラムをカスタマイズします 利用する機能 独自のSSHクライアントプログラム ( 例えば JSCH) TOMOYO Linux の task.state キーワード アプリケーション層 /usr/sbin/sshd 要求順序監視機能 (TOMOYO Linux) 2008.11.13 123
利点 ケース 5: 非シェルセッション プログラムの実行を伴わずに権限を切り替えできる アクセス要求の順序をパスワードの代わりに使用 対話的 非対話的シェルセッションを開始する前に適用することも可能 2008.11.13 124
難点 ケース 5: 非シェルセッション 使える要素が少ない プログラムの実行を伴わないで実現する必要がある おそらく TOMOYO Linux 専用 SSH サーバプログラム (/usr/sbin/sshd) を改造することなくプロセスの状態変数 (task.state) を操作しているため クライアントを自作する必要性 2008.11.13 125
ケース6: 即席ハニーポットの構築 侵入者をハニーポットへリダイレクトできます もちろん 強制ログアウトもできます /usr/sbin/sshd /bin/bash /bin/bash /bin/timeauth /bin/timeauth /bin/bash??? /bin/force-logout /bin/bash?????? 2008.11.13 126
論文はこちらです セキュリティ強化 OS によるログイン認証の強化手法 http://sourceforge.jp/projects/tomoyo/docs/win f2005.pdf http://sourceforge.jp/projects/tomoyo/docs/win f05-slides.pdf 3 年前に書かれた内容ですので内容が古いです しかし 考え方は現在でも役に立ちますし 実際に適用することができます 2008.11.13 127