cfengine メモ #0 - cfengine の構成パターン

Posted by Gosuke Miyashita Tue, 26 Dec 2006 13:55:53 GMT

I, newbie » cfengineによるシステム管理の自動化: その1 を読んで、cfengine よさげだなぁ、ってことで導入を検討することに。

このブログでは、上記エントリで「ややこしいけど魅力的」と書かれている cfengine について、自分なりに試したことや整理したことについてメモしていこうと思います。日本語のドキュメントが少ないですし、実際に手を動かしてみないと理解しにくいものなので、これを使ってみようかな、という方に少しでもお役に立てれば幸いです。

まず、cfengine ってそもそも何?というところですが、上記の I, newbie さんのエントリがわかりやすいので省略。今回は cfengine の構成パターンについて整理してみます。

単一マシンで利用するパターン

http://mizzy.org/img/linux/cfengine00.jpg

単一のマシンで cfengine を実行します。実際にこのパターンで運用することはない(cfengine 使う意味がない)と思いますが、cfengine の動作を理解するためのはじめの一歩として、まずはこのパターンで実行してみると良いです。

cfagent は cfengine に含まれるコマンドラインツールなのですが、以下の様に実行することで、設定情報がなどが書かれた cfagent.conf の内容にしたがって、自身の設定を行います。

# cfagent -f cfagent.conf

クライアント主導パターン

http://mizzy.org/img/linux/cfengine01.jpg

cfengine サーバ(設定情報を一元管理するサーバ)と cfengine クライアント(cfengine による管理対象サーバ)の2種類によって構成されます。今度は新しく cfserved というものが出てきましたが、これも cfengine に含まれているプログラムでデーモンとして常駐し、cfengine クライアントに cfagent.conf や他のファイルなどを提供したり、他のホストから cfagent を起動するリクエストを受け付けたり(これについては後述)します。

動作の流れは次のようになります。

  1. cfengine クライアントは cfengine サーバから最新の cfagent.conf を取得する。(どのサーバから取得するか、どのファイルを取得するか、といった情報が update.conf に記述されている。)
  2. cfengine クライアントは取得した cfagent.conf の内容にしたがって、自身の設定を行う。

この様に、最新の cfagent.conf の取得と実行は、クライアントサイド主導で行われますので、このパターンを「クライアント主導パターン」としています。実際の運用では、cron で定期的に実行することになるかと思います。

サーバ主導パターン

http://mizzy.org/img/linux/cfengine02.jpg

このパターンもサーバ/クライアント構成になっていますが、クライアント主導パターンと違うのは、クライアント側でも cfservd が動いていることと、サーバ側で cfrun というコマンドを実行していることです。cfrun も cfengine に含まれるコマンドラインツールで、リモートの cfserved に対して、cfagent を実行するようリクエストを出します。

このパターンでの動作の流れは次のようになります。

  1. サーバ側で cfagent.conf の更新をトリガーに cfrun を実行して、クライアントの cfagent をキックする。
  2. キックされた cfagent が cfagent.conf を取得し、その内容にしたがって自身の設定を行う。

何百とサーバがある環境だと、クライアントがサーバにアクセスする負荷もバカにならないので、クライアント主導型の様に、何も変更がないのに cron で定期的に実行するのも無駄ですし、一気にアクセスがこないように cron のスケジューリングを調整するのも面倒ですよね。そういった場合にはこのパターンが適しているかと思います。

cfrun は1ホストに対して1回実行というわけではなく、cfrun.hosts というファイルに書かれたホスト全部に対してコマンド一発実行もできますし、一度に起動できるプロセス数もオプションで指定できるので、サーバに一気にアクセスが集中する、ということがないようにコントロールすることも容易です。

以上が cfengine の構成パターンとして代表的なものになります。

次回以降、実際の使い方、注意点、運用上のノウハウなど少しづつ書いていきたいと思います。(まぁ、まだ運用してないので、ノウハウなんかないですが。)

Apache での SSL クライアント証明書による認証

Posted by Gosuke Miyashita Fri, 08 Sep 2006 18:47:17 GMT

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 クライアント証明書の発行

Posted by Gosuke Miyashita Fri, 08 Sep 2006 18:18:41 GMT

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 だとこんな感じで入る。

http://mizzy.org/img/client_certificate.jpg

Fedora Core 4 への Courier-IMAP の導入

Posted by Gosuke Miyashita Sat, 22 Jul 2006 10:45:38 GMT

訳あって 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 で

Posted by Gosuke Miyashita Sun, 21 May 2006 06:17:01 GMT

おうち 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

Posted by Gosuke Miyashita Thu, 18 May 2006 14:43:09 GMT

Hoard というメモリアロケータを、弊社サーバエンジニアの方から教えてもらいました。

使い方は簡単で、

export LD_PRELOAD="/path/libhoard.so:/lib/libdl.so"

などとしておくと、アプリケーション実行時に Hoard のライブラリを読み込み、malloc/free を Hoard のものに置き換えます。これにより、マルチプロセッサ/マルチスレッド環境でパフォーマンスを発揮する Hoard のメモリアロケーションアルゴリズムが、アプリに一切手を加えることなく利用できる、というわけです。

もちろん仕組み上、FAQ にあるように、スタティックリンクされたアプリや、malloc/free を使わずに独自のメモリアロケータを使っているアプリでは利用することはできませんが、ほとんどのアプリには利用できるんじゃないでしょうか。

trac を lighttpd + FastCGI で動かす

Posted by Gosuke Miyashita Wed, 17 May 2006 14:40:45 GMT

このエントリ の様な経緯で、うちでは apache + tracd という構成で trac を動かしてるのですが、tracd がしょっちゅう落ちるんですよね。1日に2, 3回ぐらいは落ちる感じ。で、5分ごとに cron で tracd プロセスを監視して、落ちてたら再起動ってなことをやってるんですが、typester さん から「うちは lighttpd + FastCGI でやってるよ」というアドバイスを頂いたので、試してみました。

やったことは以下の通り。

  1. FastCGI のインストール
  2. lighttpd のインストール
  3. lighttpd.conf を書く
  4. 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

Posted by Gosuke Miyashita Wed, 17 May 2006 00:54:26 GMT

リバースプロキシな環境では 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 のインストールではまる

Posted by Gosuke Miyashita Sat, 04 Mar 2006 14:53:22 GMT

正確には 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 認証用モジュールが含まれてるのね

Posted by Gosuke Miyashita Sat, 04 Mar 2006 09:14:05 GMT

subversion を WebDAV と合わせて使おうと思い、apache2 をインストールして、認証は LDAP でやりたいので、apache1 と同じ感覚で modules.apache.org で見つけた mod_auth_ldap とか modXLdapAuth とかを入れてみようと思っても、make が通らない。

で、いくら頑張っても make が通らないので諦めかけていたところ、なんとなく apache2 のソースディレクトリ以下を find してみたら、mod_authnz_ldap.c とかいうものを発見。ドキュメントを読んでみたらまさにこれが LDAP 認証のためのモジュールでした。これで2時間無駄にした…

Older posts: 1 2 3 4