OpenLDAP

 Fedora Cora 5 へOpenLDAPをインストールしてみました。

目次

準備

 # yum install openldap-server openldap-client
 # yum install openldap-servers openldap-clients
 # rpm -qa | grep openldap
 openldap-clients-2.3.19-4
 openldap-devel-2.3.19-4
 openldap-2.3.19-4
 openldap-servers-2.3.19-4

 設定ファイルはコピーしておきます。

 # cp /etc/ldap.conf /etc/ldap.conf.original
 # cp -r openldap/ openldap.original
 # ls -dl openldap openldap.original/

 サーバ証明書などのありかを確認します。例えば、Apache HTTPD Server でHTTPSが使えるようにしてあるなら、すでにSSLを使ってサーバ証明書などを作成しているはずですから、/etc/httpd/conf.d/ssl.conf をみてOpenSSLで生成されたサーバ証明書、秘密鍵のファイル名を確認しておきます。もしなければこちらを参考にするなどして作成をしてください。

SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key

 ldapサーバの起動ユーザが参照できるようにグループ、モードを変更しておきます。

 # chgrp ldap /etc/pki/tls/private/localhost.key
 # chgrp ldap /etc/pki/tls/certs/localhost.crt
 # chmod g+r /etc/pki/tls/certs/localhost.crt
 # chmod g+r /etc/pki/tls/private/localhost.key

 ちなみに、SSLRandomSeedで /dev/random、/dev/urandom どちらを使うか指定ができることを初めて知りました。/dev/randomが調子悪いときは /dev/urandom を使うように指定するといいようです。

SSLRandomSeed startup file:/dev/urandom  256

設定

 設定は「 /etc/openldap/slapd.conf 」にあります。これを以下のように編集します。なお、LDAPのデータベースファイルは,/var/lib/ldapディレクトリ内に格納されますから、データベースを破棄したい場合は/var/lib/ldapディレクトリにあるファイルを削除します。ここでは、変更分だけ示しておきます。「TLSCACertificateFile」にはFedora Core 5であらかじめ用意されているファイル 「 /etc/pki/tls/certs/ca-bundle.crt 」を指定しています。

  TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
  TLSCertificateFile /etc/pki/tls/certs/localhost.crt
  TLSCertificateKeyFile /etc/pki/tls/private/localhost.key

  database        bdb
  suffix          "dc=localhost,dc=localdomain"
  rootdn          "cn=Manager,dc=localhost,dc=localdomain"
  # slappasswd -h {SSHA} -s changeit
  # rootpw        changeit
  rootpw          {SSHA}Yl8SUby2Ry2qq5/EbKE847dhqb7ZcNef

 TLS/SSL対応のために、/etc/openldap/ldap.conf も次のように編集しておきます。

 HOST 127.0.0.1
 BASE dc=localhost,dc=localdomain
 #TLS_CACERTDIR /etc/openldap/cacerts
 TLS_CACERTDIR /etc/pki/tls/certs
 TLS_CACERT /etc/pki/tls/certs/ca-bundle.crt

 暗号化されたパスワード用文字列はslappasswdコマンドを使って取得することができます。次の例ではMD5、SHA、SSHAでchangeitという文字列の暗号化をする方法を示しています。

   # slappasswd -h {MD5} -s changeit
   # slappasswd -h {SHA} -s changeit
   # slappasswd -h {SSHA} -s changeit

データの投入

 slapaddを実行することにより、オフラインでのデータ追加ができます。データは次の通りで、suffix_entry.ldifへ保存しておきます。

#root
dn: dc=localhost,dc=localdomain
dc: localhost
objectClass: dcObject
objectClass: organizationalUnit
ou: localhost dot localdomain organization

# person organizational unit
dn: ou=people,dc=localhost,dc=localdomain
ou: people
objectClass: organizationalUnit

 追加は次のコマンドで行います。データベースの設定をしていないので警告がでています。

 # slapadd -b 'dc=localhost,dc=localdomain' < suffix_entry.ldif
 bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)
 Expect poor performance for suffix dc=localhost,dc=localdomain.
 # chown -R ldap:ldap /var/lib/ldap/

 追加したデータの確認は下記の通りです。データベースの設定をしていないので警告がでています。

 # slapcat -b 'dc=localhost,dc=localdomain'
 bdb_db_open: Warning - No DB_CONFIG file found in directory /var/lib/ldap: (2)
 Expect poor performance for suffix dc=localhost,dc=localdomain.
 dn: dc=localhost,dc=localdomain
 dc: localhost
 objectClass: dcObject
 objectClass: organizationalUnit
 ou: localhost dot localdomain organization
 structuralObjectClass: organizationalUnit
 entryUUID: 9e205cd2-83e6-102a-952b-d718202c6772
 creatorsName: cn=Manager,dc=localhost,dc=localdomain
 modifiersName: cn=Manager,dc=localhost,dc=localdomain
 createTimestamp: 20060530051221Z
 modifyTimestamp: 20060530051221Z
 entryCSN: 20060530051221Z#000000#00#000000
 
 dn: ou=people,dc=localhost,dc=localdomain
 ou: people
 objectClass: organizationalUnit
 structuralObjectClass: organizationalUnit
 entryUUID: 9e332dc6-83e6-102a-952c-d718202c6772
 creatorsName: cn=Manager,dc=localhost,dc=localdomain
 modifiersName: cn=Manager,dc=localhost,dc=localdomain
 createTimestamp: 20060530051221Z
 modifyTimestamp: 20060530051221Z
 entryCSN: 20060530051221Z#000001#00#000000

 次にユーザを追加しました。ここではパスワードを暗号化していませんが、「slappasswd -h {SHA} -s changeit」のようにして暗号化したパスワードをuserPasswordへ指定することもできます。

