2014年4月25日金曜日

LDIFによるLDAPサーバへのデータ登録


■Linux SSHログイン認証をOpenLDAPで一元管理

LDAPサーバに登録したユーザでのSSHログインおよびパスワード変更をアプリ系サーバで実現するための流れを、下記のパートに分けて記載していきます。



■本編の概要
LinuxのOSユーザは最低1つのグループに属しているので、それを踏襲したDIT(Directory Information Tree)を LDAP上に定義して、ユーザを登録する手順をまとめます。 LDAPサーバへデータを登録するにはLDIFファイルの利用が便利です。 登録したユーザの削除やパスワード変更、一連作業時によくあるエラーのメッセージもまとめてみます。
OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■DIT(Directory Information Tree)概念図
●dc=open_ldap,dc=com
│
├---●ou=Group
│   │
│   ├---●cn=team1000
│   └---●cn=team2000
│
└---●ou=People
     │
     ├---●uid=user1001
     ├---●uid=user1002
     ├---●uid=user2001
     └---●uid=user2002

■オブジェクトクラスの確認
OSユーザに必要な属性をカバーする適当なオブジェクトクラスとして'posixAccount'を使用する。
スキーマに定義されている内容を確認する。
[root@ty-ldap01 ~]# grep -n -A 4 posixAccount /etc/openldap/schema/*.schema
/etc/openldap/schema/nis.schema:161:objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
/etc/openldap/schema/nis.schema-162-    DESC 'Abstraction of an account with POSIX attributes'
/etc/openldap/schema/nis.schema-163-    SUP top AUXILIARY
/etc/openldap/schema/nis.schema-164-    MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
/etc/openldap/schema/nis.schema-165-    MAY ( userPassword $ loginShell $ gecos $ description ) )
[root@ty-ldap01 ~]#
⇒homeDirectory が必須属性になっていることに注意!!

■LDIFファイル準備
## base.ldif
[root@ty-ldap01 ldif]# cat base.ldif
dn: dc=open_ldap,dc=com
objectClass: dcObject
objectClass: organization
dc: open_ldap
o: OpenLDAP Corporation

dn: cn=Manager,dc=open_ldap,dc=com
objectclass: organizationalRole
cn: Manager

dn: ou=Group,dc=open_ldap,dc=com
objectClass: organizationalUnit
ou: Group

dn: ou=People,dc=open_ldap,dc=com
objectClass: organizationalUnit
ou: People
[root@ty-ldap01 ldif]#
## group.ldif
[root@ty-ldap01 ldif]# cat group.ldif
dn: cn=team1000,ou=group,dc=open_ldap,dc=com
objectClass: posixGroup
objectClass: top
cn: LDAP team1000
gidNumber: 1000

dn: cn=team2000,ou=group,dc=open_ldap,dc=com
objectClass: posixGroup
objectClass: top
cn: LDAP team2000
gidNumber: 2000
[root@ty-ldap01 ldif]#
## people.ldif
[root@ty-ldap01 ldif]# cat people.ldif
dn: uid=user1001,ou=People,dc=open_ldap,dc=com
uid: user1001
cn: LDAP user1001
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/user1001

dn: uid=user1002,ou=People,dc=open_ldap,dc=com
uid: user1002
cn: LDAP user1002
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 1002
gidNumber: 1000
homeDirectory: /home/user1002

dn: uid=user2001,ou=People,dc=open_ldap,dc=com
uid: user2001
cn: LDAP user2001
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 2001
gidNumber: 2000
homeDirectory: /home/user2001

