■OpenLDAPのTLS対応
LDAPサーバとLDAPクライアントが同居の場合には特に問題にならないのですが大体のケースにおいてLDAPのサーバとクライアントは別々なことが多いです。LDAPクライアントは特定のものに限らずいろいろなサーバがLDAPを参照することが多いためです。
そういった場合に、OpenSSLで証明書を作成しOpenLDAPのSSL通信(TLS)に対応させることが望ましいです。実務においてもHTTPSのように外部の機関に署名してもらって証明書を発行してもらうというのはOpenLDAPの場合、いまだ見たことがありません。
不特定多数からアクセスしてくるわけではなく、決まったクライアントからしかアクセスはないのでオレオレ証明書で十分と判断するところが多いのだと思います。
■自己認証局の構築
OpenLDAPサーバ上でCA証明書を作成します。OpenSSLのパッケージを利用しCAスクリプトを利用してCA認証局およびCA証明書を作成するところから始めます。まず最初にopenssl.cnfファイルを編集しサーバ証明書の有効期限に関する設定を行っておきます。
# vi /etc/pki/tls/openssl.cnf default_days = 2000 # how long to certify for |
デフォルトは証明書有効期間は1年間ですが10年間に修正しておきます。つづいて以下のコマンドであらかじめCA証明書の有効期間も変更しておきます。
# vi /etc/pki/tls/misc/CA CADAYS="-days 3650" # 10 years |
両者の有効期限を明確にするためにあえて違った値にしています。2000と3650は日数であり、数字に特に深い意味はなく適当に設定してます。そして次のコマンドを実行してCA証明書の作成に対話式に進めていきます。
# /etc/pki/tls/misc/CA -newca CA certificate filename (or enter to create) [ Enter ] Making CA certificate ... Generating a 2048 bit RSA private key ....................................................+++ ................................................................+++ writing new private key to '/etc/pki/CA/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) [XX]:JP State or Province Name (full name) []:Kagawa Locality Name (eg, city) [Default City]:Takamatsu Organization Name (eg, company) [Default Company Ltd]:UnixPower Corp Organizational Unit Name (eg, section) []:Develop Common Name (eg, your name or your server's hostname) []:www.unix-power.net Email Address []:webmaster@unix-power.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: [ Enter ] An optional company name []: [ Enter ] Using configuration from /etc/pki/tls/openssl.cnf Enter pass phrase for /etc/pki/CA/private/./cakey.pem: [ 上で入力したパスフレーズ] Check that the request matches the signature Signature ok Certificate Details: Serial Number: d2:b2:02:b0:95:12:8e:1e Validity Not Before: Dec 30 11:32:13 2012 GMT Not After : Dec 28 11:32:13 2022 GMT Subject: countryName = JP stateOrProvinceName = Kagawa organizationName = UnixPower Corp organizationalUnitName = Develop commonName = www.unix-power.net emailAddress = webmaster@unix-power.net X509v3 extensions: X509v3 Subject Key Identifier: 00:3D:EE:F2:80:88:59:17:21:F7:AC:20:7B:D8:2C:32:32:8B:11:94 X509v3 Authority Key Identifier: keyid:00:3D:EE:F2:80:88:59:17:21:F7:AC:20:7B:D8:2C:32:32:8B:11:94 X509v3 Basic Constraints: CA:TRUE Certificate is to be certified until Dec 28 11:32:13 2022 GMT (3650 days) Write out database with 1 new entries Data Base Updated |
これで作成されるファイルは以下の2つです。
- /etc/pki/CA/private/cakey.pem (CAの秘密鍵)
- /etc/pki/CA/cacert.pem (CA証明書)
これにより自己認証局が構築できました。続いてサーバ証明書の作成に移ります。
■サーバ証明書の作成
秘密鍵を作成するための乱数ファイルを作成します。下記では/var/log/messagesを指定しています が、/etc/*としてもOKですし何でもOKだと思います。
# cd /etc/pki/tls/ # openssl md5 /var/log/messages* > rand.dat # more rand.dat MD5(/var/log/messages)= 3fa5d6631735bf840daa82e0113700a3 MD5(/var/log/messages-20121006)= 3673d2a78a983490f6aa729ba4653538 MD5(/var/log/messages-20121007)= 528346d6e271aca6c3b963989a1c6926 MD5(/var/log/messages-20121014)= c0c0d7a10a03f67272ad2a0979203d74 MD5(/var/log/messages-20121118)= d37fced7395f3ea53ce18514a8d90f39 |
乱数ファイルができましたのでこれを用いて秘密鍵を作成します。
# openssl genrsa -rand ./rand.dat -des3 2048 > ./private/test.key 321 semi-random bytes loaded Generating RSA private key, 2048 bit long modulus ...........+++ ...........................+++ e is 65537 (0x10001) Enter pass phrase: [パスワード入力] Verifying - Enter pass phrase:[再度パスワード入力] |
上記にて秘密鍵ができましたので、これを用いて証明書発行要求(Certificate Signing Request)を作成します。
# openssl req -new -key ./private/test.key -out ./test.csr Enter pass phrase for /etc/pki/tls/private/test.key:[パスフレーズ入力] 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) [XX]:JP State or Province Name (full name) []:Kagawa Locality Name (eg, city) [Default City]:Takamatu-shi Organization Name (eg, company) [Default Company Ltd]:UnixPower Organizational Unit Name (eg, section) []:UnixPower Corp Common Name (eg, your name or your server's hostname) []:www.unix-power.net Email Address []:webmaster@unix-power.net Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: [何も入力しない] An optional company name []:[何も入力しない] |
ここで作成したCSRに自己認証局で署名し証明書を作成します。
# openssl ca -out /etc/pki/CA/certs/mycert.pem -infiles /etc/pki/tls/test.csr Using configuration from /etc/pki/tls/openssl.cnf Enter pass phrase for /etc/pki/CA/private/cakey.pem:[パスフレーズ入力] Check that the request matches the signature Signature ok Certificate Details: Serial Number: f7:0c:33:96:49:ac:b0:3a Validity Not Before: Dec 30 12:09:03 2012 GMT Not After : Jun 22 12:09:03 2018 GMT Subject: countryName = JP stateOrProvinceName = Kagawa organizationName = UnixPower organizationalUnitName = UnixPower Corp commonName = www.unix-power.net emailAddress = webmaster@unix-power.net X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 7A:33:E8:08:90:0F:66:51:A9:70:6F:FC:AA:42:A4:2A:2E:2F:3A:BE X509v3 Authority Key Identifier: keyid:12:52:A3:22:4B:CE:6B:0B:C1:CD:FA:79:E1:C7:DE:C0:46:AE:74:F4 Certificate is to be certified until Jun 22 12:09:03 2018 GMT (2000 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 |
これで/etc/pki/CA/certs/mycert.pemにサーバ証明書が作成されました。サーバのプライベートkeyについて起動する度にパスフレーズを聞かれるのは面倒なので以下のコマンドで外しておきます。
# mv ./private/test.key ./private/test.key.org # openssl rsa -in ./private/test.key.org -out ./privte/test.key |
■OpenLDAPサーバの設定
Slapdの設定を修正しTLS対応にします。これを適用するため以下のLDIFファイルを用意します。
# vi tls.ldif dn: cn=config changetype: modify add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/pki/CA/cacert.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/pki/CA/certs/mycert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/pki/tls/private/test.key |
上記LDIFファイルを以下のコマンドでLDAPに適用します。
# ldapmodify -x -W -D cn=config -f tls.ldif Enter LDAP Password: modifying entry "cn=config" |
slapdの起動オプションを変更してTLS対応で起動するよう以下のファイルを編集します。
# vi /etc/sysconfig/ldap SLAPD_LDAPS=yes |
そしてslapdを再起動してldapsで起動しているか確認します。
# /etc/rc.d/init.d/slapd restart # ps ax | grep ldaps 1925 ? Ssl 0:00 /usr/sbin/slapd -h ldap:/// ldaps:/// ldapi:/// -u ldap -4 |
■OpenLDAPクライアントの設定
クライアントの設定は/etc/openldap/ldap.confにて行います。以下のように編集します。
# vi /etc/openldap/ldap.conf TLS_REQCERT never TLS_CACERT /etc/pki/CA/cacert.pem TLS_CACERTDIR /etc/pki/CA |
なお、サーバとクライアントが別筐体の場合は上記のcacert.pemファイルをクライアント側にコピーしておく必要があります。
実際にldapsearchコマンドでldapsを指定し検索することができるか試してみます。-hでは単にホストのIPを指定すれば良かったのですが、ldapsでURI指定を行うため-Hオプションを使用しています。
# ldapsearch -H "ldaps://localhost" -x -W -D cn=Manager,dc=unix-power,dc=net \ -b ou=Users,dc=unix-power,dc=net -s sub Enter LDAP Password: # extended LDIF # # LDAPv3 # base <ou=Users,dc=unix-power,dc=net> with scope subtree # filter: (objectclass=*) # requesting: ALL # # Users, unix-power.net dn: ou=Users,dc=unix-power,dc=net objectClass: organizationalUnit ou: Users # takeda, Users, unix-power.net dn: uid=takeda,ou=Users,dc=unix-power,dc=net objectClass: posixAccount objectClass: inetOrgPerson sn: takeda cn: kazuma displayName: Takeda Kazuma uid: takeda uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/takeda loginShell: /bin/bash userPassword:: e1NTSEF9OFBvMTVDSWt2cUpWZy9ZQVV2NDduaC9rSXBMdmJ1NTk= mail: takeda@unix-power.net # suzuki, Users, unix-power.net dn: uid=suzuki,ou=Users,dc=unix-power,dc=net objectClass: posixAccount objectClass: inetOrgPerson sn: suzuki cn: hajime displayName: Suzuki Hajime uid: suzuki uidNumber: 1001 gidNumber: 1000 homeDirectory: /home/suzuki loginShell: /bin/bash userPassword:: e1NTSEF9OFBvMTVDSWt2cUpWZy9ZQVV2NDduaC9rSXBMdmJ1NTk= mail: suzuki@unix-power.net # tanaka, Users, unix-power.net dn: uid=tanaka,ou=Users,dc=unix-power,dc=net objectClass: posixAccount objectClass: inetOrgPerson sn: tanaka cn: takuya displayName: Tanaka Takuya uid: tanaka uidNumber: 1002 gidNumber: 1000 homeDirectory: /home/tanaka loginShell: /bin/bash userPassword:: e1NTSEF9OFBvMTVDSWt2cUpWZy9ZQVV2NDduaC9rSXBMdmJ1NTk= mail: tanaka-replaceX@unix-power.net # search result search: 2 result: 0 Success # numResponses: 5 # numEntries: 4 |