cfengine メモ #0 - cfengine の構成パターン
I, newbie » cfengineによるシステム管理の自動化: その1 を読んで、cfengine よさげだなぁ、ってことで導入を検討することに。
このブログでは、上記エントリで「ややこしいけど魅力的」と書かれている cfengine について、自分なりに試したことや整理したことについてメモしていこうと思います。日本語のドキュメントが少ないですし、実際に手を動かしてみないと理解しにくいものなので、これを使ってみようかな、という方に少しでもお役に立てれば幸いです。
まず、cfengine ってそもそも何?というところですが、上記の I, newbie さんのエントリがわかりやすいので省略。今回は cfengine の構成パターンについて整理してみます。
単一マシンで利用するパターン
単一のマシンで cfengine を実行します。実際にこのパターンで運用することはない(cfengine 使う意味がない)と思いますが、cfengine の動作を理解するためのはじめの一歩として、まずはこのパターンで実行してみると良いです。
cfagent は cfengine に含まれるコマンドラインツールなのですが、以下の様に実行することで、設定情報がなどが書かれた cfagent.conf の内容にしたがって、自身の設定を行います。
# cfagent -f cfagent.conf
クライアント主導パターン
cfengine サーバ(設定情報を一元管理するサーバ)と cfengine クライアント(cfengine による管理対象サーバ)の2種類によって構成されます。今度は新しく cfserved というものが出てきましたが、これも cfengine に含まれているプログラムでデーモンとして常駐し、cfengine クライアントに cfagent.conf や他のファイルなどを提供したり、他のホストから cfagent を起動するリクエストを受け付けたり(これについては後述)します。
動作の流れは次のようになります。
- cfengine クライアントは cfengine サーバから最新の cfagent.conf を取得する。(どのサーバから取得するか、どのファイルを取得するか、といった情報が update.conf に記述されている。)
- cfengine クライアントは取得した cfagent.conf の内容にしたがって、自身の設定を行う。
この様に、最新の cfagent.conf の取得と実行は、クライアントサイド主導で行われますので、このパターンを「クライアント主導パターン」としています。実際の運用では、cron で定期的に実行することになるかと思います。
サーバ主導パターン
このパターンもサーバ/クライアント構成になっていますが、クライアント主導パターンと違うのは、クライアント側でも cfservd が動いていることと、サーバ側で cfrun というコマンドを実行していることです。cfrun も cfengine に含まれるコマンドラインツールで、リモートの cfserved に対して、cfagent を実行するようリクエストを出します。
このパターンでの動作の流れは次のようになります。
- サーバ側で cfagent.conf の更新をトリガーに cfrun を実行して、クライアントの cfagent をキックする。
- キックされた cfagent が cfagent.conf を取得し、その内容にしたがって自身の設定を行う。
何百とサーバがある環境だと、クライアントがサーバにアクセスする負荷もバカにならないので、クライアント主導型の様に、何も変更がないのに cron で定期的に実行するのも無駄ですし、一気にアクセスがこないように cron のスケジューリングを調整するのも面倒ですよね。そういった場合にはこのパターンが適しているかと思います。
cfrun は1ホストに対して1回実行というわけではなく、cfrun.hosts というファイルに書かれたホスト全部に対してコマンド一発実行もできますし、一度に起動できるプロセス数もオプションで指定できるので、サーバに一気にアクセスが集中する、ということがないようにコントロールすることも容易です。
以上が cfengine の構成パターンとして代表的なものになります。
次回以降、実際の使い方、注意点、運用上のノウハウなど少しづつ書いていきたいと思います。(まぁ、まだ運用してないので、ノウハウなんかないですが。)
Apache での SSL クライアント証明書による認証
Apache 2.x で SSL クライアント証明書による認証を行うためのメモ。ssl.conf があるので、そいつに以下の様な設定を入れる。(コメントアウトされてるので、# を外して適当に書き換える。)
SSLCACertificatePath /usr/local/apache/conf/ca SSLCACertificateFile /usr/local/apache/conf/ca/cacert.pem
cacert.pem は このエントリ で生成された cacert.pem を適当な場所にコピーするなり、ダイレクトにパスを指定するなりする。
SSLVerifyClient require SSLVerifyDepth 10
これで Apache を再起動してやれば OK。cacert.pem を持つ CA から発行された証明書のみ、アクセスが許可されるようになる。
SSL クライアント証明書の発行
OpenSSL で クライアント証明書を発行する手順メモ。
openssl.cnf の修正
パスは環境によって違うでしょうが、うちの場合は /usr/local/ssl/openssl.cnf 。
# For normal client use this is typical # nsCertType = client, email
を以下の様に変えとく。
# For normal client use this is typical nsCertType = client, email
CA 用ファイルの作成
直接 openssl コマンド叩くよりも、OpenSSL 付属の CA.sh や CA.pl を使うほうが楽。どちらもやれることは一緒っぽいので、ここでは CA.pl の方を使ってみる。
$ mkdir cert $ cd cert $ /usr/local/ssl/misc/CA.pl -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key ...++++++ .............++++++ unable to write 'random state' writing new private key to './demoCA/private/cakey.pem' 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]:jp State or Province Name (full name) [Some-State]:kanagawa Locality Name (eg, city) []:sagamihara Organization Name (eg, company) [Internet Widgits Pty Ltd]:mizzy.org Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:CA of mizzy.org Email Address []: $ ls demoCA/
CA のキーや証明書やらシリアル番号管理用ファイルやら、諸々作ってくれます。
リクエスト生成
クライアント証明書用リクエスト作成。
$ /usr/local/ssl/misc/CA.pl -newreq Generating a 1024 bit RSA private key ...............................++++++ ......++++++ unable to write 'random state' writing new private key to 'newreq.pem' 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]:jp State or Province Name (full name) [Some-State]:kanagawa Locality Name (eg, city) []:sagamihara Organization Name (eg, company) [Internet Widgits Pty Ltd]:mizzy.org Organizational Unit Name (eg, section) []: Common Name (eg, YOUR name) []:Gosuke Miyashita Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: Request (and private key) is in newreq.pem
以下の様な キーと CSR を含んだ newreq.pem ができあがる。
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: DES-EDE3-CBC,C27EDC6FD0152E96 ki738nKH/tR2n2QWm9LmRrRJNGMOPpBwT+a3+HMeU/jGuXutW4qGdVA+OGTKES89 FB11qih4Utb1fEasofdubvuQssSM3yHaPYD20rLkSlepHuoT0PiBYf7yrIJxntd4 IwnFm4OepZ2wW9yzT6sicWLmPq/W+h7db0OCU/sls/5Je5awdY74/68VdurgKFpH Ev8qdo1Qr/azyIsCOCjEIHj1ZgDdJs2wNbg7iIyPkDscZYe0uL+E8B81SCx8UUWV iXRjJrrQZLgN0hFKQuYKb+RSQjv9gYQk47vgigAEQmBBpsrPB9nOb0+vuXCpY6o6 AqvTCgk7/UYjDuSPEDT3VS+JD8EG9B+wZNIMXrT4WerX4ajiF/ylOd280YhZf+dC Dcw1nM2lulgJ+HKGdCLHXAIT4uEdRYJSsqZ23hmSmWmwjODN0kuqEQxAfRZC6tmJ UPdTRZBdXX8q+dT6pndHFdOG+kTkkoD/VwVtYShnGiAch+dbSRNyNQxslQX3QJJk oj+Q90pB8+EQ09tJJjUGwV2R/9O5Cdxc6JJ1nkrkUaRqDU2G9SjL2XUiQzYShbvV TAJkECe/6yYYpAOR2S2s0bxJKEq7cIyBEAbKf7HaNB7n+Qh/d4QK4kgbA+qgTY6D /l328ja/gbweljfX1gdOsS3OG8HvtDrbK3VKabf5hJrmmEOEpMejiCso8exTVluW uC4O8lijiZXCMlluR9JLjw5TUZ2bje3YEDxhNKrxmu8s2mMHKiWtl48d7fvWfLQP UsdqFM/mbTCFGXPMsAZ5NpFd1aTASW+JzlI5ivi7SmMNblgCasuuMA== -----END RSA PRIVATE KEY----- -----BEGIN CERTIFICATE REQUEST----- MIIBpDCCAQ0CAQAwZDELMAkGA1UEBhMCanAxETAPBgNVBAgTCGthbmFnYXdhMRMw EQYDVQQHEwpzYWdhbWloYXJhMRIwEAYDVQQKEwltaXp6eS5vcmcxGTAXBgNVBAMT EEdvc3VrZSBNaXlhc2hpdGEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANp9 lhjHNQmMSH08ccj0C4+bKle4Prd0GglGMueKIUBCXGk5o6xS7o5U9JH9YfzVN4vC zdOLwzw9NNfeLALrymt8vyBTE9/RenxRcCRk4CMRvD6YMsrJ6+9b/z425FY/FU5q TAg0Gs30VgyjqBo81K7A9Zi63U2z5JkFtFOY2dyZAgMBAAGgADANBgkqhkiG9w0B AQQFAAOBgQBNo4ubHdThZOAQvB+jqRBG4pXQu4Go8sgzEY+hdOEvp+L7T3jxqh1W XXrA3FFBQtbzEnjXlias3g4jQcFtakdD1SIM7HoJbBQ9y4gsT/9q+ZyvyIkuCPnD SasVBdVklOC19BT6kw5V0sOv+Zt/4n4asrktjqSArFz6dF7ERXcjVg== -----END CERTIFICATE REQUEST-----
CA による署名
$ /usr/local/ssl/misc/CA.pl -sign
Using configuration from /usr/local/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Sep 8 17:57:48 2006 GMT
Not After : Sep 8 17:57:48 2007 GMT
Subject:
countryName = jp
stateOrProvinceName = kanagawa
localityName = sagamihara
organizationName = mizzy.org
commonName = Gosuke Miyashita
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client, S/MIME
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
EF:7F:AA:D8:9A:C2:83:BC:69:C0:55:C8:B6:11:3F:C1:DD:D2:A7:C9
X509v3 Authority Key Identifier:
keyid:27:4C:C9:4E:45:63:A8:62:1B:41:4D:14:2A:98:C9:EE:87:AE:1D:09
DirName:/C=jp/ST=kanagawa/L=sagamihara/O=mizzy.org/CN=CA of mizzy.org
serial:00
Certificate is to be certified until Sep 8 17:57:48 2007 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
以下の様な newcert.pem ができる。
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: md5WithRSAEncryption
Issuer: C=jp, ST=kanagawa, L=sagamihara, O=mizzy.org, CN=CA of mizzy.org
Validity
Not Before: Sep 8 17:57:48 2006 GMT
Not After : Sep 8 17:57:48 2007 GMT
Subject: C=jp, ST=kanagawa, L=sagamihara, O=mizzy.org, CN=Gosuke Miyashita
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:da:7d:96:18:c7:35:09:8c:48:7d:3c:71:c8:f4:
0b:8f:9b:2a:57:b8:3e:b7:74:1a:09:46:32:e7:8a:
21:40:42:5c:69:39:a3:ac:52:ee:8e:54:f4:91:fd:
61:fc:d5:37:8b:c2:cd:d3:8b:c3:3c:3d:34:d7:de:
2c:02:eb:ca:6b:7c:bf:20:53:13:df:d1:7a:7c:51:
70:24:64:e0:23:11:bc:3e:98:32:ca:c9:eb:ef:5b:
ff:3e:36:e4:56:3f:15:4e:6a:4c:08:34:1a:cd:f4:
56:0c:a3:a8:1a:3c:d4:ae:c0:f5:98:ba:dd:4d:b3:
e4:99:05:b4:53:98:d9:dc:99
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Client, S/MIME
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
EF:7F:AA:D8:9A:C2:83:BC:69:C0:55:C8:B6:11:3F:C1:DD:D2:A7:C9
X509v3 Authority Key Identifier:
keyid:27:4C:C9:4E:45:63:A8:62:1B:41:4D:14:2A:98:C9:EE:87:AE:1D:09
DirName:/C=jp/ST=kanagawa/L=sagamihara/O=mizzy.org/CN=CA of mizzy.org
serial:00
Signature Algorithm: md5WithRSAEncryption
96:0f:74:99:c1:b7:ce:62:08:df:d0:f8:f2:6b:ee:1e:90:43:
c7:8e:9c:4d:f2:de:2d:05:06:b9:25:49:d1:6e:d5:65:04:65:
71:52:44:1e:8f:87:9b:7b:e7:ed:d1:60:0a:6a:d1:fa:41:cc:
2a:82:b6:10:84:2a:7c:e3:8f:bf:32:a8:e0:01:d9:99:e6:ab:
dd:5e:a8:26:4d:85:cf:64:b7:62:de:74:5f:df:36:fe:ce:fd:
cd:b2:37:e1:a4:ce:6a:da:1e:3e:f7:89:24:cd:de:f3:9f:39:
5f:01:78:3c:30:ae:57:e1:94:07:fd:60:51:66:f8:9b:66:60:
1c:bb
-----BEGIN CERTIFICATE-----
MIIDPDCCAqWgAwIBAgIBATANBgkqhkiG9w0BAQQFADBjMQswCQYDVQQGEwJqcDER
MA8GA1UECBMIa2FuYWdhd2ExEzARBgNVBAcTCnNhZ2FtaWhhcmExEjAQBgNVBAoT
CW1penp5Lm9yZzEYMBYGA1UEAxMPQ0Egb2YgbWl6enkub3JnMB4XDTA2MDkwODE3
NTc0OFoXDTA3MDkwODE3NTc0OFowZDELMAkGA1UEBhMCanAxETAPBgNVBAgTCGth
bmFnYXdhMRMwEQYDVQQHEwpzYWdhbWloYXJhMRIwEAYDVQQKEwltaXp6eS5vcmcx
GTAXBgNVBAMTEEdvc3VrZSBNaXlhc2hpdGEwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
MIGJAoGBANp9lhjHNQmMSH08ccj0C4+bKle4Prd0GglGMueKIUBCXGk5o6xS7o5U
9JH9YfzVN4vCzdOLwzw9NNfeLALrymt8vyBTE9/RenxRcCRk4CMRvD6YMsrJ6+9b
/z425FY/FU5qTAg0Gs30VgyjqBo81K7A9Zi63U2z5JkFtFOY2dyZAgMBAAGjgf4w
gfswCQYDVR0TBAIwADARBglghkgBhvhCAQEEBAMCBaAwLAYJYIZIAYb4QgENBB8W
HU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTvf6rYmsKD
vGnAVci2ET/B3dKnyTCBjQYDVR0jBIGFMIGCgBQnTMlORWOoYhtBTRQqmMnuh64d
CaFnpGUwYzELMAkGA1UEBhMCanAxETAPBgNVBAgTCGthbmFnYXdhMRMwEQYDVQQH
EwpzYWdhbWloYXJhMRIwEAYDVQQKEwltaXp6eS5vcmcxGDAWBgNVBAMTD0NBIG9m
IG1penp5Lm9yZ4IBADANBgkqhkiG9w0BAQQFAAOBgQCWD3SZwbfOYgjf0Pjya+4e
kEPHjpxN8t4tBQa5JUnRbtVlBGVxUkQej4ebe+ft0WAKatH6QcwqgrYQhCp844+/
MqjgAdmZ5qvdXqgmTYXPZLdi3nRf3zb+zv3NsjfhpM5q2h4+94kkzd7znzlfAXg8
MK5X4ZQH/WBRZvibZmAcuw==
-----END CERTIFICATE-----
PEM から PKCS12 へ
PEM のままではブラウザにインポートできないので、PKCS12 へ変換。
$ openssl pkcs12 -export -in newcert.pem -inkey newreq.pem -certfile demoCA/cacert.pem -out newcert.p12 Enter pass phrase for newreq.pem: Enter Export Password: Verifying - Enter Export Password:
newcert.p12 をブラウザにインポート
手順は省略。Firefox だとこんな感じで入る。
Fedora Core 4 への Courier-IMAP の導入
訳あって Fedora Core 4 上でメールサーバを構築する必要があったので、Courier-IMAP を導入しました。mizzy.org のサーバでも使っていて慣れているし、今のところトラブルもないので安心して利用できるので。
RPM は嫌いなんですが、Fedora Core を使うのであれば、できる限り RPM で入れた方がいいよな、と思い RPM パッケージを探したのですが、Courier-IMAP のソース(ソース RPM ではない)から RPM パッケージを作成できることが判明。ただ、ソース付属の INSALL 読んだだけですんなりインストールできたわけではないので、ここに導入メモを残しておきます。
expect のインストール
expect に依存してるので、入ってなければインストール。
$ sudo yum install expect
libtool-ltdl-devel のインストール
Courier-IMAP は Courier-Authlib に依存してるのですが、Courier-Authlib の RPM パッケージ作成時に、libtool-ltdl-devel がないと、最後の最後に以下の様なエラーが出ます。
Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/courier-authlib-0.58-1.4-root error: Installed (but unpackaged) file(s) found: /usr/lib/libltdl.a /usr/lib/libltdl.la /usr/lib/libltdl.so /usr/lib/libltdl.so.3 /usr/lib/libltdl.so.3.1.0
なので、まずは yum で libtool-ltdl-devel をインストール。
$ sudo yum install libtool-ltdl-devel
Courier-Authlib のインストール
ここから Courier-Authlib のソースをダウンロード。展開はせずにそのまま
$ sudo rpmbuild -ta courier-authlib-0.58.tar.bz2
を実行。しばらくビルド作業が続き、以下の様に複数の RPM パッケージを生成して完了。
Wrote: /usr/src/redhat/SRPMS/courier-authlib-0.58-1.4.src.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-devel-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-userdb-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-ldap-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-mysql-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-pgsql-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-pipe-0.58-1.4.i386.rpm Wrote: /usr/src/redhat/RPMS/i386/courier-authlib-debuginfo-0.58-1.4.i386.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.17424 + umask 022 + cd /usr/src/redhat/BUILD + cd courier-authlib-0.58 + rm -rf /var/tmp/courier-authlib-0.58-1.4-root + exit 0
このうち courier-authlib と courier-authlib-devel は必須なのでインストールしておきます。
$ rpm -Uvh /usr/src/redhat/RPMS/i386/courier-authlib-0.58-1.4.i386.rpm $ rpm -Uvh /usr/src/redhat/RPMS/i386/courier-authlib-devel-0.58-1.4.i386.rpm
後は必要なものを適宜インストール。
gamin-devel のインストール
Courier-IMAP の RPM パッケージを作成しようとすると、
error: Failed build dependencies:
/usr/include/fam.h is needed by courier-imap-4.1.1-1.4.i386
と怒られるので、このファイルが含まれる gamin-devel をインストールします。
$ sudo yum install gamin-devel
Courier-IMAP のインストール
ソースから Perl を入れている場合には、生成された RPM パッケージをインストールしようとすると、
error: Failed dependencies:
/usr/local/bin/perl is needed by courier-imap-4.1.1-1.4.i386
と怒られるので、PATH から /usr/local を外しておきます。
$ export PATH=/bin:/usr/bin
で、いよいよ Courier-IMAP の RPM パッケージの作成ですが、
$ sudo rpmbuild -ta courier-imap-4.1.1.tar.bz2
と実行すると、
configure: WARNING: === Do not compile Courier-IMAP as root. Compile configure: WARNING: === Courier-IMAP as a non-root user then su to configure: WARNING: === root before running make install. You must now configure: WARNING: === remove this entire directory and then extract the configure: WARNING: === source code from the tarball as a non-root user configure: WARNING: === and rerun the configure script. If you have read configure: WARNING: === the INSTALL file you should have known this. So configure: WARNING: === you better read INSTALL again. configure: error: aborted. error: Bad exit status from /var/tmp/rpm-tmp.46388 (%prep)
と怒られるので sudo を外すと、
$ rpmbuild -ta courier-imap-4.1.1.tar.bz2 error: Failed to rename /usr/src/redhat/SPECS/rpm-spec.oF7pub to /usr/src/redhat/SPECS/rpm-spec.oF7pub: Permission denied: No such file or directory
と怒られる。
http://www.courier-mta.org/?FAQ.html~rpm に対処方法が書いてあるので、これにしたがって non-root ユーザで以下の様に実行。
$ mkdir $HOME/rpm $ mkdir $HOME/rpm/SOURCES $ mkdir $HOME/rpm/SPECS $ mkdir $HOME/rpm/BUILD $ mkdir $HOME/rpm/SRPMS $ mkdir $HOME/rpm/RPMS $ mkdir $HOME/rpm/RPMS/i386 echo "%_topdir $HOME/rpm" >> $HOME/.rpmmacros rpmbuild -ta courier-imap-4.1.1.tar.bz2
RPM パッケージが生成されるので、インストール。
$ sudo rpm -Uvh /home/miya/rpm/RPMS/i386/courier-imap-4.1.1-1.4.i386.rpm
ここまでやって、よし、設定して起動するか、と思ったところで、Dovecot が既にインストールされていて起動していることに気づいた…せっかく Courier 入れたけど、Dovecot 使ったことないので、いい機会なのでこっちを使うことにした。
lighttpd の認証を LDAP で
おうち trac が認証を一切せずに、誰でも wiki の書き換えができたり、ticket の発行ができたり、という状態だったので、それはまずかろうってことで認証かけることにした。
「trac を lighttpd + FastCGI で動かす」 で触れたとおり、trac は lighttpd 上で動いているので、認証は lighttpd で設定します。やりかたは lighttpd のサイトにある 「Using Authentication Module: mod_auth」 の通りなので、あまり難しいことはないのですが、とりあえずやったことをメモ。
うちの Linux サーバ上で動いているサービスは、ほとんどが LDAP で認証しているので、lighttpd も LDAP で認証するようにします。
まず、lighty のデフォルト configure オプションでは、auth_ldap が disable になってるので、以下の様にして再インストール。
$ ./configure --with-ldap $ make $ sudo make install
でもって、/usr/local/etc/lighttpd.conf を書き換え。関連する部分だけ抜き出すとこんな感じ。
server.modules = (
"mod_auth",
"mod_fastcgi",
)
auth.backend = "ldap"
auth.backend.ldap.hostname = "kenny"
auth.backend.ldap.base-dn = "ou=people,o=southpark"
auth.backend.ldap.filter = "(uid=$)"
auth.require = ( "/public/login" =>
(
"method" => "basic",
"realm" => "trac admin area",
"require" => "user=xxx"
)
)
これで lighty を再起動すれば OK。あとは「Trac Permissions」 を参照しながら trac-admin コマンドでパーミッション設定。Web Admin Plugin を導入している場合は trac-admin 使わずにウェブから設定。
マルチプロセッサ/マルチスレッド メモリアロケータ Hoard
Hoard というメモリアロケータを、弊社サーバエンジニアの方から教えてもらいました。
使い方は簡単で、
export LD_PRELOAD="/path/libhoard.so:/lib/libdl.so"
などとしておくと、アプリケーション実行時に Hoard のライブラリを読み込み、malloc/free を Hoard のものに置き換えます。これにより、マルチプロセッサ/マルチスレッド環境でパフォーマンスを発揮する Hoard のメモリアロケーションアルゴリズムが、アプリに一切手を加えることなく利用できる、というわけです。
もちろん仕組み上、FAQ にあるように、スタティックリンクされたアプリや、malloc/free を使わずに独自のメモリアロケータを使っているアプリでは利用することはできませんが、ほとんどのアプリには利用できるんじゃないでしょうか。
trac を lighttpd + FastCGI で動かす
このエントリ の様な経緯で、うちでは apache + tracd という構成で trac を動かしてるのですが、tracd がしょっちゅう落ちるんですよね。1日に2, 3回ぐらいは落ちる感じ。で、5分ごとに cron で tracd プロセスを監視して、落ちてたら再起動ってなことをやってるんですが、typester さん から「うちは lighttpd + FastCGI でやってるよ」というアドバイスを頂いたので、試してみました。
やったことは以下の通り。
- FastCGI のインストール
- lighttpd のインストール
- lighttpd.conf を書く
- lighttpd の起動
1, 2 については省略。ディストリビューションによって違うでしょうし、うちは Slackware だからあんまり参考にならないだろうし。3 については以下の様な内容の /usr/local/etc/lighttpd.conf を作成した。
server.modules = (
"mod_fastcgi",
)
server.document-root = "/home/miya/html"
server.errorlog = "/var/log/lighttpd.error.log"
mimetype.assign = (
".png" => "image/png",
)
static-file.exclude-extensions = ( ".fcgi" )
server.port = 81
server.bind = "localhost"
server.username = "svn"
server.groupname = "svn"
fastcgi.server = ("/public" =>
("public" =>
("socket" => "/tmp/trac-fastcgi.sock",
"bin-path" => "/usr/local/share/trac/cgi-bin/trac.fcgi",
"check-local" => "disable",
"bin-environment" =>
("TRAC_ENV" => "/home/miya/trac/public")
)
)
たったこれだけの設定でちゃんと動きました。起動は以下のコマンドで。
$ sudo /usr/local/sbin/lighttpd -f /usr/local/etc/lighttpd.conf
あとは apache の設定を変更してやれば OK。こんな感じで 動いてます。
mod_rpaf よりも mod_extract_forwarded
リバースプロキシな環境では mod_rpaf 使ったりすることが多いと思いますが、バックエンドの apache でアクセス制限かける場合には、mod_extract_forwarded を使ったほうが良いよ、というお話。
バックエンドの apache 2.0 + mod_rpaf な環境で .htaccess によるアクセス制限をかけようとしても、接続元の IP アドレスではなく、pound の IP アドレスで制限がかかってしまう、という現象に悩まされました。で、ソースを眺めてみると mod_rpaf は ap_hook_post_read_request で実行されているのに対し、mod_access は ap_hook_access_checker で実行されています。おそらく、ap_hook_post_read_request よりも ap_hook_access_checker が先に実行されてしまい、mod_rpaf によるアドレス書き換え前にアクセス制限が実行されてしまう、ということなのでしょう、たぶん。(「モジュールの Apache 1.3 から Apache 2.0 への移植」 にモジュールのフックステージ一覧があるのですが、実行される順番は不明。apache のソース軽く眺めても、いくつかのファイルに分散しててよくわからんかった。)
で、mod_rpaf のソース書き換えて、フックする場所変えればいいんじゃね、と思いつつ試してみるも、思った通りの動作をせずに悩んでいたところ、弊社のサーバエンジニアの方が、mod_extract_forwarded を見つけてきてくれました。
これを試してみたところ、ちゃんと pound ではなく接続元の IP アドレスで制限がかかってくれました。
mod_extract_forwarded のソースを眺めてみると、ap_hook_post_read_request, ap_hook_translate_name, ap_hook_access_checker の3つのフックステージで何やらごにょごにょやっている様子。特に、mod_access の場合は、
ap_hook_access_checker(check_dir_access,NULL,NULL,APR_HOOK_MIDDLE);
と同じ ap_hook_access_checker の APR_HOOK_MIDDLE で実行されてるのに対し、mod_extract_forwarded では
ap_hook_access_checker(mef_access_check, NULL, NULL, APR_HOOK_FIRST);
といった感じで APR_HOOK_FIRST で実行されてたりするので、この辺がポイントなのかな、とあまりソース読めないなりに理解しました。
ためしたのは .htaccess だけですが、おそらく httpd.conf でアクセス制限かける場合でも同じなのではないかと。
また、 apache 2.2 では mod_access ではなく mod_authz_host ですが、フックしているところは mod_access と全く同じなので、たぶん 2.2 でも同じことでしょう。 2.2 ではそのままでは動かないそうです。 その他にも色々注意点があり大変参考になります。id:dayflower さん、ありがとうございます。
svk のインストールではまる
正確には svk ではなく、subversion の perl binding のインストールではまったのでメモ。svk をインストールしようとすると、「SVN::Core がねーよ、subversion の perl binding をちゃんと入れとけ」みたいなことを言われたので、subversion のソースディレクトリで make swig-pl; make check-swig-pl したところで、以下の様なエラーが大量に出る。
../../../../../subversion/bindings/swig/perl/native/t/4pool......Can't load '/home/miya/src/subversion-1.1.4/subversion/bindings/swig/perl/native/blib/arch/auto/SVN/_Core/_Core.so' for module SVN::_Core: /home/miya/src/subversion-1.1.4/subversion/bindings/swig/perl/native/blib/arch/auto/SVN/_Core/_Core.so: undefined symbol: svn_swig_pl_thunk_config_enumerator at /usr/local/lib/perl5/5.8.7/i686-linux/DynaLoader.pm line 230.
「undefined symbol: svn_swig_pl_thunk_config_enumerator」と出てるので、こいつが含まれるライブラリがリンクされてないんだろうな、と思いまずはライブラリ探し。これは libsvn_swig_perl-1.so であることを発見。で、ldd _Core.so を実行してみると、案の定このライブラリがリンクされてない。
というわけで、subversion/bindings/swig/perl/native/Makefile の LOADLIBS の行の最後に、-lsvn_swig_perl-1 を追加して make swig-pl; make check-swig-pl すると今度はエラーもなくチェック完了。このまま make install で無事インストールができた。
追記
あとで最初からやりなおしてみたら、最初から Makefile に -lsvn_swig_perl-1 があった。なんだったんだろう?
apache2 って最初から LDAP 認証用モジュールが含まれてるのね
subversion を WebDAV と合わせて使おうと思い、apache2 をインストールして、認証は LDAP でやりたいので、apache1 と同じ感覚で modules.apache.org で見つけた mod_auth_ldap とか modXLdapAuth とかを入れてみようと思っても、make が通らない。
で、いくら頑張っても make が通らないので諦めかけていたところ、なんとなく apache2 のソースディレクトリ以下を find してみたら、mod_authnz_ldap.c とかいうものを発見。ドキュメントを読んでみたらまさにこれが LDAP 認証のためのモジュールでした。これで2時間無駄にした…