CentOS6 OpenLDAPでTLS

スポンサーリンク

■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つです。

  1. /etc/pki/CA/private/cakey.pem (CAの秘密鍵)
  2. /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
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする