LDAPサーバを作る

過去色々作ってみて、最終的にadでアカウント管理を選択したのだが、再度ldapを扱うことになった。
CentOS7で作ってみる

既にActiveDirectory支配下のドメインだけど、「sybyl.local」ドメインでのLDAPサーバを作る。

過去記事 LDAP/サーバ構築

インストール

[root@ldap ~]# yum install openldap-servers openldap-clients
[root@ldap ~]# systemctl status slapd.service
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
[root@ldap ~]#

インストール直後からサーバプログラムとなる「slapd」は起動しないみたい。

LDAPデータベース

データベース(Berkeley DB)の仕様ファイルをコピーする。
*データベースのコンテンツではないです

[root@ldap ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
 
[root@ldap ~]# chown ldap:ldap /var/lib/ldap/DB_CONFIG

でっかいディレクトリ数を扱うなら修正は必要かと思うが、少数なら変更無くてもいいみたい

サービス起動

サーバプログラムとなる「slapd」を起動させます

[root@ldap ~]# systemctl enable slapd
[root@ldap ~]# systemctl start slapd

「/var/lib/ldap」に関連ファイルが作られます

[root@ldap ~]# ls -l /var/lib/ldap/
合計 19124
-rw-r--r-- 1 ldap ldap      845 10月  6 20:27 DB_CONFIG
-rw------- 1 ldap ldap  2326528 10月  6 20:32 __db.001
-rw------- 1 ldap ldap 17448960 10月  6 20:32 __db.002
-rw------- 1 ldap ldap  1884160 10月  6 20:32 __db.003
-rw-r--r-- 1 ldap ldap     2048 10月  6 20:32 alock
-rw------- 1 ldap ldap     8192 10月  6 20:32 dn2id.bdb
-rw------- 1 ldap ldap    32768 10月  6 20:32 id2entry.bdb
-rw------- 1 ldap ldap 10485760 10月  6 20:32 log.0000000001
[root@ldap ~]#
[root@ldap ~]# file /var/lib/ldap/*
/var/lib/ldap/DB_CONFIG:      ASCII text
/var/lib/ldap/__db.001:       Applesoft BASIC program data
/var/lib/ldap/__db.002:       386 pure executable
/var/lib/ldap/__db.003:       386 pure executable
/var/lib/ldap/alock:          data
/var/lib/ldap/dn2id.bdb:      Berkeley DB (Btree, version 9, native byte-order)
/var/lib/ldap/id2entry.bdb:   Berkeley DB (Btree, version 9, native byte-order)
/var/lib/ldap/log.0000000001: Berkeley DB (Log, version 19, native byte-order)
[root@ldap ~]#

稼働状態を確認します

[root@ldap ~]# systemctl status slapd
● slapd.service - OpenLDAP Server Daemon
   Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2018-10-06 20:32:44 JST; 1min 45s ago
     Docs: man:slapd
           man:slapd-config
           man:slapd-hdb
           man:slapd-mdb
           file:///usr/share/doc/openldap-servers/guide.html
  Process: 1015 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS)
  Process: 1001 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS)
 Main PID: 1017 (slapd)
   CGroup: /system.slice/slapd.service
           mq1017 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:///
 :
 :
[root@ldap ~]#

問題なく動いているみたい

管理者パスワードの登録

ここが良く分からない....ORACLEでいうならSYSTEMのパスワード登録って感じだろうか...MSSQLならsaのパスワードかな.
ハッシュ化されたパスワード文字列は「slappasswd」コマンドで得る