# hiro
dn: uid=hiro,ou=people,dc=localhost,dc=localdomain
objectClass:inetOrgPerson
cn: hiro
sn: yuki
uid: hiro
userPassword: vf3pai

# akira
dn: uid=akira,ou=people,dc=localhost,dc=localdomain
objectClass:inetOrgPerson
cn: akira
sn: yuki
uid: akira
userPassword: vf4evo

ポート

 ldap関係のサービスポートは下記の通りです。lokkitなどで必要なポートを開けてからクライアントからアクセスするようにします。

 # cat /etc/services | grep ldap
 ldap            389/tcp
 ldap            389/udp
 ldaps           636/tcp                         # LDAP over SSL
 ldaps           636/udp                         # LDAP over SSL
 www-ldap-gw     1760/tcp                        # www-ldap-gw
 www-ldap-gw     1760/udp                        # www-ldap-gw
 ldap-admin      3407/tcp                        # LDAP admin server port
 ldap-admin      3407/udp                        # LDAP admin server port

起動と停止

OpenLDAPの起動と停止には /etc/rc.d/init.d/ldap を使います。

  # /etc/rc.d/init.d/ldap start
  # /etc/rc.d/init.d/ldap stop

GUI LDAPクライアント

 LDAP Browser/Editorなどいろいろとあります。ここまでの設定できちんと動作しているか、LDAPクライアントを使って動作確認しておきましょう。

 次のように指定してConnectすると、anonymousで接続します。

Host: 192.168.0.1
Base Dn: dc=localhost,dc=localdomain

 オプションで、SSLをチェックするとldapsでアクセスしますし、anonymousのチェックを外すと、ユーザ単位でアクセスができます。User Infoへは、次のような値を設定します。パスワードは暗号化される前のuserPasswordの値を指定すればいいです。

User Dn: uid=hiro,ou=people,dc=localhost,dc=localdomain
Password: vf3pai

 管理者としてアクセスするには次のようにすれば良いでしょう。

User Dn: cn=Manager,dc=localhost,dc=localdomain
Password: changeit

 

LDAP認証

 /etc/httpd/conf/httpd.conf で認証の設定を追加します。Apache2.2ではmod_authnz_ldapモジュールを使います。認証段階ではBASIC認証を指定し、その際にLDAPを使うようにするために、AuthBasicProviderでldapを指定しています。また、入力された値と比較するためにLDAPから検索する属性をAuthLDAPURLで指定します。この場合はuidを検索して、一致したuidから対応するdnを取得し、そのdnが持つuserPassword属性の値と入力されたパスワードの値を使って認証が行われます。今回の承認段階では、認証が行われた人はだれでもこのURIへアクセスしてもよいので、require vaild-userとして、AuthLDAPAuthoritativeをoffにしておきます。もっと高度な承認をすることもできるので、その場合はマニュアルを参考にして設定しましょう。

<Location /secret>
    # 認証
    AuthType Basic
    AuthBasicProvider ldap
    AuthName "Secret"
    AuthLDAPURL ldap://localhost/ou=people,dc=localhost,dc=localdomain?uid
    # 承認
    require valid-user
    AuthzLDAPAuthoritative off
</Location>

 ちなみにApache2.0の場合は次のように設定するらしいです。

<Location /secret>
  AuthType  Basic
  AuthName  "Secret"
  AuthLDAPURL  ldap://localhost/dc=localhost,dc=localdomain?uid
  require   valid-user
</Location>

アクセス制御

 アクセス制御リストを指定して、anonymousでLDAPへアクセスした場合は、パスワードが見えないようにします。ただし、認証時にはanonymousでアクセスしてくるので、その場合には使えるように設定をします。本人であることが認証できたら、表示して編集できるようにしています。もちろん管理者も編集できるようにしておきます。「 /etc/openldap/slapd.conf 」へ次を追加してLDAPを再起動しましょう。これで、パスワードが他の人には見えなくなるはずです。

access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=localhost,dc=localdomain" write
    by anonymous auth
    by * none

access to *
    by dn="cn=Manager,dc=localhost,dc=localdomain" write
    by self write
    by * read
同じカテゴリの記事: Linux