LPIC Level3 Core(英語試験)の学習。
「Linux 教科書 LPIC レベル3 」の内容に概ね従って進める。
「4.4 SSL/TLSによる通信路の保護」
SSLを用いて、LDAP通信を暗号化するように設定(ldaps通信)。
パブリックな認証局は使わない(自前の認証局も使わない)。
【参考サイト】
・そろそろLDAPにしてみないか? 「第11回 OpenLDAPとSSL」
秘密鍵の生成
# cd /tmp/ssl
# openssl genrsa -out server.key -des3 2048
Generating RSA private key, 2048 bit long modulus
…..+++
…………………………+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying – Enter pass phrase for server.key:
# ls -l
合計 4
-rw-r–r– 1 root root 1751 6月 23 06:01 server.key
# cat server.key
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,3A8D652658D374CE
ALAGuINHdXLE/7NcavlzyPcn3P47Kg/xvj1bq56u8mdxWlfkFTOjCQVS8/yODHez
tNBjm8bag8xRemtZ22RK3K/3cHw4xaG/65djOtzt/mwadsyF/tgyRJbrtZkalajj
wbGBLvIQ+M1WlDyRkz8+s2gVcSiL7i6NWdIOAaSCP4CqsMKHcOz06oJTKhXuNvFS
6jzYtZnY+Qq8/iZ8Wq8vCmGmdkBIbnnIF4BrrTVKq8+9JeYMJdLH1bMKNdej+pJL
RJlI84aYDrVVJ8cTlhweu8fnRGZuUEw1U6+OePgDrFvtFCYq12hHItUAUVmPIPwr
viesW6akIiOc/xUWTx0rXbcd/1NdEgYIG4kVg6997fnp6QnIHXcSWRXccXcPsNoA
ejJ/TD2DScR/67X8ksvO5ZilTR2CvPZrri5SirofhMMw6HcVIP0/vc/MI9qiMU76
hA95zGlNS6oxnPBAD3JjfvoG94O6MuV06YI1RgP89N0xtCdCvBtGUqNmqbM2H/bX
CgZ7aIaxt7aO6/p2Ay0gBsiUsoHeQ4/1n72o2jrz36bmjJ/p1Mq5Xd5Rc19CW2R1
/bDj3Say103aMCck4eHcd2UY2qsu2BevBEhvfLx3MBfRLZ7/B4uM72nt0MVbCDGg
XFjJZOUn9wsPgZd1WDF5jBYEiKrDtK/eEUzSjx663M0wKrq/Z5icS86zFF8vTtEX
/NJuiKf+hpyk194YT2ouYNcZHxy6Wjpn3SwLE4lrFpYnKDfWzp+4l/4sFncfB0jq
IdDV1n89Pm0wpD595FVycGvboo2550byQQaHoq+X/GGNt26K1yjZYOgPGSjga4ve
WVEye47l0ciWnKNYAo/SosIRrwfgZvBfAxiTdRS3H2KTFdPjNSFI5twa5NueQLdh
Zi1O5c9Z09Ukm0gDLf5XmV0CfdyRgD1yuSEZa2heb0YmZ4XKIa0PbbKqeaRt78sV
yy44qaycvYllR7WOqLIwcMGmj8EBsxzxcn4RgtDfcJOn4pUtUWn5VWi6dZg4CW2z
vn+ymTyGL9j4gprX5KPijAjuLwQDSxC2SuaLpu5+rO/+kYHgibrI/vxre/xXzPKo
KU7HHPuVqpX8AYwwC5TfG32HxRvcEwS10C+sFXpTdCCes/4uCPoZ72OXTUCjHTpP
xe6xYU+HiaoC9MSv5BqFzLSqyXXW6x/1Ebshe6r8wHoEI365Y5zHmRUksPfjnJbx
iXUgEhPqxcL0AyttbczlJq0GKZ1fLFqdifjNWrB6Yh1P0SEF/VX58SPWV7UuQ5bs
DoDM8CE++skM7u8RH8vRtLfnDQmnL+rZGx+xPeG7169lUq22VJmWTu/4Ywdwl6pP
GNmO+RQfiIaGtFvH1A50fm/XO/D51C95Mznl7WzNNi6YlrAN/jg74qlSmCaEVP7F
+0lA1KEQooackn7vE0UtiWodh9ESrgRz3fcvUq1MYtYJX9HIFEH/cg27fc0Pksdf
QFw5y3k7GtZ5XG3Qkt0YKsMJePb1xYefBmiXpRgTPRKZ9EvYhgdyEQma3r8yQ3jj
0b2Xf/UuZtSlhJI/tOaoFSTeUhwyUQ/DiHES1Uflp+urTKKLZa+U8OiT2dNf1q1t
—–END RSA PRIVATE KEY—–
root以外からは秘密鍵を読み込みできないように、パーミッションを変更する。
※ldapサービスは、ldapアカウントで動かすのでldapにしないといけないかも?とりあえず、このままで。
# chmod 400 server.key
# ls -l
合計 4
-r——– 1 root root 1751 6月 23 06:01 server.key
秘密鍵にパスフレーズが含まれているのは、セキュリティ上好ましいが、サーバー再起動時に各デーモンが自動で起動できなくなるなど運用上不便な面もあるようだ。
今回は、秘密鍵のパスフレーズを解除する。
# mv server.key server.key.org
# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:
writing RSA key
# ls -l
合計 8
-rw-r–r– 1 root root 1679 6月 23 06:13 server.key
-r——– 1 root root 1751 6月 23 06:01 server.key.org
# rm server.key.org
rm: remove 通常ファイル `server.key.org’? y
# chmod 400 server.key
# ls -l
合計 4
-r——– 1 root root 1679 6月 23 06:13 server.key
自己証明書を作成。
# openssl req -new -x509 -days 3650 -key server.key -out server.crt
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) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Shinjuku-ku
Organization Name (eg, company) [My Company Ltd]:KAKUYA-SHIKAKUGETS
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:kakuya
Email Address []:kakuya.my-domain.local
[root@centos5-1 ssl]#
[root@centos5-1 ssl]# ls -l
合計 8
-rw-r–r– 1 root root 1631 6月 23 06:21 server.crt
-r——– 1 root root 1679 6月 23 06:13 server.key
[root@centos5-1 ssl]# cat server.crt
—–BEGIN CERTIFICATE—–
MIIEhjCCA26gAwIBAgIJAKeGSb9M/6clMA0GCSqGSIb3DQEBBQUAMIGIMQswCQYD
VQQGEwJKUDEOMAwGA1UECBMFVG9reW8xFDASBgNVBAcTC1NoaW5qdWt1LWt1MRsw
GQYDVQQKExJLQUtVWUEtU0hJS0FLVUdFVFMxDzANBgNVBAMTBmtha3V5YTElMCMG
CSqGSIb3DQEJARYWa2FrdXlhLm15LWRvbWFpbi5sb2NhbDAeFw0xMDA2MjIyMTIx
NDdaFw0yMDA2MTkyMTIxNDdaMIGIMQswCQYDVQQGEwJKUDEOMAwGA1UECBMFVG9r
eW8xFDASBgNVBAcTC1NoaW5qdWt1LWt1MRswGQYDVQQKExJLQUtVWUEtU0hJS0FL
VUdFVFMxDzANBgNVBAMTBmtha3V5YTElMCMGCSqGSIb3DQEJARYWa2FrdXlhLm15
LWRvbWFpbi5sb2NhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOKI
4vYDiiUkerBDvyYxeo1IT42Er2BWpoe+/zDXR6gBTUXCjT92pLFfyRz0Ccuv6IYZ
1ZBIKhAoDsMncvIzBl3CbXkeI6Hpmmjz8pDWpr5cUL67dCQCArHZ/iT9oeOfH+qE
yKEt5Sh6nGg2m2/tiiYGURsfAYrNqaSutW5voDXMX62Hhsxp+lhPWxHz3DxvXm15
nnwsADTVC2IH1s0a2RAnoJDRVINLN0CzGgckUKce5zNYczJe67hmEeU/GLjJYonj
tMb2ziuZ67zch1KLZXHwWeSpmXZtnejQbQ2obC+JZXsbuMTBuxX98oo68fAOmr9d
f7TRlZyBd6WaeqbN2eECAwEAAaOB8DCB7TAdBgNVHQ4EFgQU8Q3GIvISGPx5hTk8
Vn/Ejqv2hzswgb0GA1UdIwSBtTCBsoAU8Q3GIvISGPx5hTk8Vn/Ejqv2hzuhgY6k
gYswgYgxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzEUMBIGA1UEBxMLU2hp
bmp1a3Uta3UxGzAZBgNVBAoTEktBS1VZQS1TSElLQUtVR0VUUzEPMA0GA1UEAxMG
a2FrdXlhMSUwIwYJKoZIhvcNAQkBFhZrYWt1eWEubXktZG9tYWluLmxvY2FsggkA
p4ZJv0z/pyUwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaVTKSRpM
sVwHVt53ikSpwmcjwxcnXSScCSd3eMJYVYuWJ7cEq3Z9OyaQ8V/lSz5HM4/TGWjN
1KGXisfM6JiJlkZw82SR6/syLz7/ARhpIyaEkr6P+GGWxrMElyCRp6ZJdWt8Y+z7
wW+Bg/1rgfF/DlqDI531I9ZPKWjNu84BHbuhr7i9NrdG4GB8eXphgojHysLWuEBS
88HI+4SK41OPsvVQ1kMRa+DmPxYQdDPQ3D9rzKi4OvCXhAhpJC/sWWuTqEwYcaGV
e2cbgX60uOwu7y60iKPwJUDJ4zI6XRftMOOO/efw3K2xbBDxpoEFPrjU8n2JLcK/
7aknQj20uNhC7g==
—–END CERTIFICATE—–
秘密鍵と証明書を、便宜上/etc/openldap/配下へコピーする
# cp -p {server.crt,server.key} /etc/openldap/.
# ls -l /etc/openldap/
合計 24
drwxr-xr-x 2 root root 4096 1月 21 2009 cacerts
-rw-r–r– 1 root root 329 6月 14 21:15 ldap.conf
-rw-r–r– 1 root root 1631 6月 23 06:21 server.crt
-r——– 1 root root 1679 6月 23 06:13 server.key
OpenLDAPでSSL/TLSを利用するには、slapd.confに以下の設定を行う。
(編集前にファイルのバックアップはとっておこう。)
以下を追記する
# cp -p /usr/local/etc/openldap/slapd.conf /usr/local/etc/openldap/slapd.conf.bak
# vi /usr/local/etc/openldap/slapd.conf
#Add by Kakuya for SSL
TLSCertificateFile /etc/openldap/server.crt
TLSCertificateKeyFile /etc/openldap/server.key
#TLSCACertificateFile /etc/openldap/cacart.pem ←認証局の証明書も使う場合は指定する
で、構文チェックしてslapdを起動する。
# slaptest
bdb_monitor_db_open: monitoring disabled; configure monitor database to enable
config file testing succeeded
# /usr/local/libexec/slapd -u ldap
# ps aux | grep slapd
root 4158 0.0 0.1 4984 760 pts/2 R+ 07:19 0:00 grep slapd
slapdが動かない。
とりあえず、ログを確認
# tail – 100 /var/log/slapd_log
Jun 25 07:16:19 centos5-1 slapd[4071]: line 64 (access to attrs=userPassword by * auth)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 65 (access to * by * read)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 68 (sasl-host centos5-1.manjin.local)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 69 (sasl-realm my-domain.com)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 73 (authz-regexp uid=([^.]*),cn=.*,cn=auth uid=$1,ou=People,dc=my-domain,dc=com)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 81 (database bdb)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 82 (suffix “dc=my-domain,dc=com”)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 83 (rootdn “cn=Manager,dc=my-domain,dc=com”)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 84 (rootpw ***)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 88 (rootpw ***)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 92 (directory /usr/local/var/openldap-data)
Jun 25 07:16:19 centos5-1 slapd[4071]: line 96 (index objectClass eq,pres)
Jun 25 07:16:19 centos5-1 slapd[4071]: index objectClass 0x0006
Jun 25 07:16:19 centos5-1 slapd[4071]: line 97 (index ou,cn,mail,surname,givenname eq,pres,sub)
Jun 25 07:16:19 centos5-1 slapd[4071]: index ou 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: index cn 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: index mail 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: index sn 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: index givenName 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: line 98 (index uidNumber,gidNumber,loginShell eq,pres)
Jun 25 07:16:19 centos5-1 slapd[4071]: index uidNumber 0x0006
Jun 25 07:16:19 centos5-1 slapd[4071]: index gidNumber 0x0006
Jun 25 07:16:19 centos5-1 slapd[4071]: index loginShell 0x0006
Jun 25 07:16:19 centos5-1 slapd[4071]: line 99 (index uid,memberUid eq,pres,sub)
Jun 25 07:16:19 centos5-1 slapd[4071]: index uid 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: index memberUid 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: line 100 (index nisMapName,nisMapEntry eq,pres,sub)
Jun 25 07:16:19 centos5-1 slapd[4071]: index nisMapName 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: index nisMapEntry 0x0716
Jun 25 07:16:19 centos5-1 slapd[4071]: main: TLS init def ctx failed: -1
Jun 25 07:16:19 centos5-1 slapd[4071]: slapd stopped.
Jun 25 07:16:19 centos5-1 slapd[4071]: connections_destroy: nothing to destroy.
なんか、”main: TLS init def ctx failed: -1″とか出ている。
とりあえず、心当たりのあるところを修正。秘密鍵と自己証明書のオーナー(とグループ)をrootからldapに変更する。
# cd /etc/openldap/
# ls -l
合計 24
drwxr-xr-x 2 root root 4096 1月 21 2009 cacerts
-rw-r–r– 1 root root 329 6月 14 21:15 ldap.conf
-rw-r–r– 1 root root 1631 6月 23 06:21 server.crt
-r——– 1 root root 1679 6月 23 06:13 server.key
# chown ldap:ldap ./server.*
# ls -l
合計 24
drwxr-xr-x 2 root root 4096 1月 21 2009 cacerts
-rw-r–r– 1 root root 329 6月 14 21:15 ldap.conf
-rw-r–r– 1 ldap ldap 1631 6月 23 06:21 server.crt
-r——– 1 ldap ldap 1679 6月 23 06:13 server.key
#
もう一度、slapdを起動してみる。
# /usr/local/libexec/slapd -u ldap
# ps aux | grep slapd
ldap 4761 0.0 0.7 19632 3904 ? Ssl 07:30 0:00 /usr/local/libexec/slapd -u ldap
root 4779 0.0 0.1 4984 764 pts/2 R+ 07:31 0:00 grep slapd
#
起動できた。
LDAPでのSSL/TTL(ldaps)接続用ポート(636番ポート)が待受状態(LISTEN)になっているか確認する。
# netstat -an | egrep “389|636”
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN
tcp 0 0 :::389 :::* LISTEN
LDAPでのSSL/TTL用636番ポートがLISTEN状態になっていない。
起動するときに以下のように指定しないといけないようだ。
# /usr/local/libexec/slapd -u ldap -h ‘ldap:/// ldaps:///’
LDAPサービスを再起動して、もう一度LISTENポートを確認
# netstat -an | egrep “389|636”
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:636 0.0.0.0:* LISTEN
tcp 0 0 :::389 :::* LISTEN
tcp 0 0 :::636 :::* LISTEN
636番でも待ち受けされるようになった。
クライアントからの接続確認。
ldapsearchコマンドに-Hオプションをつけて検索してみる。
# # ldapsearch -x -LLL -H ‘ldaps://127.0.0.1/’ -b ‘dc=my-domain,dc=com’ ‘(uid=kakuya)’
ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)
接続できない。
正当な認証局の証明書を使わずに、自己証明書のみを使用した場合、
デフォルトのクライアント設定では、ldaps通信ができないようだ。
なので、クライアントの設定を変更する。
# vi /usr/local/etc/openldap/ldap.conf
#Add by kakuya
URI ldap://127.0.0.1/
BASE dc=my-domain,dc=com
TLS_REQCERT never ←追記
上記の設定で、クライアントは接続先の正当性を確認しなくなる。
もう一度、接続を試みる。成功した。
# ldapsearch -x -LLL -H ‘ldaps://127.0.0.1/’ -b ‘dc=my-domain,dc=com’ ‘(uid=kakuya)’
dn: uid=kakuya,ou=People,dc=my-domain,dc=com
uid: kakuya
cn: kakuya
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowLastChange: 14779
shadowMax: 99999
shadowWarning: 7
uidNumber: 501
gidNumber: 501
homeDirectory: /home/kakuya
本当にldaps通信になっているかは、パケットをキャプチャして確認しよう。
続いて、StartTLSを使ってみる。
LDAPサーバ側でldaps通信用の636番ポートが待受状態になっていなくても、
クライアント側からStartTLS拡張操作を行うことで、ldaps通信が可能になる。
クライアントコマンドで-Zオプションを使う。
事前準備として、LDAPサーバで636番ポートを待受状態にしない。
# ps aux | grep slapd
ldap 5089 0.0 1.0 59696 5248 ? Ssl 07:42 0:00 /usr/local/libexec/slapd -u ldap -h ldap:/// ldaps:///
root 6210 0.0 0.1 4984 780 pts/2 R+ 08:15 0:00 grep slapd
# kill 5089
# /usr/local/libexec/slapd -u ldap
# netstat -an | egrep “389|636”
tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN
tcp 0 0 :::389 :::* LISTEN
unix 2 [ ] DGRAM 13895
まずは、StartTLS拡張操作を行わず(-Zオプションを付けず)にldaps通信ができるかどうか確認する。
# ldapsearch -x -LLL -H ‘ldaps://127.0.0.1/’ -b ‘dc=my-domain,dc=com’ ‘(uid=kakuya)’
ldap_sasl_bind(SIMPLE): Can’t contact LDAP server (-1)
できない。
続いて、-Zオプションを付けて接続できるか確認する。ldaps://はldap://にすること。
# ldapsearch -x -LLL -Z -H ‘ldap://127.0.0.1/’ -b ‘dc=my-domain,dc=com’ ‘(uid=kakuya)’
dn: uid=kakuya,ou=People,dc=my-domain,dc=com
uid: kakuya
cn: kakuya
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
shadowLastChange: 14779
shadowMax: 99999
shadowWarning: 7
uidNumber: 501
gidNumber: 501
homeDirectory: /home/kakuya
できた。本当に389番ポートで暗号通信がなされているかは、パケットをキャプチャして確認しよう。