postfixのTLSの設定

続いてpostfixでTLSを使う設定をします。

postfixは25番ポートでの配送のやりとりと587番でのsubmissionを行っているわけですが、サーバ間の配送に使われる25番ポートは基本的に認証などは行いません。ただし、リレーは行わず自分宛のメールのみ受け取ります。

一方587番のsubmissionはメールの送信を受け付けます。ここでは認証が必要です。認証はSASL AUTHで行いますが、このときパスワードを平文で渡しても問題ないようにSTARTTLSによるTLSの使用を必須とします。

まずpostfixの設定ファイルは/etc/postfix/の下にあります。main.cfに以下の設定を行います。TLSに使うサーバ証明書の指定と、AUTHはTLSのときにしか行わないという制限です。証明書はdovecotに使用したものと同じものを使います。

次にmaster.cfのsubmissionの行に以下のオプションを追加します。これはTLSを必ず使うと言う設定です。これで587番ポートでのsubmissionの接続は必ずTLSで行われることになります。

postfixにもクライアント認証の設定があるようですがThunderbirdでクライアント認証の設定方法が見当たらないので今回は見送ります。

 

dovecotのIMAPSの設定

オレオレ証明書ならいくらでも作成できる環境になったので、メールサーバもSSLを使って通信をするように変更します。

証明書は普通のサーバ証明書を使用しますが、メールサーバには別の名前(mailなど)を使用している場合には、そのサーバ名をCNにした証明書を用意します。

dovecotの設定ファイルは/etc/dovecot/conf.d/の下にありますが、10-ssl.confがSSLの設定です。

以下の設定でSSLが有効になります。/etc/dovecot/dovecot.confでprotocolsとしてimapが有効になっていると、これでimapsが有効になります。

次に以下の証明書の設定を行います。これで再起動すればIMAPSでアクセスが可能になります。

IMAPSでのアクセスが可能になったら、10-auth.confのdisable_plaintext_authはyesに戻してもよいかもしれません。最後にiptablesでimapの143を閉じて変わりにimapsの993をあけたら完了です。

また、当然ながらオレオレ証明書の場合はメールソフト側で警告が出ます。

さらにdovecotの設定ファイルでは認証にクライアント認証を使うこともできるようですが、Thunderbirdでクライアント認証を使う方法が分からないので今回は保留とします。Thunderbirdの認証方式の設定でTLS証明書というのがそれっぽく見えますが、証明書も指定できないしどうも違うみたいです。

nagiosのクライアント認証

nagiosではデフォルトではユーザ名とパスワードを用いたベーシック認証で認証を行いますが、せっかくクライアント認証の環境を用意したのでクライアント認証で認証できないかな考えます。

認証の設定自体はApacheの設定です。nagiosのウェブアクセスの設定ファイルはnagiosのディレクトリの下のetc/cgi.cfgです。

以下の設定がベーシック認証のユーザ名をnagiosで利用する設定のようです。これを0にします。

以下の設定がクライアント認証のユーザ名をnagiosで利用する設定のようですが、nagiosadmin以外のユーザ名だと面倒なので、今回はこれは0にすることにします。

以下の設定を行うと認証とは関係なくユーザnagiosadminとみなすことができるようです。

認証自体はApacheでクライアント認証の設定をしているのでこれで問題ありません。

クライアント証明書の作成およびApacheのクライアント認証の設定

opensslを使用してクライアント証明書を作成します。作成手順はサーバ証明書の時と全く同じです。サーバ証明書の時はCNにFQDNを指定していたのが、クライアント証明書ではCNにユーザ名を指定するのが唯一の違いです。

  • クライアント証明書用の秘密鍵を作成
  • クライアント証明書要のCSRを作成
  • 自前の認証局で署名

サーバ証明書だとサーバの数は限られるのでお金を払ってもよい気がしますが、クライアント証明書を正規の認証機関で署名してもらうのはかなり厳しいのではと思います。ここで自前の認証局が活躍となります。

つぎにユーザのインストール用にクライアント証明書をパッケージ化します。以下のようにopensslを使ってpkcs12という形式で、クライアント証明書・秘密鍵・認証局の証明書をまとめることができます。このときにpkcs12のパッケージ用のパスワードを設定します。

正規の認証局で署名してあれば認証局の配布は不要となります。秘密鍵をシステム側で作成して配布するのは本来の意味では間違いと思いますが、ユーザがCSRを作成して署名してもらうというのは(特にWindowsでは)現実的ではないので気にしないことにします。