dn: uid=user2002,ou=People,dc=open_ldap,dc=com
uid: user2002
cn: LDAP user2002
objectClass: account
objectClass: posixAccount
objectClass: top
userPassword: {SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
loginShell: /bin/bash
uidNumber: 2002
gidNumber: 2000
homeDirectory: /home/user2002
[root@ty-ldap01 ldif]#
※userPasswordには (1) OpenLDAPのインストールと起動 で作成した各ユーザ(共通)のエンコードされたパスワード文字列を指定。

■データ登録
## base.ldif 登録
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f ./base.ldif
adding new entry "dc=open_ldap,dc=com"

adding new entry "cn=Manager,dc=open_ldap,dc=com"

adding new entry "ou=Group,dc=open_ldap,dc=com"

adding new entry "ou=People,dc=open_ldap,dc=com"

[root@ty-ldap01 ldif]#
## group.ldif 登録
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f ./group.ldif
adding new entry "cn=team1000,ou=group,dc=open_ldap,dc=com"

adding new entry "cn=team2000,ou=group,dc=open_ldap,dc=com"

[root@ty-ldap01 ldif]#
## people.ldif 登録
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f ./people.ldif
adding new entry "uid=user1001,ou=People,dc=open_ldap,dc=com"

adding new entry "uid=user1002,ou=People,dc=open_ldap,dc=com"

adding new entry "uid=user2001,ou=People,dc=open_ldap,dc=com"

adding new entry "uid=user2002,ou=People,dc=open_ldap,dc=com"

[root@ty-ldap01 ldif]#
★LDIFに'homeDirectory'の記載を忘れたときのエラー
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f people-nohome.ldif
adding new entry "uid=user2003,ou=People,dc=open_ldap,dc=com"
ldap_add: Object class violation (65)
        additional info: object class 'posixAccount' requires attribute 'homeDirectory'

[root@ty-ldap01 ldif]#
★ユーザを重複登録したときのエラー
[root@ty-ldap01 ldif]# ldapadd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -f people-dual.ldif
adding new entry "uid=user2001,ou=People,dc=open_ldap,dc=com"
ldap_add: Already exists (68)

[root@ty-ldap01 ldif]#

■ldap.confの修正
[root@ty-ldap01 ~]# cp -p /etc/openldap/ldap.conf /etc/openldap/ldap.conf.org
[root@ty-ldap01 ~]# vi /etc/openldap/ldap.conf
[root@ty-ldap01 ~]# grep -v "#\|^$" /etc/openldap/ldap.conf
TLS_CACERTDIR   /etc/openldap/certs
URI ldap://127.0.0.1/
BASE dc=open_ldap,dc=com
[root@ty-ldap01 ~]#
※上記の修正を怠ると、ldapsearchコマンドでエントリがヒットしない場合がある。

■登録した情報を確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -D "cn=Manager,dc=open_ldap,dc=com" -w secret | grep -n dn:
10:dn: dc=open_ldap,dc=com
17:dn: cn=Manager,dc=open_ldap,dc=com
22:dn: ou=Group,dc=open_ldap,dc=com
27:dn: ou=People,dc=open_ldap,dc=com
32:dn: cn=team1000,ou=group,dc=open_ldap,dc=com
40:dn: cn=team2000,ou=group,dc=open_ldap,dc=com
48:dn: uid=user1001,ou=People,dc=open_ldap,dc=com
61:dn: uid=user1002,ou=People,dc=open_ldap,dc=com
74:dn: uid=user2001,ou=People,dc=open_ldap,dc=com
87:dn: uid=user2002,ou=People,dc=open_ldap,dc=com
[root@ty-ldap01 ~]# 

■特定ユーザのパスワード変更
[root@ty-ldap01 ~]# ldappasswd -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret -s himitsu "uid=user1001,ou=People,dc=open_ldap,dc=com"
パスワードをプロンプトから入力する場合は[-s naisyo] → [-S]にする。

## パスワードが変更されたかの確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -b "uid=user1001,ou=People,dc=open_ldap,dc=com" -LLL
dn: uid=user1001,ou=People,dc=open_ldap,dc=com
uid: user1001
cn: LDAP user1001
objectClass: account
objectClass: posixAccount
objectClass: top
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/user1001
userPassword:: e1NTSEF9WC9RTTFzVzhTSEpIYTdURUN1TENsRVpWMEhwbHIyVHQ=

[root@ty-ldap01 ~]#
## パスワードはbase64でエンコードされているのでデコード
[root@ty-ldap01 ~]# echo "e1NTSEF9WC9RTTFzVzhTSEpIYTdURUN1TENsRVpWMEhwbHIyVHQ=" | base64 -d
{SSHA}X/QM1sW8SHJHa7TECuLClEZV0Hplr2Tt[root@ty-ldap01 ~]#
⇒people.ldifに設定したパスワードは「{SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5」だったので確かに変更されているようです。

■特定ユーザエントリを削除
[root@ty-ldap01 ~]# ldapdelete -x -D "cn=Manager,dc=open_ldap,dc=com" -w secret "uid=user2002,ou=People,dc=open_ldap,dc=com"
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -b "dc=open_ldap,dc=com" | grep -n "dn: uid"
48:dn: uid=user1001,ou=People,dc=open_ldap,dc=com
61:dn: uid=user1002,ou=People,dc=open_ldap,dc=com
74:dn: uid=user2001,ou=People,dc=open_ldap,dc=com
[root@ty-ldap01 ~]#

■登録したデータを全削除する場合
[root@ty-ldap01 ~]# rm -rf /var/lib/ldap/*
[root@ty-ldap01 ~]# cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[root@ty-ldap01 ~]# /etc/init.d/slapd restart
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
※以降の作業のために、全削除後もう一度ldifファイルでデータを登録しておきます。

■ホームディレクトリをNFSで公開
[root@ty-ldap01 ~]# vi /etc/exports
[root@ty-ldap01 ~]# cat /etc/exports
/home           *(rw,sync,no_root_squash)
[root@ty-ldap01 ~]# exportfs -a
[root@ty-ldap01 ~]# /etc/init.d/nfs start
NFS サービスを起動中:                                      [  OK  ]
NFS クォータを起動中:                                      [  OK  ]
NFS mountd を起動中:                                      [  OK  ]
NFS デーモンを起動中:                                      [  OK  ]
RPC idmapd を起動中:                                      [  OK  ]
[root@ty-ldap01 ~]#
## NFS自動起動設定
[root@ty-ldap01 ~]# chkconfig nfs on; chkconfig --list nfs
nfs             0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@ty-ldap01 ~]#


LDIFによるLDAPサーバへのデータ登録の手順は以上で終了です。
次回はいよいよアプリ系サーバからOpenLDAP上に登録したユーザでSSHログインを行います。


Before << (1) OpenLDAPのインストールと起動
Next >> (3) LDAP登録ユーザでのSSHログイン認証とパスワード変更

0 件のコメント:

コメントを投稿