はじめての DNS サーバ
会社や自宅内等の LAN でテストや検証をする場合に,IP アドレスでサーバへアクセスするよりも FQDN で指定でアクセスした方が便利な場合がよくあります.
必須ではないですが,例えば LDAP や証明書をあつかう場合等です.
また,オープンソースの Web アプリの場合でも IP アドレスではなくて FQDN を使用した例でチュートリアルが作成されている場合をよく見かけるので,とりあえず試したい場合でも,DNS サーバをあらかじめ立てておくと便利だと思います.
そこで,自宅内部のでのみ使用する DNS サーバを立ててみました.
環境
OS: CentOS 6.0
構成
- DNS サーバに設定した FQDN の場合は問い合わせに対して,すぐに応答を返す.(権威 DNS サーバ)
- DNS サーバに設定していない FQDN の問い合わせの場合は,DNS サーバを立てる前と同様に外へ問い合わせる.(キャッシュ DNS サーバ)
構成図(DNS サーバ導入後)
インストール
下記の 2 つをインストールします.
- bind
- bind-chroot
# yum install bind bind-chroot
/etc/named.conf の編集
# ACL を定義 acl localnet { 192.168.0.0/24; 127.0.0.1; }; # 共通設定 options { # listen-on port 53 { 127.0.0.1; }; # listen-on-v6 port 53 { ::1; }; version "unknown"; # bind 設定用ディレクトリの指定 directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; # 許可する問い合わせ元の IP Address または ACL 指定 allow-query { localnet; }; # ACL で指定したネットワークからの問い合わせ時にキャッシュがあれば応答する allow-query-cache { localnet; }; # zone 転送 allow-transfer { none; }; # 再帰検索の受付可否 recursion yes; # 内部ドメイン以外の名前解決先 # ISP の DNS を指定してあるルータや ISP の DNS の IP Address の指定 # これがないと直接、ルート DNS へ問い合わせに行ってしまう forwarders { 192.168.0.1; }; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; view "internal" { # 問い合わせ元の IP アドレス またはネットワーク(下記では ACL のネットワークを指定) match-clients { localnet; }; # 正引きゾーンの設定 zone "hexa.diary" IN { type master; file "db.hexa.diary"; }; # 逆引きゾーンの設定 zone "0.168.192.in-addr.arpa" IN { type master; file "db.192.168.0"; }; # 逆引きゾーンの設定 zone "0.0.127.in-addr.arpa" IN { type master; file "db.127.0.0"; }; # ルートゾーンの設定 zone "." IN { type hint; file "named.ca"; }; };
zone ファイル
/etc/named.conf で指定したファイルを /var/named/chroot/var/named/ 以下に作成します.
- db.hexa.diary
; TTL の指定 $TTL 1h @ IN SOA ns1.hexa.diary. hexa.diary.gmail.com. ( 1 ; シリアル番号 3h ; リフレッシュ時間 1h ; リトライ時間 1w ; 期限 1h ) ; ネガティブキャッシュの TTL ; ネームサーバ IN NS ns1.hexa.diary. ; アドレスとの対応の指定 localhost.hexa.diary. IN A 127.0.0.1 ns1.hexa.diary. IN A 192.168.0.5 ns2.hexa.diary. IN A 192.168.0.4 test.hexa.diary. IN A 192.168.0.3 ; 別名から正規名の対応 name1.hexa.diary. IN CNAME ns1.hexa.diary. a.hexa.diary. IN CNAME test.hexa.diary.
- db.192.168.0
$TTL 3h 0.168.192.in-addr.arpa. IN SOA ns1.hexa.diary. hexa.diary.gmail.com ( 1 3h 1h 1w 1h ) 0.168.192.in-addr.arpa. IN NS ns1.hexa.diary. 5 IN PTR ns1.hexa.diary. 4 IN PTR ns2.hexa.diary. 3 IN PTR test.hexa.diary.
- db.127.0.0
$TTL 3h 0.0.127.in-addr.arpa. IN SOA ns1.hexa.diary. hexa.diary.gmail.com. ( 1 3h 1h 1w 1h ) 0.0.127.in-addr.arpa. IN NS ns1.hexa.diary. 1.0.0.127.in-addr.arpa. IN PTR localhost.
/etc/resolv.conf の編集
/etc/resolv.conf を編集して,今構築している DNS サーバに問い合わせるように IP アドレスを変更します.
nameserver 192.168.0.5
確認
dig を使って確認してみます.
正引き
$ dig ns1.hexa.diary ns2.hexa.diary a IN ; <<>> DiG 9.6-ESV-R4-P3 <<>> ns1.hexa.diary ns2.hexa.diary a IN ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49924 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;ns1.hexa.diary. IN A ;; ANSWER SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; Query time: 11 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Thu Mar 1 01:20:23 2012 ;; MSG SIZE rcvd: 62 ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39468 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;ns2.hexa.diary. IN A ;; ANSWER SECTION: ns2.hexa.diary. 3600 IN A 192.168.0.4 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; ADDITIONAL SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; Query time: 0 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Thu Mar 1 01:20:23 2012 ;; MSG SIZE rcvd: 82
逆引き
$ dig -x 192.168.0.4 ; <<>> DiG 9.6-ESV-R4-P3 <<>> -x 192.168.0.4 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14957 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;4.0.168.192.in-addr.arpa. IN PTR ;; ANSWER SECTION: 4.0.168.192.in-addr.arpa. 10800 IN PTR ns2.hexa.diary. ;; AUTHORITY SECTION: 0.168.192.in-addr.arpa. 10800 IN NS ns1.hexa.diary. ;; ADDITIONAL SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; Query time: 13 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Thu Mar 1 01:24:49 2012 ;; MSG SIZE rcvd: 106
CNAME
$ dig ns1.hexa.diary name1.hexa.diary a IN ; <<>> DiG 9.6-ESV-R4-P3 <<>> ns1.hexa.diary name1.hexa.diary a IN ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45116 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;ns1.hexa.diary. IN A ;; ANSWER SECTION: ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; Query time: 11 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Sun Mar 4 03:02:57 2012 ;; MSG SIZE rcvd: 62 ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27833 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;name1.hexa.diary. IN A ;; ANSWER SECTION: name1.hexa.diary. 3600 IN CNAME ns1.hexa.diary. ns1.hexa.diary. 3600 IN A 192.168.0.5 ;; AUTHORITY SECTION: hexa.diary. 3600 IN NS ns1.hexa.diary. ;; Query time: 0 msec ;; SERVER: 192.168.0.5#53(192.168.0.5) ;; WHEN: Sun Mar 4 03:02:57 2012 ;; MSG SIZE rcvd: 82
設定できているようです.
スクリプトによるアラートの通知
Zabbix は,障害が起きた場合などに,メールや Jabber, SMS で通知することが可能です.
また,自分で作成したスクリプトを実行させて,他の通知方法を利用することも可能です.
個人的には,(見逃しても問題がないことが多いため)Growl で通知されると嬉しいので,試しに設定してみました.
手順
/etc/zabbix/alertscripts/ 以下にメッセージを送信するスクリプトを設置しておきます.
スクリプトには zabbix が実行できる権限を設定しておきます.
メディアタイプの作成
- [管理] - [メディアタイプ] で [メディアタイプの作成] をクリック
- [説明] を適当に入力
- [タイプ] に [スクリプト] を選択
- [スクリプト名] を入力
- /etc/zabbix/alertscripts/ 以下に配置したスクリプトのファイル名を入力します
- [保存] をクリック
ユーザへメディアタイプを設定
- [管理] - [ユーザ] からメディアタイプを設定する [メンバー] のリンクをクリック
- [メディア] の [追加] をクリックして,[新規メディア] を追加
- [タイプ] に メディアタイプの作成 で入力した [説明] を選択
- 送信先を適当に入力
- [追加] をクリック
- [保存] をクリック
アクションの設定
- [設定] - [アクション] で [アクションの作成] をクリック
- [名前] を適当に入力
- アクションのコンディション
- [アクションのオペレーション] の [新規] をクリック
- [オペレーションのタイプ] は [メッセージの送信] を選択
- [メッセージの送信先] は [シングルユーザ] と,ユーザへメディアタイプを設定 で設定した [メンバー] を選択
- [次のメディアのみ使用] は [- 全て -] を選択
- [追加] をクリック
- [保存] をクリック
監視対象のサーバで ifdown させたりして,障害を意図的に発生させて確認します.
スクリーンを使用してグラフを複数枚表示させる
前回の [zabbix] グラフの設定 - Hexa's diary でふれなかった, 複数のグラフを 1 ページに表示させる方法 です.
手順
あらかじめ,前回と同様の手順で,複数の グラフ を作成しておきます.
スクリーンの作成
- [設定] - [スクリーン] で [スクリーンの作成] をクリック
- [名前] を適当に入力
- [列] と [行] を入力
- [列] は横に並べるグラフの枚数 (今回は 2 を指定)
- [行] は縦に並べるグラフの枚数 (今回は 1 を指定)
- グラフ以外も並べることが可能です
- [保存] をクリック
スクリーンの設定
- [設定] - [スクリーン] で上記で作成したスクリーンの 名前 のリンクをクリック
- スクリーンの作成 の直後であれば,既に [設定] - [スクリーン] のページ遷移しているはずです
- [変更] のリンクが 2 つあるので,左の [変更] をクリック
- [リソース] に [グラフ] を選択
- [グラフ名] に作成済みのグラフを選択
- 他は適当に設定
- [保存をクリック]
- 左側にグラフが表示されます
- もう一つの方の [変更] のリンクをクリックして,上記と同様の手順でグラフを設定
- 上記とは別のグラフを設定します
これで 2 枚のグラフが横並びに表示されます.
設定したスクリーンのグラフは,[監視データ] - [スクリーン] で確認できます.
グラフの設定
zabbix-server を用いると,[監視データ] - [最新データ] から,設定したアイテムのグラフを確認することが可能です.
しかし,ここで表示されるグラフは 1 アイテムにつき 1 つのグラフだけです.
例えば,比較したい項目が複数ある場合などには,同一のグラフ上に 2 つのデータをプロットしたり,複数のグラフを 1 ページに表示させて観察する方が便利です.
今回は,前者の同一のグラフ上に 2 つのデータをプロットする方法を書きます.
下記の 2 つのアイテムのグラフ表示の設定をおこないます.
- 「Incoming traffic on interface eth0」
- 「Incoming traffic on interface lo」
手順
- [設定] - [ホスト] で設定したいホストの [グラフ] のリンクをクリック
- [グラフの作成] をクリック
- [名前] を適当に入力
- [アイテム] をクリックして,グラフに追加するアイテムを設定
- [パラメータ] でアイテムを指定
- 他は適当に設定
- [追加] をクリック
- 同じグラフ上にプロットさせたい [アイテム] をクリックして,上記と同様の手順でグラフに追加するアイテムを設定
- 重なると見えにくいので [色] は変更しましょう
- [保存] をクリック
グラフの表示
[監視データ] - [グラフ] で上記の手順で設定したグラフが表示されます.
- Incoming traffic on interface eth0: 緑
- Incoming traffic on interface lo: 青
証明書を格納してみる
LDAP サーバには証明書を格納できます.
格納の方法(LDIF ファイルの書き方)が少し特殊なので書いておきます.
core.shema
core.schema を眺めてみると,それらしい属性がいくつか見つかります.
- userCertificate
- cACertificate
- authorityRevocationList
- certificateRevocationList
- crossCertificatePair
偶然,クライアント証明書が手元にあったので,この証明書を userCertificate に指定してみます.
格納するクライアント証明書
今回使用するクライアント証明書です.
-----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgIFAJ+xmTcwDQYJKoZIhvcNAQEFBQAwGTEXMBUGA1UEAwwO Y2EuZXhhbXBsZS5jb20wHhcNMTIwMTMwMTUwMDAwWhcNMTMwMTMwMTUwMDAwWjAh MR8wHQYDVQQDDBZoZXhhLmRpYXJ5QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEAqeo9n9jvwvZqdQiek7MwOg3YO2Ft28/vjTDD4UvD JeGD2oOVg3C5Pg9EqHtC+HebxpYabJNRIcx3gcH/Ykooy/xaVvK2aQq+zwcZuvgU RYRtdpmGx6otbA+LShVK0rolRYkH4MWEpN7SUrxNGUR41kYX+jbDUpp97Yp38z6h o6thal+4hm0GvIc3a9NMBYog2aFpNuCDJCeQaLcqNRYOI9v7IXxbNolM5tmCMNTs zIFwz8d1UZQREouSG6536joBrug/CbBhH/TthpWpVy6UrUk8MC6G/XbwMhIlafY/ uJ6Y8qkplugJiKLiaBp0NcdM2Mc+igGmDkr4b8VWlws3dwIDAQAfo4GlMIGiMAwG A1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUW+hePyMFM8Hpn/SIi93Fs4NfPikwHQYD VR0OBBYEFMdf5OBoGg9TxSrnfvObmjg3k8txMB0GA1UdJQQWMBQGCCsGAQUFBwMB BggrBgEFBQcDAjAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8vZXhhbXBsZS5jb20v Y3JsL2V4YW1wbGUuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAyWCvNP/k1UYuoZ49d JwlURKm6g59+6bqeUdv7EkaSgjTol0mvY7UwwHzztZsnapmGin36bWURaNZs+xrZ 7Xn/OWHB3grmKxF/eXowlmtF0EzS0Xg5n6s48n0deMkPIy8GUxD/KpQqUV+GYt5V XdSEKdH0ovLkzoiqtISN7C49VRRm6F9MIFoFnJQMQUU3XCN0djrEuNiPZ/op4zJ1 1/Ft5UdYDB7TIWXI1+sJy1yrRWg31dRj0ThiNxBTL9zR9rHCCMLDJAZODLl6jRhg lSyVF995MJRNui7qlJksHpDOM85H67SthInq18Jc67lyrKyJPAXuQON20ftq86Y7 ygvo -----END CERTIFICATE-----
テキストだとこんな感じです.
Certificate: Data: Version: 3 (0x2) Serial Number: 2679216439 (0x9fb19937) Signature Algorithm: sha1WithRSAEncryption Issuer: CN=ca.example.com Validity Not Before: Jan 30 15:00:00 2012 GMT Not After : Jan 30 15:00:00 2013 GMT Subject: CN=hexa.diary@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:a9:ea:3d:9f:d8:ef:c2:f6:6a:75:08:9e:93:b3: 30:3a:0d:d8:3b:61:6d:db:cf:ef:8d:30:c3:e1:4b: c3:25:e1:83:da:83:95:83:70:b9:3e:0f:44:a8:7b: 42:f8:77:9b:c6:96:1a:6c:93:51:21:cc:77:81:c1: ff:62:4a:28:cb:fc:5a:56:f2:b6:69:0a:be:cf:07: 19:ba:f8:14:45:84:6d:76:99:86:c7:aa:2d:6c:0f: 8b:4a:15:4a:d2:ba:25:45:89:07:e0:c5:84:a4:de: d2:52:bc:4d:19:44:78:d6:46:17:fa:36:c3:52:9a: 7d:ed:8a:77:f3:3e:a1:a3:ab:61:6a:5f:b8:86:6d: 06:bc:87:37:6b:d3:4c:05:8a:20:d9:a1:69:36:e0: 83:24:27:90:68:b7:2a:35:16:0e:23:db:fb:21:7c: 5b:36:89:4c:e6:d9:82:30:d4:ec:cc:81:70:cf:c7: 75:51:94:11:12:8b:92:1b:ae:77:ea:3a:01:ae:e8: 3f:09:b0:61:1f:f4:ed:86:95:a9:57:2e:94:ad:49: 3c:30:2e:86:fd:76:f0:32:12:25:69:f6:3f:b8:9e: 98:f2:a9:29:96:e8:09:88:a2:e2:68:1a:74:35:c7: 4c:d8:c7:3e:8a:01:a6:0e:4a:f8:6f:c5:56:97:0b: 37:77 Exponent: 65567 (0x1001f) X509v3 extensions: X509v3 Basic Constraints: critical CA:FALSE X509v3 Authority Key Identifier: keyid:5B:E8:5E:3F:23:05:33:C1:E9:9F:F4:88:8B:DD:C5:B3:83:5F:3E:29 X509v3 Subject Key Identifier: C7:5F:E4:E0:68:1A:0F:53:C5:2A:E7:7E:F3:9B:9A:38:37:93:CB:71 X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication X509v3 CRL Distribution Points: Full Name: URI:http://example.com/crl/example.crl Signature Algorithm: sha1WithRSAEncryption 32:58:2b:cd:3f:f9:35:51:8b:a8:67:8f:5d:27:09:54:44:a9: ba:83:9f:7e:e9:ba:9e:51:db:fb:12:46:92:82:34:e8:97:49: af:63:b5:30:c0:7c:f3:b5:9b:27:6a:99:86:8a:7d:fa:6d:65: 11:68:d6:6c:fb:1a:d9:ed:79:ff:39:61:c1:de:0a:e6:2b:11: 7f:79:7a:30:96:6b:45:d0:4c:d2:d1:78:39:9f:ab:38:f2:7d: 1d:78:c9:0f:23:2f:06:53:10:ff:2a:94:2a:51:5f:86:62:de: 55:5d:d4:84:29:d1:f4:a2:f2:e4:ce:88:aa:b4:84:8d:ec:2e: 3d:55:14:66:e8:5f:4c:20:5a:05:9c:94:0c:41:45:37:5c:23: 74:76:3a:c4:b8:d8:8f:67:fa:29:e3:32:75:d7:f1:6d:e5:47: 58:0c:1e:d3:21:65:c8:d7:eb:09:cb:5c:ab:45:68:37:d5:d4: 63:d1:38:62:37:10:53:2f:dc:d1:f6:b1:c2:08:c2:c3:24:06: 4e:0c:b9:7a:8d:18:60:95:2c:95:17:df:79:30:94:4d:ba:2e: ea:94:99:2c:1e:90:ce:33:ce:47:eb:b4:ad:84:89:ea:d7:c2: 5c:eb:b9:72:ac:ac:89:3c:05:ee:40:e3:76:d1:fb:6a:f3:a6: 3b:ca:0b:e8
証明書は PEM 形式から,DER 形式に変換しておきます.
OpenSSL を使用する場合は,下記のようにして変換します.
# openssl x509 -inform PEM -outform DER -in client.pem -out client.der
LDIF ファイル
inetOrgPerson オブジェクトクラスを使用します.
必須の属性は cn と sn です.
必須属性が必要なのは,基底オブジェクトクラス(の基底オブジェクトクラス)が Person オブジェクトクラスだからです.
LDIF ファイルには,userCertificate にクライアント証明書のファイルを指定します.また,userCertificate: ではなく,userCertificate;binary: と記載します.
dn: cn=hexa.diary@example.com,dc=ldap,dc=example,dc=com objectclass: inetOrgPerson cn: hexa.diary@example.com sn: sn userCertificate;binary:< file:///root/client.der
cn, sn は適当に指定してます.
追加と確認
ldapadd
エントリを追加します.
# ldapadd -x -H ldaps://ldap.example.com -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -f hexa.diary.ldif Enter LDAP Password: adding new entry "cn=hexa.diary@example.com,dc=ldap,dc=example,dc=com"
ldapsearch
ldapsearch で確認してみます.
# ldapsearch -x -H ldaps://ldap.example.com -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -b 'dc=ldap,dc=example,dc=com' '(cn=hexa.diary@example.com)' Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=ldap,dc=example,dc=com> with scope subtree # filter: (cn=hexa.diary@example.com) # requesting: ALL # # hexa.diary@example.com, ldap.example.com dn: cn=hexa.diary@example.com,dc=ldap,dc=example,dc=com objectClass: inetOrgPerson cn: hexa.diary@example.com sn: sn userCertificate;binary:: MIIDXzCCAkegAwIBAgIFAJ+xmTcwDQYJKoZIhvcNAQEFBQAwGTEXM BUGA1UEAwwOY2EuZXhhbXBsZS5jb20wHhcNMTIwMTMwMTUwMDAwWhcNMTMwMTMwMTUwMDAwWjAhMR 8wHQYDVQQDDBZoZXhhLmRpYXJ5QGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMII BCgKCAQEAqeo9n9jvwvZqdQiek7MwOg3YO2Ft28/vjTDD4UvDJeGD2oOVg3C5Pg9EqHtC+HebxpYa bJNRIcx3gcH/Ykooy/xaVvK2aQq+zwcZuvgURYRtdpmGx6otbA+LShVK0rolRYkH4MWEpN7SUrxNG UR41kYX+jbDUpp97Yp38z6ho6thal+4hm0GvIc3a9NMBYog2aFpNuCDJCeQaLcqNRYOI9v7IXxbNo lM5tmCMNTszIFwz8d1UZQREouSG6536joBrug/CbBhH/TthpWpVy6UrUk8MC6G/XbwMhIlafY/uJ6 Y8qkplugJiKLiaBp0NcdM2Mc+igGmDkr4b8VWlws3dwIDAQAfo4GlMIGiMAwGA1UdEwEB/wQCMAAw HwYDVR0jBBgwFoAUW+hePyMFM8Hpn/SIi93Fs4NfPikwHQYDVR0OBBYEFMdf5OBoGg9TxSrnfvObm jg3k8txMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAzBgNVHR8ELDAqMCigJqAkhiJodH RwOi8vZXhhbXBsZS5jb20vY3JsL2V4YW1wbGUuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQAyWCvNP/k 1UYuoZ49dJwlURKm6g59+6bqeUdv7EkaSgjTol0mvY7UwwHzztZsnapmGin36bWURaNZs+xrZ7Xn/ OWHB3grmKxF/eXowlmtF0EzS0Xg5n6s48n0deMkPIy8GUxD/KpQqUV+GYt5VXdSEKdH0ovLkzoiqt ISN7C49VRRm6F9MIFoFnJQMQUU3XCN0djrEuNiPZ/op4zJ11/Ft5UdYDB7TIWXI1+sJy1yrRWg31d Rj0ThiNxBTL9zR9rHCCMLDJAZODLl6jRhglSyVF995MJRNui7qlJksHpDOM85H67SthInq18Jc67l yrKyJPAXuQON20ftq86Y7ygvo # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
無事に追加されているようです.
userCertificate の確認
ついでなので,userCertificate;binary:: の内容を確認してみます.
userCertificate;binary:: の内容を client.crt ファイルに保存して,下記を実行して確認します.
$ ruby -r openssl -r base64 -e "puts OpenSSL::X509::Certificate.new(Base64::decode64(File.read('client.crt'))).to_text" Certificate: Data: Version: 3 (0x2) Serial Number: 2679216439 (0x9fb19937) Signature Algorithm: sha1WithRSAEncryption Issuer: CN=ca.example.com Validity Not Before: Jan 30 15:00:00 2012 GMT Not After : Jan 30 15:00:00 2013 GMT Subject: CN=hexa.diary@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:a9:ea:3d:9f:d8:ef:c2:f6:6a:75:08:9e:93:b3: 30:3a:0d:d8:3b:61:6d:db:cf:ef:8d:30:c3:e1:4b: c3:25:e1:83:da:83:95:83:70:b9:3e:0f:44:a8:7b: 42:f8:77:9b:c6:96:1a:6c:93:51:21:cc:77:81:c1: ff:62:4a:28:cb:fc:5a:56:f2:b6:69:0a:be:cf:07: 19:ba:f8:14:45:84:6d:76:99:86:c7:aa:2d:6c:0f: 8b:4a:15:4a:d2:ba:25:45:89:07:e0:c5:84:a4:de: d2:52:bc:4d:19:44:78:d6:46:17:fa:36:c3:52:9a: 7d:ed:8a:77:f3:3e:a1:a3:ab:61:6a:5f:b8:86:6d: 06:bc:87:37:6b:d3:4c:05:8a:20:d9:a1:69:36:e0: 83:24:27:90:68:b7:2a:35:16:0e:23:db:fb:21:7c: 5b:36:89:4c:e6:d9:82:30:d4:ec:cc:81:70:cf:c7: 75:51:94:11:12:8b:92:1b:ae:77:ea:3a:01:ae:e8: 3f:09:b0:61:1f:f4:ed:86:95:a9:57:2e:94:ad:49: 3c:30:2e:86:fd:76:f0:32:12:25:69:f6:3f:b8:9e: 98:f2:a9:29:96:e8:09:88:a2:e2:68:1a:74:35:c7: 4c:d8:c7:3e:8a:01:a6:0e:4a:f8:6f:c5:56:97:0b: 37:77 Exponent: 65567 (0x1001f) X509v3 extensions: X509v3 Basic Constraints: critical CA:FALSE X509v3 Authority Key Identifier: keyid:5B:E8:5E:3F:23:05:33:C1:E9:9F:F4:88:8B:DD:C5:B3:83:5F:3E:29 X509v3 Subject Key Identifier: C7:5F:E4:E0:68:1A:0F:53:C5:2A:E7:7E:F3:9B:9A:38:37:93:CB:71 X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication X509v3 CRL Distribution Points: Full Name: URI:http://example.com/crl/example.crl Signature Algorithm: sha1WithRSAEncryption 32:58:2b:cd:3f:f9:35:51:8b:a8:67:8f:5d:27:09:54:44:a9: ba:83:9f:7e:e9:ba:9e:51:db:fb:12:46:92:82:34:e8:97:49: af:63:b5:30:c0:7c:f3:b5:9b:27:6a:99:86:8a:7d:fa:6d:65: 11:68:d6:6c:fb:1a:d9:ed:79:ff:39:61:c1:de:0a:e6:2b:11: 7f:79:7a:30:96:6b:45:d0:4c:d2:d1:78:39:9f:ab:38:f2:7d: 1d:78:c9:0f:23:2f:06:53:10:ff:2a:94:2a:51:5f:86:62:de: 55:5d:d4:84:29:d1:f4:a2:f2:e4:ce:88:aa:b4:84:8d:ec:2e: 3d:55:14:66:e8:5f:4c:20:5a:05:9c:94:0c:41:45:37:5c:23: 74:76:3a:c4:b8:d8:8f:67:fa:29:e3:32:75:d7:f1:6d:e5:47: 58:0c:1e:d3:21:65:c8:d7:eb:09:cb:5c:ab:45:68:37:d5:d4: 63:d1:38:62:37:10:53:2f:dc:d1:f6:b1:c2:08:c2:c3:24:06: 4e:0c:b9:7a:8d:18:60:95:2c:95:17:df:79:30:94:4d:ba:2e: ea:94:99:2c:1e:90:ce:33:ce:47:eb:b4:ad:84:89:ea:d7:c2: 5c:eb:b9:72:ac:ac:89:3c:05:ee:40:e3:76:d1:fb:6a:f3:a6: 3b:ca:0b:e8
確かに,LDIF ファイルで指定したクライアント証明書であることが確認できました.
TLS の設定
設定自体は簡単ですが,すぐに忘れるので書いておきます.
TLS 用の証明書の作成
CA 証明書とサーバ証明書を適当に作ります.
$ ./publish_certiticate.rb Certificate: Data: Version: 3 (0x2) Serial Number: 1 (0x1) Signature Algorithm: sha1WithRSAEncryption Issuer: CN=ca.example.com Validity Not Before: Jan 30 15:00:00 2012 GMT Not After : Jan 30 15:00:00 2014 GMT Subject: CN=ca.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b6:de:f7:87:72:36:95:49:28:30:52:a3:9f:e4: 1f:36:1d:96:a7:70:62:a6:72:43:6a:05:43:1c:dd: bb:93:83:6e:6e:29:a8:c0:f4:8f:fa:ad:4b:89:e7: f0:80:c6:fc:6c:b8:b1:a1:03:93:8b:03:a6:d6:2b: e4:16:e3:c4:29:db:8c:dc:d2:ed:e4:17:08:22:36: 26:39:75:06:36:1e:d1:7e:c5:db:de:7b:b0:82:9e: 88:38:ca:d3:18:1e:91:2a:47:4c:31:6e:43:08:78: 6a:27:36:67:d8:9b:cc:0f:7c:93:05:d3:8c:a2:0d: e6:20:04:20:ef:0b:4d:58:22:00:12:81:97:da:22: 12:d2:d2:fa:64:75:7e:51:67:df:fb:40:59:76:75: 15:05:e1:73:1c:59:ef:02:f9:00:bf:d8:5d:92:b4: f9:a5:34:1e:82:cf:d7:a0:51:4f:f8:71:90:af:e3: 9c:0f:53:bd:68:5d:db:dd:c5:6b:15:a4:36:f4:a1: 8f:38:1c:42:1d:77:b5:aa:f3:fb:db:64:e8:18:d3: 35:6d:2f:ad:3a:9a:d3:17:4d:e1:00:6a:bf:f6:c0: 34:d3:0b:d0:01:83:72:f7:84:6d:45:06:13:eb:85: fc:a4:7b:52:0a:c6:07:22:99:34:0d:65:f8:a2:86: 1d:2b Exponent: 65567 (0x1001f) X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha1WithRSAEncryption 11:fa:48:22:1a:13:64:a9:0b:a4:10:82:2e:e8:e3:f0:a4:37: ba:14:bd:ba:4a:6c:e3:16:ed:12:94:c0:37:f1:57:eb:1a:fe: ea:8f:6a:ec:ed:5c:0d:30:6f:8c:e8:85:8b:d4:be:81:70:bf: e2:87:b9:e8:e2:2c:59:ef:d3:87:e8:dd:77:c6:38:a9:cb:dd: 1d:e4:cf:08:1b:df:1c:0f:a9:4a:e0:0a:fc:c9:0d:b2:a3:f8: 46:c1:cd:7e:bc:1b:da:67:09:9a:30:7c:fa:c5:08:39:23:49: e6:78:b3:75:12:9f:94:ab:82:a0:2f:66:6d:d8:0f:77:f5:b8: 6d:5f:3f:4a:f0:f8:0c:cb:dc:f5:2d:da:d5:19:80:82:7b:42: 66:c5:01:4a:0f:41:06:3d:6b:24:79:c1:c1:66:09:89:c8:eb: 46:e2:a1:f0:2e:4e:99:cd:17:e4:70:fe:69:eb:bc:77:be:e7: d0:8e:53:93:ca:04:11:63:c7:6f:55:4f:60:75:5c:e1:72:53: fd:24:46:0f:af:bb:5d:68:dd:fb:13:69:91:32:41:c9:f1:71: c9:82:48:1d:9d:dd:5b:16:7f:4a:39:f0:a2:db:0a:dd:8f:01: c6:ae:89:c7:b4:c9:28:5f:48:5f:b1:f4:cc:d9:0d:97:2d:3f: 92:27:7e:6e Certificate Request: Data: Version: 1 (0x1) Subject: CN=ldap.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:9f:16:fc:a5:82:82:9f:5f:92:f7:66:f8:60:16: d6:a2:11:ae:02:8a:27:b7:0c:58:9a:4a:1d:fb:7e: 8b:21:20:88:55:7a:33:57:da:24:ef:88:10:36:f8: 12:46:0d:26:85:be:e1:5f:ff:39:28:b7:91:24:4b: f4:bf:51:ff:82:f0:5a:49:5a:3c:d1:ec:bc:ef:82: 00:1b:48:8a:41:93:d6:6e:00:ed:f9:c5:4d:8f:1c: fe:2c:09:a7:d4:8b:8c:f6:b9:61:6d:1e:64:69:5b: 0c:f0:00:69:02:30:19:09:62:78:cc:62:aa:0d:ba: d5:15:0f:62:01:f7:1e:12:3a:78:aa:a7:96:3a:9b: 3f:cc:8a:f0:49:d5:08:d7:04:ce:49:81:6d:f9:c1: 96:9a:0f:25:40:b2:f8:b6:61:59:a5:f1:6e:3f:6a: 26:82:b8:fd:e3:e0:1e:ba:3a:ab:bd:a7:56:e5:af: f5:f7:ad:6b:30:aa:9c:40:b4:7a:56:b6:99:2a:0e: 48:b0:c5:da:42:fc:d1:e6:6d:28:a8:63:02:81:1e: f3:0e:07:88:fc:6d:d6:fd:2a:14:ea:2a:3e:52:6a: 7a:19:e4:29:71:02:d9:12:dc:0f:d6:60:ef:00:be: a1:9a:8b:3e:f7:7b:1a:eb:a8:d9:d8:81:99:ac:86: bb:2b Exponent: 65567 (0x1001f) Attributes: a0:00 Signature Algorithm: sha1WithRSAEncryption 91:82:3a:8e:12:c0:b4:51:6c:85:f3:cc:73:a1:40:8b:e4:27: 96:8b:e4:9d:73:e0:a8:e1:a8:85:25:72:90:37:43:67:13:62: 94:ca:99:4d:ee:9e:f0:18:0e:34:b9:32:a2:93:10:15:50:62: 3e:3a:92:52:c2:be:30:c4:50:88:2a:32:38:67:f2:90:d2:d2: 73:fa:4c:95:16:e7:38:47:7d:ee:40:99:84:a3:df:a6:b1:8f: ac:5a:c7:ad:81:c3:c5:0b:86:e7:47:d5:eb:fa:cf:8b:b0:2f: 58:fa:44:7f:e3:38:1b:7f:01:e7:f6:e2:7c:28:01:d3:50:d2: 4a:00:4e:39:f6:7f:2f:e6:c2:e9:9c:de:87:30:b5:97:ca:80: b9:a3:c2:89:05:77:5e:77:1f:47:05:d3:26:90:9a:e7:df:f4: 46:1b:78:1f:ee:d5:da:07:ce:d3:0d:0b:33:f4:70:45:9d:34: b8:bc:e1:95:c8:c6:19:46:eb:5f:6d:85:f6:59:fb:ef:51:ba: a8:ed:f6:5d:b6:94:ad:11:71:ff:ff:1e:f8:60:44:71:9b:a3: 63:9d:e7:86:30:07:6e:10:e5:ab:0d:50:70:d1:4a:82:0e:54: b3:f0:4b:b4:49:2b:32:2c:ac:39:c2:8b:b1:3d:02:0f:43:be: d1:c6:61:f5 Certificate: Data: Version: 3 (0x2) Serial Number: 05:e2:e6:a4:cd:09:ea:54:d6:65:b0:75:fe:22:a2:56 Signature Algorithm: sha1WithRSAEncryption Issuer: CN=ca.example.com Validity Not Before: Jan 30 15:00:00 2012 GMT Not After : Jan 30 15:00:00 2013 GMT Subject: CN=ldap.example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:9f:16:fc:a5:82:82:9f:5f:92:f7:66:f8:60:16: d6:a2:11:ae:02:8a:27:b7:0c:58:9a:4a:1d:fb:7e: 8b:21:20:88:55:7a:33:57:da:24:ef:88:10:36:f8: 12:46:0d:26:85:be:e1:5f:ff:39:28:b7:91:24:4b: f4:bf:51:ff:82:f0:5a:49:5a:3c:d1:ec:bc:ef:82: 00:1b:48:8a:41:93:d6:6e:00:ed:f9:c5:4d:8f:1c: fe:2c:09:a7:d4:8b:8c:f6:b9:61:6d:1e:64:69:5b: 0c:f0:00:69:02:30:19:09:62:78:cc:62:aa:0d:ba: d5:15:0f:62:01:f7:1e:12:3a:78:aa:a7:96:3a:9b: 3f:cc:8a:f0:49:d5:08:d7:04:ce:49:81:6d:f9:c1: 96:9a:0f:25:40:b2:f8:b6:61:59:a5:f1:6e:3f:6a: 26:82:b8:fd:e3:e0:1e:ba:3a:ab:bd:a7:56:e5:af: f5:f7:ad:6b:30:aa:9c:40:b4:7a:56:b6:99:2a:0e: 48:b0:c5:da:42:fc:d1:e6:6d:28:a8:63:02:81:1e: f3:0e:07:88:fc:6d:d6:fd:2a:14:ea:2a:3e:52:6a: 7a:19:e4:29:71:02:d9:12:dc:0f:d6:60:ef:00:be: a1:9a:8b:3e:f7:7b:1a:eb:a8:d9:d8:81:99:ac:86: bb:2b Exponent: 65567 (0x1001f) X509v3 extensions: X509v3 Basic Constraints: critical CA:FALSE X509v3 Authority Key Identifier: keyid:5B:E8:5E:3F:23:05:33:C1:E9:9F:F4:88:8B:DD:C5:B3:83:5F:3E:29 X509v3 Subject Key Identifier: B2:96:4C:07:DE:EC:12:63:2B:46:E4:69:2D:70:B2:83:DE:C5:DB:F2 X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication X509v3 CRL Distribution Points: Full Name: URI:http://ca.example.com/crl/example.crl Signature Algorithm: sha1WithRSAEncryption 30:64:a7:72:14:e8:57:db:5b:b6:77:04:03:71:cf:85:af:75: 15:65:49:5c:6c:e8:c0:e4:1f:02:f2:3b:c4:d6:6e:de:f2:be: 71:5e:e1:b7:12:31:21:a3:54:b2:17:f6:37:ff:1b:7b:f1:d5: 19:e7:ff:e2:a7:61:b6:79:d9:2a:fd:29:21:45:16:d3:6e:49: 41:17:e0:86:65:23:f0:bc:6d:22:02:58:ed:39:51:92:c1:61: d5:06:98:04:bf:28:a7:2a:9f:fe:e0:82:bf:73:a6:c4:50:4d: eb:8d:53:3c:6b:d4:a5:b5:4f:32:c2:51:38:bd:4f:ef:60:01: 99:2a:52:85:f6:bb:0e:4c:b2:21:2d:56:cc:9b:50:56:c7:41: 3f:db:b9:b6:54:3e:3c:8a:d1:48:42:2e:fd:8c:74:7a:c9:4c: 6c:37:98:db:29:3f:81:3a:66:44:83:e5:8e:81:ce:b8:70:fb: fd:f0:3d:99:e5:3d:ec:ff:28:fa:53:ac:eb:66:80:60:b2:dd: 4e:e9:62:bd:8c:0f:68:30:8f:65:8d:63:f5:9e:97:0a:03:b1: 6b:f6:3a:1b:6b:34:96:3b:9d:d8:57:73:01:8d:04:fd:6f:74: e0:34:31:87:5b:15:46:ea:37:2f:f2:b2:fa:01:b8:2c:36:c9: b9:27:18:cd
確認していないですが,TLS Web Server Authentication は必要だと思います.
サーバ側の設定
suffix や rootdn 等は前回のと同じ設定にします.
sldap.conf
下記を設定します.
TLSCACertificateFile /etc/openldap/certs/ca.pem TLSCertificateFile /etc/openldap/certs/server.pem TLSCertificateKeyFile /etc/openldap/certs/key.pem
TLSCACertificateFile は何に使用しているか分からないです …
起動
slapd をたちあげます.
# service slapd start
クライアント側の設定
/etc/openldap/ldap.conf
TLS_CACERT を追記します.
TLS_CACERT サーバ証明書を検証する CA 証明書を指定します.
(たぶんサーバ証明書の verify 用かな)
TLS_CACERT /etc/openldap/certs/ca.pem
実行
上記までで,設定は完了です.
netstat で LISTEN を確認してみます.
# netstat -a | grep ldaps tcp 0 0 *:ldaps *:* LISTEN tcp 0 0 *:ldaps *:* LISTEN
(ldaps のポート番号は 636 です)
動いているようなので,試しに ldapsearch を実行してみます.
ldapsearch
ldap:// のときとの違いは,コマンドに指定する URI のスキームを ldap から ldaps に変更することだけです.
# ldapsearch -x -H ldaps://ldap.example.com -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -b 'dc=ldap,dc=example,dc=com' '(objectClass=*)' Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=ldap,dc=example,dc=com> with scope subtree # filter: (objectClass=*) # requesting: ALL # # ldap.example.com dn: dc=ldap,dc=example,dc=com objectClass: dcObject objectClass: organization o: organization dc: ldap # person, ldap.example.com dn: ou=person,dc=ldap,dc=example,dc=com objectClass: organizationalUnit ou: person # hexa, person, ldap.example.com dn: cn=hexa,ou=person,dc=ldap,dc=example,dc=com objectClass: person cn: hexa sn: blog userPassword:: e1NTSEF9Tm9rQnBiYXc2MXpwRTRBUVRuQXo1cmxRM0lIT2hvbXE= # search result search: 2 result: 0 Success # numResponses: 4 # numEntries: 3
CentOS 6.2 に OpenLDAP をインストールしてみた
CentOS 6 では,CentOS 5 までは存在していた OpenLDAP の設定ファイルの slapd.conf が無くなり,その代わりに,/etc/openldap/slapd.d/ 以下に設定ファイル(とディレクトリ)が格納されるようになっています,
/etc/openldap/slapd.d/ 以下のファイル
# ls -R /etc/openldap/slapd.d/ /etc/openldap/slapd.d/: cn=config cn=config.ldif /etc/openldap/slapd.d/cn=config: cn=schema olcDatabase={0}config.ldif olcDatabase={1}monitor.ldif cn=schema.ldif olcDatabase={-1}frontend.ldif olcDatabase={2}bdb.ldif /etc/openldap/slapd.d/cn=config/cn=schema: cn={0}corba.ldif cn={2}cosine.ldif cn={6}java.ldif cn={10}ppolicy.ldif cn={3}duaconf.ldif cn={7}misc.ldif cn={11}collective.ldif cn={4}dyngroup.ldif cn={8}nis.ldif cn={1}core.ldif cn={5}inetorgperson.ldif cn={9}openldap.ldif
これらのファイルを編集していけばいいような気がしますが,Red Hat のドキュメントを読んでみると,/etc/openldap/slapd.d/ 以下の直接の編集は推奨されていません.
このままではどうしようもないので,一度,slapd.conf を作成して,作成した slapd.conf から /etc/openldap/slapd.d/ の移行を試みます.
slapd.conf は下記のディレクトリにあります.
/usr/share/openldap-servers/slapd.conf.obsolete
移行
slaptest を使用して移行します.
# cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/ # vim /etc/openldap/slapd.conf.obsolete ## 変更点 ### # 116c116 # < suffix "dc=my-domain,dc=com" # --- # > suffix "dc=ldap,dc=example,dc=com" # 118c118 # < rootdn "cn=Manager,dc=my-domain,dc=com" # --- # > rootdn "cn=Manager,dc=ldap,dc=example,dc=com" # 123c123 # < # rootpw {crypt}ijFYNcSNctBYg # --- # > rootpw {SSHA}QeqmMk3atYqjqXGaURtgB0mXSxHnhcFL ########## # rm -rf /etc/openldap/slapd.d/* # slaptest -f /etc/openldap/slapd.conf.obsolete -F /etc/openldap/slapd.d # chown -R ldap:ldap /etc/openldap/slapd.d/ # chown -R ldap:ldap /var/lib/ldap # service slapd start # service slapd status slapd (pid 2462) is running...
無事動きました.
確認
適当にエントリの追加と検索をおこなって,変更した設定が反映されていることを確認します.
# ldapadd -x -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -f person.ldif Enter LDAP Password: adding new entry "dc=ldap,dc=example,dc=com" adding new entry "ou=person,dc=ldap,dc=example,dc=com" adding new entry "cn=hexa,ou=person,dc=ldap,dc=example,dc=com" # ldapsearch -x -D 'cn=Manager,dc=ldap,dc=example,dc=com' -W -b 'dc=ldap,dc=example,dc=com' '(cn=hexa)' Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=ldap,dc=example,dc=com> with scope subtree # filter: (cn=hexa) # requesting: ALL # # hexa, person, ldap.example.com dn: cn=hexa,ou=person,dc=ldap,dc=example,dc=com objectClass: person cn: hexa sn: blog userPassword:: e1NTSEF9Tm9rQnBiYXc2MXpwRTRBUVRuQXo1cmxRM0lIT2hvbXE= # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
ldapadd で追加して,ldapsearch でその内容が確認できたので,設定は反映されているようです.