#author("2018-10-06T13:30:38+00:00","default:sysosa","sysosa")
#author("2018-10-06T13:37:52+00:00","default:sysosa","sysosa")
LDAPサーバを作る

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

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

&size(10){過去記事 [[LDAP/サーバ構築]]};

***インストール [#k2d1a34d]
#code(nonumber){{
[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データベース [#z056e459]
データベース(Berkeley DB)の仕様ファイルをコピーする。
&color(red){*};データベースのコンテンツではないです
#code(nonumber){{
[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
}}
でっかいディレクトリ数を扱うなら修正は必要かと思うが、少数なら変更無くてもいいみたい

***サービス起動 [#i0291bbe]
サーバプログラムとなる「slapd」を起動させます
#code(nonumber){{
[root@ldap ~]# systemctl enable slapd
[root@ldap ~]# systemctl start slapd
}}
「/var/lib/ldap」に関連ファイルが作られます
#code(nonumber){{
[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 ~]#
}}
稼働状態を確認します
#code(nonumber){{
[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 ~]#
}}
問題なく動いているみたい


***管理者パスワードの登録 [#aaf8019d]
ここが良く分からない....ORACLEでいうならSYSTEMのパスワード登録って感じだろうか...MSSQLならsaのパスワードかな.
ハッシュ化されたパスワード文字列は「slappasswd」コマンドで得る
#code(nonumber){{
[root@ldap ~]# slappasswd
New password:
Re-enter new password:
{SSHA}2yKfg6(略
[root@ldap ~]#
}}
&color(red){*};&size(10){上記のハッシュ化されたパスワード文字列は一部消してます。hashcatとかで分かるご時勢なので...};

得られたハッシュ化されたパスワード文字列をldap(slapd)に反映させるには、まず登録用の入力ファイル(LDIF)を別途用意します。
#code(nonumber){{
[root@ldap ~]# cat ldaprootpasswd.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}2yKfg6(略
[root@ldap ~]#
}}
そして ldapadd を使って反映させる

#code(nonumber){{
[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 ~]#
}}


***スキーマ拡張 [#y3b96fba]
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

一筆書きで実行
#code(nonumber){{
[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) [#x28069d9]
まずは、ディレクトリの管理者とデータへのアクセス権をLDIFで定義する
ここではドメインは &color(crimson){dc=sybyl,dc=local};
ディレクトリ管理者は &color(orangered){cn=Manager,dc=sybyl,dc=local};
としています。
#code(nonumber){{
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に反映させる。
#code(nonumber){{
[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行目に問題がるとされた。ここらは&color(red){od};コマンドで確認します。
すると、
#code(nonumber){{
[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」に余計な空白があると分かる。ここを修正して再度登録しなおします。
#code(nonumber){{
[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) [#p0d82700]
トップドメインを用意します。
下記ファイル(&color(green){''domain.ldif''};)には、
-トップドメインの定義(&color(blue){dn: dc=sybyl,dc=local};)
-管理者の定義(&color(blue){dn: cn=Manager,dc=sybyl,dc=local};)
-ユーザの定義枠(&color(blue){dn: ou=People,dc=sybyl,dc=local};)
-グループの定義枠(&color(blue){dn: ou=Group,dc=sybyl,dc=local};)

が含まれてます。
#code(nonumber){{
[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 ~]#
}}
これは新規追加となるので「&color(magenta){ldapadd};」を使います。
「Enter LDAP Password:」とパスワードを問われるが、これはディレクトリ管理者のパスワード.
#code(nonumber){{
[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