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$