LDAPにユーザ、グループを追加し、Linuxアカウントとして設定したときの備忘録

必要なパッケージのインストール

$ rpm -qa | grep ldap
python-ldap-2.3.10-1.el6.x86_64
apr-util-ldap-1.3.9-3.el6_0.1.x86_64
openldap-2.4.23-32.el6_4.1.x86_64
openldap-devel-2.4.23-32.el6_4.1.x86_64
$ su
Password: 
# yum install openldap-servers openldap-clients
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package openldap-clients.x86_64 0:2.4.23-32.el6_4.1 will be installed
---> Package openldap-servers.x86_64 0:2.4.23-32.el6_4.1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package               Arch        Version                   Repository    Size
================================================================================
Installing:
 openldap-clients      x86_64      2.4.23-32.el6_4.1         updates      165 k
 openldap-servers      x86_64      2.4.23-32.el6_4.1         updates      2.0 M

Transaction Summary
================================================================================
Install       2 Package(s)

Total download size: 2.2 M
Installed size: 5.0 M
Is this ok [y/N]: y
Downloading Packages:
(1/2): openldap-clients-2.4.23-32.el6_4.1.x86_64.rpm     | 165 kB     00:00     
(2/2): openldap-servers-2.4.23-32.el6_4.1.x86_64.rpm     | 2.0 MB     00:00     
--------------------------------------------------------------------------------
Total                                           367 kB/s | 2.2 MB     00:06     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : openldap-clients-2.4.23-32.el6_4.1.x86_64                    1/2 
  Installing : openldap-servers-2.4.23-32.el6_4.1.x86_64                    2/2 
  Verifying  : openldap-servers-2.4.23-32.el6_4.1.x86_64                    1/2 
  Verifying  : openldap-clients-2.4.23-32.el6_4.1.x86_64                    2/2 

Installed:
  openldap-clients.x86_64 0:2.4.23-32.el6_4.1                                   
  openldap-servers.x86_64 0:2.4.23-32.el6_4.1                                   

Complete!
#

LDAPでの属性の種類

属性の種類は以下のとおり。

属性名 名前 意味
c Country 国名
cn Common Name 一般名、人名
dc Domain Component ドメイン
o The Organization 団体名
ObjectClass - スキーマ
ou Organization Unit 部署名
sn Sumame
st State 都道府県
uid User ID ユーザID

属性を指定するときにobjectClassを指定するがobjectClassには必須属性が決まっているので属性を決めることでobjectClassも決まる。

objectClass名 必須属性
dcObject dc
organization o
organizationalRole cn
organizationalUnit ou
account uid
simpleSecurityObject userPassword
inetOrgPerson cn, sn
posixAccount uid (accountなど構造型オブジェクトクラスと一緒に使用する必要あり)
posixGroup cn

設定ディレクトリのパスワード作成と設定

設定ディレクトリの管理者パスワードを生成しそれをolcRootPWとして記述する。

# slappasswd
New password: パスワードを入力
Re-enter new password: パスワードを入力
{SSHA}u1ZacGMzhiuUJ8wCnGfxsWq7GWZalqRD
# vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
config.ldif 
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to *  by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage  by * none
olcAddContentAcl: TRUE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=config
olcRootPW: {SSHA}u1ZacGMzhiuUJ8wCnGfxsWq7GWZalqRD
olcSyncUseSubentry: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: 1b5c8322-ed45-1032-909b-8bec7ef9b5cb
creatorsName: cn=config
createTimestamp: 20131129132257Z
entryCSN: 20131129132257.805304Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20131129132257Z
#

データベースチューニング

デフォルトでBerkleyDBを利用しているので、これのチューニング。サンプルをそのまま使用。

# cp -ip /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

サーバ起動

# /etc/rc.d/init.d/slapd start
slapd を起動中:                                            [  OK  ]
#

設定の確認と変更

デフォルトの設定を確認してみる。早速ldapsearchを使用。
その後、データディレクトリのolcRootDB, olcSuffixを変更、olcRootPWを追加するためファイルを作成し、ldapmodifyを使用。

