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