LDAP ( 2 )

May 06, 2018

openLDAP の導入

今回は Linux ユーザの統合管理を行うために、openLDAP を導入し、LDAP サーバを構築する。
LDAP クライアントは、この LDAP サーバに問い合わせを行うことにより、ユーザの認証を行うことになる。

今回は同一 VPC における複数のインスタンスを LDAP クライアントとし、これらが LDAP サーバに問い合わせを行う構成とする。
なお LDAP クライアント及びサーバの環境として、全て以下の Amazon Linux AMI を用いることとする。

$ cat /etc/os-release   
NAME="Amazon Linux AMI"  
VERSION="2018.03"  
ID="amzn"  
ID_LIKE="rhel fedora"  
VERSION_ID="2018.03"  
PRETTY_NAME="Amazon Linux AMI 2018.03"  
ANSI_COLOR="0;33"  
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"  
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"  

OpenLDAP サーバ

事前準備

まず初めに openldap-servers と openldap-clients の RPM パッケージをインストールする。

$ sudo yum install openldap-servers openldap-clients  
  
...  
  
================================================================================================================================================================================================================  
 Package                                             Arch                                      Version                                                       Repository                                    Size  
================================================================================================================================================================================================================  
Installing:  
 openldap-clients                                    x86_64                                    2.4.40-12.30.amzn1                                            amzn-main                                    313 k  
 openldap-servers                                    x86_64                                    2.4.40-12.30.amzn1                                            amzn-main                                    2.3 M  
Installing for dependencies:  
 libtool-ltdl                                        x86_64                                    2.4.2-20.4.8.5.32.amzn1                                       amzn-main                                     51 k  
 portreserve                                         x86_64                                    0.0.4-9.5.amzn1                                               amzn-main                                     23 k  
  
Transaction Summary  
================================================================================================================================================================================================================  

LDAP に保存するデータは OpenLDAP に付属の BDB (Berkeley DB) がバックエンドで管理している。BDB のデータファイルはデフォルトでは /var/lib/ldap/ 以下に保存されるが、ここでは /ldapdata/my-company/ 以下に保存することとする。

$ sudo mkdir -p /ldapdata/my-company/  

作成したディレクトリ直下に DBD のパラメータファイル /ldapdata/my-company/DB_CONFIG を以下の内容で作成する。

$ cat /ldapdata/my-company/DB_CONFIG  
set_cachesize 0 268435456 1  
set_lg_regionmax 262144  
set_lg_bsize 2097152  
set_flags DB_LOG_AUTOREMOVE  

また、OpenLDAP は ldap ユーザ/グループ権限で動作するため、作成したディレクトリ及びファイルのアクセス権を変更する。

$ sudo chown -R ldap.ldap /ldapdata/  

LDAP に保存するデータは OpenLDAP に付属の BDB (Berkeley DB) がバックエンドで管理している。
以下のように DB_CONFIG ファイルを作成する。

$ sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG  
$ sudo chown ldap. /var/lib/ldap/DB_CONFIG   

OpenLDAP サーバのログは local4 の facility で syslog に出力される。これを /var/log/slapd.log に出力するように、/etc/rsyslog.conf/etc/logrotate.d/syslog に設定を追加し、syslog サービスを再起動して設定を反映させる。

$ sudo cp /etc/rsyslog.conf /etc/rsyslog.conf.org   
$ sudo diff /etc/rsyslog.conf /etc/rsyslog.conf.org   
38c38  
< *.info;mail.none;authpriv.none;cron.none;local4                /var/log/messages  
---  
> *.info;mail.none;authpriv.none;cron.none                /var/log/messages  
58c58  
< local4.*						-/var/log/slapd.log  
---  
>   
  
$ sudo cp /etc/logrotate.d/syslog /etc/logrotate.d/syslog.org   
$ sudo diff /etc/logrotate.d/syslog /etc/logrotate.d/syslog.org   
6d5  
< /var/log/slapd.log  
  
