Sunday, July 26, 2009

Getting Started With OpenLDAP on Ubuntu Linux

About



OpenLDAP を Ubuntu Linux にインストールしたその作業メモを記載する。





Environment



環境は次のとおり。

- VMware Server on Ubuntu Linux 8.10 Desktop 64-bit version
- Ubuntu Linux 9.04 Server 32-bit version
- Ubuntu Linux 9.04 in Amazon Web Services





Preface



今回 Ubuntu Linux に OpenLDAP をインストールして設定するため OpenLDAP Server を参考にした。基本的に、このドキュメントと同様の構成でまとめる。日本語に翻訳しにくい部分など、英語のままだったり、直訳っぽかったりするので、そのうち修正する。

環境について言及する。4 GB のメモリがインストールされている ThinkPad T61 に Ubuntu Linux 8.10 desktop の 64-bit バージョンをインストールした。この Ubuntu に VMware Server 2 の 64-bit バージョンをインストールした。この VMware Server に virtual machine を作成し、Ubuntu Linux 9.04 server の 32-bit バージョンをインストールした。この VM に OpenLDAP をインストールする。

また、一部の設定を試験するにあたり Amazon Web Services が提供している AMI を使用する。





Installation



まず、OpenLDAP サーバ deamon である slapd と、LDAP 管理ユーティリティが含まれる ldap-utils をインストールする。

sudo apt-get install slapd ldap-utils



このインストレーションプロセスにおいて、LDAP directory admin のパスワード (と確認) を入力する。任意のパスワードを入力して ENTER キーを押下する。とりあえず

    ldapadmin

を入力した。

デフォルトで、ディレクトリサフィックスは、サーバのドメインネームとマッチする。たとえば、もしサーバマシンの FQDN が ldap.example.com である場合、デフォルトのサフィックスは dc=example,dc=com となる。もし、異なるサフィックスを指定したいなら、dpkg-reconfigure を実行して reconfigure できる。次を、ターミナルプロンプトに入力する :

sudo dpkg-reconfigure slapd



その後、コンフィギュレーションダイアログに基づいたメニューを経由し、様々な slapd オプションの設定が許可される。以下は、メニューで質問される項目と、指定する値だ。

- Omit OpenLDAP server configuratin? : No
- Domain name : satoshiabe.jp
- Organization name : satoshiabejp
- Select a backend database (BDB or HDB) : HBD (The HDB backend is recommendded)
- Do you want the database to be removed when slalpd is purged? : No
- Move old database in /var/lib/ldap : Yes
- Administrator password : ldapadmin
- Allow LDAPv2 protocol : No





Configuration