# ldapsearch -x -LLL -b 'olcDatabase={2}bdb,cn=config' -D cn=config -W
Enter LDAP Password: [前述で設定した設定ディレクトリのパスワード]
dn: olcDatabase={2}bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: {2}bdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=my-domain,dc=com
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=Manager,dc=my-domain,dc=com
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: mail pres,eq,sub
olcDbIndex: ou pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
# slappasswd
New password: [データディレクトリManagerのパスワードを入力]
Re-enter new password: [データディレクトリManagerのパスワードを入力]
{SSHA}9/wZQrml4BzOxVWxGX7bH+5fOw+TMq3i
# view bdb-init.ldif
# 同一dnの場合は"-"で続けることが可能。
# 一行あけるとdn宣言する必要があるので気をつける。
# DN=olcDatabase={2}bdb,cn=configをmodifyする宣言。
# 変更はreplaceを追加はaddを宣言
dn: olcDatabase={2}bdb,cn=config
changetype: modify
# change data
replace: olcRootDN
olcRootDN: cn=Manager,dc=miyagino,dc=net
-
replace: olcSuffix
olcSuffix: dc=miyagino,dc=net
-
# add data
add: olcRootPW
olcRootPW: {SSHA}9/wZQrml4BzOxVWxGX7bH+5fOw+TMq3i

# ldapmodify -x -D cn=config -f bdb-init.ldif -W
Enter LDAP Password: [前述で設定した設定ディレクトリのパスワード]
modifying entry "olcDatabase={2}bdb,cn=config"

#

変わったかを確認。

# ldapsearch -x -LLL -b 'olcDatabase={2}bdb,cn=config' -D cn=config -W
Enter LDAP Password: 
dn: olcDatabase={2}bdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcBdbConfig
olcDatabase: {2}bdb
olcDbDirectory: /var/lib/ldap
olcAddContentAcl: FALSE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcSyncUseSubentry: FALSE
olcMonitoring: TRUE
olcDbCacheSize: 1000
olcDbCheckpoint: 1024 15
olcDbNoSync: FALSE
olcDbDirtyRead: FALSE
olcDbIDLcacheSize: 0
olcDbIndex: objectClass pres,eq
olcDbIndex: cn pres,eq,sub
olcDbIndex: uid pres,eq,sub
olcDbIndex: uidNumber pres,eq
olcDbIndex: gidNumber pres,eq
olcDbIndex: mail pres,eq,sub
olcDbIndex: ou pres,eq,sub
olcDbIndex: loginShell pres,eq
olcDbIndex: sn pres,eq,sub
olcDbIndex: givenName pres,eq,sub
olcDbIndex: memberUid pres,eq,sub
olcDbIndex: nisMapName pres,eq,sub
olcDbIndex: nisMapEntry pres,eq,sub
olcDbLinearIndex: FALSE
olcDbMode: 0600
olcDbSearchStack: 16
olcDbShmKey: 0
olcDbCacheFree: 1
olcDbDNcacheSize: 0
olcRootDN: cn=Manager,dc=miyagino,dc=net
olcSuffix: dc=miyagino,dc=net
olcRootPW: {SSHA}9/wZQrml4BzOxVWxGX7bH+5fOw+TMq3i

#

データの初期登録

データディレクトリの用意ができたので登録してみる。

  • 最初の部分はo/dcを登録するのでobjectclassはorganizationとdcObject。
  • 次の部分はcn(Common Name)を登録するのでobjectclassはorganizationalRole
# vi data-init.ldif
dn: dc=miyagino,dc=net
objectclass: organization
objectclass: dcObject
o: MIYAGINO net
dc: miyagino

dn: cn=Manager,dc=miyagino,dc=net
objectclass: organizationalRole
cn: Manager
# ldapadd -x -D "cn=Manager,dc=miyagino,dc=net" -f data-init.ldif -W
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
adding new entry "dc=miyagino,dc=net"

adding new entry "cn=Manager,dc=miyagino,dc=net"

#

miyagino.netを検索起点(-bオプション)とし、Manager権限でアクセス(-Dオプション)して確認してみる。

# ldapsearch -x -LLL -b 'dc=miyagino,dc=net' -D 'cn=Manager,dc=miyagino,dc=net' -W
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
dn: dc=miyagino,dc=net
objectClass: organization
objectClass: dcObject
o: MIYAGINO net
dc: miyagino

dn: cn=Manager,dc=miyagino,dc=net
objectClass: organizationalRole
cn: Manager

#

ユーザ・グループの追加

ユーザとグループを追加する。それにはまずouでUsersとGroupsを登録し、それぞれの配下にユーザとグループを追加する。

