授業資料/07 の変更点


#contents

* 24時間電源が入っているわけではないサーバについての心構え [#zc117487]

前回の授業で,セキュリティ対策としての OS, Ports/Pacages の半自動的な脆弱性情報収集について学んだが,24時間電源が入っていて半自動的に状況をチェックできているシステムではない場合, こうした半自動化が有効ではない.
つまり,電源を入れたときにシステムの状況チェックを行うしかない.
これを起動時に自動的に行うようにしてもよいが,ここでは前回の学習内容を活かして簡単に能動的に行うことを考えよう.

&ref(./notes.png); 具体的には,電源を入れたらなるべくは以下の作業を行おう.

(OS のバージョンが古すぎないかのチェックに使える)
  freebsd-update fetch 

(インストールされている Ports/Packages の脆弱性のチェック)
  portaudit -adF  

(Ports 情報の更新)
  portsnap fetch
  portsnap update

(インストールされている Ports/Packages がどれくらい古いかの参考に. ただしこの操作は時間がかかるので状況に応じて.)
  portupgrade -na 

* サーバサービスの提供: web サーバについて概要 [#ffc58b32]

さて,ネットワークサービスの中でも基本がシンプルな Web サーバを実際に動かしてみよう.
&br;&br;

CENTER:&ref(./How2ConnectWithWebserver.png,60%,"Web サーバへの接続の様子");
CENTER:[Web サーバへの接続の様子]

&br;&br;
Web という仕組みはシンプルであるように設計されたものであるので,上の図にみるように基本構造はとても理解しやすい.
&ref(./warning.png); 基本はシンプルなのだが,その上に展開されている応用技術は今となっては結構複雑で,全貌の把握は簡単ではないかも.
&ref(./warning.png); 詳細は後で説明するが,一般に Port 80 は通常の Web のやり取り(HTTP)に使い,Port 443 は SSL での web 情報のやりとり(HTTPS)に使われることが多い.

ということで,今回は Web サーバを用意し,動かしてみる.

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

* インストール前の準備 [#we02caaa]

** 利用する前のライセンス確認 [#h7cf61df]
&ref(./notes.png); 何かソフトウェアを導入するときは,まずはともかくライセンスを確認しよう. 具体的には Apache Software Foundation の Web を閲覧し,そうした項目を探して読もう((自分のマシンに試しにインストールしてみるだけならばそんなに問題ないことが多いにしても,だ)).
// &ref(./warning.png); ライセンスに関する文章は,法律的に正しいものにしようとして書かれているためか,何語で書かれていてもわかりにくいことが多い.
// そのため,英語で書かれている文章が読めない(読むのが大変すぎる),という場合は,
// そういう時はまずは日本語(もしくは得意な言語)に訳された文章
// http://sourceforge.jp/projects/opensource/wiki/licenses%2FApache_License_2.0

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

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

&ref(./notes.png); Web サーバが既にインストールされていたり,動いていたりしないかチェックしよう. 具体的には,

- まず,/etc/rc.conf を読み,また,/usr/local/etc/rc.d (ディレクトリ)を見て,apache や httpd などの記述/存在などが無いかをチェック.

- 次に,
  pkg_info | grep -i apache
の出力結果をみて, Ports/Packages として Apache がインストールされていないかチェック.
もしもインストールされているようならば,後の作業のためにそのバージョン番号を控えておこう.

- 次に,
  ps -axuww | grep -i http
の出力結果をみて, web server の類いが動いていないか(たぶん httpd という名前で動いているため)もチェック.

- 次に,
  lsof -i4 | grep -i http
の出力結果をみて, ネットワークサービスとして httpd が動いていないかチェック.

上記全てをまずチェックしよう.
そのつもりがないのに apache がインストールされているというような場合,
そのバージョンが 1.3 系や 2.0 系だと少しヤヤコシイので,念の為にいったんアンイストールしておこう( pkg_deinstall を使えばよい).

** インストールすべきバージョンの把握 [#fce15328]
とりあえず最新バージョンでよいように思うだろうが,これぐらい大きなソフトウェアだとそうもいかないこともある.
そこで,大ざっぱでよいのでバージョンによる違いがどうなのか調べておこう.
// *** 実習 
大まかに分けて apache には現在は 1.3系統,2.0系統,2.2系統の3つのバージョンがある.

&ref(./notes.png); これらにどのような違いがあるのか,大ざっぱにでよいのでしらべよ. この時注目すべきポイントは,

- 機能の変更はどうか… は当然として,
- ライセンスの変更はないか
- 利用できる環境(OS や基礎となるソフトウェアのバージョン)の変更はどうか
- 安定して動いていそうか
- マニュアル等は充実しているか

などになる.  

* インストール [#w58ac5cd]
さて,今回インストールするバージョンは 2.2 系統としておく. 特に問題はないはずだ.

** Ports を用いてインストール [#fc9f7a73]
そしてインストールは ports からのインストールでよい…というか,それがよい.

&ref(./notes.png); まずいつものように,

  portsnap fetch
  portsnap update

として念の為に ports を最新のものにしてから,psearch を使って apache がどこにあるかを調べよう.
ただし,多すぎて分からないだろうから,探すべきは "apache22" であることを教えておこう.

そして,いつものように portinstall を使ってインストールする.

  cd /usr/ports
  portinstall www/apache22

これで ver. 2.2.13 のインストールが始まる(この実習を遅れて行う人によっては 2.2.14 になっているかも).
なお,古いバージョンが既にインストールされている人は portinstall ではなくて portupgrade でバージョンアップしておこう.

しばらくすると,Apache のインストールオプションを
&ref(./01.png);
と聞いてくることがあるので,そういう場合は,
- IPv6 のチェックを外す (この授業では IPv6 は使わないので)

と変更するぐらいで,あとはそのままで進めてよいだろう(mod_dav や mod_dav_fs も外してもよいかもしれない).

&ref(./warning.png); Ports のインストールオプションは一回設定すると記録され,次からはその設定が使われるようになっている.
そのため,間違えた設定をしてしまったのでインストールをやり直したい,というような場合は困る.
そうした場合は,/var/db/ports の下にあるオプションが記録されたファイル options を消去してからインストールしよう. そうすれば再びオプション設定を尋ねてくる.

&ref(./warning.png); こうした大きなソフトウェアでは, インストール時に重要な注意点などが画面に出力される.
こうした注意点を見逃すと大変なことになることもあるので,一通り目を通すことを忘れてはいけない.
スクロールが速くて多分読みきれないだろうが,Ports でインストールした場合は,ログを残すように以前設定してあるので,そのログをインストールが終わったあとにゆっくり読めばよい.
Ports のインストールログは,以前の設定通りならば /var/log/ports 以下にあるはずだ.

&ref(./notes.png); インストールが終わったら,インストールログを読んで,注意点などがないかチェックしよう.
ただし,Apache のインストールに必要な「他のソフトウェア」が一緒にインストールされ, それについて注意点が存在することも考えられるので,

  cd /var/log/ports
  ls -lgaF

などとしてログファイルの日付をチェックして,Apache と一緒にインストールされたと思われる新しいソフトのログファイル全てになるべく目を通そう.

実際,上のディレクトリにあるだろう www::apache22.log を読んで(ファイルの最初の部分はしばらくはオプション選択画面のためのエスケープシーケンスの嵐で読みにくいが我慢して先へ進む)
メッセージや注意書に相当しそうな部分を抜き出すと以下のようになる.
&br;&br;

(ログ: オプション選択画面直後ぐらい)
>   To enable a module category: WITH_<CATEGORY>_MODULES
>   To disable a module category: WITHOUT_<CATEGORY>_MODULES
>  
>   Per default categories are:
>    AUTH AUTHN AUTHZ DAV CACHE MISC
>   Categories available:
>    AUTH AUTHN AUTHZ CACHE DAV EXPERIMENTAL LDAP  MISC PROXY SSL SUEXEC THREADS
>  
>    To see all available knobs, type make show-options
>    To see all modules in different categories, type make show-categories
>    You can check your modules configuration by using make show-modules

オプションの On/Off や現状設定がどうなっているかを知る方法の説明だ. 
今回はとりあえず気にしなくてよいだろう.

&br;
(ログ: 実際のインストールが始まってから)
>  Package openssl was not found in the pkg-config search path.
>  Perhaps you should add the directory containing `openssl.pc'
>  to the PKG_CONFIG_PATH environment variable
>  No package 'openssl' found
>    forcing SSL_LIBS to "-lssl -lcrypto  -lcrypt  -lpthread"

openssl が package で入っていないよ? というメッセージだ.
しかし最初からシステムで入っていればとりあえず問題ないので,このままでよい(もし入っていなければさらに違うメッセージがあるはず).

&br;
&br;
>  ----------------------------------------------------------------------
>  Libraries have been installed in:
>     /usr/local/lib
>  
>  If you ever happen to want to link against installed libraries
>  in a given directory, LIBDIR, you must either use libtool, and
>  specify the full pathname of the library, or use the `-LLIBDIR'
>  flag during linking and do at least one of the following:
>     - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
>       during execution
>     - add LIBDIR to the `LD_RUN_PATH' environment variable
>       during linking
>     - use the `-Wl,-rpath -Wl,LIBDIR' linker flag
>  
>  See any operating system documentation about shared libraries for
>  more information, such as the ld(1) and ld.so(8) manual pages.
>  ----------------------------------------------------------------------

インストールされたライブラリを自作ソフトで使いたければこうしろ,という話だ.
これも今回はとりあえず気にしなくてよいだろう.

&br;&br;
(インストール実作業そのものがほぼ終わったところで)
> To run apache www server from startup, add apache22_enable="YES"
> in your /etc/rc.conf. Extra options can be found in startup script.

Apache を,サーバ起動時から(自動的に)動くようにしたければこうしろ,また,細かいオプション等は起動スクリプトに書いてあるはず,という話だ. 
&ref(./warning.png); 結構重要なメッセージだ. これを見逃さないようにしよう.
&ref(./warning.png); こうした起動スクリプトファイルは,たいていは /usr/local/etc/rc.d というディレクトリに配置される.

&br;&br;
>  Your hostname must be resolvable using at least 1 mechanism in
>  /etc/nsswitch typically DNS or /etc/hosts or apache might
>  have issues starting depending on the modules you are using.

マシンのホストネームが /etc/nsswitch.conf で指定された方法で解決できる(=ホストネームから IP がわかるという意味)ようにしておけよ,そうでないと apache に問題が生じるかもよ,という話だ.
確認したいというのであれば,
  dig `hostname`
として,自分のマシンの IP が出力されるようなら大丈夫だ.
それでダメなら,/etc/hosts を眺めてみて,ここに情報が書いてあるかチェックする.書いてあればまだ大丈夫.
それでもダメなら,これまでの設定に問題があるか,教室のサーバに問題があるので,教官や TA に尋ねよう.

&br;&br;
(ほぼ最後で)
>        This port has installed the following files which may act as network
>        servers and may therefore pose a remote security risk to the system.
>  /usr/local/lib/libapr-1.so.3
>  
>        This port has installed the following startup scripts which may cause
>        these network services to be started at boot time.
>  /usr/local/etc/rc.d/apache22
>  /usr/local/etc/rc.d/htcacheclean
>  
>        If there are vulnerabilities in these programs there may be a security
>        risk to the system. FreeBSD makes no guarantee about the security of
>        ports included in the Ports Collection. Please type 'make deinstall'
>        to deinstall the port if this is a concern.
>  
>        For more information, and contact details about the security
>        status of this software, see the following webpage:
>  http://httpd.apache.org/

セキュリティ的にリスクをもちうる部分について説明がある.
単に「そうした可能性のありうる」ソフトやライブラリが機械的に列挙されるだけなのでこれをみてすぐにどうこうというものではないが,とりあえず目を通しておくべきだろう.

// インストール作業の途中,様々なメッセージが出るので,できることならそれらを見ておこう.
// ただ,スクロールが速くて多分読みきれないだろうから,

* Apache の起動 [#e74e7794]

** 起動設定 [#d9d7e26a]

&ref(./notes.png); まずは OS ブート時に Apache が動くようにしよう. 
上に指定されたように作業をしてから,リブートしよう.
//etc/rc.conf に
//  apache22_enable="YES"
//と書き込む. 

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

さて,これで既に起動時に Apache が起動するようになっているはず.

&ref(./notes.png); そこで,確かに起動しているか確認しよう.

- まずは上でインストール前にチェックした lsof の方法を使うのがよいだろう.
- 次に,動いていそうならばさらに (lynx, w3m, firefox 等の) Web Browser で  http://localhost/  にアクセスしてみよう. "It Works!" などと表記されれば Apache が確実に動いている.

&ref(./warning.png); 動いていない場合はどうやって原因を突き止めればよいか?
例えば,次の順序で調べればおおよそ原因が突き止められよう.
+ /var/log/ の下に httpd-error.log というようなファイルがあるか調べる. これが無いような場合は,Apache は「起動しようとすらしなかった」ということなので,/etc/rc.conf に書きこんだ文字列のスペルミスなどが原因という可能性が高い.
+ /var/log/httpd-error.log を読む. すると Apache の起動途中の記録があるはずだ. この中に [alert] などという個所があればそこが問題を指摘している個所なので,そのメッセージをしっかり読んで理解しよう.
 

&ref(./notes.png); 次に,CGI (Common Gateway Interface)のテストと接続状況のチェックを兼ねて作業しよう.
具体的には,
  cd /usr/local/www/apache22/cgi-bin
  chmod aog+x ./printenv
として,サンプル cgi の動作許可を出してから,今度は  http://localhost/cgi-bin/printenv に接続してみよう. すると


>  DOCUMENT_ROOT="/usr/local/www/apache22/data"
>  GATEWAY_INTERFACE="CGI/1.1"
>  HTTP_ACCEPT="text/html, text/plain, text/css, text/sgml, */*;q=0.01"
>  HTTP_ACCEPT_ENCODING="gzip, compress, bzip2"
>  HTTP_ACCEPT_LANGUAGE="en"
>  HTTP_HOST="localhost"
>  HTTP_USER_AGENT="Lynx/2.8.6rel.5 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.8e"  &color(blue){←アクセスした web browser の情報};
>  PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin"
>  QUERY_STRING=""
>  REMOTE_ADDR="127.0.0.1"  &color(blue){←アクセスしたホスト};
>  REMOTE_PORT="53511"
>  REQUEST_METHOD="GET"
>  REQUEST_URI="/cgi-bin/printenv"
>  SCRIPT_FILENAME="/usr/local/www/apache22/cgi-bin/printenv"
>  SCRIPT_NAME="/cgi-bin/printenv"
>  SERVER_ADDR="127.0.0.1"   &color(blue){←サーバのアドレス};
>  SERVER_ADMIN="you@example.com" &color(blue){←サーバの管理者};
>  SERVER_NAME="localhost" &color(blue){←サーバの名前};
>  SERVER_PORT="80"
>  SERVER_PROTOCOL="HTTP/1.0"
>  SERVER_SIGNATURE=""
>  SERVER_SOFTWARE="Apache/2.2.13 (FreeBSD) DAV/2 mod_ssl/2.2.13 OpenSSL/0.9.8e"  &color(blue){←ソフトウェアの概要};
>  UNIQUE_ID="Swzoc8CoCoIAAEP8icQAAAAE" &color(blue){←リクエスト毎に一意な ID};

というような表示が出て,接続したときの環境等がわかる.
Web サーバの状況が良く分からない…というような時はこうして基本情報を得よう.

&ref(./notes.png); なお,これらの情報が誰にでも見えてしまうのは良くないので,以下のようにしてサンプル cgi が動作しないように元に戻しておこう.
  cd /usr/local/www/apache22/cgi-bin
  chmod aog-x ./printenv

&ref(./warning.png); CGI とはごくごく簡単に言えば Webサーバにアクセスしてサーバ上で動かせるプログラムである. セキュリティ上の「穴」となりやすいので,CGI については特に注意深く作業しよう.

次に手動で apache を動かしたり停めたりする手法を書いておく.
手動で起動するならば,
  /usr/local/etc/rc.d/apache22 start
とし,手動で止めたければ
  /usr/local/etc/rc.d/apache22 stop
とすればよい.
&ref(./warning.png); このスクリプトファイル(/usr/local/etc/rc.d/apache22)を読むとわかるが,/etc/rc.conf に apache22_enable="YES" が書いてないと apache が動かないようになっている.

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

* Apache の設定 [#bc209700]

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

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

&ref(./notes.png); まず,web サーバとしての基本設定ファイルは httpd.conf であるのでこれを編集する.
&ref(./warning.png); こうした「重要な」ファイルを編集するときは元のファイルのバックアップをとっておこう. 方法は原始的でも構わない. 例えば,具体的には,
  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 の中身に関する設定部分が &lt;Directory "/usr/local/www/apache22/data"&gt;などに書いてあるので,ここも自分の設定にあわせて直しておこう. 具体的には
>  <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">
<と修正しないとといけないので注意しよう.


&ref(./notes.png); では,設定が変更できたかチェックしよう.
まず,上で用意した DocumentRoot に例えば次のような適当な内容の index.html ファイルを用意しよう.

>   <html>
>     &color(blue){なんでもよいので書く.とりあえずアルファベットのみで書いた方がよいだろう};
>     </html>

次に apache を手動で起動し,http://localhost にアクセスして,「自分で用意した index.html」の中身が見えることを確認しよう.

&ref(./notes.png); 次に,cgi の意味を掴む目的も兼ねて cgi のテストを行おう. 
まず,次の内容((Content-type の後に空行が出力されないといけない規格なのでこの通りに書くべし.))

>  #!/bin/csh -f
>  echo "Content-type: text/plain; charset=iso-8859-1"
>  echo ""
>  echo ""
>  /usr/games/fortune

のファイルを web-test という名称で(自分で設定した) cgi ディレクトリに置こう.
&ref(./warning.png); 最後の行で改行していないと fortune が実行されないので何も出力されない. きちんと改行しよう.
 
次にこのファイルの実行パーミッションを設定しよう.
  cd (自分で設定した cgi ディレクトリ)
  chmod aog+x ./web-test

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

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

// *** 実習 
// ここまでの作業を行おう.

* Apache の機能いくつか [#o2a7f4f5]

** TLS (Transport Layer Security) / SSL (Secure Sockets Layer) [#fc369fb2]
ここまでの Apache への Web 接続は素の「HTTP接続」で,(port 80 で行われていて) 実はデータが「そのまま」ネットワークを流れている.
つまり,ネットワーク途中に居るマシンなどから見れば流れているデータは丸見えであり,秘密にしたい重要なデータなどを流せない,危険な状態である.

しかし,ネットワーク上の通信を暗号化する方法が既にいくつか存在する.
その一つである TLS (Transport Layer Security) (旧称 SSL(Secure Sockets Layer))を使って,web 用の通信プロトコル HTTP をその上で利用する暗号化 HTTP, 即ち HTTPS(HTTP over SSL) を使えるようにしてみよう.
&ref(./warning.png); TLS/SSL は汎用的な仕組みであり,HTTP 以外の通信も載せることができる.

まず,セキュリティのために TLS の提供する機能を簡単に述べておくと,

: 暗号化 | 通信内容を暗号化する. 使える暗号は 5〜7種類程度ある.
: 改竄の検出 | やりとりする情報が途中で誰かに改竄されていないか検出ができる.
: 認証 | 接続相手が「本当に名乗っているとおりの相手か」を証明する. 通常はサーバ側だけが証明書を見せるが,(必要ならばオプションで)クライアント側が証明書を見せるようにも設定できる.

の三本柱である. 
暗号化と改竄の検出についてはサーバとクライアントの関係だけで成立させられるが,
認証については「第三者(認証局)によるその証明書の保証」が本来必要である.
&ref(./notes.png); TLS/SSL について,さらに詳しく調べておこう.

さて,HTTPS を使う準備を始めよう.

それにはまず,TLS/SSL そのものの準備をしないといけない.
TLS/SSL を使うには上の3つの機能のうちの認証のために,証明書を用意しないといけない.
しかし,証明書を保証する電子署名を行う認証局に作業を依頼するには通常は費用がかかるし,手続きもそれなりに繁雑だ.

そこで,本授業では自分で自分を保証して証明書を作ってしまおう.
&ref(./warning.png); これは俗に言う"オレオレ証明書" であって,認証には問題がある. まあ,証明書の finger print を手渡しなどの「安全な経路で」入手して確認するなどでも一時しのぎはできると思うけど… また,作成した秘密鍵 apache.key 自体は暗号化していないので取り扱いは要注意だ.
 
&ref(./notes.png); 具体的には以下のように作業することで証明書(apache.crt)が作成できる.

  cd /usr/local/etc/apache22
  openssl genrsa -out apache.key 1024
  openssl req -new -x509 -days 365 -key apache.key -out apache.crt  

最後の証明書作成時にいくつか質問されるので,例えば以下の青字のように適切に答えよう.

> You are about to be asked to enter information that will be incorporated
> into your certificate request.
> What you are about to enter is what is called a Distinguished Name or a DN.
> There are quite a few fields but you can leave some blank
> For some fields there will be a default value,
> If you enter '.', the field will be left blank.
> -----
> Country Name (2 letter code) [AU]:&color(blue){JP};
> State or Province Name (full name) [Some-State]:&color(blue){Osaka など};
> Locality Name (eg, city) []:&color(blue){Toyonaka など};
> Organization Name (eg, company) [Internet Widgits Pty Ltd]:&color(blue){Osaka Univ. など};
> Organizational Unit Name (eg, section) []:&color(blue){Faculty of Science など};
> Common Name (eg, YOUR name) []:&color(blue){web サーバとしての名前を書く.例えば,q09.cl.math.sci.osaka-u.ac.jp など};
> Email Address []:&color(blue){サーバ管理者のメールアドレス};

すると,apache.crt という証明書(有効期限 365日のもの)ができているはずだ.
&ref(./warning.png); openssl については man openssl で,openssl req のオプションについては man req でマニュアルを読むことができる.

ここで,作成した証明書の内容を一度確認しておこう.
  openssl x509 -in apache.crt -text
とすると内容が出力されるので,みておこう.

&ref(./notes.png); 次に,HTTPS 設定ファイルを直そう.
/usr/local/etc/apache22/extra/httpd-ssl.conf が設定ファイルなので,その <VirtualHost _default_:443> の部分を修正しよう.
具体的には以下のようにしよう.
&ref(./warning.png); もちろんこのファイルも作業前にバックアップを取っておこう.

: 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.conf の
>  # Include etc/apache22/extra/httpd-ssl.conf

と書いてある行の行頭の # を消してこの行を有効にしよう.

これで設定は終了だ. apache をいったん停めてから起動し, https://localhost にアクセスして,確かに http&color(red){s}; で接続できることを確かめよう.
(できれば,上の Common Name で指定した名前でアクセスした方がよい.例えば,q09.cl.math.sci.osaka-u.ac.jp ならば,https://q09.cl.math.sci.osaka-u.ac.jp/ としてアクセスしよう)
ただし,オレオレ証明書なので途中で「だいじょぶ?」と尋ねられるので,&color(red){今回だけ};大丈夫だとして先へ進めて接続しよう.
なお,firefox などだと,https で接続しているときはアプリの下側に鍵のマークが表示されたりするので確認しやすい.

&ref(./warning.png); "オレオレ証明" は本来はよろしくないもので,リスクがある.

&ref(./notes.png); "オレオレ証明" の危険性について調べておこう. 
個人的には高木浩光氏の "高木浩光@自宅の日記" の 2007月11月25日の記述( http://takagi-hiromitsu.jp/diary/20071125.html )がよくわかってよいと思う.
個人的には高木浩光氏の "高木浩光@自宅の日記" の 2007月11月25日の記述( http://takagi-hiromitsu.jp/diary/20071125.html )などがよくわかってよいと思う.

** Apache の便利な機能: Basic 認証 / Digest 認証 [#o01057da]

Apache には実は非常に多くの機能がある.
その一つである認証(Basic 認証と Digest 認証がある)について知ろう.
これはアクセスする際にユーザ名とパスワードの入力が要求されるアクセスコントロール機能の一種である.
ディレクトリやファイル単位で設定が可能で,簡単なわりに便利なので,使えるようになっておくとよい.
&ref(./warning.png); Basic 認証はセキュリティ的にはあまり堅固ではないが,Digest 認証は少し古めのブラウザからは使えない.

*** Basic 認証 [#h6ab87d7]
まずはとりあえず Basic 認証を使ってみよう.

&ref(./notes.png); Basic 認証にどのようなセキュリティ上の問題があるか,Apache 2.2マニュアルの「認証,承認,アクセス制御」( http://httpd.apache.org/docs/2.2/ja/howto/auth.html )を読んで調べておこう.

さて,実際にやってみよう.
&ref(./notes.png); まず,対象となるディレクトリを用意する.
今回は(自分で設定したDocumentRoot)の下に test というディレクトリを作り,そこで  basic 認証を試してみよう.
というわけで,まずはディレクトリを作成しよう.

&ref(./notes.png); 次にアカウントとパスワードを含むパスワードファイルを作ろう.
パスワードファイルは「 DocumentRoot 以下には作らない」ようにしないと外から読めてしまうかもしれないため,それは避けよう.
今回は例えば /usr/local/etc/apache22/Includes に作るとすると,
  cd /usr/local/etc/apache22/Includes
  htpasswd -c ./passwdfile test-user 
  ユーザ "test-user" のパスワードを新規に考えて入力

という感じで操作すればよい.
&ref(./warning.png); 既にそのパスワードファイルが存在するのに "-c" オプションをつけて htpasswd を実行するとそのファイルの中身は消えてしまうので,"-c" をつけるときはくれぐれも慎重に.

念の為にこのファイルを読んでみて,確かにユーザ名とパスワード(暗号化されている)が格納されていることを確認しておこう.

次に Basic 認証を有効にするのだが,具体的な方法は以下の二種類があって,
- システム側で設定する方法(httpd.conf での設定)
- 各ディレクトリで .htaccess ファイルで設定する方法

それぞれ利点欠点がある.
ユーザが自分で設定できる後者の方が使い方の幅が広がる(その分リスクも増すので,運用の際はもっと調べてから)ので今回は後者でやってみよう.

&ref(./notes.png); では,Basic 認証を実際に有効にしよう.
まずそのための準備として,まず httpd.conf の <Directory "(自分で設定したDocumentRoot)"> 以下にある
>  AllowOverride None

という行を修正し, 
>  AllowOverride AuthConfig

にしておこう.
&ref(./warning.png); "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 を用意しておこう.
>  <html>
>  The basic auth function test was successful.
>  </html>

これで apache を停めてから再び apache を起動すれば Basic 認証は有効になっているはずだ.

&ref(./notes.png); 認証機能がうまく働くか確認してみよう.
http://localhost/test ← (上で用意したディレクトリ) にアクセスしてみて,ユーザ名とパスワードが聞かれるはずなので,test-user というユーザ名を入れ,自分で上で設定したパスワードを入れてみよう.
無事アクセスできて,上の "The basic auth ... "という表示がみられれば OK だ.

&ref(./notes.png); 近くの席に座っている人も認証機能が使えるように情報を追加して,試してもらおう.
具体的には,
  cd /usr/local/etc/apache22/Includes
  htpasswd ./passwdfile その人用のユーザ名
  そのユーザのパスワードを新規に考えて入力

としてから,先のディレクトリ中にある .htaccess の require 行を修正して追加したユーザも以下のように加えて,
>  require user test-user 追加ユーザ名 &color(blue){← スペースで区切る};

とするか,
>  Require valid-user

と直そう.
そして,その人に Web ブラウザで自分のホストに対して http://q**.cl.math.sci.osaka-u.ac.jp/test ← (自分のホスト名/上で用意したディレクトリ) としてアクセスして貰い,上と同様にユーザ名とパスワードを入れてアクセスできるかをみるのである.
&ref(./warning.png); 後者の "Require valid-user" は,パスワードファイルに書かれているユーザ全てが対象になる,という設定である.
&ref(./warning.png); アクセスするユーザを増やすには,他にも Group ファイルを用いる方法やデータベースを使う方法などがある. 具体的な方法は上にも示した Apache 2.2マニュアルの「認証,承認,アクセス制御」( http://httpd.apache.org/docs/2.2/ja/howto/auth.html )などに丁寧に書いてあるので参照せよ.
&ref(./warning.png); htpasswd でユーザを「追加」するときは "-c" オプションがないことに注意せよ.

*** Digest 認証 [#lcb0f5a0]
次に Digest 認証をしてみよう. セキュリティ上は Basic 認証より好ましいので,これが問題なく使える場合はこちらを使うようにしよう.

ディレクトリは先のものをそのまま使うとしよう.

&ref(./notes.png); そして,Digest 認証用に新しくアカウントとパスワードを含むパスワードファイルを作ろう.
パスワードファイルの置場所に対する注意も Basic認証と同じである.
そして,置く場所も先と同じでよいだろう.
さて,具体的には作業は以下のようになる.

  cd /usr/local/etc/apache22/Includes
  htdigest -c ./passwdfile-digest "Digest auth test" digest-test-user
  ユーザ "digest-test-user" のパスワードを新規に考えて入力

&ref(./warning.png); 既にそのパスワードファイルが存在するのに "-c" オプションをつけて htdigest を実行するとそのファイルの中身は消えてしまうので,"-c" をつけるときはくれぐれも慎重に.
&ref(./warning.png); htdigest コマンドは二つ目の引数として realm (認証の対象範囲とでもいうか)が必要となる. 今回は "Digest auth test" がこれにあたる. そして,この realm は .htaccess の中の AuthName として使われるので覚えておこう.

次に,先の testディレクトリの .htaccess ファイルを Digest 認証用に修正しよう.
具体的には次のようになるだろう.

>  AuthType Digest
>  AuthName "Digest auth test" &color(blue){← 上の htdigest コマンドで入力したものと完全に一致させること!};
>  AuthUserFile  /usr/local/etc/apache22/Includes/passwdfile-digest
// >  AuthGroupFile /dev/null
>  require user digest-test-user

ついでに先の index.html もちょこっと直しておこう.
>  <html>
>  The digest auth function test was successful.
>  </html>

これで設定は OK だ.

&ref(./notes.png); 認証機能がうまく働くか確認してみよう.
http://localhost/test ← (上で用意したディレクトリ) にアクセスしてみて,ユーザ名とパスワードが聞かれるはずなので,test-user というユーザ名を入れ,自分で上で設定したパスワードを入れてみよう.
無事アクセスできて,上の "The digest auth ... "という表示がみられれば OK だ.

&ref(./notes.png); 近くの席に座っている人も認証機能が使えるように情報を追加して,試してもらおう.
具体的には,
  cd /usr/local/etc/apache22/Includes
  htdigest ./passwdfile-digest "Digest auth test" その人用のユーザ名
  そのユーザのパスワードを新規に考えて入力

としてから,先のディレクトリ中にある .htaccess の require 行を修正して追加したユーザも以下のように加えて,
>  require user digest-test-user 追加ユーザ名 &color(blue){← スペースで区切る};

とするか,
>  Require valid-user

と直そう.
そして,その人に Web ブラウザで自分のホストに対して http://q**.cl.math.sci.osaka-u.ac.jp/test ← (自分のホスト名/上で用意したディレクトリ) としてアクセスして貰い,上と同様にユーザ名とパスワードを入れてアクセスできるかをみるのである.
&ref(./warning.png); これも後者の "Require valid-user" は,パスワードファイルに書かれているユーザ全てが対象になる,という設定である.
&ref(./warning.png); アクセスするユーザを増やすには,他にも Group ファイルを用いる方法やデータベースを使う方法などがある. 具体的な方法は上にも示した Apache 2.2マニュアルの「認証,承認,アクセス制御」( http://httpd.apache.org/docs/2.2/ja/howto/auth.html )などに丁寧に書いてあるので参照せよ.
&ref(./warning.png); htdigest でもユーザを「追加」するときは "-c" オプションがないことに注意せよ.

* レポート [#j5067c3c]
TLS/SSL について調べよ. 特に,認証の "オレオレ証明" について,そのセキュリティリスクを調べよ.
また,Basic 認証と Digest 認証の違いを調べよ.

また,web サーバにまつわるその他のセキュリティリスク(脆弱性)についても調べよ.
特に httpd.conf 中で "Allowoverride AuthConfig" ではなく "Allowoverride All" とした場合どれくらい危険性が増すのか,よく調べよ.

また,本日行った作業について報告せよ.
もちろん各自の

+ 所属(学部,学科)
+ 学籍番号
+ 学年
+ 氏名
+ 日時
+ 肝心のレポート内容(得た知見,作業について気づいたこと等)

を書くのを忘れないように.

*** about Icons [#ofc1e470]
Some icons in this page are downloadable at [[ICONFINDER:http://www.iconfinder.net/]].
The "note" icon designed by [[Marco Martin:http://www.notmart.org/]] is distributed with the LGPL licence
and the "warning" icon designed by [[Alexandre Moore:http://nuovext.pwsp.net/]] with the GPL licence.