OpenShift v3 のLDAP認証

OpenShiftの設定はマニュアルに書いてありありますが、そもそもLDAPサーバの証明書の準備などなど少し手間取ったので、メモです。

LDAPサーバの準備

インストール

これらのページを参照

  1. http://linux-hacking-guide.blogspot.jp/2015/04/ldap-authentication-server-in-rhel7.html
  2. http://www.certdepot.net/rhel7-configure-ldap-directory-service-user-connection/

確認

参照サイト(2)の方法で、/etc/passwd からユーザを移行している場合は、以下のコマンドで確認できます。

ldapsearch -x cn=ldapuser01 -b dc=example,dc=com
curl "ldap://client.cloud:389/dc=example,dc=com?cn?sub?uid=ldap*" -u "cn=Manager,dc=example,dc=com"
Enter host password for user 'cn=Manager,dc=example,dc=com’:redhat

DN: uid=ldapuser01,ou=People,dc=example,dc=com
    cn: ldapuser01
password=user01ldap

DN: uid=ldapuser02,ou=People,dc=example,dc=com
    cn: ldapuser02

password=user02ldap

TLSの利用設定とオレオレ証明書発行

証明書の発行

参照サイト (1) の以下の手順で証明書を発行します。

10) Create Server Certificate. Follow the following steps:

10.1) Create a local Certificate Authority (CA).

[root@oserver1 ~]# /etc/pki/tls/misc/CA  -newca

ここで設定するホスト名は、LDAPサーバのホスト名にしました。

10.2) Create public-private key pair

[root@oserver1 ~]#  openssl genrsa -out ldapserver.key

10.3) Create a certificate signing request (CSR)

[root@oserver1 ~]# openssl req -new -key ldapserver.key -out ldapserver.csr

10.4) Sign the certificate with the local CA.

[root@oserver1 ~]# openssl ca -in ldapserver.csr -out ldapserver.crt

10.5) Copy the files 'ldapserver.key' and 'ldapserver.crt' to the dir. '/etc/openldap/certs/'

10.6) We have to copy the CA cert file '/etc/pki/CA/cacert.pem' to the dir '/etc/openldap/cacerts/' on every client machine.

10.7)Create a file 'cert.ldif' with the following entries.

          dn: cn=config
          changetype: modify
          replace: olcTLSCertificateFile
          olcTLSCertificateFile: /etc/openldap/certs/ldapserver.crt

          dn: cn=config
          changetype: modify
          replace: olcTLSCertificateKeyFile
          olcTLSCertificateKeyFile: /etc/openldap/certs/ldapserver.key

10.8) Make entry

