正規表現、セキュリティ

					2007年06月19日
情報科学類 コンピュータリテラシ

                                       筑波大学 システム情報工学研究科 
                                       コンピュータサイエンス専攻, 電子・情報工学系
                                       新城 靖
                                       <yas@is.tsukuba.ac.jp>

このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/literacy-2007/2007-06-19
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/

■連絡事項

6月29日は、筆記試験を行う。A4メモ用紙、1ページ(両面)持込み可能とす る。紙の表面上部に学籍番号と名前を記入すること。圧縮、暗号化をしないこ と。試験との答案といっしょに提出する。メモが不要な場合には、学籍番号と 名前を記入したもを提出する。

Rubyの作者、まつもとゆきひろさんによる集中講義がある。

■復習

grep コマンド、 Emacs 文字列の置換え、

■正規表現(regular expression)

単純な検索 正規表現の例:「^a.*tion$」。「aで始まり、tionで終わるもの」。

^」、「.」、「*」、「$」 は、 メタキャラクタ。特別の意味を持つ。 メタキャラクタを含まない文字列も、正規表現として意味を持つ。

◆種類

種類
grep系
grep, ed, vi, ex, sed, less (lv)
egrep系
egrep, awk
Emacs
emacs
シェル系
csh, tcsh, sh
その他
Perl, Ruby, Apache, ....
シェルの「*,?,[]」などは、単にワイルドカードではなく、正規表現に 近い。複数の場所に「*」が書けるので、単なるワイルドカードではな い。

◆grep系の正規表現

grep は、文字列を検索するコマンド。

grep使われている正規表現

\
続く文字(メタキャラクタ)の意味をなくす
^
行の先頭。([]の中で使われたときには否定の意味)
$
行の終わり
.
任意の1文字
[c1c2c...cn]
c1c2c...cn のどれか。 例:[abc]ならabcのどれか。
[c1-c2]
c1からc2 の範囲のどれか。 例:[a-z]ならaからzまでのアルファベットの小文字。
[^c1c2c...cn]
並べられた文字以外。 例:[^abc]ならaでもなくbでもなくcでもないもの。
正規表現*
直前の「正規表現」の任意の繰り返し。 例:.*なら任意の文字の任意回数の繰り返し。 [a-z]*ならアルファベット小文字の任意回数の繰り返し。
正規表現1正規表現2
正規表現1に続き正規表現2が続く 例:abなら、「a」に続き「b」。
\(正規表現\)
タグ付き正規表現。 例: X\(abc\)*X は、XabcabcXにマッチする。
\N
N番目のタグ付き正規表現。 例: X\(abc\)\1X は、XabcabcXにマッチする。
\<
単語の先頭。vi, ex のみ。
\>
単語の終わり。vi, ex のみ。
正規表現 マッチする例 マッチしない例
abc abc, abcd ab
\\abc \abc, \abcd \ab
a.c aac, abc, xabc ac, a, c,
a*c c, ac, axc, aaac, xc a
[abc]x ax, bx, XaxX dx
[^abc]x dx, ex bx, Xbx, abx

◆egrep系

言語理論で定義された正規表現のうち、grep では使えなかったものがが使えるようになった。 ただし、一部、grep よりも落ちる。
正規表現+
正規表現の1回以上の繰り返し。「正規表現 正規表現*」と同じ。
正規表現?
正規表現が0回、または、1回。
正規表現1|正規表現2
正規表現1かまたは正規表現2。orの意味。
(正規表現)
正規表現のグループ化。
タグ付き正規表現\(\)やその参照\Nは廃止された。

◆Emacs の正規表現