OpenLDAP は、cn=config DIT (Directory Information Tree) を含むセパレートデータベースを使用する。この cn=config DIT は、ダイナミックに slapd daemon を configure するために使用され、サービスの提供を停止せず、schema 定義、インデックス、ACL などの変更を許可する。この cn=confg tree は ldap-utils パッケージの utilities を使用して操作される。たとえば


  • tree を閲覧するために ldapsearch を使用する --- installation または reconfiguration したときに設定したアドミンパスワードを入力する。


  • ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase={1}hdb



    $ ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase={1}hdb
    Enter LDAP Password:
    dn: olcDatabase={1}hdb,cn=config
    objectClass: olcDatabaseConfig
    objectClass: olcHdbConfig
    olcDatabase: {1}hdb
    olcDbDirectory: /var/lib/ldap
    olcSuffix: dc=satoshiabe,dc=jp
    olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=satosh
    iabe,dc=jp" write by anonymous auth by self write by * none
    olcAccess: {1}to dn.base="" by * read
    olcAccess: {2}to * by dn="cn=admin,dc=satoshiabe,dc=jp" write by * read
    olcLastMod: TRUE
    olcDbCheckpoint: 512 30
    olcDbConfig: {0}set_cachesize 0 2097152 0
    olcDbConfig: {1}set_lk_max_objects 1500
    olcDbConfig: {2}set_lk_max_locks 1500
    olcDbConfig: {3}set_lk_max_lockers 1500
    olcDbIndex: objectClass eq

    $

    上記の出力は、HDB バックエンドデータベースの現在のコンフィギュレーションオプションである。上記の例は dc=satoshiabe,dc=jp サフィックスを含んでいる。

  • フィルタを提供してサーチをリファインする、この場合インデックスされたアトリビュートのみが表示される。


  • ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase={1}hdb olcDbIndex



    $ ldapsearch -xLLL -b cn=config -D cn=admin,cn=config -W olcDatabase={1}hdb olcDbIndex
    Enter LDAP Password:
    dn: olcDatabase={1}hdb,cn=config
    olcDbIndex: objectClass eq

    $

  • cn=config tree 編集の例として、ldapmodify を実行して、もうひとつのアトリビュートをインデックスリストへ追加する。


  • ldapmodify -x -D cn=admin,cn=config -W



    $ ldapmodify -x -D cn=admin,cn=config -W
    Enter LDAP Password:
    dn: olcDatabase={1}hdb,cn=config
    add: olcDbIndex
    olcDbIndex: cn eq,pres,sub

    modifying entry "olcDatabase={1}hdb,cn=config"

    $

  • ldapmodify は、変更をファイルからも読み込める。次の行をコピーアンドペーストし uid_index.ldif という名前でファイルを作成する。


  • dn: olcDatabase={1}hdb,cn=config
    add: olcDbIndex
    olcDbIndex: uid eq,pres,sub



    ldapmodify を実行する。

    ldapmodify -x -D cn=admin,cn=config -W -f uid_index.ldif



    $ ldapmodify -x -D cn=admin,cn=config -W -f uid_index.ldif
    Enter LDAP Password:
    modifying entry "olcDatabase={1}hdb,cn=config"

    $

    このメソッドは、大きな変更を実行するときに有効だ。

  • slapd に、アディショナルな schema を追加するために LDIF フォーマットにコンバートされた schema が要求される。幸いにも、slapd プログラムは、このコンバージョンを自動化できる。続く例は misc.schema を追加する。


  • 1. まず schema_convert.conf という名前のファイルを作成し、そのファイルに次の内容を記述する。

    include /etc/ldap/schema/core.schema
    include /etc/ldap/schema/collective.schema
    include /etc/ldap/schema/corba.schema
    include /etc/ldap/schema/cosine.schema
    include /etc/ldap/schema/duaconf.schema
    include /etc/ldap/schema/dyngroup.schema
    include /etc/ldap/schema/inetorgperson.schema
    include /etc/ldap/schema/java.schema
    include /etc/ldap/schema/misc.schema
    include /etc/ldap/schema/nis.schema
    include /etc/ldap/schema/openldap.schema
    include /etc/ldap/schema/ppolicy.schema



    2. 続いて、出力を保持するためのテンポラリなディレクトリを作成する。

    mkdir /tmp/ldif_output



    3. 続いて schema ファイルを LDIF へコンバートするために slaptest を実行する。

    sudo slaptest -f schema_convert.conf -F /tmp/ldif_output



    4. /tmp/ldif_output/cn=config/cn=schema/cn={8}misc.ldif ファイルを編集し、次のアトリビュートを変更する。

    sudo vi /tmp/ldif_output/cn=config/cn=schema/cn={8}misc.ldif



    次のアトリビュートを変更する。

    dn: cn=misc,cn=schema,cn=config
    ...
    cn: misc



    また、ファイルの最下部から次の行を削除する。

    structuralObjectClass: olcSchemaConfig
    entryUUID: 10dae0ea-0760-102d-80d3-f9366b7f7757
    creatorsName: cn=config
    createTimestamp: 20080826021140Z
    entryCSN: 20080826021140.791425Z#000000#000#000000
    modifiersName: cn=config
    modifyTimestamp: 20080826021140Z



    5. 最後に ldapadd ユーティリティを実行し、ディレクトリに新しい schema を追加する。

    sudo ldapadd -x -D cn=admin,cn=config -W -f /tmp/ldif_output/cn\=config/cn\=schema/cn\=\{8\}misc.ldif



    There should now be a dn: cn={4}misc,cn=schema,cn=config entry in the cn=config tree.






Populating LDAP



ディレクトリは、installation または reconfiguration の途中で作成されたので、続いて、情報を追加する。"classical" な scheme - address book application と Unix Posix accounts とにコンパチブルな - により追加される。Posix accounts は、様々なアプリケーション - Web applications や MTA applications など - を認証を許可する。

外部 application が LDAP を使用して認証するためには、互いに特定の configure をしなければならない。詳細な情報を、個々の application の documentation を参照すること。