# vi data-add-ou.ldif
dn: ou=Users,dc=miyagino,dc=net
objectclass: organizationalUnit
ou: Users

dn: ou=Groups,dc=miyagino,dc=net
objectclass: organizationalUnit
ou: Groups
# ldapadd -x -W -D "cn=Manager,dc=miyagino,dc=net" -f data-add-ou.ldif
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
adding new entry "ou=Users,dc=miyagino,dc=net"

adding new entry "ou=Groups,dc=miyagino,dc=net"

# vi data-add-groups.ldif
dn: cn=gtest0,ou=Groups,dc=miyagino,dc=net
objectClass: posixGroup
cn: gtest0
gidNumber: 1000

dn: cn=gtest1,ou=Groups,dc=miyagino,dc=net
objectClass: posixGroup
cn: gtest1
gidNumber: 1001

# ldapadd -x -W -D "cn=Manager,dc=miyagino,dc=net" -f data-add-groups.ldif
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
adding new entry "cn=gtest0,ou=Groups,dc=miyagino,dc=net"

adding new entry "cn=gtest1,ou=Groups,dc=miyagino,dc=net"

#

パスワードを生成しユーザを追加する。

# slappasswd -h '{CRYPT}'
New password: [test0のパスワードを入力]
Re-enter new password: [test0のパスワードを入力]
{CRYPT}ptXA.gDbQN7vQ
# slappasswd -h '{CRYPT}'
New password: [test1のパスワードを入力]
Re-enter new password: [test1のパスワードを入力]
{CRYPT}3ckrEmrFf2W9k

# vi data-add-users.ldif
dn: uid=test0,ou=Users,dc=miyagino,dc=net
objectclass: posixAccount
objectclass: inetOrgPerson
sn: test
cn: taro
displayName: Test Taro
uid: test0
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test0
loginShell: /bin/bash
userPassword: {CRYPT}ptXA.gDbQN7vQ
mail: test0@miyagino.net

dn: uid=test1,ou=Users,dc=miyagino,dc=net
objectclass: posixAccount
objectclass: inetOrgPerson
sn: test
cn: jiro
displayName: Test Jiro
uid: test1
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1
loginShell: /bin/bash
userPassword: {CRYPT}3ckrEmrFf2W9k
mail: test1@miyagino.net
# ldapadd -x -W -D "cn=Manager,dc=miyagino,dc=net" -f data-add-users.ldif
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
adding new entry "uid=test0,ou=Users,dc=miyagino,dc=net"

adding new entry "uid=test1,ou=Users,dc=miyagino,dc=net"

# ldapsearch -x -W -D 'cn=Manager,dc=miyagino,dc=net' -b 'ou=Users,dc=miyagino,dc=net' -s sub
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=miyagino,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# Users, miyagino.net
dn: ou=Users,dc=miyagino,dc=net
objectClass: organizationalUnit
ou: Users

# test0, Users, miyagino.net
dn: uid=test0,ou=Users,dc=miyagino,dc=net
objectClass: posixAccount
objectClass: inetOrgPerson
sn: test
cn: taro
displayName: Test Taro
uid: test0
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test0
loginShell: /bin/bash
userPassword:: e0NSWVBUfXB0WEEuZ0RiUU43dlE=
mail: test0@miyagino.net

# test1, Users, miyagino.net
dn: uid=test1,ou=Users,dc=miyagino,dc=net
objectClass: posixAccount
objectClass: inetOrgPerson
sn: test
cn: jiro
displayName: Test Jiro
uid: test1
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/test1
loginShell: /bin/bash
userPassword:: e0NSWVBUfTNja3JFbXJGZjJXOWs=
mail: test1@miyagino.net

# search result
search: 2
result: 0 Success

# numResponses: 4
# numEntries: 3
# 

登録されているようだ。属性の一部を変更する場合はldifを作ってldapmodifyする。例えばtest0のメールアドレスを変更する場合は以下。

# vi data-modify-test0-mail.ldif
dn: uid=test0,ou=Users,dc=miyagino,dc=net
changetype: modify
replace: mail
mail: test-taro@miyagino.net
# ldapmodify -x -W -D "cn=Manager,dc=miyagino,dc=net" -f data-modify-test0-mail.ldif
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
modifying entry "uid=test0,ou=Users,dc=miyagino,dc=net"