[root@ldap ~]# slappasswd
New password:
Re-enter new password:
{SSHA}2yKfg6(略
[root@ldap ~]#

*上記のハッシュ化されたパスワード文字列は一部消してます。hashcatとかで分かるご時勢なので...

得られたハッシュ化されたパスワード文字列をldap(slapd)に反映させるには、まず登録用の入力ファイル(LDIF)を別途用意します。

[root@ldap ~]# cat ldaprootpasswd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}2yKfg6(略
[root@ldap ~]#

そして ldapadd を使って反映させる

[root@ldap ~]# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
 
[root@ldap ~]#

スキーマ拡張

ActiveDirectoryでautofsスキーマ拡張を行ったがそれと同じ感じ. ここでは基本的なスキーマの拡張(追加)です。
既定で用意されているスキーマは「/etc/openldap/schema/」にある。
DBで言えば、、、SYSTEM側のテーブル追加って感じかな. 何を登録できるかは「/etc/openldap/schema/」の「*.schema」を参照
ここでは下記を追加する

  • cosine.ldif
    attributetype: personalTitle, mobileTelephoneNumber, buildingName,,
    objectclass: newPilotPerson,,.
  • nis.ldif
    attributetype: gecos, homeDirectory, loginShell,,
    objectclass: posixAccount, posixGroup,,.
  • inetorgperson.ldif
    attributetype: departmentNumber, employeeNumber, employeeType,,
    objectclass: inetOrgPerson

一筆書きで実行

[root@ldap ~]# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"
 
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
 
[root@ldap ~]#

自分のドメインの設計(その1)

まずは、ディレクトリの管理者とデータへのアクセス権をLDIFで定義する
ここではドメインは dc=sybyl,dc=local
ディレクトリ管理者は cn=Manager,dc=sybyl,dc=local
としています。

dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=sybyl,dc=local" read by * none                          <--- ここ
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=sybyl,dc=local                  <--- ここ
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=sybyl,dc=local       <--- ここ
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxx    <--- slappasswdで再度作る
 
dn: olcDatabase={2}hdb,cn=config              <--- ここ
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
  dn="cn=Manager,dc=sybyl,dc=local" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=sybyl,dc=local" write by * read                 <--- ここ

これを「ldapdomain.ldif」と保存して下記によりLDAPに反映させる。

[root@ldap ~]# ldapmodify -H ldapi:/// -f ldapdomain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
 
modifying entry "olcDatabase={2}hdb,cn=config"
 
ldapmodify: wrong attributeType at line 16, entry "olcDatabase={2}hdb,cn=config"
[root@ldap ~]#

っが、ldapdomain.ldifの16行目に問題がるとされた。ここらはodコマンドで確認します。
すると、

[root@ldap ~]# od -c ldapdomain.ldif
  :
0000560   t   y   p   e   :       m   o   d   i   f   y  \n   r   e   p   <-- [type: modify<br>rep]
0000600   l   a   c   e   :       o   l   c   R   o   o   t   D   N  \n   <-- [lace: olcRootDN<br>]
0000620   o   l   c   R   o   o   t   D   N   :       c   n   =   M   a   <-- [olcRootDN: cn=Ma]
0000640   n   a   g   e   r   ,   d   c   =   s   y   b   y   l   ,   d   <-- [nager,dc=sybyl,d]
0000660   c   =   l   o   c   a   l  \n      \n   d   n   :       o   l  <-- [c=local<br> <br>dn: ol]「\n  \n」と余計な空白がある
0000700   c   D   a   t   a   b   a   s   e   =   {   2   }   h   d   b   <-- [cDatabase={2}hdb]
  :

と「ldapdomain.ldif」に余計な空白があると分かる。ここを修正して再度登録しなおします。

[root@ldap ~]# ldapmodify -H ldapi:/// -f ldapdomain.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
 
modifying entry "olcDatabase={2}hdb,cn=config"
 
modifying entry "olcDatabase={2}hdb,cn=config"
 
modifying entry "olcDatabase={2}hdb,cn=config"
 
modifying entry "olcDatabase={2}hdb,cn=config"
 
[root@ldap ~]#

で完了。

自分のドメインの設計(その2)

トップドメインを用意します。
下記ファイル(domain.ldif)には、

  • トップドメインの定義(dn: dc=sybyl,dc=local)
  • 管理者の定義(dn: cn=Manager,dc=sybyl,dc=local)
  • ユーザの定義枠(dn: ou=People,dc=sybyl,dc=local)
  • グループの定義枠(dn: ou=Group,dc=sybyl,dc=local)

が含まれてます。

[root@ldap ~]# cat domain.ldif
#TOPドメインの定義
dn: dc=sybyl,dc=local
objectClass: top
objectClass: dcObject
objectclass: organization
dc: sybyl
o: sybyl local
description: sybyl Ldap
 
#管理者の定義
dn: cn=Manager,dc=sybyl,dc=local
objectClass: organizationalRole
cn: Manager
description: Directory Manager
 
#people(/etc/passwdなもの)の定義
dn: ou=People,dc=sybyl,dc=local
objectClass: organizationalUnit
ou: People
 
#group(/etc/groupなもの)の定義
dn: ou=Group,dc=sybyl,dc=local
objectClass: organizationalUnit
ou: Group
[root@ldap ~]#

これは新規追加となるので「ldapadd」を使います。
「Enter LDAP Password:」とパスワードを問われるが、これはディレクトリ管理者のパスワード.

[root@ldap ~]# ldapadd -x -D cn=Manager,dc=sybyl,dc=local -W -f domain.ldif
Enter LDAP Password:
adding new entry "dc=sybyl,dc=local"
 
adding new entry "cn=Manager,dc=sybyl,dc=local"
 
adding new entry "ou=People,dc=sybyl,dc=local"
 
adding new entry "ou=Group,dc=sybyl,dc=local"
 
[root@ldap ~]#

これで枠が完成した。


トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2018-10-06 (土) 22:37:52 (42d)