ユーザ用ツール

サイト用ツール


apache

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 等で素材を使わないなら不要だがそんな事はまず無いだろう。

apache.txt · 最終更新: 2011/06/01 04:50 by nullpon