$ sudo service rsyslog restart  
Shutting down system logger:                               [  OK  ]  
Starting system logger:                                    [  OK  ]  

最後に OpenLDAP の起動及び自動起動設定。

$ sudo service slapd start  
Starting slapd:                                            [  OK  ]  
  
$ sudo chkconfig slapd on  
[ec2-user@ip-10-1-11-46 ~]$ sudo chkconfig --list | grep slapd  
slapd          	0:off	1:off	2:on	3:on	4:on	5:on	6:off  

OpenLDAP の設定

OpenLDAP の設定ファイルは /etc/openldap/slapd.d/cn=config に格納されている。
以前の OpenLDAP では slapd.conf という設定ファイルを直接編集していたみたいだが、現行のバージョンでは ldif ファイルを作成し、LDAP コマンドで読み込ませることで設定変更を行う。

OpenLDAP 管理者パスワードの設定

まず LDAP の編集をするために、まずは OpenLDAP の管理者を設定する。

  • 管理者パスワードの生成

    $ slappasswd   
    New password:   
    Re-enter new password:   
    {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxx  
  • パスワード変更用の ldif ファイルの作成 -

    $ cat ChangePass.ldif  
    dn: olcDatabase={0}config,cn=config  
    changetype: modify  
    add: olcRootPW  
    olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxx #先ほど生成した SSHA パスワード  
  • 管理者パスワードの変更 -

    $ sudo ldapadd -Y EXTERNAL -H ldapi:// -f ChangePass.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"  
  • 変更の確認 -
$ sudo cat /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif   
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.  
# CRC32 df87e913  
dn: olcDatabase={0}config  
objectClass: olcDatabaseConfig  
olcDatabase: {0}config  
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=exter  
 nal,cn=auth" manage  by * none  
olcAddContentAcl: TRUE  
olcLastMod: TRUE  
olcMaxDerefDepth: 15  
olcReadOnly: FALSE  
olcRootDN: cn=config  
olcSyncUseSubentry: FALSE  
olcMonitoring: FALSE  
structuralObjectClass: olcDatabaseConfig  
entryUUID: ce6ea08e-e558-1037-8187-836857d0b692  
creatorsName: cn=config  
createTimestamp: 20180506090837Z  
olcRootPW:: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx <- 追加されていることを確認  
entryCSN: 20180506091248.032987Z#000000#000#000000  
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth  
modifyTimestamp: 20180506091248Z  

なお、パスワードを間違えると以下のように出力される。

$ ldapsearch -x -LLL -D "cn=config" -W -b "cn=config" '(objectClass=*)'  
Enter LDAP Password:   
ldap_bind: Invalid credentials (49)  
スキーマの読み込み

デフォルトで用意されているスキーマは以下の通り。

$ ll /etc/openldap/schema/  
total 308  
-rw-r--r-- 1 root root  2036 Feb 13  2017 collective.ldif  
-rw-r--r-- 1 root root  6190 Feb 13  2017 collective.schema  
-rw-r--r-- 1 root root  1845 Feb 13  2017 corba.ldif  
-rw-r--r-- 1 root root  8063 Feb 13  2017 corba.schema  
-rw-r--r-- 1 root root 20612 Feb 13  2017 core.ldif  
-rw-r--r-- 1 root root 20499 Feb 13  2017 core.schema  
-rw-r--r-- 1 root root 12006 Feb 13  2017 cosine.ldif  
-rw-r--r-- 1 root root 73994 Feb 13  2017 cosine.schema  
-rw-r--r-- 1 root root  4842 Feb 13  2017 duaconf.ldif  
-rw-r--r-- 1 root root 10388 Feb 13  2017 duaconf.schema  
-rw-r--r-- 1 root root  3330 Feb 13  2017 dyngroup.ldif  
-rw-r--r-- 1 root root  3289 Feb 13  2017 dyngroup.schema  
-rw-r--r-- 1 root root  3481 Feb 13  2017 inetorgperson.ldif  
-rw-r--r-- 1 root root  6267 Feb 13  2017 inetorgperson.schema  
-rw-r--r-- 1 root root  2979 Feb 13  2017 java.ldif  
-rw-r--r-- 1 root root 13901 Feb 13  2017 java.schema  
-rw-r--r-- 1 root root  2082 Feb 13  2017 misc.ldif  
-rw-r--r-- 1 root root  2387 Feb 13  2017 misc.schema  
-rw-r--r-- 1 root root  6809 Feb 13  2017 nis.ldif  
-rw-r--r-- 1 root root  7640 Feb 13  2017 nis.schema  
-rw-r--r-- 1 root root  3308 Feb 13  2017 openldap.ldif  
-rw-r--r-- 1 root root  1514 Feb 13  2017 openldap.schema  
-rw-r--r-- 1 root root  6904 Feb 13  2017 pmi.ldif  
-rw-r--r-- 1 root root 20467 Feb 13  2017 pmi.schema  
-rw-r--r-- 1 root root  4356 Feb 13  2017 ppolicy.ldif  
-rw-r--r-- 1 root root 19963 Feb 13  2017 ppolicy.schema  

以下のコマンドで、基本的なスキーマを読み込む。

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif  
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"  
ldap_add: Other (e.g., implementation specific) error (80)  
	additional info: olcAttributeTypes: Duplicate attributeType: "0.9.2342.19200300.100.1.2"  
  
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif  
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"  
ldap_add: Other (e.g., implementation specific) error (80)  
	additional info: olcAttributeTypes: Duplicate attributeType: "1.3.6.1.1.1.1.2"  
  
$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif  
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"  
ldap_add: Other (e.g., implementation specific) error (80)  
	additional info: olcAttributeTypes: Duplicate attributeType: "2.16.840.1.113730.3.1.1"  

全部すでに読み込まれてた…。

サフィックスの設定

デフォルトのサフィックスは以下のように dc=my-domain,dc=com となっているので、これを変更する。

$ cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif | grep Suffix  
olcSuffix: dc=my-domain,dc=com  

ldif ファイルを作成し、ldapmodify で読み込む。
データベースのパスワードも先ほど出力したものに変更する。

$ cat ChangeDomain.ldif  
dn: olcDatabase={2}bdb,cn=config  
changetype: modify  
replace: olcSuffix  
olcSuffix: dc=my-company,dc=com  
  
dn: olcDatabase={2}bdb,cn=config  
changetype: modify  
replace: olcRootDN  
olcRootDN: cn=Manager,dc=my-company,dc=com  
  
dn: olcDatabase={2}bdb,cn=config  
changetype: modify  
add: olcRootPW  
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxxxxxx   
  
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ChangeDomain.ldif  
SASL/EXTERNAL authentication started  
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth  
SASL SSF: 0  
modifying entry "olcDatabase={2}bdb,cn=config"  
  
modifying entry "olcDatabase={2}bdb,cn=config"  
  
modifying entry "olcDatabase={2}bdb,cn=config"  

変更を確認してみる。

$ cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}bdb.ldif   
  
...  
  
olcSuffix: dc=my-company,dc=com  
olcRootDN: cn=Manager,dc=my-company,dc=com  
olcRootPW:: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  
  
...  
ベース DN の登録

LDAP の情報を格納する起点となる部分である、ベース DN を登録する。このベース DN 配下にユーザ格納用 OU も作成する。

$ cat AddObject.ldif  
dn: dc=my-company,dc=com  
objectClass: top  
objectClass: dcObject  
objectclass: organization  
o: U-PIN.inc  
dc: my-company  
  
dn: cn=Manager,dc=my-company,dc=com  
objectClass: organizationalRole  
cn: Manager  
  
dn: o=Linux Users,dc=my-company,dc=com  
o: Linux Users  
objectClass: organization  
  
dn: ou=People,o=Linux Users,dc=my-company,dc=com  
ou: People  
objectClass: organizationalUnit  
  
dn: ou=Group,dc=my-company,dc=com  
ou: Group  
objectClass: organizationalUnit  

 © 2023, Dealing with Ambiguity