情報システム概論 I 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/dsys-2005/2006-02-27
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
Gateway とは、WWW で使われている HTTP というプロトコルへの入り口という 意味。 プログラムの実行結果は、普通は、HTML にすることが多いが、普通のテキス トであることもイメージであることもある。
図? CGIの仕組み
CGI の利用例
CGI になるファイル名のパタン
設定によっては、これ以外のものも可能である。
1: #!/usr/local3/bin/ruby 2: 3: Datafile="/home/lab/Denjo/yas/coins/compsys1-2005/cgi-data/counter.data" 4: 5: def main() 6: begin 7: f=File.open(Datafile,"r+",0666) 8: rescue StandardError => e 9: show_error("touch datafile") 10: end 11: f.flock(File::LOCK_EX) 12: c_str = f.read() 13: if( c_str == "" ) 14: c_str = "0" 15: end 16: c = Integer(c_str) 17: c = c+1 18: f.rewind() 19: c_str = c.to_s() 20: f.write( c_str ) 21: f.truncate(f.pos) 22: f.flock(File::LOCK_UN) 23: f.close() 24: show_counter_value( c ) 25: exit( 0 ) 26: end 27: 28: def show_counter_value( c ) 29: msg = <<-EOF 30: Content-Type: text/plain 31: 32: #{c} 33: EOF 34: print( msg ) 35: end 36: 37: def show_error( e ) 38: msg = <<-EOF 39: Content-Type: text/plain 40: 41: エラーです。ごめんなさい。 42: EOF 43: print( msg ) 44: exit( 1 ) 45: end 46: 47: main()WWW ブラウザを使って Apache 経由で実行させ、その結果を表示する変りに、 シェルから実行し、結果を端末の画面に表示させる方法もある。
% cd ~yas/public_html/coins/compsys1-2005/2006-02-27CGI のプログラムは、画面(標準出力)に結果を表示する。一行目は、 Content-Type: が多い。HTML を出力するなら、Content-Type: text/html と する。 空行以降に、ブラウザの画面に表示されるべきデータを置く。 (空行以前は、HTTP のヘッダに関係している)。% ./counter.cgi
Content-Type: text/plain 127 % ./counter.cgi
Content-Type: text/plain 128 %
![]()
WWW サーバ Apache は、1行目を解析(parse)して、クライアントに対して返 すべき HTTP のヘッダを作成する。それ以外のヘッダも生成して送る。
% telnet www2.coins.tsukuba.ac.jp 80Trying 130.158.86.5... Connected to www2.coins.tsukuba.ac.jp. Escape character is '^]'. GET /~yas/coins/compsys1-2005/2006-02-27/counter.cgi HTTP/1.0
![]()
HTTP/1.1 200 OK Date: Sun, 26 Feb 2006 13:38:59 GMT Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) mod_ssl/2.8.12 OpenSSL/0.9.6 DAV/1.0.2 PHP/4.1.2 mod_perl/1.24_01 mod_throttle/3.1.2 Connection: close Content-Type: text/plain 129 Connection closed by foreign host. % telnet www2.coins.tsukuba.ac.jp 80
Trying 130.158.86.5... Connected to www2.coins.tsukuba.ac.jp. Escape character is '^]'. POST /~yas/coins/compsys1-2005/2006-02-27/counter.cgi HTTP/1.0
![]()
HTTP/1.1 200 OK Date: Sun, 26 Feb 2006 13:39:32 GMT Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) mod_ssl/2.8.12 OpenSSL/0.9.6 DAV/1.0.2 PHP/4.1.2 mod_perl/1.24_01 mod_throttle/3.1.2 Connection: close Content-Type: text/plain 130 Connection closed by foreign host. %
![]()
Unix オペレーティング・システムのカーネルは、 ファイルに保存された実行型式のプログラムを、 ファイル(ハードディスク)からメモリにコピーして実行する機能がある。 ただし、先頭の2バイトが「#!」であった場合は、メモリに読み込むのは、 そのファイルではなく、「#!」以降に記述されたファイルを読み込み実行する。 「#!」には、普通、インタプリタを指定する。
インタプリタ(機械語)は、実行されると、引数として、 プログラム(テキスト)が含まれているファイルの名前を得る。 それをメモリに読み込んで、(機械語には変換せず)解釈・実行する。 ( 仮想計算機の機械語や木構造などの中間言語に変換することがある。 )
% ls -l run-cat-n-rwxr-xr-x 1 yas lab 20 Feb 26 22:52 run-cat-n % cat run-cat-n
#!/bin/cat -n hello % ./run-cat-n
1 #!/bin/cat -n 2 hello % cat -n ./run-cat-n
1 #!/bin/cat -n 2 hello %
![]()
s = f.read()C言語のような手続き型言語では、次のように書く
s = read(f)
上のプログラムでは、Integer() で、整数に変換している。
File::open() で、エラーが起きると、「例外」が発生し、制御がrescue に飛 ぶ。
カーネルには、通信のためのハードウェア(ネットワーク・インタフェース)を 操作するためのデバイス・ドライバも含まれる。
ネットワーク通信を行うプログラムは、システムコールを通じてTCP/IP の機 能を利用する。
図? アクセス制御における主体、オブジェクト、および、操作
ファイルの「内容」のアクセス3段階であるが、ファイルの「属性」次の2段 階である。
アクセス制御の方針(ポリシー)は、サーバ側で記述される。 この時、次のような情報がよく使われる。
アクセス制御は、基本的には、WWWサーバの管理者の仕事である。
WWWサーバ (httpd) の設定ファイル
(
/usr/local/etc/httpd/conf/httpd.conf
,
/var/www/conf/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
例:パスワード・ファイル
/home/lab/Denjo/yas/etc/passwd-doc1
に登録されているユーザだけが、
.htaccess
があるディレクトリ以下にあるファイルをアクセスできる。
AuthType Basic AuthName "Members Only" AuthUserFile /home/lab/Denjo/yas/etc/passwd-doc1 require valid-userこのパスワード・ファイルは、サーバ(www,www2)上で htpasswd というプログ ラムで作る。
% ls /home/lab/Denjo/yas/etc/passwd-doc1一番最初は、ls: /home/lab/Denjo/yas/etc/passwd-doc1: No such file or directory % htpasswd -c /home/lab/Denjo/yas/etc/passwd-doc1 user1
Adding password for user1. New password:user1のパスワードを打ち込む
Re-type new password:user1のパスワードを打ち込む
% htpasswd /home/lab/Denjo/yas/etc/passwd-doc1 user2
Adding user user2 New password:user2のパスワードを打ち込む
Re-type new password:user2のパスワードを打ち込む
% cat /home/lab/Denjo/yas/etc/passwd-doc1
user1:1fjr1tHIgoG7U user2:qXaeA9Zge7Yqc %
![]()
-c
オプション付で実行する。passwd
コマ
ンドと同様に、打ち込んだパスワードは、画面には表示されず、また、確
認のために2回打つ必要がある。
htpasswd コマンドの結果、次のようなファイルが作られる。
user1:1fjr1tHIgoG7U user2:qXaeA9Zge7Yqcユーザ名と暗号化されたパスワード(ハッシュ値)から構成される。 このファイルは、~/public_html 以外の場所に置くと GET で盗まれることはない。
このアクセス制御が有効なファイルをクライアントが GET したとする。
GET /dir1/file1.html HTTP/1.0すると、サーバから次のようなエラーが返される。![]()
![]()
HTTP/1.1 401 Authorization Required WWW-Authenticate: Basic realm="Members Only" Content-Type: text/html <HTML><HEAD> <TITLE>401 Authorization Required</TITLE> </HEAD><BODY> ... </BODY></HTML>
.htaccess
の AuthType
と AuthName
の内容が、HTTP の応答の WWW-Authenticate:
に現れる。
このページをアクセスするには、クライアント(WWWブラウザ)は、ウインドウ を開いてユーザにユーザ名とパスワードを要求する。そして、次のような GET 要求をもう一度送る。
GET /dir1/file1.html HTTP/1.0Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
![]()
![]()
Authorization:
には、ユーザが打ち込んだユーザ名とパスワードが
Base64 (64進数)で符合化されて含まれている。
これを受け取ったサーバは、
AuthUserFile
で指定されたファイルを開いて、ユーザ名とパスワー
ドパスワードを照合して、正しければアクセスを許する。
Base64 は、「暗号ではない」ので、簡単に元にもどせる。
% echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | openssl base64 -dAuthType Basic を使うアクセス制御の方法では、パスワードがそのままネッ トワークを流れてしまうので、盗聴に弱い。Aladdin:open sesame%
![]()
図? 暗号の考え方
暗号の方法は、大きく2つに分類される
例
利用例
01で符合化できれば、あとは、なんとかなる。 (01で符合化できないものは、どうしようもない。)
情報システム流の考え方。とにかく速くする、大量のものを扱えるようにすれ ば、すれば質も自ずから変る。
相転移。