LDAP directories は LDIF ファイルにより populate される。次の例の LDIF ファイルをコピーし john.ldif とネーミングし、ファイルシステムのどこかに保存する。

dn: ou=People,dc=satoshiabe,dc=jp
objectClass: organizationalUnit
ou: People

dn: ou=Groups,dc=satoshiabe,dc=jp
objectClass: organizationalUnit
ou: Groups

dn: uid=john,ou=People,dc=satoshiabe,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 10000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@satoshiabe.jp
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress:
initials: JD

dn: cn=example,ou=Groups,dc=satoshiabe,dc=jp
objectClass: posixGroup
cn: example
gidNumber: 10000



この例において、ディレクトリ構造とユーザとグループがセットアップされる。他の例において、すべてのエントリに objectClass: top が追加されるかもしれないが、それはデフォルトのふるまいで、明示的にそれを追加しなければならないわけでない。

エントリを LADP directory 追加するために ldapadd ユーティリティを使用する。

ldapadd -x -D cn=admin,dc=satoshiabe,dc=jp -W -f john.ldif



$ ldapadd -x -D cn=admin,dc=satoshiabe,dc=jp -W -f john.ldif
Enter LDAP Password:
adding new entry "ou=people,dc=satoshiabe,dc=jp"

adding new entry "ou=groups,dc=satoshiabe,dc=jp"

adding new entry "uid=john,ou=people,dc=satoshiabe,dc=jp"

adding new entry "cn=example,ou=groups,dc=satoshiabe,dc=jp"

$

ldap-utils パッケージのツールにより、内容が正常に追加されたかをチェックできる。LDAP directory の検索を実行するために :

ldapsearch -xLLL -b "dc=satoshiabe,dc=jp" uid=john sn givenName cn



$ ldapsearch -xLLL -b "dc=satoshiabe,dc=jp" uid=john sn givenName cn
dn: uid=john,ou=people,dc=satoshiabe,dc=jp
sn: Doe
givenName: John
cn: John Doe

$


  • -x: will not use SASL authentication method, which is the default.

  • -LLL: disable printing LDIF schema information.







LDAP replication



しばしば LDAP は、早期に high クリティカルなネットワークのサービスとなりえる。複数のシステムは、認証および承認およびコンフィギュレーションなどのために LDAP に依存するようになる。レプリケーションを通じてリダンダントシステムをセットアップすることは、よいアイディアである。

...

以下の example は、複数のマスターコンフィギュレーションである。この設定により互いの OpenLDAP サーバは、互いに push と pull の replication を実現する。

1. 最初に、cn=config データベースを同期するサーバを設定する。syncrepl_cn-config.ldif という名前のファイルを作成する。

dn: cn=module{0},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: syncprov

dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldap://172.16.227.129
olcServerID: 2 ldap://172.16.227.130

dn: olcOverlay=syncprov,olcDatabase={0}config,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov

dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001 provider=ldap://172.16.227.129 binddn="cn=admin,cn=config" bindmethod=simple
credentials=secret searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
olcSyncRepl: rid=002 provider=ldap://172.16.227.130 binddn="cn=admin,cn=config" bindmethod=simple
credentials=secret searchbase="cn=config" type=refreshAndPersist
retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE


2. Edit the file changing

IP address が記述されている部分を、自分の環境に適用させる。2 つ以上の LDAP サーバを保持でき、そして 1 台に変更が発生したとき、残りのサーバに同期される。olcServerID の値を、また olcSyncRepl エントリの rid もインクリメントすること。また、credentials=secret に admin password を指定する。

3. 次に ldapmodify utility を使用して、この LDIF ファイルを追加する。

ldapmodify -x -D cn=admin,cn=config -W -f syncrepl_cn-config.ldif



4. もう一方の LDAP サーバに syncrepl_cn-config.ldif をコピーし上記の ldapmodify コマンドを実行する。

5. 新しいモジュールが追加されたので、すべての replicated servers の slapd daemon は再起動が必要とされる。

sudo /etc/init.d/slapd restart



6. 現在、互いのサーバの configuration database は sync される。backend database も同様に sync が必要とされる。以下をコピーアンドベースとしもうひととの LDIF ファイルを syncrepl_backend.ldif という名前で作成する。

dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=admin,dc=satoshiabe,dc=jp
-
add: olcSyncRepl
olcSyncRepl: rid=003 provider=ldap://172.16.227.129 binddn="cn=admin,dc=satoshiabe,dc=jp"
bindmethod=simple credentials=secret searchbase="dc=satoshiabe,dc=jp" type=refreshOnly
interval=00:00:00:10 retry="5 5 300 5" timeout=1
olcSyncRepl: rid=004 provider=ldap://172.16.227.130 binddn="cn=admin,dc=satoshiabe,dc=jp"
bindmethod=simple credentials=secret searchbase="dc=satoshiabe,dc=jp" type=refreshOnly
interval=00:00:00:10 retry="5 5 300 5" timeout=1
-
add: olcMirrorMode
olcMirrorMode: TRUE

dn: olcOverlay=syncprov,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov


7. 前回の LDIF ファイルのようにファイルを編集する。


  • searchbase="dc=satoshiabe,dc=jp" を、自分の directory's searchbase に変更する。

  • もし異なる admin ユーザを使用しているなら binddn="cn=admin,dc=satoshiabe,dc=jp" を変更する。

  • credentials=secret を自分の admin パスワードに変更する。



8. LDIF ファイルを追加する。

ldapmodify -x -D cn=admin,cn=config -W -f syncrepl_backend.ldif



サーバの configuration は既に同期されているため、もう一方のサーバに LDIF ファイルのコピーを必要としない。現在この configuration と backend databases は、他のサーバに同期される。必要ならば、追加のサーバを ldapmodify utility を使用して追加できる。“Configuration” セクションで詳細を確認できる。デフォルトで slapd daemon は、/var/log/syslog にログを送信する。





Setting up ACL



// TODO :





TLS and SSL



// TODO :





LDAP Authentication



Once you have a working LDAP server, the auth-client-config and libnss-ldap packages take the pain out of configuring an Ubuntu client to authenticate using LDAP.
これらのパケージをインストールするために、ターミナルプロンプトに入力する :

sudo apt-get install libnss-ldap



使用する LDAP server の URI を指定する。画面に ldapi:/// と入力されているが、これを ldap://127.0.0.1/ と指定しておく。

続いて、LDAP search base の distinguished name を入力する。これを dc=satoshiabe,dc=jp

続いて ldapns により使用される LDAP のバージョンを選択する。バージョン 3 を選択する。

続いて、パスワードユーティリティに pam - local なパスワードを変更するように振る舞う - を使用するか、を選択する。もし、/etc を NFS で mount しているなら NO を選択する。今回、YES を選択する。

続いて、LDAP database にログインを要求するか、を選択する。NO を選択する。

LDAP account for root を指定する。root のパスワードが変更されたとき、このアカウントが使用される。cn=admin,dc=satoshiabe,dc=jp

続いて、ldap-auth-config が LDAP account for root を使用して LDAP directory にログインするときに使用するパスワードを入力する。もし empty password を入力すると、古いパスワードが再利用される。


情報を入力していときに間違ってしまったなら、再度、情報を入力できる。

sudo dpkg-reconfigure ldap-auth-config




結果を /etc/ldap.conf で確認できる。もし、メニューが必要とするオプションをカバーしていないなら、このファイルを編集する。


Now, libnss-ldap は、次のコマンドラインを入力することにより auth-client-config LDAP profile を有効にするよう設定される。

sudo auth-client-config -a -p lac_ldap




  • -a: applies the specified profile.

  • -p: name of the profile to enable, disable, etc.

  • lac_ldap: the auth-client-config profile that is part of the ldap-auth-config package.



これで、 LDAP directory にストアされている user credentials を使用してログインできる。


****************************************
Ubuntu 9.04 の場合、ここで BUG らしき状況に遭遇する。
Bug #295008 in ldap-auth-client (Ubuntu): “Running "auth-client-config -p lac_ldap" gives error (2)”

回避するための手順を記載する。まず、事象から記載する。

% sudo auth-client-config -a -p lac_ldap
[sudo] password for satoshiabe:
Error in updating the file: 'pam_account' not found
--
Errors found. Aborting (no changes made)
$

というように、auth-client-config を実行するとエラーが発生してしまう。

次のコマンドを実行し、

$ sudo auth-client-config -t nss -p lac_ldap

続いて、次のコマンドを実行する。

$ sudo pam-auth-update ldap
PAM profiles to enable:

[*] Unix authentication
[*] LDAP Authentication
[*] ConsoleKit Session Management
****************************************