ここで生成されたp12ファイルをWindows上でダブルクリックするとインストールすることができます。インストール時にpkcs12のパッケージのパスワードを入力します。OSおよびIEはこれで証明書を認識できます。

FireFoxでは別途ブラウザ上でクライアント証明書をインストールする必要があります。

Apache側の設定ですが、SSLの設定はすんでいると仮定します。ssl.confの以下の項目でクライアント証明書を発行した認証局の証明書を指定します。

また次の設定で上記認証局で署名されたクライアント証明書がないとSSLでアクセスができなくなります。

個別にユーザの制限を行う場合は以下のような設定を追加します。以下の例では/以下の場所で上記認証局で署名されたユーザhugaのみアクセス可能となります。

 

サーバ証明書の作成およびApacheのSSLの設定

opensslを使ってApacheでSSLを使用するためのサーバ証明書を作成します。

まずは以下のコマンドでサーバ証明書用の2048bitの秘密鍵を作成します。ここではhoge.keyというファイル名で保存します。

Apacheを起動するときに毎回秘密鍵のパスフレーズを入力するのは大変なのでパスフレーズなしの秘密鍵も作成します。ファイル名はhoge.nopass.keyにします。(追記:パスフレーズ外すなら最初から暗号化しない秘密鍵を作ればいいのか?)

次に上で作成した秘密鍵を用いてCSR(証明書要求)を作成します。ここではhoge.csrというファイル名にします。実行すると組織の情報などの入力が求められます。そしてCNとしてサーバの名前(FQDN)を入力します。

ここで作成したCSRに署名をしたものがサーバ証明書となります。ここまでは正規の証明書でもオレオレ証明書でも同じです。正規の証明書ではこのCSRに商用の認証機関で署名してもらうことになります。

ちなみにCAスクリプトを使用する場合はCA -newreqで上記の作業が可能なようです。この場合、特に指定しなければファイル名などはopenssl.cnfで設定されているデフォルトが使われるようです。(ちゃんと確認していません。)

次に、オレオレ証明書の場合は、自分で作成した認証局で署名を行います。以下の例では認証局の証明書および秘密鍵がそれぞれcacert.pem、cakey.pemです。サーバ証明書のファイル名はhoge.crtとします。

CAスクリプトではCA -signで実行するようです。(こちらも未確認。)

ApacheのSSLの設定ですが、CentOSではmod_sslパッケージをインストールすることでSSLが使用可能になります。設定ファイルは/etc/httpd/conf.d/ssl.confです。以下の項目にそれぞれ上記で作成した証明書と秘密鍵を設定します。

httpdを再起動すればhttpsでアクセスが可能なはずです。iptablesの設定などにも注意が必要です。

商用の認証機関で署名をしてもらったときには中間証明書が必要な場合もあります。その場合にはSSLCertificateChainFileの項目も合わせて設定を行います。

認証局(CA)の作成

ちょっと前に正規のサーバ証明書を購入しても非常に安価であるという話をしたばかりですが、いわゆるオレオレ証明書を作成するための(プライベートな)認証局の作成の話を書きます。

CentOSの場合、opensslのパッケージをインストールしていると/etc/pki/の下に認証関係のファイルが配置されています。/etc/pki/tls/misc/CAというスクリプトを実行すると認証局が作成できます。非常に簡単です。デフォルトでは/etc/pki/CA/の下に認証局のファイルが作成されます。

具体的には以下のように実行します。実行すると秘密鍵用のパスフレーズおよび組織の情報などの入力が求められます。

phpMyAdminをインストール

phpMyAdminはウェブからGUIでMySQLlの操作が行えるツールです。データベースの作成やユーザの作成だけならコマンドラインからmysqlコマンドで行っても全然問題がありませんが、ものは試しということでインストールしてみました。

CentOSのリポジトリには入っていないようなので公式サイトからダウンロードしてインストールします。公式サイトは以下の場所です。

  • http://www.phpmyadmin.net/home_page/index.php

インストールは非常に簡単で、ここからソースファイルをインストールしウェブからアクセスできる場所に解答するだけです。デフォルトの設定ファイルがconfig.sample.inc.phpという名前で入っているのでそれをconfig.inc.phpという名前でコピーします。

設定はデフォルトのままで動きました。MySQLのユーザ名とパスワードでログインできます。あとは環境に合わせてApacheの設定を行います。AliasでURLを設定しアクセス制御を行えば完了だと思います。

