Operating System Lecture No.09
Menu
セキュリティ
インターネットにコンピュータが接続されるようになって、セキュリティの問題が重視されている。セキュリティとは何か?
security [se'cu'ri'ty] n.安全;安心;確実;保護,保安;保証(金・人);担保 (品);借用証 (for);(pl.)証券,証書,債券. ◎in security for の担保とし て.セキュリティとは、「秘密を守る」ことではない。重要なのは安全である。コンピュータビールスなどで、データが失われることを防ぐには、バックアップを取ることが簡単で効果的な対策である。どんなことをしても、絶対にデータが失われないようにすることは、非常に難しい。
同様に、「絶対に秘密が守られる」ことを保証することは難しい。むしろ、秘密が洩れた時に、どう対処するかを考えておく方が「安全性」という観点からは、より優れている。
セキュリティとは、ある種の防壁を作り、さらに、その防壁を越えて被害がでるような場合に対しても、その被害を限定できるようにすることだといえる。
問題9.1
バックアップに関する考察OS の持つセキュリティに関する機能
OS の持つ防壁にはいろいろなものがある。その防壁は、「異なるもの」を区別するものである。
プロセス(仮想計算機)の区別 ユーザの区別 ファイルの区別これらの区別は、ユーザを識別する数値であるユーザIDにしたがって行われるのが普通である。これらの区別を持たない OS も存在するが、そのようなOSにはセキュリティも存在しない。
Unix のユーザID
Unix のユーザID は、16bit または 32bit の整数である。ユーザIDは、基本的には表 (/etc/passwd ) で管理されていて、
アカウント名 ユーザID の値 パスワード コメントとして使われる部分などがある。いくつかの値は、特別なものである。
0 スーパユーザあるいはrootと呼ばれる特権を持つユーザ 65535 または -1 nobdy 外部から認証無しでアクセスする場合のユーザNIS (Network Information System), YP (Yellow Page), Netinfo などは、これらのユーザ情報をネットワーク上で管理するものである。
リングプロテクション
防壁は、プロセス空間を分離することに対応する。しかし、完全に分離されたままでは、お互いに通信することができない。したがって、通信する場合には、なんらかの手段を使うことになる。一つの方法は、セキュリティのレベルを定義して、レベルが上に上がると、より多くの資源(resource)にアクセスできるようにすることができる。これは階層的に構築することができ、リングプロテクションと呼ばれる。
階層間の移行は、仮想記憶などと同様にハードウェアによるサポートによる場合が多い。 trap や、software interrupt などと呼ばれる特権命令により、階層間の移行が行われる。
Unix では、Kernel level と User level の二段階から構成されている。二段階以上にすることにより、一段の防壁が破られた時の被害を低減することができるが、処理は複雑となる。特定の特権命令が特定のセキュリティレベルでないと実行できないようにすることにより、多段の階層を作ることができる。セキュリティレベルに合わない命令を実行した場合は、より上のレベルで対処が行われる。つまり割り込みがかかることが多い。
アクセスリストとケーパビリティリスト
コンピュータ上の資源(resource)にもIDを付けて、資源毎に、誰が、その資源にアクセスすることができるかを表す表 (アクセスリスト access list)そして、ユーザ毎に、
ユーザがアクセスできる資源の表 (ケーパビリティリスト capaility list)を用意すると、もっともきめ細かく資源に対するアクセスを管理することができる。
Unix では、そこまで細かい制御は行わない。その代りに、グループIDという概念を導入している。
資源の所有者(owner) 資源の属するグループ (group) グループID に属するユーザIDの一覧 /etc/group
suid (set user id)
Unix では、一時的に ユーザIDを切替えることができる。これは、setuid というシステムコールによって実現される。
set uid bit
コマンドのファイル・モードの一つ。<>--->
パスワードの管理
紙に書いて画面に貼っておく手に書く
指紋認証だったら? 指紋のない人は?
Key Ring
Browser が パスワードを覚えておく場所
二重暗号鍵
暗号data と key と同じ長さならば安全一方向関数 鍵S が
encode(S) は linear order decode(S) は linear order鍵がない場合は exponential ordr の時間が解読にかかる。
encode と decode が同じ関数の場合もある。
One Key
key(S)を使って (f: flate, e: encrypted )
encode(S) decode(S) f ---------------> e ---------------> f
Double Key
二重キーでは、encode のキーとdecodeのキーが異なる。
Public Key P Secret Key Sこの二つのキーは、encode/decode のどちらにでも使える。
encode(S) decode(P) a ---------------> b ---------------> a decode(S) encode(P) a <--------------- b <--------------- asign 署名
user 1 user 2 encode(S_1) encode(P_1) a <--------------- b <--------------- a encode(P_2) encode(S_2) sign<--------------- x <--------------- signsign key by itself
SSH, SSL の keygen
どの程度のkey length にするべきか?
/dev/random
その他の防御
Java の Protected Method
TPM
Trusted Platform Module回路的に分離したCPU/Memooryを持つと良いと考えた人たちがいる。
なんのやくにたつの?
そこに鍵を置いておく
くらいか? VM ではどうする?
防御を破る手段
いろいろあるが、
トロイの木馬 セキュリティ・フロー バッファオーバフロー クロスサイト・スクリプティングなどが有名。これらを利用して増殖するものは、
コンピュータ・ウォーム Worm コンピュータ・ビールス Viruusと呼ばれる。特に悪さをしないものを Worm と呼ぶことが多い。
トロイの木馬
なんらかの方法でユーザに「悪さをするコード」を実行させる方法。メールで送りつけるタイプのVirusのほとんどはこれ。ネットで配布されるバイナリには、正当性を示すcheck sum (MD5 Signature など)をつけて、これを防ぐことがある。ソースで公開されていれば、トロイの木馬が入る余地は少ない。
セキュリティ・フロー
バッファオーバフローが有名。f(char *s) { char b[10]; strcpy(b,s); .... }のようなコードに、長さ10以上の文字を送りつけることにより、call stack 上に任意のコードを置き、実行することができる。
sendmail にはdebug modeがあり、debug modeを実行することにより、任意のコードを実行することが出来た。
ftp, telnet は、裸のパスワードがネットワークに流れてしまう。パケット監視ツールにより丸見えとなる。
ypcat passwd では、passwd の暗号化されたものを見ることが出来る。これを利用して、安易なパスワードを見つけることが可能。(John's Ripper)
xhost + とすると、任意のコンピュータから、そのX Window System になんでもすることができる。画像を表示すること、Cut&Paste bufferの横取り、キーボードやマウスのイベントの横取りなど。キーボードの入力を取得するものは、キーロガーなどと呼ばれる。
rootkit というクラッキング用のパッケージがある。ホストに裏道(back door)を作り、一斉に特定のサイトを攻撃する(DDoS)などに使われる。psやlsなどをかたり、rootkit の存在を隠すことがある。kernel module として動作するrootkit では、その存在を見つけることは極めて難しい。
問題9.2
セキュリティに関する考察と s/mimeGPG用の鍵pairの作り方
Mac / Open SSL用の鍵pairの作り方
これで生成した、.p12 を KeyChain.app を使って、certificate に登録する。
Mail.aap で Subjectのところに鍵マークがでるので、それを入れて、秘密鍵で署名して公開鍵付きでメールを送る。
公開鍵をもらったら、それを使って、暗号化したメールを送信できる。
この時に、自分の秘密鍵で署名して送る。
そうすると、s/mime で相互通信できるようになる。
クロスサイト・スクリプティング
Cross Site Scripting : XSS例えば、lsの結果を表示するHTMLのページを以下のようにcgiで作ったとしよう。
print "<title>$dir</title>"; system "ls $dir";$dir に、"/" と入れると、rootが見える。まぁ、それは良い。
$dir = ". ; /usr/X11/bin/xterm -display hoge:0.0"とかだったら?
ユーザからの入力は、必ずチェックすること。
Cross Site Request Forgeries:CSRF
login している状態で、ユーザの入力をfakeするイベントを外部から生成する。
セッションの入力を予測されにくくするための値を使用する
スキミング
カードの情報を読み出すこと。仕様を作るときに、カード上にパスワードを入れない。パスワードが入ってなければ、パスワードは他の方法で取得する。磁気カードよりも、ICカードの方が読み出されにくいことが知られている。ICカードに移行せず、磁気カードを使い続けている金融会社あるいは消費者に関して考察してみよう。
Felica の場合はどうか?
Side channel attach
本来のプログラムや通信の入出力の他の情報に着目する。電力や処理時間、あるいは電波漏洩など。暗号解読手法とは異なる。しかし、鍵を見つける攻撃に使えることがある。CPUの仮想メモリのキャッシュの遅延を使って、システムモードのメモリの値を推測する攻撃が一時期流行った。これを防止するために、カーネルの速度を犠牲にする手法が使われたこともある。
address randomization
プログラムやカーネルの実行時のメモリアドレスを動的に変更する手法。固定アドレスに対する攻撃を防ぐ狙いがある。どれだけ有効なのかは不明だがスタックオーバーフローなどには有効だと思われる。kernel debugするときには停止する必要がある。
ハードディスク / SSD
単純な rm では、残されたデータパターンは消えないが... 実際の被害は?暗号化しておいて、鍵を捨てることによって読めなくする方法がある。
Crypto Erase
個人情報はどのように取り扱うべきか?
パスワードを忘れた場合
人が自分で作るパスワードは脆弱。
Password generator
記号を入れずに15文字以上が推奨されてる(要出展)
#!/usr/bin/perl my $t = "123456789abcdefhjkmnoprstuvwxyzABCDEFHJKMNOPRSTUVWXYZ"; my $r; for(my $i = 0; $i < 16; $i++) { $r .= substr($t, int(length($t) * rand()), 1); } print "$r\n";
人間的要素
データを持ち出す方法 ログを取ることで防げること、防げないこと
セキュリティ・フローを指摘する場合
逆ぎれに気をつけよう (まじ)直接報告しない。 JPCERT/CC を使う
監視による対処
ネットワークの通信パターン snort/mrtg 変更されたシステムファイルの履歴 read only にする? 入室退出記録 監視カメラ ログはどれくらい残すべきか?
クラッキングされたら...
バックアップ
ランサムウェア対策ワクチンソフトでいい?
再インストール
古いディストリビューションからインストールしない
gitlab は2ヶ月単位で update
ネットワークにつなげてインストールするか、切り離してインストールするか