You should now be able to login using user credentials stored in the LDAP directory.





User and Group Management



ldap-utils package は、複数のユーティリティから構成され、ディレクトリをマネージするが、長い文字列のオプションを必要とし、使用する負担となり得る。ldapscripts package に、簡単に LDAP ユーザとグループをマネージするための configurable script が含まれる。そのパッケージをインストールするために、ターミナルに次のように入力する。

sudo apt-get install ldapscripts



次に /etc/ldapscripts/ldapscripts.conf ファイルを編集する。以下の行を、環境に適用するよう uncommenting または変更する。

SERVER=localhost
BINDDN='cn=admin,dc=satoshiabe,dc=jp'
BINDPWDFILE="/etc/ldapscripts/ldapscripts.passwd"
SUFFIX='dc=satoshiabe,dc=jp'
GSUFFIX='ou=Groups'
USUFFIX='ou=People'
MSUFFIX='ou=Computers'
GIDSTART=10000
UIDSTART=10000
MIDSTART=10000



ldapscripts.passwd ファイルを作成して、ディレクトリへの認証されたアクセスを許可する。

sudo sh -c "echo -n 'secret' > /etc/ldapscripts/ldapscripts.passwd"
sudo chmod 400 /etc/ldapscripts/ldapscripts.passwd



:: Note : "secret" を実際のパスワード - LDAP admin user の - にリプレースする

さて ldapscripts を、ディレクトリをマネージする助けとするよう準備した。どのように scripts を使用するか、いくつか例を挙げる。


  • 新しいユーザを作成する


  • sudo ldapadduser george example



    これは、uid が george で、ユーザのプライマリグループ (gid) が example のユーザを作成する。

  • Change a user's password


  • sudo ldapsetpasswd george
    Changing password for user uid=george,ou=People,dc=example,dc=com
    New Password:
    New Password (verify):



  • Delete a user


  • sudo ldapdeleteuser george



  • Add a group


  • sudo ldapaddgroup qa



  • Delete a group


  • sudo ldapdeletegroup qa



  • Add a user to a group


  • sudo ldapaddusertogroup george qa



  • Remove a user from a group


  • sudo ldapdeleteuserfromgroup george qa



  • ldapmodifyuser script は、ユーザ属性の追加や削除や変更を許可する。このスクリプトは ldapmodify utility と同じ syntax を使用する。たとえば


  • sudo ldapmodifyuser george
    # About to modify the following entry :
    dn: uid=george,ou=People,dc=example,dc=com
    objectClass: account
    objectClass: posixAccount
    cn: george
    uid: george
    uidNumber: 1001
    gidNumber: 1001
    homeDirectory: /home/george
    loginShell: /bin/bash
    gecos: george
    description: User account
    userPassword:: e1NTSEF9eXFsTFcyWlhwWkF1eGUybVdFWHZKRzJVMjFTSG9vcHk=

    # Enter your modifications here, end with CTRL-D.
    dn: uid=george,ou=People,dc=example,dc=com
    replace: gecos
    gecos: George Carlin



  • Another great feature of ldapscripts, is the template system. Templates allow you to customize the attributes of user, group, and machine objectes. For example, to enable the user template edit /etc/ldapscripts/ldapscripts.conf changing:


  • UTEMPLATE="/etc/ldapscripts/ldapadduser.template"



    There are sample templates in the /etc/ldapscripts directory. Copy or rename the ldapadduser.template.sample file to /etc/ldapscripts/ldapadduser.template:

    sudo cp /etc/ldapscripts/ldapadduser.template.sample /etc/ldapscripts/ldapadduser.template



    Edit the new template to add the desired attributes. The following will create new user's as with an objectClass of inetOrgPerson:

    dn: uid=<user>,<usuffix>,<suffix>
    objectClass: inetOrgPerson
    objectClass: posixAccount
    cn: <user>
    sn: <ask>
    uid: <user>
    uidNumber: <uid>
    gidNumber: <gid>
    homeDirectory: <home>
    loginShell: <shell>
    gecos: <user>
    description: User account
    title: Employee



    Notice the <ask> option used for the cn value. Using will configure ldapadduser to prompt you for the attribute value during user creation.


There are more useful scripts in the package, to see a full list enter: dpkg -L ldapscripts | grep bin





Resources



http://www.openldap.org/

OpenLDAP Server

No comments: