転居に伴い新しいサーバーにFreebsd8.2とapache2.2.20を導入 2011年7月末に転居したことに伴いwebサーバーを新しくした。 新しくするつもりは無かったのだが、400日くらい連続運転を続けてきたサーバが 一度電源を落とすと、全く立ち上がらなくなった。 何度か一時的に止めたことはあるが、5年ほど24時間運転をしてきた中古ノートパソコンである。 製造から言えば10年を過ぎている。潮時だろう。 Versapro(VersaPro VA70J/WXA: M Pentium 3 700MHz Memoey 256MB HDD 20GB)ご苦労様。 日立の中古ノートパソコンを購入し、これに新たにOSとwebサーバーソフトを入れることにした。 ハードウェア:日立 Flora 270W PC8MF1 (CPU:Core2Duo T5500 Memory 1GB HDD 40GB) OS:Freebsd−8.2 webサーバ:apache−2.2.20 SSL :OpenSSL 0.9.8q 2 Dec 2010 1)ftpでISOイメージをダウンロードしてCDに焼く FreeBSD-8.2-RELEASE-i368-disc1.iso 2)CDからインストール 前回インストールした6.1とは少し違うようだ 標準インストールを選んだからだろうか?(前回はカスタム) 3)inetdの設定 インストールの設定でinetdを使う設定を選び、telnetとftp、sshの使用を設定した 4)ntpdをrc.confに追加した。 ntpd_enable="YES" ・・rc.confに追加 windows上で追加し、ftpで転送 動かない。^Mマークがファイルにあり。 qkcをインストールして改行コードの変更、日本語コードの変更が必要 freebsd8.2は標準で/etc/ntp.confがあり、サーバー名が記述されている。 私は、以前から使っている日本のntpサーバーを記述したntp.confを ftpで /etc/ntp.confとして送った。 5)qkcの導入 portsからqkcをインストール 上記4)を行うため。 6)linuxカーネルの導入 rc.confに linux_enable="YES" を追加 kldstatコマンドで確認のこと 0)apache-2.2.20をダウンロード ファイル名が変わるだけで1)〜7)は前回と同じです。 1) /usr/local/の下にsource/apacheディレクトリーをつくりここにapache2のソースをいれる。 2)圧縮ファイルを展開 /usr/local/source/apache にフォルダーを移す cd /usr/local/source/apache ファイルの展開 tar zxvf httpd-2.2.20.tar.gz httpd-2.0.59 フォルダーができる 3) フォルダ移動 httpd-2.2.20 フォルダーに移動 cd httpd-2.2.20 4) コンパイルの準備 ここでsslモジュールを入れる ./configure --enable-ssl (約58秒) <−−−−ここが肝心です 5)コンパイル make (約2分29秒) 6)インストール make install (約6秒)} /usr/local/apache2 にインストールされる 7)フォルダ移動 cd /usr/local/apache2 8)httpd.confファイルの編集 cd conf (/usr/local/apache2/conf) httpd.confは この位置(/usr/local/apache2/conf/httpd.conf)にあり、 ssl.confは 一段下のextraディレクトリーにある。(/usr/local/apache2/conf/extra/ssl.conf) freebsd6.1とはssl.confの位置が異なる。 httpd.confは大幅に変更され簡単になり、その他の設定は ./extra/以下に別ファイルとして提供されている。 必要に応じてhttpd.confから読み込む設定である。 httpd.confの変更点は前回とほぼ同じ エラーメッセージも前回と同じものを使用。併せて、BASIC認証もについてもhttpd.confの最後に前回と同じ内容を追加した。 httpd.confのディフォルトからの変更点 #[Sun Sep 11 20:54:33 2011] [warn] (2)No such file or directory: # Failed to enable the 'httpready' Accept Filter #[Sun Sep 11 20:54:33 2011] [warn] (2)No such file or directory: # Failed to enable the 'dataready' Accept Filter # # への対応の(ワーニングを発生させない)ために下の2行を追加した # http://www.skymerica.com/blog/yotsumoto/arch/2007/06/11/000799.html より # # AcceptFilter http none AcceptFilter https none #ServerAdmin you@example.com ServerAdmin USER@localhost #ServerName www.example.com:80 ServerName USER.ddo.jp:80 #DocumentRoot "/usr/local/apache2/htdocs" DocumentRoot "/usr/home/USER/www" # # This should be changed to whatever you set DocumentRoot to. # #<Directory "/usr/local/apache2/htdocs"> ドキュメントルートの変更 <Directory "/usr/home/USER/www"> ドキュメントルートの変更 # Options Indexes FollowSymLinks <---- この行はIndexes があると indel.htmlファイルが無い場合ディレクトリー表示する Options -Indexes FollowSymLinks # # Customizable error responses come in three flavors: # 1) plain text 2) local redirects 3) external redirects # # Some examples: エラーメッセージを自分用に変更 ErrorDocument 400 /ERROR/error-400.html ErrorDocument 401 /ERROR/error-401.html #ErrorDocument 402 http://www.example.com/subscription_info.html ErrorDocument 403 /ERROR/error-403.html #ErrorDocument 404 /missing.html ErrorDocument 404 /ERROR/error-404.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" ErrorDocument 405 /ERROR/error-405.html #ErrorDocument 500 "The server made a boo boo." ErrorDocument 500 /ERROR/error-500.html # Secure (SSL/TLS) connections sslを利用するのでincludeする #Include conf/extra/httpd-ssl.conf Include conf/extra/httpd-ssl.conf # BASIC認証をするために、httpd.confに以下を追加 # ------------------------------------------------------------- # BASIC認証をHTTPのルートディレクトリー以下にかける # 2009/01/14 --> # 各ディレクトリーに .htaccess を置かずに、ここ(httpd.conf)ですべて記述 # apache2 の manualにはその方が良いと記述されている。(例外あり) # BASIC認証が必要なディレクトリーは /usr/home/USER/https 以下 # -------------------------------------------------------------- <Directory "/usr/home/USER/https"> AuthType Basic AuthName "Sorry ! This page is Webmaster only" AuthUserFile /etc/.htpasswd require valid-user </Directory> 9)ssl.confファイルの編集 変更した点をここに列記 ssl.confを設定したつもりだが、hpptsによるアクセスができなかった。 /usr/local/apache2/logs/ssl_error_logを調べてみると [Sun Sep 11 21:08:02 2011] [error] [client 192.168.24.51] client denied by server configuration: /usr/home/USER/https/ssl.confの設定が何かまずいようだ。 httpd.confの設定は2.0.*と違って2.2.*から大きく変更されている。 httpd.confを見ると、まず、ルートのアクセスを全て拒否し # First, we configure the "default" to be a very restrictive set of # features. # <Directory /> Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory> その後、すこしずつアクセス可能な範囲を拡げる記述している。 defaultのhttpd.conf ssl.confを使うと当然httpsによるアクセスは可能となった。 (もちろんそれなりの設定は必要) ssl.confでデフォルトと変えているのはドキュメントルートである。 http のドキュメントルートは /usr/HOME/USER/www httpsのドキュメントルートは /usr/HOME/USER/https である。httpとhttpsのドキュメントルートが異なることで httpd.confに記述されたディレクトリによるアクセス許可がssl.confには適用されないことが理解できた。 そこで、ssl.confにもアクセス許可のディレクトリを記述した。 httpd−ssl.confのディフォルトからの変更点 # General setup for the virtual host #DocumentRoot "/usr/local/apache2/htdocs" DocumentRoot "/usr/home/USER/https" # First, we configure the "default" to be a very restrictive set of # features. # 2011/9/13 httpd.confからコピー <Directory /> ・・ すべてのルートアクセスを禁止 Options FollowSymLinks AllowOverride None Order deny,allow Deny from all </Directory> #<Directory "/usr/local/apache2/htdocs"> 2011/9/13 httpd.confからコピーして修正(www --> https) # この<Directory>でアクセスを許可 <Directory "/usr/home/USER/https"> # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.2/mod/core.html#options # for more information. # # Options Indexes FollowSymLinks <---- この行はIndexes があるとディレクトリー表示する Options -Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Order allow,deny Allow from all </Directory> #ServerName www.example.com:443 ServerName USER825.ddo.jp:443 #ServerAdmin you@example.com ServerAdmin USER@localhost #ErrorLog "/usr/local/apache2/logs/error_log" sslのエラーログをアパッチエラーログから変更 ErrorLog "/usr/local/apache2/logs/ssl_error_log" #TransferLog "/usr/local/apache2/logs/access_log" sslアクセスログをアパッチアクセスログから変更 TransferLog "/usr/local/apache2/logs/ssl_access_log" # 2009/1/18 error 401 対応のため設置 # httpsのERROR ディレクトリーをhttpのERRORディレクトリーにリンクさせる # でないと、オリジナルのerror-401.htmlが表示されない。 # Alias /ERROR/ "/usr/home/USER/www/ERROR/" これでhttpsによるアクセスが可能になった。(もちろん下に記述した鍵の設定が前提) 1)鍵を入れる場所がapache2.2から変更になった。 apache2.0 /usr/local/apache2/ssl.crt/ssl.crt と /usr/local/apache2/ssl.key/ssl.key apache2.2 /usr/local/apache2/conf/ssl.crt と /usr/local/apache2/conf/ssl.key に変更になった。 2)サーバー秘密鍵の作成 ( 以下2)〜4)は前回と同じ ) #cd ssl.key #pwd /usr/local/apache2/ssl.key VersaPro# openssl genrsa -out server.key 1024 <−− サーバー秘密鍵の作成 Generating RSA private key, 1024 bit long modulus .........................++++++ ......++++++ e is 65537 (0x10001) # ll total 2 -rw-r--r-- 1 root wheel 887 Jan 12 16:13 server.key 3)サーバーCSR(証明書署名要請書)の作成 # openssl req -new -key server.key -out server.csr <−− サーバーcsr(証明書署名要請書)の作成 4)自己署名の作成(外部機関に証明書の発行を依頼しない) # openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 <−−自己署名 有効期限365日 Signature ok subject=/C=jp/ST=aaa/L=bbb/CN=ccc Getting Private key #ll total 6 -rw-r--r-- 1 root wheel 753 Jan 12 16:26 server.crt -rw-r--r-- 1 root wheel 639 Jan 12 16:18 server.csr -rw-r--r-- 1 root wheel 887 Jan 12 16:13 server.key 5) キーの移動 サーバーの秘密鍵と証明書(自己署名)をそれぞれ、 /usr/local/apache2/conf/ に server.key /usr/local/apache2/conf/ に server.crt に移動させる。(ssl.confにあるパスとファイル名に一致させること) 移動後の確認 Flora-T5500# pwd /usr/local/apache2/conf Flora-T5500# l drwxr-xr-x 2 root wheel 512 Sep 13 20:58 extra ・・ この下にhttpd-ssl.confがある -rw-r--r-- 1 root wheel 13346 Sep 4 14:14 httpd-org.conf -rw-r--r-- 1 root wheel 14981 Sep 13 23:10 httpd.conf -rw-r--r-- 1 root wheel 12958 Sep 4 14:14 magic -rw-r--r-- 1 root wheel 49815 Sep 4 14:14 mime.types drwxr-xr-x 3 root wheel 512 Sep 4 14:14 original ・・ オリジナルのconfファイルが入っている -r-------- 1 root wheel 725 Sep 12 22:03 server.crt -r-------- 1 root wheel 586 Sep 12 22:02 server.csr ・・ これはcrtを作った後は使わないようだ? -r-------- 1 root wheel 887 Sep 12 21:53 server.key netstatでLISTEN状況を確認した。 ポート443をLISTENしている。okだ。 Flora-T5500# netstat -atn Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 192.168.24.111.23 192.168.24.51.1438 ESTABLISHED tcp4 0 0 *.110 *.* LISTEN tcp4 0 0 *.23 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp4 0 0 *.21 *.* LISTEN tcp4 0 0 *.* *.* CLOSED tcp46 0 0 *.443 *.* LISTEN tcp4 0 0 *.* *.* CLOSED tcp46 0 0 *.80 *.* LISTEN tcp4 0 0 127.0.0.1.25 *.* LISTEN udp4 0 0 127.0.0.1.123 *.* udp6 0 0 ::1.123 *.* udp6 0 0 fe80:3::1.123 *.* udp4 0 0 192.168.24.111.123 *.* udp6 0 0 *.123 *.* udp4 0 0 *.123 *.* udp4 0 0 *.514 *.* udp6 0 0 *.514 *.* Active UNIX domain sockets Address Type Recv-Q Send-Q Inode Conn Refs Nextref Addr c49e4ec8 stream 0 0 c4afe96c 0 0 0 /var/run/devd.pipe c49e4b6c dgram 0 0 0 c49e5b6c 0 c49e5ac0 c49e5a14 dgram 0 0 0 c49e5c18 0 0 c49e5ac0 dgram 0 0 0 c49e5b6c 0 c49e4e1c c49e4e1c dgram 0 0 0 c49e5b6c 0 0 c49e5b6c dgram 0 0 c49d2a78 0 c49e4b6c 0 /var/run/logpriv c49e5c18 dgram 0 0 c49d2b84 0 c49e5a14 0 /var/run/log Flora-T5500# 1)BASIC認証をする インターネットで検索するとBASIC認証するには、BASIC認証するディレクトリー(及びその下のサブディレクトリを含む)に .htaccess ファイルを置き、ユーザーとパスワードを書いた.htpasswd ファイルをapacheがアクセスできない 場所に置くとあった。 しかし、apacheのmanualには、ユーザーが多くいて一人一人が自分の特定のディレクトリー以下を BASIC認証するには上記の方法が良いが、人数が少なく、root権限が使える場合は httpd.confの中の<Directory></Directory> ブロックに .htaccessの記述をそのまま記述することで行えるとのこと また、その方が安全であるとの記述。そこで httpd.confに以下の文を追加した。 # ------------------------------------------------------------- # BASIC認証をHTTPのルートディレクトリー以下にかける # 2009/01/14 --> # 各ディレクトリーに .htaccess を置かずに、ここですべて記述 # apache2 の manualにはその方が良いと記述されている。(例外あり) # BASIC認証が必要なディレクトリーは /usr/home/USER/https 以下 # -------------------------------------------------------------- <Directory "/usr/home/USER/https"> <−−−ここはBASIC認証を必要とするルートディレクトリ AuthType Basic <−−−認証方式をBASICにする AuthName "このページは、Webmaster専用です。" <−−− BASIC認証できないときのコメント AuthUserFile /etc/.htpasswd <−−− BASIC認証する人のidとパスワードの保存場所 require valid-user <−−−認証が必要 </Directory>これで/usr/home/USER/https以下のディレクトリーにBASIC認証が必要となる。 2) 利用可能なユーザーとパスワードの登録 /usr/local/apache2/binで # ./htpasswd -mc /etc/.htpasswd USER <−−ここを入力 -mc:m:MD5で暗号化、c:新しくファイルを作る /etc/.htpasswd 出力するファイル名とそのパス USER 追加するユーザー名 New password: <−−パスワードを聞いてくる Re-type new password: <−−再度パスワードを聞いてくる Adding password for user USER # 2人目以降でユーザーを追加するときは "c"が入らない。つまり # ./htpasswd -m /etc/.htpasswd ユーザー名 1)APACHE2のスタート Apache2.0から変更になった。startsslは使わずstartのみ 最初startsslを使うとエラーが出て、とまどった。 /usr/local/apache2/bin/apachectl startssl (Apache2.0.59) /usr/local/apache2/bin/apachectl start (Apache2.2.20) 2)APACHE2を停止するには /usr/local/apache2/bin/apachectl stop (変わらず) (2009/01/18 追記) httpd.confの中に”ErrorDocument 401 /ERROR/error-401.html”と記述していた。 他のエラー403や404も同様に記述している。ところが、401エラーだけは 正しく表示されずに標準出力+以下追加メッセージが表示されることになった。 Additionally, a 401 Authorization Required error was encounteredいろいろgoogleしているとここの記述に 認証ができないのだから、認証が必要なディレクトリーの下にあるエラーの記述されているディレクトリーには当然アクセスできないとあった。 なるほどそうだ。話を聞けばそうだと思う。だが、ここまで説明している所は少ない(だろう?)。私も袋小路に入ってしまった一人である。 解決方法はDocumentRootの下のBASIC認証の掛かっていないディレクトリーにエラーメッセージを置けばよいとのこと。 この解説では、HTTPのドキュメントルートの下にHTTPSのページを作り、HTTPSのルートをHTTPのルートと同じにし、 HTTPルートの下にerrorディレクトリを置くというもの。この方法だとhttpsのBASIC認証ページを呼び出すとき サブディレクトリまで指定しないといけない。 http(https) root ---- https(basic 認証ディレクトリー) ---- error directoryそこでいろいろ考え、ALIASを使うことにした。 DocumentRoot "/usr/home/USER/www" ・・・・・httpのドキュメントルート(httpd.conf) DocumentRoot "/usr/home/USER/https" ・・・・・httpsのドキュメントルート(ssl.conf) /usr/home/USER/www/ERROR/ ・・・・・エラーのディレクトリー(httpd.conf) ErrorDocument 401 /ERROR/error-401.html ・・・エラードキュメント(httpd.conf)これらを結びつけるためにssl.confに Alias /ERROR/ "/usr/home/USER/www/ERROR/" を追加した。これでうまく行くようになった。 (以上2009/01/18 追記) |