アクセスするといろいろと項目があって複雑ですね。mcryptがないと怒られますがそれは今度考えることにします。

AWStats

ウェブサーバのアクセス解析というと大きく二つに分けられると思います。ひとつは各HTMLに埋め込んで動的に情報を収集するもの、もうひとつはApacheのログから情報を解析するものです。

前者としては代表的なものとしてGoogle Analyticsがあげられると思います。実際Google Analyticsも使っていますが、すべてのウェブページの情報を解析するのには向いていないと思うので、ログを解析するタイプのアクセス解析としてAWStatsをインストールしました。

他に定番なソフトとしてWebalyzerがあるかと思いますが、見た目がよくできているのと完全日本語版というのが気になったのでAWStatsをインストールしてみました。オフィシャルサイトは以下の場所です。

完全日本語版は以下のサイトにあります。

インストールは上記の完全日本語版のサイトにしたがって行いましたが非常に簡単です。ウェブからアクセスできる場所に展開したファイルを配置し、設定を行い、実行するという流れです。

上記サイトにありますが、ウェブからアクセスできるというのはcgi-binとiconのディレクトリが見れれば十分なようなので、適当なところにおいて、そこだけApacheの設定にAliasを追加する感じになるかと思います。

設定もとくに問題になるところはなく、ほとんどデフォルトでも十分な出力が得られると思います。

一番なやむのが運用方法ではないでしょうか。AWStatsの処理はログからデータをアップデートする処理とデータを表示する処理に分けられます。アップデートは定期的に行い、表示はウェブからのアクセスに基づいて行うということになります。おそらく表示の部分は特に考える余地はなくCGIが実行されると表示されると言うことになります。

トップページだけはデータをアップデートしたときに静的にHTMLを生成しておくと負荷が削減できるようです。

そのデータのアップデートの処理ですが、定期的にアップデート処理を起動すると、前回からの差分を更新する仕組みのようです。処理済の部分のログを削除することが可能で次回以降の処理が軽くできるという思想のようですが、ログを処理したら削除というのはポリシーとしては受け入れがたいものがあります。

また、前回処理からの差分を処理ということでlogrotateとは相性がよくありません。(通常の定期的な処理のほかにlogroate直前の処理というのをはさむ必要がでてきます。)

完全日本語版ではログからデートする前に一旦フィルターをかけてファイルを変換するという処理が追加されるという方式です。定期的にチェックする処理が二重になるのと、ファイルの変換という処理が入るのとで、効率よく処理するためには処理済のログは削除というポリシーにいっそう依存するような構成になります。

今回はそんなにリアルタイムにログを解析したいわけではない個人サイトということで、大きく割り切ってログのアップデートは週に1回だけ行うことにしました。logrotateが終わってるであろう時間に、最後にローテートされたログに対して処理を行います。この場合ファイル内に追加されたログがある場合はありませんので、処理済のログを削除しなくても無駄なく処理が可能です。このときにあわせてHTMLのページも生成します。

具体的な設定としては、まず/var/www/awstats/以下にファイルを配置し、Apacheの設定に以下を追加しました。実際にはこれに加えてベーシック認証の設定もあります。

次にawstats.confは以下のようにログファイルを設定、SiteDomainやHostAliasesも適当に設定しました。

更新には以下のようなスクリプトを作成し、日曜日の朝に実行するようにcronに設定しました。

PostgreSQLの使い方

フリーで使えるDBとしてはMySQLとPostgreSQLが代表的なものかと思いますが、それぞれの特徴などはどうなんでしょうね。感覚的にはMySQLの方がよく使われている気がします。

CentOS 5.6ではデフォルトではPostgreSQLのバージョン8.1になるようです。postgresql84というパッケージをインストールするとバージョン8.4を使用することが可能です。

最初に起動するときにDBの初期化が必要なようです。service postgresql initdbで実行できます。

次に認証の設定を行います。/var/lib/pgsql/data/pg_hba.confに以下の設定をすることで、ローカルからの接続は認証なし、IPによるlocalhostからの接続はmd5認証となります。(デフォルトはすべてident認証ですが、ident認証のやり方はよく知りません。)

一般的な操作をメモしておくと、ユーザhogeの作成と、所有者がhogeのデータベースhugaの作成はそれぞれコマンドラインから以下のとおりです。ちなみにデフォルトのpostgresというのがスーパーユーザの名前です。

ユーザhogeにパスワードfooを設定する方法はpsqlと言うコマンドでログインしてから以下のコマンドを実行します。