目次
Apache2
SSL
オレオレ認証局とオレオレ証明書を作ります。自己認証局は自分だけが使うためのものです。誰でも利用できる公開サーバでSSLを使う場合は、ベリサイン等の信頼できる認証局に証明書発行を依頼します。
OpenSSLを入れる。debian系ならば以下のコマンドで
sudo aptitude install openssl
自己認証局の作成(認証局運営者)
CAを作成
cd /usr/lib/ssl/misc sudo ./CA.sh -newca
CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key .++++++ ..++++++ writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase:CA秘密鍵のパスフレーズを設定 Verifying - Enter PEM pass phrase:CA秘密鍵のパスフレーズを再入力 ----- 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]:国(例:JP) State or Province Name (full name) [Some-State]:県名(例:Tokyo) Locality Name (eg, city) []:都市名(例:Nerima) Organization Name (eg, company) [Internet Widgits Pty Ltd]:CAの組織名など(example inc.) Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:CAのホスト名(ドメイン) Email Address []:CA管理者のメールアドレス Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Using configuration from /usr/lib/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/./cakey.pem:先ほど設定したパスフレーズを入力 Check that the request matches the signature Signature ok
これで自己認証局の作成が完了しました。
openssl x509 -in demoCA/cacert.pem -text
で内容を確認できます
サーバ証明書の署名要求を作成(サーバ管理者)
どこに作ってもいいですが /etc/apache2/ssl に作成します。
cd /etc/apache2/ssl
サーバの鍵が無ければ、署名要求と同時にサーバの鍵も生成します(ただし1024bitの鍵になってしまうので、もっと長い鍵にしたい時は別に作る)
sudo openssl req -new -keyout server.key -out server.csr
サーバの鍵を作成
sudo openssl genrsa -rand 適当なファイル -des3 2048 > server.key
des3はサーバの鍵をさらにトリプルDESで暗号化して保護する指定。使える暗号化方式にはideaやaes256等がある。鍵自体はRSAである。
サーバの鍵を指定してCSRを作成
sudo openssl req -new -key server.key -out server.csr
Generating a 1024 bit RSA private key .......................++++++ ........++++++ writing new private key to 'server.key' Enter PEM pass phrase:サーバ秘密鍵のパスフレーズを設定 Verifying - Enter PEM pass phrase:サーバ秘密鍵のパスフレーズを確認 ----- 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]:CAと同じ情報 State or Province Name (full name) [Some-State]:CAと同じ情報 Locality Name (eg, city) []:CAと同じ情報 Organization Name (eg, company) [Internet Widgits Pty Ltd]:CAと同じ情報 Organizational Unit Name (eg, section) []:CAと同じ情報 Common Name (eg, YOUR name) []:証明書を利用するサーバのドメイン名 Email Address []:サーバ管理者のメールアドレス Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
同一ホストでSSLサービスとCAを行うならば、Organizational Unit NameまではCAと同じ情報を入力します。
server.key がサーバの秘密鍵、server.csr がCAに認証を依頼する証明書です。
サーバの鍵を作成するときのパスフレーズを忘れないこと。これはCAを作成するときに使用したパスフレーズとは別のものです。
サーバ証明書に署名(認証局運営者)
署名要求に署名して、サーバ証明書を作成します。ここでは先ほど作成したオレオレ認証局に署名させますが、この作業は本来ベリサイン等の認証機関に依頼するものです。ベリサイン等の正規の認証局の署名を加える事でインターネットで使用可能な証明書となります。
cd /usr/lib/ssl/misc sudo openssl ca -out /etc/apache2/ssl/server.pem -infiles /etc/apache2/ssl/server.csr
パスフレーズを求められますが、これはCA管理者の立場で実行するものなので、CAのパスフレーズを入力します。
server.pem がサーバ証明書です。
証明書をApacheに設定(サーバ管理者)
Apacheにsslのモジュールをロードさせます。debian系ならばssl.load と ssl.conf のシンボリックリンクを mods-enabled に作成します。
sites-available/default を修正します。(サイト構成に合わせて適宜ファイルを設定してください)
NameVirtualHost *:80 NameVirtualHost *:443 <VirtualHost *:80> ... </VirtualHost> <VirtualHost *:443> ... SSLEngine on SSLCertificateFile /etc/apache2/ssl/server.pem SSLCertificateKeyFile /etc/apache2/ssl/server.key ... </VirtualHost>
Apacheを再起動します。サーバ秘密鍵の作成時に-des3等のオプションを付けて暗号化しているとApacheの起動時にパスフレーズを求められます。
sudo /etc/init.d/apache2 start
セキュリティには良くないですが自動起動できるようにサーバ秘密鍵の暗号化を解除します。
openssl rsa -in server.key -out server.key
鍵ファイルの保管には十分注意すること。誰かに盗まれた瞬間に鍵としての意味を失います。
自己認証局の証明書をブラウザにインストール
毎回、信用できない証明書だぜ!と怒られるので俺様自己認証局の証明書をブラウザにインストールします。
cd /usr/lib/ssl/misc openssl x509 -inform pem -outform der -in demoCA/cacert.pem -out ~/cacert.der
作成したcacart.derをクライアントに持ってきてブラウザに追加します。くどいようですが、自己認証局は自分のためだけに使ってください。他人に証明書のインストールなどをさせてはいけません。
中間証明書
以下は正規の証明書を使う場合。
ベリサイン等の正規の認証局は階層化されており、最上位の認証局をルート認証局(ルートCA)という。一般的にサーバ証明書はルートCAで署名・認証されず、ルートCAで署名された下位の認証局(中間認証局、中間CA)で署名・認証される。
大抵のブラウザはルートCAを知っているが、中間CAを知らない(中間CAの証明書を持っていない)。よって中間CAで署名されたサーバ証明書を正規の証明書であると判断できない。
サーバに中間CA証明書インストールしておくと、ブラウザはそれをダウンロードし、ルートCAで署名された正規の中間CAであるか確認する。中間CA証明書が正規のものであると確認できると、その中間CAで署名されたサーバ証明書も正規のものであると確認できる。
中間証明書はルート認証局の運営会社が配布しているので、ダウンロードしてサーバに設置し、apacheのSSLのコンフィグに以下の設定を加える(mod_sslの場合)。詳細は書く認証局のサイトで確認できる。
SSLCertificateChainFile /path/to/middle_ca.pem
ブラウザは過去にあるサイトである中間CA証明書をダウンロードしていれば、同じ中間CA証明書を使っている別のサイトにアクセスしたときにはダウンロードしない。サーバにSSLを設定して動作確認するとき、ブラウザが中間証明書を持っていれば、中間証明書をサーバに設置するのを忘れてもエラーにならないので注意する。
OpenSSLのコマンド
秘密鍵を確認
openssl rsa -in 鍵ファイル -text
CSRの確認
openssl req -in CSRファイル -text
証明書の確認
openssl x509 -in 証明書ファイル -text
ログ
ログ抑制
css、jsや画像へのアクセスをログに吐かないようにする
# .jpg .png 等へのリクエストに対して nolog をセット SetEnvIf Request_URI "\.(jpg|png|gif|swf|js|css)$" nolog # nologがセットされているときはログ出力しない CustomLog /var/logs/apache2/access.log combined env=!nolog
logrotate
ログのローテーションを行うツール。UbuntuではパッケージでApacheをinstallすると /var/log/apache2/*.log に対して設定済み
CronoLog
CronoLogは定期的にログローテートさせるツール
インストール
# sudo aptitude install cronolog
設定
CustomLog "|usr/sbin/cronolog /var/vhosts/wiki.paulownia.jp/logs/access.log.%Y%m" combined ErrorLog "|usr/sbin/cronolog /var/vhosts/wiki.paulownia.jp/logs/error.log.%Y%m"
日付でフォルダ分けでできる
CustomLog "|usr/sbin/cronolog /var/vhosts/wiki.paulownia.jp/logs/%Y/%m/access.%Y%m%d.log" combined ErrorLog "|usr/sbin/cronolog /var/vhosts/wiki.paulownia.jp/logs/%Y/%m/error.log.%Y%m.log"
visitors
Visitorsは高速なApacheログ解析ツール。ソースをダウンロードしてmake、でき上がったバイナリを好きな場所に設置する。
visitors ログファイル名 > hoge.html
メンテナンスページを出す
検索エンジンはステータス503を認識するので、メンテナンス中はステータス503を返すとよい。
mod_alias を使う
Redirectディレクティブを使う。一時的に特定のコンテンツを隠したい場合はこちらが楽。サイト全体を隠したいならば、mod_rewriteの方が良いだろう
/hoge 以下のみをメンテナンスにする
ErrorDocument 503 /503.html Redirect 503 /hoge
mod_rewrite を使う
特定のIPアドレスからのアクセスはメンテページを表示せずに通常利用できるなどの制御が可能。サイト全体で本格的にメンテナンス作業をするならこちらで
192.168.1.2 以外からのアクセスに対して503.htmlを表示する方法
ErrorDocument 503 /503.html RewriteEngine on RewriteCond %{REQUEST_URI} !=/503.html RewriteCond %{REMOTE_ADDR} !=192.168.1.2 RewriteRule ^.*$ - [R=503,L]
有効範囲を工夫してBASIC認証をかける
特定のIPアドレスからのアクセスは認証しない
127.0.0.1からのアクセスの場合は認証しない
AuthType basic AuthName "Only Me" AuthUserFile /var/www/conf/htpasswd AuthGroupFile /dev/null Require valid-user Allow from 127.0.0.1 Satisfy any
BASIC認証のユーザを分ける
/aaaa はユーザxxxのみアクセス可、/bbbb はユーザyyyのみアクセス可。それ以外は認証ユーザすべてアクセス可能。
<Directory /var/www/htdocs/> AuthType basic AuthName "Staff Only" AuthUserFile /var/www/conf/htpasswd AuthGroupFile /dev/null Require valid-user </Directory> <Directory /var/www/htdocs/aaaa/> Require user xxx </Directory> <Directory /var/www/htdocs/bbbb/> Require user yyy </Directory>
一段下がった場所のみBASIC認証をかける
ルートディレクトリは誰でもアクセス可能にし、サブディレクトリ以下に認証を設定する。個別に設定すると面倒なのでDirectoryMatchで一度に設定する。
<Directory "/var/www/htdocs/"> AuthType basic AuthName "Staff Only" AuthUserFile /var/www/conf/htpasswd AuthGroupFile /dev/null </Directory> <DirectoryMatch "^/var/www/htdocs/(.+?)/"> Require valid-user </DirectoryMatch> <DirectoryMatch "^/var/www/htdocs/(img|css|js)/"> Allow from all Satisfy any </DirectoryMatch>
素材類を認証から除外するために /js, /css, /img
へのアクセスは常に許可する。/index.html
等で素材を使わないなら不要だがそんな事はまず無いだろう。