[root@oserver1 ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f cert.ldif

追加設定

※ここは私の勘違いがありそうな予感。。。 TLSCACerfiticationを有効にするため、/etc/openldap/slapd.d/cn=config.ldifolcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pemの記述を追加します。 すでに、olcTLSCACertificateFileの定義がある場合は、次のldifを使って更新します。

dn: cn=config
changetype: modify
replace: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/openldap/cacerts/cacert.pem

ldaps の有効化

/etc/sysconfig/slapdを編集してSLAPD_URLSを変更します。

#SLAPD_URLS="ldapi:/// ldap:///"
SLAPD_URLS="ldapi:/// ldap:/// ldaps:///"

トラブルシューティング

データベースの更新エラー

色々と悪銭苦闘していると、証明書を発行し直したり。で、そんなこんなでopenssl ca実行時にエラーが発生。

failed to update database
TXT_DB error number 2

古い証明書を無効にする必要があります。

openssl ca -revoke /etc/pki/CA/newcerts/00.pem

revokeもできない場合は、`/etc/pki/CA/index.txt を編集します。

cp -p /etc/pki/CA/index.txt{,.old}
: > /etc/pki/CA/index.txt

動作確認

# openssl s_client -connect client.cloud:636 -CAfile my-ldap-ca-bundle.crt 
CONNECTED(00000003)
depth=1 C = XX, ST = Default State, O = Default Company Ltd, OU = Default Organization, CN = client.cloud
verify return:1
depth=0 C = XX, ST = Default State, O = Default Company Ltd, OU = Default Organization, CN = client.cloud
verify return:1
---
Certificate chain
 0 s:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
   i:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
 1 s:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
   i:/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDbDCCAlSgAwIBAgIJANs2X7OV8HUkMA0GCSqGSIb3DQEBCwUAMHkxCzAJBgNV
BAYTAlhYMRYwFAYDVQQIDA1EZWZhdWx0IFN0YXRlMRwwGgYDVQQKDBNEZWZhdWx0
IENvbXBhbnkgTHRkMR0wGwYDVQQLDBREZWZhdWx0IE9yZ2FuaXphdGlvbjEVMBMG
A1UEAwwMY2xpZW50LmNsb3VkMB4XDTE1MTAwNzIxNDQyNFoXDTE2MTAwNjIxNDQy
NFoweTELMAkGA1UEBhMCWFgxFjAUBgNVBAgMDURlZmF1bHQgU3RhdGUxHDAaBgNV
BAoME0RlZmF1bHQgQ29tcGFueSBMdGQxHTAbBgNVBAsMFERlZmF1bHQgT3JnYW5p
emF0aW9uMRUwEwYDVQQDDAxjbGllbnQuY2xvdWQwgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBAMOUaNe/BY4cj6Q5eFZvfsKMnLCKXP6Ui6MVA4D5FuxoU7lSfUm5
VIvcxsxJNWGExPC9ZpDK0Yulpr3+FXbRhcwcZb6N5/F2UldamC4mscZT1AsfwRZJ
zMN+14HGV0lfAGkaA/ctbgOw41rd0oyy+VGODRAUMFlt6kF7/VFixTITAgMBAAGj
ezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVk
IENlcnRpZmljYXRlMB0GA1UdDgQWBBSRtt3qakgF9XS09BNnhT8GfT7C6zAfBgNV
HSMEGDAWgBShCPFk9kdbkAQoYRxf46abhM6DzTANBgkqhkiG9w0BAQsFAAOCAQEA
IVGB3hSQWXzAl2jHP8pHQ/s1qeRQZAKHuCp687CycikhSVgVd/VFA+VLeoTJrL7m
ESdfz0L3j+jJtlWTjN9Evs4QJBfqHkIyFlxz+ud0k+2tXdggqV+Cqo1i0hi+u9F1
KZL8BhPJwnN+Z8vEhA0RaWctqbTr2jMJ0ySEHGghmaPEggkZjbJ7TCub4KCwlKVF
12XIAEr4xLx6eOlwFQRmC8TpgGkKLj2HZ/k+7ywlApbv1zJErq3C1fyB9TQNNPEX
0Wdow+uuIQIgCog65YepsVHE4cMikX0uaXZW3tyE6FcD0Y3uaU9+X5pyJ+XGosC4
i46cMdt0xQutdACKdrRteA==
-----END CERTIFICATE-----
subject=/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
issuer=/C=XX/ST=Default State/O=Default Company Ltd/OU=Default Organization/CN=client.cloud
---
No client certificate CA names sent
---
SSL handshake has read 2003 bytes and written 439 bytes
---
New, TLSv1/SSLv3, Cipher is AES128-GCM-SHA256
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : AES128-GCM-SHA256
    Session-ID: 268668D6A0B3813C46718D3502D5F028A068BE44F5A9CE23407611499A62D77D
    Session-ID-ctx: 
    Master-Key: 808949603CFADCDC98FDB435495C3DE5D8A6106FD2214D891142148F5FE5CC546A552F19EF90C45BCBE02E0AAB00AE28
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    Start Time: 1444300644
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

OpenShiftの認証設定 

証明証の配置

LDAPサーバから証明書(/etc/openldap/cacerts/cacert.pem)を取得して、/etc/openshift/master/my-ldap-ca-bundle.crtに保存します。

oauthConfig:
  assetPublicURL: https://master.cloud:8443/console/
  grantConfig:
    method: auto
  identityProviders:
  - name: my_ldap_provider
    challenge: True
    login: True
    provider:
      apiVersion: v1
      kind: LDAPPasswordIdentityProvider
      attributes:
        id:
        - dn
        email:
        - mail
        name:
        - cn 
        preferredUsername:
        - uid
      bindDN: "cn=Manager,dc=example,dc=com"
      bindPassword: "redhat"
      ca: "my-ldap-ca-bundle.crt"
      insecure: false
      url: "ldaps://client.cloud:636/dc=example,dc=com?uid"

なお、CAの認証をしない場合、cainsecureurlの設定は以下の通りです。

ca: ""
insecure: true
url: "ldap://client.cloud:389/dc=example,dc=com?uid"

openshift-master を再起動して、LDAP認証の完了です