test0を指定してldapsearch。なお、メタキャラ"*"も使える。

# ldapsearch -x -W -D 'cn=Manager,dc=miyagino,dc=net' -b 'ou=Users,dc=miyagino,dc=net' -s sub '(uid=test0)'
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=miyagino,dc=net> with scope subtree
# filter: (uid=test0)
# requesting: ALL
#

# test0, Users, miyagino.net
dn: uid=test0,ou=Users,dc=miyagino,dc=net
objectClass: posixAccount
objectClass: inetOrgPerson
sn: test
cn: taro
displayName: Test Taro
uid: test0
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/test0
loginShell: /bin/bash
userPassword:: e0NSWVBUfXB0WEEuZ0RiUU43dlE=
mail: test-taro@miyagino.net

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
#

属性の一部の修正、追加、削除は同様にldifを作ってldapmodify。ただしdnごと削除(つまりここではユーザ削除)する場合は以下。

# ldapdelete -x -W -D "cn=Manager,dc=miyagino,dc=net" "uid=test0,ou=Users,dc=miyagino,dc=net"
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
# ldapdelete -x -W -D "cn=Manager,dc=miyagino,dc=net" "uid=test1,ou=Users,dc=miyagino,dc=net"
Enter LDAP Password: [データディレクトリManagerのパスワードを入力]
#

単に登録内容を表示したい場合

いちいちldapsearchが面倒な場合はこれで全部出力しませう。

# slapcat

Linuxのアカウントとして使う場合

LDAP認証をLinuxのアカウントとして使う場合の設定。まずは必要なパッケージをインストールする。

# yum install pam_ldap
# yum install nscd nss-pam-ldapd

その後、認証の設定を行う。

# authconfig-tui
「認証の設定」
ユーザー情報の[LDAPの使用]をチェック
認証の[LDAP認証を使用]をチェック
[次へ]を選択し、

「LDAP設定」
[TLSを使用]をチェック
ベースDNを dc=miyagino,dc=net に変更。
なお、サーバーは  ldap://127.0.0.1/ のまま。
[OK]を選択して終了。
# ps -ef | grep sssd
sssdが起動していることを確認。sssdとはSystem Security Services Daemonで
リモートディレクトリへのアクセスと認証メカニズムを管理する。
また、システムへのNSSとPAMインターフェイスを提供するとのこと。詳しくはman sssdを参照のこと。

ディレクトリを作ってchownしてみる。
# mkdir /home/test0
# mkdir /home/test1
# chown test0:gtest0 /home/test0
一回目はなぜかエラー。二回目は大丈夫。
# chown test1:gtest1 /home/test1
# ls -l /home
パーミッションが変わっているならldapから引けている証拠。

しかし、ログインテストしてみてもログインできない。/var/log/messages には以下のエラーが出力されていた。

# cat /var/log/messages
....
Dec  2 19:39:17 localhost sssd[be[default]]: Could not start TLS encryption. TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.
Dec  2 19:40:38 localhost sssd[be[default]]: Could not start TLS encryption. TLS error -8172:Peer's certificate issuer has been marked as not trusted by the user.
....

そこで以下のようにsssd.confを修正しrestartsしたところうまくいった。

# cd /etc/sssd
# cp -ip sssd.conf sssd.conf.org
# vi sssd.conf
ldap_tls_cacertdir を削除
ldap_tls_reqcert = never を追加
# diff -u sssd.conf.org sssd.conf
--- sssd.conf.org	2013-12-02 19:33:44.626782375 +0900
+++ sssd.conf	2013-12-02 19:40:05.228260304 +0900
@@ -9,7 +9,7 @@
 auth_provider = ldap
 chpass_provider = ldap
 ldap_uri = ldap://127.0.0.1/
-ldap_tls_cacertdir = /etc/openldap/cacerts
+ldap_tls_reqcert = never
 [sssd]
 services = nss, pam
 config_file_version = 2
# /etc/init.d/sssd restart
sssd を停止中:                                             [  OK  ]
sssd を起動中:                                             [  OK  ]
(ちなみに、reloadではダメだった。)
# slogin test0@localhost
test0@localhost's password: 
-bash-4.1$ id
uid=1000(test0) gid=1000(gtest0) 所属グループ=1000(gtest0)
-bash-4.1$