grep系、egrep系の組み合わせ。|の意味が違い、egrepで |と書く所、Emacs では \|と書く。egrep で \|と書く所では、Emacs では|でよい。
正規表現1\|正規表現2
正規表現1かまたは正規表現2。orの意味。
\`
バッファの先頭
\'
バッファの最後
\w
単語
\W
単語以外
\b
単語の先頭、または、単語の末尾
\B
「単語の先頭および単語の末尾」以外
バッファとは、Emacs でメ モリを抽象化したもの。ファイルの内容を読み込み、編集できる。保存しない と失われる。

■検索と置換え

◆Emacs の検索

通常(一括) インクリメンタル
正規表現なし search-forward isearch-forward
正規表現付き search-forward-regexp isearch-forward-regexp
方向は、-forward 以外に -backward がある。
C-r             isearch-backward
C-s             isearch-forward
C-M-r           isearch-backward-regexp
C-M-s           isearch-forward-regexp
C-M-s は、Esc C-s, C-M-r は、Esc C-r と同じ。

◆Emacs の置換え

一括 問合せ付き
正規表現なし replace-string query-replace
正規表現付き replace-regexp query-replace-regexp
M-%             query-replace
C-M-%           query-replace-regexp

◆コマンドラインでの検索

The Unix Super Text 33.1.3節 参照
grep
正規表現での検索。
egrep
正規表現での検索。+,?,|,() が使える。
fgrep
文字列での検索。正規表現は使えない。
sed
正規表現での検索(pコマンド)。
awk
正規表現での検索(printコマンド)。+,?,|,() が使える。

◆コマンドラインでの置換え

sed
正規表現での検索と、マッチした部分の参照。
awk で、正規表現で行を検索した後、printf()substr() による非正規表現で の置換えができる。

◆スクリプトによる検索と置換え

スクリプト言語によるプログラムを書き、検索と置換えを行うことができる。 Ruby や Perl などのスクリプト言語の1行プログラミング(one liner)も便利 である。

◆find コマンド

Unix の find コマンドは、ディレクトリ木をたどりながらファイルを検索する ことができる。 The Unix Super Text 33.1.5項 参照

注意点

◆メタキャラクタの衝突

シェルに対するコマンドで正規表現を打つときには、メタキャラクタの衝突に 気をつける。 正規表現で使うメタキャラクタシェルのメタキャラクタが重なっている。 シェルが正規表現の「$」や「*」を解釈しないように、 シングルクォート「''」でくくるなどして、エスケープする。

■セキュリティ

セキュリティとは、安全や機密を保持すること。

対策

◆悪意があるプログラム(malicious program)の分類

◆コンピュータ・ウイルス(狭義)

コンピュータ・ウイルス(狭義)は、悪意があるプログラム一種で、次のような 性質を持つもの。

活動

◆トロイの木馬とワーム

トロイの木馬(Trojan Horse)は、単独のプログラムであり、他のプログラムに 寄生しない。利用者を騙して実行されるのを待つ。

ワーム(worm)は、他のプログラムに寄生しない。

世の中で「ウイルス」と呼んでいるものの中には、トロイやワームに分類され るものが多い。

◆ウイルス対策プログラム

ファイルや電子メールの内容を調べて、悪意のあるプログラムに特徴的なパタ ンを探し、削除する。

限界

◆バグ、弱点、攻撃

プログラムからバグ(誤り)を全てのバグを取り除くことはできない。 バグの一部は、セキュリティ的な脆弱性につながる。

悪意のあるプログラムの多くは、セキュリティ的な脆弱性を攻撃する。

「危険なデフォルト」は、本来の機能を有効にしたものなので、バグではない が、利用者が気が付かないと攻撃の対象になる。

◆バッファ・オーバーフロー攻撃

プログラムの脆弱性をつく攻撃の1つ。

現在のコンピュータは、機械語命令もデータも同じメモリに保存する。 データを機械語命令だと解釈して実行することができる。

悪意を持つプログラムが送られて来た場合、本来はデータとして扱わなければ ならないのに、脆弱性があるプログラムは機械語命令として解釈して制御を移 して実行してしまう。

◆DoS (Denial of Service) 攻撃

サーバにある種の要求を送ることで、本来のサーバの機能を停止させてしまう 攻撃。サービス運用妨害、サービス拒否攻撃ともいう。

分類

後者を防ぐことは、難しい。後者で、要求を送るプログラムが1つではなく、 複数のクライアントが協調して1つのサーバを攻撃する場合、分散型DoS攻撃 という。

攻撃対象としては、サーバ(WWWサーバ、メール・サーバ)の他に、ルー タであることもある。

◆防御

ローカルで働く悪意があるプログラムによる被害を を防ぐには、ローカルへの侵入を水際で止める。

弱い権限で動作させると、万一の時の被害を最小にできる。

遠隔のコンピュータ

◆個人で身を守る方法

技術者や管理者に求められていること。 技術が未熟な現在、各個人は、ある程度、技術を知る必要がある。 対策

◆防火壁(ファイアウォール(firewall))

防火壁とは、外部のネットワークと内部のネットワークの間に設置し、内部の ネットワークのセキュリティを高めるための仕組み。

インターネットの仕組みの基本:どのコンピュータとコンピュータも通信できる。

防火壁では、そのような本来の仕組みに制限を設け、特定のコンピュータとし か通信できないようにしたり、特定のサービスしかつかえないようにする。

攻撃の対象となるコンピュータの数を減らし、集中的に侵入対策を施すことで、 セキュリティを高める。

防火壁構築は、様々な技術の集合:

パケット・フィルタリング
IPアドレスやポート番号を使ってTCP/IP の特定のサービスを特定の方向 について遮断する。アクセス制御の一種。
例:ファイアウォールの内側から外側への電子メールの送信は許すが、逆方向 は許さない。
プライベート・アドレスの利用
壁の内側で、プライベート・アドレスと呼ばれる、インターネット上で は決して利用されないことが保証されているIPアドレスを用いる。プライベー ト・アドレスを使うと、インターネットの外から直接攻撃されることはない。 壁の外側をアクセスする時に、「壁の上」で、外でも通じるIPアドレスに付け 変える。
電子メールのフィルタリング
電子メールの内容をパタンマッチ等で検索し、悪意があるプログラムを 発見したら削除する。
壁の上:壁の内側のコンピュータも壁の外側ののコンピュータも、両方にアクセ スできる場所。

■Webページに対するアクセス制御と認証

ファイルに対するアクセス制御と 考え方が共通の部分と異なる部分がある。

◆アクセス制御

[再掲]

アクセス制御(access control) とは、「主体」が、「オブジェクト」を「操作」する時、どんな操作なら正し いということを定義して、それがきちんと守られていることをということを保 証することである。

図? アクセス制御における主体、オブジェクト、および、操作

図? アクセス制御における主体、オブジェクト、および、操作

◆Webページにのアクセスにおける主体、オブジェクト、操作

WWWは、もともと大勢の人にメッセージを伝えるための仕組みだが、後付けでア クセス制御の仕組みを入れた。 あるページは、ある特定の人(同じ研究室・部署の人)だけにしか見えないよ うに設定することもできる。

主体
オブジェクト
URLで表現できるもの。木構造を利用した指定や正規表現による指定も可能。
操作

◆Webページに対するアクセス制御の設定

アクセス制御の設定は、普通は、オブジェクト側でなされる。 access.conf は空で、全部 httpd.conf に書くことも多い。 サーバの管理者は、.htaccess を無効にもできる。

coins では、orchid-nwd の次の場所にある。

◆IPアドレスやドメイン名によるアクセス制御

httpd.conf や .htaccess に次のように記述する。
order deny,allow
deny from all
allow from 130.158.0.0/16 133.51.0.0/16 192.50.17.0/24
主体は、IP アドレスで指定されたクライアント・コンピュータ。

◆WWW Basic認証

WWW ブラウザが1つのページをアクセスするたびに HTTP のヘッダにユーザ名 とパスワードを含める。

GET /dir1/file1.html HTTP/1.1[←]
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==[←]
[←]
Authorization: には、ユーザが打ち込んだユーザ名とパスワードが Base64 (64進数)で符合化されて含まれている。Base64 は、暗号ではないので、 簡単に元にもどせる。

% echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | openssl base64 -d [←]
Aladdin:open sesame% [←]
% []
Basic 認証では、パスワードがそのままネットワークを流れてしまう。 この問題点を解消するために、SSL で通信路を暗号化することがよく行われる。

◆WWW Basic認証の設定

ユーザ名とパスワードの対応を保存する方法にはいくつかの方法がある。

■cookie

cookieは、コンピュータ・サイエンス(情報学類)の専門用語。

協調して動作しているプログラムの間で、ある一連の作業を識別するための数 を意味する。

WWW(World Wide Web)では、1回のデータ転送ごとに通信路が切断される ので、通常はWWWのブラウザ(クライアント)とWWWサーバの間では、途 中経過を保持することができない。

途中経過を保存したい時:

WWWで途中経過を保存するためには、cookie が使われる。

サーバは、その情報を利用して、適切なページ(たとえば前回最後に訪れたペー ジ)を表示させるようにすることができる。

◆cookieとプライバシ

現在の cookie の実現では、利用者のプライバシーを犯す危険性が高いという 問題が指摘されている。

普通のWWWサーバでは、要求を送ってきたコンピュータのIPアドレスを記 録しているので、コンピュータ単位でのアクセス状況を記録することはできる が、個人を特定することはできない。

クッキーを利用することにより、コンピュータではなくどの個人がアクセスし てきたかを記録することができる。

クッキーから電子メールのアドレスや氏名まで調べることはできない。 しかし、インターネットをサーフしている間にどこかでそれを打ち込んだが最 後、クッキーと電子メール・アドレスや氏名との対応が記録されてしまう危険 性がある。

参考

RFC2965 HTTP State Management Mechanism
Netscape社によるWWWにおけるクッキー実現の案
http://wp.netscape.com/newsref/std/cookie_spec.html

■実習

実習時間中には、 以下の課題をできるだけ多く行いなさい。全部を行う必要はない。

★練習問題(1901) grepコマンド

grep コマンドを使って、次のファイルや結果を検索しなさい。 grep コマンドを使って、次のコマンドの結果を検索しなさい。

★練習問題(1902) egrep

grep の代わりに egrep を使ってみなさい。egrep 独自の機能を調べなさい。

★練習問題(1903) sed

The Unix Super Text 35.3 参照。 sed コマンドを使って、正規表現の検索を行いなさい。 sed コマンドを使って、正規表現の置換えを行いなさい。

★練習問題(1904) awk

awk コマンドを使って、正規表現の検索を行いなさい。

★練習問題(1905) 1行プログラミング

Ruby, Perl などのスクリプト言語が持つ1行プログラミングの機能を用いて、 正規表現の検索を行いなさい。

★練習問題(1906) lookコマンド

look コマンドは、単語のスペルを調べるコマンドである。grep コマンドを用 いて、look コマンドと同じ単語が検索できることを確認しなさい。

★練習問題(1907) WWW ブラウザの cookie の状態

WWW ブラウザが、cookie をどのように扱う状態になっているかを調べなさい。 cookie を受け付けないように設定してみなさい。

MacOSX Firefox

次のような操作を行ってみなさい。

★練習問題(1908) ファイルに保存されたCookieの観察

cd, ls, lv コマンドなどを利用して Cookie が保存されているファイルを観察 しなさい。MacOSX Firefox では次の場所にある。

★練習問題(1909) .htaccessによるBasic認証のページ(coinsのパスワード)

~/secure_html/ の下に、実験用のディレクトリを作成しなさい。
% mkdir ~/secure_html [←]
% mkdir ~/secure_html/ディレクトリ名 [←]
次のドキュメントを参考にして、作成したディレクトリに .htaccess を作成し なさい。 次の3つの方法を比較しなさい。 レポート提出ページや出席ボタンでは、どのような設定になっているかを観察しなさい。

★練習問題(1910) .htaccessによるBasic認証のページ(htpasswd)

htpasswd コマンドを使ってパスワード・ファイルを作成しなさい。作成したパ スワード・ファイルを利用して、Basic 認証によりアクセス制御を行うように 設定しなさい。 The Unix Super Text 28.7.6項 参照

例:パスワード・ファイル /home1/prof/yas/etc/passwd-doc1 に登録されているユーザだけが、 .htaccess があるディレクトリ以下にあるファイルをアクセスできる。

.htaccess:

AuthType Basic
AuthName "restricted stuff"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user
このパスワード・ファイルは、サーバ上でhtpasswd というプログラムで作成する。
% htpasswd -c /home1/prof/yas/etc/passwd-doc1 user1 [←]
Adding password for user1.
New password:user1のパスワードを打ち込む[←]
Re-type new password:user1のパスワードを打ち込む[←]
% htpasswd /home1/prof/yas/etc/passwd-doc1 user2 [←]
Adding user user2
New password:user2のパスワードを打ち込む[←]
Re-type new password:user2のパスワードを打ち込む[←]
% []
一番最初は、-c オプション付で実行する。passwd コマ ンドと同様に、打ち込んだパスワードは、画面には表示されず、また、確 認のために2回打つ必要がある。

htpasswd コマンドの結果、次のようなファイルが作られる。

user1:1fjr1tHIgoG7U
user2:qXaeA9Zge7Yqc
ユーザ名と暗号化されたパスワード(正確にはパスワードのハッシュ値)から 構成される。

パスワードによるアクセス制御の例: 設定ファイル .htaccess

AuthType Basic
AuthName "restricted stuff"
AuthUserFile /home1/prof/yas/etc/passwd-doc1
require valid-user

★練習問題(1911) .htaccessによるBasic認証のページ(dbmmanage)

htpasswd コマンドの代わりに dbmmanage コマンドを使い、パスワード・ファ イルを作成しなさい。作成したパスワード・ファイルを利用して、Basic 認証 によりアクセス制御を行うように設定しなさい。

★練習問題(1912) WWWページに対するIPアドレスによるアクセス制御

特定のIPアドレスのコンピュータからしか表示できないような WWW ページを作 成しなさい。逆に、特定のIPアドレスのコンピュータからは表示できないよう な WWW ページを作成しなさい。

★練習問題(1913) 正規表現によるアクセス制御

Apache には、正規表現によりアクセス制御の対象となるファイル名や URL を 指定する機能がある。この機能を確認しなさい。

◆課題19 正規表現、セキュリティ

締め切りは、2007年6月26日火曜日とする。 回答をテキスト・ファイルに記述し、(レポート提出 ページ)から提出しなさい。

(1) 正規表現の検索機能を用いて、次のファイルから次のことがらを検索して 画面に表示しなさい。

レポートには、コマンドラインと実行結果を含めなさい。実行結果が10行以上 に渡る時には、途中を省略しなさい。

なお、grepコマンドには、or の機能がない。orが必要な場合、grep コマンド を複数回実行してもよい。egrep 機能を用いれば 1 回で終わることもある。

(2) 正規表現の検索機能を用いて、次のコマンドの実行結果から次のことがら を検索して画面に表示しなさい。

(3) 正規表現の置換え機能(sed,Emacs,viなど)を用いて、次のことを行いなさい。

レポートには、利用したプログラムの種別、そのプログラムに与えた命令を書 きなさい。

(4) アクセスする時に Cookie の設定を要求する Web サイトを1つ示しなさい。 そのサイトが Cookie の設定を有効にした時と無効にした時で動作が変わるか を調べなさい。

(5) The Unix Super Text の次の部分を読みなさい。

次の項目について1-3行で説明しなさい。 (6) [加点] Webページにおいて、ある特定のディレクトリ以下のファイルやディ レクトリに対して、Basic 認証、または、IP アドレスを用いてアクセス制御を 行うように設定しなさい。レポートにはディレクトリ名、および、作成した .htaccess の記述、アクセスが許されたときのログ、失敗した時のログを含め なさい。ログは最小限のものだけを含めなさい。


Last updated: 2007/06/19 16:28:19
Yasushi Shinjo / <yas@is.tsukuba.ac.jp>