授業資料/第07回 の変更点

Top / 授業資料 / 第07回

* サーバサービスの提供: web サーバ [#m11cdca6]

web サーバを用意してみよう.
web サーバとして歴史がありかつ最も良く使われるものは現時点ではApache((http://www.apache.jp/misc/history.html に日本語でかかれた Apache の解説がある)) である.
これは Apache Software Foundation((http://www.apache.org))で開発されている.
脆弱性が特に重大な問題となりがちな webサーバプログラムとしては,「広く使われていて,情報が素早く知られる」こうしたものを使うのがよい.

** 利用する前のライセンス確認 [#p201c187]
まずはともかくライセンスを確認しよう((自分のマシンに試しにインストールしてみるだけならばそんなに問題ないことが多いにしても,だ)).

*** 実習 [#yf97d22c]
Apache のライセンスがどのようなものか調べよ.

** インストールされていないかチェック [#ad376b13]

既にインストールされていないか,チェックする. まず,
  pkg_info -a | grep "Information for" | less
として,この中に apache がないかみる. さらに念の為,
  ps -axuww | less 
の結果を見て,web server の類いがあがっていないか(動いていれば httpd などの文字列が見える),/usr/local/etc/rc.d の中に apache などが無いかを確認する.

上記全てをまずチェックしよう.
そのつもりがないのにインストールされているというような場合は,念の為に一旦アンイストールしよう((たぶん pkg_deinstall が使えるだろう)).

** インストールすべきバージョンの把握 [#wdfcb594]
とりあえず最新バージョンでよいように思うだろうが,これぐらい大きなソフトウェアだとそうもいかないこともある.
そこで,大ざっぱでよいのでバージョンによる違いがどうなのか調べておこう.

*** 実習 [#d11e185f]
大まかに分けて apache には現在は 1.3系統,2.0系統,2.2系統の3つのバージョンがある.
これらにどのような違いがあるのか,大ざっぱにでよいのでしらべよ.

** インストール [#z1375f0f]
さて,インストールは ports からのインストールでよい…というか,それがよい.
ただし,念の為に ports を最新のものにしてからにしよう((前回の授業を思い出せ. portsnap を使うのがよい)).

さて,インストールするバージョンは 2.2 系統としておく.
具体的には,

  cd /usr/ports
  portinstall www/apache22

とすれば 2.2.6_2 がインストールされるはずである. 数分かかるのでじっと待とう.

** 起動設定 [#o0490a1f]

まずは OS ブート時に apache が動くようにしよう. /etc/rc.conf に
  apache22_enable="YES"
と書き込む. 
念の為にリブートしておこう.

** 起動チェック [#if44d20f]

さて,上で既に起動時に apache が起動するようになっているはずなので,まずは起動しているか確認しよう.
具体的には,まず
  ps -axuww | less
で httpd が動いているのを確認して,動いていそうならばさらに firefox 等の webbrowser で
  http://localhost/
にアクセスしてみよう. "It Works!" などと表記されればまずは起動は OK だ.

次に,接続状況を見るために
  cd /usr/local/www/apache22/cgi-bin
  chmod aog+x ./printenv
として,サンプル cgi の動作許可を出してから,今度は
  http://localhost/cgi-bin/printenv
に接続してみよう. 接続したときの環境等がわかることが見て取れるだろう.

なお,うまくいったら,念の為に以下のようにしてサンプル cgi が動作しないように戻しておこう.
  cd /usr/local/www/apache22/cgi-bin
  chmod aog-x ./printenv

次に手動で apache を動かしたり停めたりする手法を書いておく.
手動で起動するならば,
  /usr/local/etc/rc.d/apache22 start
とし,手動で止めたければ
  /usr/local/etc/rc.d/apache22 stop
とすればよい.

さて,apache が無事に起動していることがここまで確認できたら手動でいったん apache を停めよう.
そして再び webbrowser で http://localhost にアクセスして,きちんと apache が停まっていることを確認しよう.

** 最低限の設定 [#z5f6e765]

apache の設定ファイルは /usr/local/etc/apache22 以下に置いてある.
さて,最低限の設定を行おう.

まず,web サーバとしての基本設定ファイルは httpd.conf であるのでこれを編集する((いうまでもないが,こうした「重要な」ファイルを編集するときは原始的にでよいので元のファイルのバックアップをとっておくこと. 具体的には,cp httpd.conf httpd.conf.ORG などで十分である. )).

最低限設定を変更したいのは以下の点である.
: ServerAdmin | web 管理者のメールアドレスを書く. サンプルが書いてあるのですぐわかるだろう.
: DocumentRoot | web アクセスのルートとして扱われるディレクトリ.
デフォルトでは /usr/local/www/apache22/data となっているが,apache のバージョンが入っていたりしてなんとも不便だし,まあ気休めではあるがセキュリティの面からもデフォルトのままにしておかないようにしよう.
そこで,新たにディレクトリ(例えば /usr/local/web_dir/top など((もちろんそのディレクトリが存在しないといけないので,無ければ mkdir 等のコマンドを使って作っておこう)) )を用意してから, この設定を書き換えておこう.
これは具体的には
  DocumentRoot "/usr/local/www/apache22/data"
という行をこの例だと
  DocumentRoot "/usr/local/web_dir/top"
と修正することになる.
また,DocumentRoot の中身に関する設定部分が <Directory "/usr/local/www/apache22/data">などに書いてあるので,ここも自分の設定にあわせて直しておこう. 具体的には
  <Directory "/usr/local/www/apache22/data">
を例えば
  <Directory "/usr/local/web_dir/top">
と直すことになる.
: ScriptAlias | cgi の置き場. これもデフォルトのままではなんなので,適当に新規ディレクトリ(例えば /usr/local/web_dir/cgi など)を作ってから,それに変更しよう. この場合は,
  ScriptAlias /cgi-bin/ "/usr/local/www/apache22/cgi-bin/"
と書いてある部分を例えば
  ScriptAlias /cgi-bin/ "/usr/local/web_dir/cgi/"
と修正することになる(最後のスラッシュを忘れないように!!).  また,これについても
  <Directory "/usr/local/www/apache22/cgi-bin">
を 
  <Directory "/usr/local/web_dir/cgi">
と修正しないとといけないので注意しよう.

では,設定が変更できたかチェックしよう.

まず,上で用意した DocumentRoot に適当な内容の index.html ファイルを用意しよう.
次に apache を手動で起動し,http://localhost にアクセスして,「自分で用意した index.html」の中身が見えることを確認しよう.

次に,cgi の意味を掴む目的も兼ねて cgi のテストを行おう. まず,次の内容(最後の行が改行していないと何も出力されないのはわかるよね?)((Content-type の後に空行が出力されないといけない規格なのでこの通りに書くべし.))のファイルを f-test という名称で(自分で設定した) cgi ディレクトリに置く.
  #!/bin/csh -f
  echo "Content-type: text/plain; charset=iso-8859-1"
  echo ""
  echo ""
  /usr/games/fortune  
  
次にこのファイルの実行パーミッションを設定しよう.
  cd (自分で設定した cgi ディレクトリ)
  chmod aog+x ./f-test

こうして設定を行ってから,  http://localhost/cgi-bin/f-test  にアクセスしてみよ. 勝手知ったる fortune の結果が web browser に出力されるのが見えるだろう.
うまくいったら再び念の為に実行パーミッションを落としておこう.
  cd (自分で設定した cgi ディレクトリ)
  chmod aog-x ./f-test

さて,ここまでうまくいったら最低限の設定は OK なので apahce を再び停止させよう.

*** 実習 [#v9b03d43]
ここまでの作業を行おう.

** SSL [#h052d0e5]
実は,プロトコル http に従って通信しているとき,データは「そのまま」ネットワークを流れている.
つまり,ネットワーク途中に居るマシンなどから見れば流れているデータは丸見えであり,秘密にしたい重要なデータなどを http で流すことはとてもできない.

しかし,ネットワーク上の通信を暗号通信にできる方法が既にいくつかある.
その一つである SSL を使って,web 用の通信プロトコル http を暗号化しても使えるようにしよう.
その一つである SSL を使って,web 用の通信プロトコル http を暗号化しても使えるようにしよう((実は認証についてきちんとしないと意味はない. レポートで勉強してもらおう)).

そのための準備として,まずは秘密鍵と証明書((ただし,これは俗に言う"オレオレ証明書" であるうえ,パスワードで保護もしていない. SSL をきちんと運用したければ,本質的には認証局をきちんと利用するしかない. まあ,証明書の finger print を手渡しなどの「安全な経路で」入手して確認するなどでも一時しのぎはできると思うけど…))を作ろう(画面の幅の関係で,3行目は折り返しているが1行分の入力なので注意せよ). 
>  cd /usr/local/etc/apache22
>  openssl genrsa -out apache.key 1024
>  openssl req -new -x509 -days 1825 -key apache.key -out apache.crt  ← いろいろ質問されるが適切(というか適当でよい)に応答せよ.

ちなみに最後の証明書はとりあえず 5年間有効にしている. 詳しくは man req とすると調べられる.

次に,設定ファイル /usr/local/etc/apache22/extra/httpd-ssl.conf の <VirtualHost _default_:443> の部分にある
: DocumentRoot | 特に理由がなければ上の DocumentRoot と同じにしておくとよい.
: ServerName | アクセス「される際の」名前になる. 今回はテストなのでマシン名でよいだろう. 例えば q3000.sci.osaka-u.ac.jp というマシンならば,
  ServerName q3000.sci.osaka-u.ac.jp:443
と書くことになる. ちなみに,これを設定するなら httpd.conf の ServeName という項目も同様に
  ServerName q3000.sci.osaka-u.ac.jp:80
と設定しておいた方が矛盾がなくてよいだろう.
: ServerAdmin | 自分のメールアドレスに変更しておこう.
: SSLCertificateFile | 上で作ったファイル "/usr/local/etc/apache22/apache.crt" に直しておく.
: SSLCertificateKeyFile | これもやはり作ったファイル "/usr/local/etc/apache22/apache.key" に直しておく.

を上のように設定する. 

次に,/usr/local/etc/apache22/httpd.con の
  # Include etc/apache22/extra/httpd-ssl.conf
と書いてある行の行頭の # を消してこの行を有効にしよう.

これで設定は終了だ. apache をいったん停めてから起動し直して, https://localhost にアクセスして,確かに http&color(red){s}; で接続できることを確かめよう((firefox などだと,https で接続しているときはアプリの下側に鍵のマークが表示されたりするので確認しやすい)).

** Basic 認証 [#i3ccc8e6]

Apache には実は非常に多くの機能がある.
その一つである Basic 認証は,あるディレクトリやファイルにアクセスする際にユーザ名とパスワードの入力が要求され,あわないとアクセスできないというアクセスコントロール機能の最も簡単なものであり,簡単なわりに便利なので,使えるようになっておくとよい.
そこでこれを試してみよう.

まず,対象となるディレクトリを用意する.
今回は(自分で設定したDocumentRoot)の下に test というディレクトリを作り,そこで  basic 認証を試してみよう.

まずはアカウントとパスワードを含むパスワードファイルを作ろう.
パスワードファイルは「 DocumentRoot 以下には作らない」ようにしないと何かとまずい.
今回は例えば /usr/local/etc/apache22/Includes に作るとすると,
>  cd /usr/local/etc/apache22/Includes
>  htpasswd -c ./passwdfile test-user ← "-c" オプションをつけるとアカウント情報を格納したファイルを新規作成する. 既にファイルがある場合はまっさらに上書きされてしまうので,"-c" をつけるときは気をつけよう.
>  (ユーザ "test-user" のパスワードを聞かれるので新しく考えて入力する)

という感じで操作すればよい.

ちなみに,basic 認証を有効にするための方法としてはシステム側で設定する方法(httpd.conf などでの設定)と,各ディレクトリで .htaccess ファイルで設定する方法があるが,ユーザが自分で設定できる後者の方が使い方の幅が広がる(その分リスクも増すので,運用の際はもっと調べてから)ので後者でやってみよう.

そのための準備として,まず httpd.conf の <Directory "(自分で設定したDocumentRoot)"> 以下にある
  AllowOverride None
という行を修正し, 
  AllowOverride AuthConfig
にしておこう("AllowOverride ..." という行は複数あるので,修正する箇所を間違えないように).

次に,上で用意した test というディレクトリ以下に次の内容で .htaccess というファイルを作ろう.
  AuthType Basic
  AuthName "basic auth test!"
  AuthUserFile  /usr/local/etc/apache22/Includes/passwdfile
  AuthGroupFile /dev/null
  require user test-user

それから,このディレクトリにまた適当な index.html を用意しておこう.

これで apache を停めてから再び apache を起動すれば準備は完了だ.
http://localhost/test ← (上で用意したディレクトリ) にアクセスしてみて,ユーザ名とパスワードが聞かれるはずなので,test-user というユーザ名を入れ,自分で上で設定したパスワードを入れてみよう.
無事アクセスできれば OK だ.

* レポート [#ic15fd1b]
SSL 認証について調べよ(特に "オレオレ証明" について. 個人的には高木浩光氏の [["高木浩光@自宅の日記" の 2007月11月25日の記述:http://takagi-hiromitsu.jp/diary/20071125.html]] がよくわかってよいと思う).
また,web サーバにまつわるセキュリティの問題(脆弱性)についても調べよ.
特に "Allowoverride AuthConfig" ではなく "Allowoverride All" とした場合どれくらい危険性が増すのか,よく調べよ.
また,本日行った作業について報告せよ.