2014年4月27日日曜日

OpenLDAPのログ出力設定


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

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



■本編の概要
OpenLDAPサーバはデフォルト設定ではログを出力しません。
slapd.confにログレベルを記述すると、シスログ経由でログを出力します。
ログレベルおよびログの出力先の設定についての手順を記載します。

OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■標準のログレベルだと出力量が多すぎるので変更
[root@ty-ldap01 ~]# vi /etc/openldap/slapd.conf
[root@ty-ldap01 ~]# grep -A 5  "EVERYTHING" /etc/openldap/slapd.conf
# rootdn can always read and write EVERYTHING!

# LogLevel
loglevel 512

# change own password ---- from ----
[root@ty-ldap01 ~]# change_slapd.sh
config file testing succeeded
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
※loglevelのデフォルト値は256です。詳細については他のサイトを参照ください。
※change_slapd.shは「OpenLDAPのインストールと起動」 で作成したスクリプトです。

■rsysylogにOpenLDAPのログ出力設定
openldap-servers、openldap-clients、nss-pam-ldapd を追加インストール
[root@ty-ldap01 ~]# echo "local4.*    /var/log/ldap.log" > /etc/rsyslog.d/ldaplog.conf
[root@ty-ldap01 ~]# cat /etc/rsyslog.d/ldaplog.conf
local4.*    /var/log/ldap.log
[root@ty-ldap01 ~]# /etc/init.d/rsyslog restart
システムロガーを停止中:                                    [  OK  ]
システムロガーを起動中:                                    [  OK  ]
[root@ty-ldap01 ~]#

■OpenLDAP登録ユーザでログインしたときのログ
## アプリ系サーバの操作
[root@ty-app01 ~]# su - user1001
-bash-4.1$ su - user1002
パスワード:
-bash-4.1$

## その時のLDAPサーバのログ
[root@ty-ldap01 ~]# tail -f /var/log/ldap.log

Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1000 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1001 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1002 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1003 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: <= bdb_equality_candidates: (uniqueMember) not indexed
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1004 op=1 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1000 op=2 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1001 op=2 ENTRY dn="cn=team1000,ou=group,dc=open_ldap,dc=com"
Apr 20 03:20:07 ty-ldap01 slapd[2503]: conn=1002 op=2 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:18 ty-ldap01 slapd[2503]: conn=1003 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:18 ty-ldap01 slapd[2503]: conn=1004 op=2 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:18 ty-ldap01 slapd[2503]: conn=1001 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1002 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1005 op=1 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1003 op=4 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1004 op=3 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1000 op=5 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1001 op=4 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1002 op=4 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1003 op=5 ENTRY dn="uid=user1001,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1004 op=4 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: <= bdb_equality_candidates: (uniqueMember) not indexed
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1000 op=6 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1001 op=5 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1002 op=5 ENTRY dn="cn=team1000,ou=group,dc=open_ldap,dc=com"
Apr 20 03:20:21 ty-ldap01 slapd[2503]: conn=1003 op=6 ENTRY dn="uid=user1002,ou=people,dc=open_ldap,dc=com"
デフォルトのloglevelから一つ下げましたが、別ユーザにスイッチするだけで上記のログが出力されます。

以上で終了です。長文おつきあいありがとうございます。サイト継続ご協力のほどお願い申し上げます。m(_ _)m


Before << (3) LDAP登録ユーザでのSSHログイン認証とパスワード変更

2014年4月26日土曜日

LDAP登録ユーザでのSSHログイン認証とパスワード変更


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

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



■本編の概要
アプリ系サーバにLDAP認証モジュール(nss-pam-ldapd)を追加してLDAPサーバに接続します。 idコマンドでLDAPに登録したユーザを確認できるものの、ログインすることができません。 認証クライアントモジュールをsssdからnslcdに変更にすることで、SSHログインできるようになります。 homeDirectoryもLDAPサーバからNFSマウントする方式にした方が一元管理レベル感が高まります。 ここまで出来ればLDAPユーザのパスワードをアプリ系サーバから変更したいところですが、 またしてもエラーに出くわします。slapd.confをさらに修正することでLDAPサーバ上の パスワードも変更できるようなります。こちらの手順もまとめます。
OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■アプリ系サーバにnss-pam-ldapdのインストール
[root@ty-app01 ~]# yum install nss-pam-ldapd.x86_64
(中略)
============================================================================
 Package                Arch        Version               Repository   Size
============================================================================
Installing:
 nss-pam-ldapd          x86_64      0.7.5-18.2.el6_4      base        152 k
Installing for dependencies:
 nscd                   x86_64      2.12-1.132.el6        base        219 k
 pam_ldap               x86_64      185-11.el6            base         88 k

Transaction Summary
============================================================================
Install       3 Package(s)
(以下略)

■authconfig-tuiによるクライアント側認証モジュール設定
authconfig-tuiのGUIの表示が崩れないように言語を英語に変更しておきます。
[root@ty-app01 ~]# LANG=C; authconfig-tui


↑Use LDAP にチェック。あとはデフォルトのまま。

↑ServerとBaseDNを設定。
[root@ty-app01 ~]# LANG=C; authconfig-tui
nslcd を起動中:                                            [  OK  ]
[root@ty-app01 ~]#
※sssdが自動起動される場合があります。
sssdの認証処理はTLSまたはLDAPSプロトコルが必須となり設定が複雑なので今回はnslcdを利用します。

## LANGを元に戻す
[root@ty-app01 ~]# LANG=ja_JP.UTF-8
## authconfig-tuiによりldap.confが修正されたことを確認
[root@ty-app01 ~]# grep -v "#\|^$" /etc/openldap/ldap.conf
TLS_CACERTDIR /etc/openldap/cacerts
URI ldap://ty-ldap01/
BASE dc=open_ldap,dc=com
[root@ty-app01 ~]#
## LDAPサーバ上のユーザ確認
[root@ty-app01 ~]# grep user1001 /etc/passwd
[root@ty-app01 ~]# id user1001
uid=1001(user1001) gid=1000(LDAP team1000) 所属グループ=1000(LDAP team1000)
[root@ty-app01 ~]#

■ホームディレクトリ準備
[root@ty-app01 ~]# mount -t nfs ty-ldap01:/home /home
[root@ty-app01 ~]# mkdir -m 700 /home/user1001; chown user1001: /home/user1001
[root@ty-app01 ~]# mkdir -m 700 /home/user1002; chown user1002: /home/user1002
[root@ty-app01 ~]# mkdir -m 700 /home/user2001; chown user2001: /home/user2001
[root@ty-app01 ~]# mkdir -m 700 /home/user2002; chown user2002: /home/user2002

■OpenLDAPサーバ上のユーザにスイッチ
[root@ty-app01 ~]# su - user1001
-bash-4.1$ su - user1002
パスワード:
su: パスワードが違います
-bash-4.1$
rootユーザからのスイッチはパスワードを聞かれないので可能ですが、
user1001 → user1002のスイッチ時に正しいパスワードを入力しても認証されません・・・。(T-T)

■認証クライアントモジュールの修正
[root@ty-app01 ~]# cd /etc/pam.d/
[root@ty-app01 pam.d]# ll | grep auth-ac
lrwxrwxrwx. 1 root root  19  3月 21 15:35 2014 fingerprint-auth -> fingerprint-auth-ac
-rw-r--r--. 1 root root 659  3月 21 15:35 2014 fingerprint-auth-ac
lrwxrwxrwx. 1 root root  16  3月 21 15:35 2014 password-auth -> password-auth-ac
-rw-r--r--. 1 root root 896  3月 21 15:35 2014 password-auth-ac
lrwxrwxrwx. 1 root root  17  3月 21 15:35 2014 smartcard-auth -> smartcard-auth-ac
-rw-r--r--. 1 root root 711  3月 21 15:35 2014 smartcard-auth-ac
lrwxrwxrwx. 1 root root  14  3月 21 15:35 2014 system-auth -> system-auth-ac
-rw-r--r--. 1 root root 937  3月 21 15:35 2014 system-auth-ac
[root@ty-app01 pam.d]#
## system-auth-acを修正
[root@ty-app01 pam.d]# cp -p system-auth-ac system-auth-ac.20140321
[root@ty-app01 pam.d]# vi system-auth-ac
[root@ty-app01 pam.d]# diff system-auth-ac system-auth-ac.20140321
7d6
< auth        sufficient    pam_ldap.so use_first_pass
15d13
< account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
19d16
< password    sufficient    pam_ldap.so use_authtok
23d19
< session     optional      pam_ldap.so
[root@ty-app01 pam.d]#
⇒適所に上記4レコードを追加。
※[pam_sss]になっている場合は[pam_ldap]に変更。

## OpenLDAPサーバ上のユーザにスイッチ
[root@ty-app01 pam.d]# /etc/init.d/nslcd restart
nslcd を停止中:                                            [  OK  ]
nslcd を起動中:                                            [  OK  ]
[root@ty-app01 pam.d]# su - user1001
-bash-4.1$ su - user1002
パスワード:
-bash-4.1$ id
uid=1002(user1002) gid=1000(LDAP team1000) 所属グループ=1000(LDAP team1000)
-bash-4.1$
成功!! (^o^)

## OpenLDAPサーバ上のユーザのパスワード変更
-bash-4.1$ passwd
ユーザー user1002 のパスワードを変更。
Enter login(LDAP) password:
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information update failed: Insufficient access
passwd: 認証トークン操作エラー
-bash-4.1$
認証されるようになったが、パスワードの変更は失敗する・・・。(T-T)


■LDAPサーバ側でパスワード変更権限追加設定
※LDAPサーバ側の設定です!!
[root@ty-ldap01 ~]# vi /etc/openldap/slapd.conf
[root@ty-ldap01 ~]# grep -A 20 "EVERYTHING" /etc/openldap/slapd.conf
# rootdn can always read and write EVERYTHING!

# change own password ---- from ----
access to attrs=userPassword
        by self write
        by dn="cn=Manager,dc=open_ldap,dc=com" write
        by anonymous auth
        by * none
access to *
        by self write
        by * read
# change own password ----- to -----

# enable on-the-fly configuration (cn=config)
database config
access to *
        by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" manage
        by * none

# enable server status monitoring (cn=monitor)
database monitor
[root@ty-ldap01 ~]#
※ # change own password のくだりを追加する場所が大事です。

## 設定反映
[root@ty-ldap01 ~]# change_slapd.sh
config file testing succeeded
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
※change_slapd.shは (1) OpenLDAPのインストールと起動 で作成したスクリプトです。


■OpenLDAPサーバ上のユーザのパスワード変更
[root@ty-app01 ~]# su - user1001
-bash-4.1$ passwd
ユーザー user1001 のパスワードを変更。
Enter login(LDAP) password:
新しいパスワード:
新しいパスワードを再入力してください:
LDAP password information changed for user1001
passwd: 全ての認証トークンが正しく更新できました。
-bash-4.1$
成功!! (^o^)

## 念のため確認
[root@ty-app01 ~]# ldapsearch -x -h ty-ldap01 -D "cn=Manager,dc=open_ldap,dc=com" -w secret | grep -n userPassword
58:userPassword:: e2NyeXB0fSQxJEJTZGhaSm1hJEF0cjE1d3dGa1pLN1FNeHFOeVA5MC8=
67:userPassword:: e1NTSEF9dTFpWXlVbllKdGQ0dTMyTE4zRnZwRkVjMzR5Q1ZvRTU=
80:userPassword:: e1NTSEF9dTFpWXlVbllKdGQ0dTMyTE4zRnZwRkVjMzR5Q1ZvRTU=
93:userPassword:: e1NTSEF9dTFpWXlVbllKdGQ0dTMyTE4zRnZwRkVjMzR5Q1ZvRTU=
[root@ty-app01 ~]#
user1001のパスワードのエンコード文字列だけ変更となっています。

## パスワードのエンコード方式の確認
[root@ty-app01 ~]# echo "e2NyeXB0fSQxJEJTZGhaSm1hJEF0cjE1d3dGa1pLN1FNeHFOeVA5MC8=" | base64 -d
{crypt}$1$BSdhZJma$Atr15wwFkZK7QMxqNyP90/[root@ty-app01 ~]#
SSHAではなく、cryptでエンコードされているようです。

## うまくいかない場合
下記ファイルの設定も見直してください。
/etc/pam.d/password-auth-ac
/etc/nsswitch.conf



Before << (2) LDIFによるLDAPサーバへのデータ登録
Next >> (4) OpenLDAPのログ出力設定

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ログイン認証とパスワード変更

2014年4月24日木曜日

OpenLDAPのインストールと起動


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

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



■本編の概要
openldap-servers、openldap-clients、nss-pam-ldapdのインストールおよびslapd.confの 設定と変更方法、slapdサービスの起動およびLDAPサーバへの接続確認方法についてまとめます。 特に、CentOS 6系からslapdの設定はslapd.dディレクトリ以下のファイルで定義される方式に変更と なっているので注意が必要です。今回はDB_CONFIGを使用し、旧来のslapd.confに設定した内容を slapd.dディレクトリに出力する手順をまとめます。
OS: CentOS 6.5 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5
LDAPサーバホスト名: ty-ldap01
アプリ系サーバホスト名: ty-app01,ty-app02

■インストール済みOpenLDAP関連パッケージの確認
[root@ty-ldap01 ~]# yum list installed '*ldap*'
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Installed Packages
apr-util-ldap.x86_64 1.3.9-3.el6_0.1    @anaconda-CentOS-201311272149.x86_64/6.5
openldap.x86_64      2.4.23-32.el6_4.1  @anaconda-CentOS-201311272149.x86_64/6.5
python-ldap.x86_64   2.3.10-1.el6       @anaconda-CentOS-201311272149.x86_64/6.5
[root@ty-ldap01 ~]#

■最低限必要なパッケージのインストール
openldap-servers、openldap-clients、nss-pam-ldapd を追加インストール
[root@ty-ldap01 ~]# yum install openldap-clients.x86_64 openldap-servers.x86_64 nss-pam-ldapd.x86_64
(中略)
===========================================================================
 Package                  Arch      Version             Repository    Size
===========================================================================
Installing:
 nss-pam-ldapd            x86_64    0.7.5-18.2.el6_4    base         152 k
 openldap-clients         x86_64    2.4.23-34.el6_5.1   updates      165 k
 openldap-servers         x86_64    2.4.23-34.el6_5.1   updates      2.0 M
Installing for dependencies:
 nscd                     x86_64    2.12-1.132.el6      base         219 k
 pam_ldap                 x86_64    185-11.el6          base          88 k
Updating for dependencies:
 openldap                 x86_64    2.4.23-34.el6_5.1   updates      265 k

Transaction Summary
===========================================================================
Install       5 Package(s)
Upgrade       1 Package(s)
(以下略)

■インストール済みOpenLDAP関連パッケージの再確認
[root@ty-ldap01 ~]# yum list installed '*ldap*'
(中略)
Installed Packages
apr-util-ldap.x86_64      1.3.9-3.el6_0.1     @anaconda-CentOS-201311272149.x86_64/6.5
nss-pam-ldapd.x86_64      0.7.5-18.2.el6_4    @base
openldap.x86_64           2.4.23-34.el6_5.1   @updates
openldap-clients.x86_64   2.4.23-34.el6_5.1   @updates
openldap-servers.x86_64   2.4.23-34.el6_5.1   @updates
pam_ldap.x86_64           185-11.el6          @base
python-ldap.x86_64        2.3.10-1.el6        @anaconda-CentOS-201311272149.x86_64/6.5
[root@ty-ldap01 ~]#

■DB_CONFIG準備
DB_CONFIGファイルは、OpenLDAPサーバが BerkeleyDB をドライブする際の環境定義を書いておくファイルであり、 slapd.confのdirectoryディレクティブで指定したディレクトリから探されます。
[root@ty-ldap01 ~]# cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

■slapd設定を変換
OpenLDAPサービスに必要となる設定がCentOS 6で変更になっています。 旧バージョンでは、slapdは /etc/openldap/slapd.conf から設定していました。 RedHatEnterpriseLinux 6のslapd設定は特殊なLDAPディレクトリ(/etc/openldap/slapd.d/) 内の事前定義済みのスキーマとDIT(ディレクトリ情報ツリー)と共に格納されるようになりました。 旧来の設定ファイルを新しいディレクトリで機能するように変換する方法を記述します。

## slapd.confの準備
[root@ty-ldap01 ~]# cp -p /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
## slapd.confのチェック
[root@ty-ldap01 ~]# slaptest -u -f /etc/openldap/slapd.conf
config file testing succeeded
[root@ty-ldap01 ~]#
## 新しいディレクトリの /etc/openldap/slapd.d/ の内容を削除
[root@ty-ldap01 ~]# rm -rf /etc/openldap/slapd.d/*
## slaptestを実行して設定ファイルの有効性をチェックし、新しい設定ディレクトリを指定
[root@ty-ldap01 ~]# slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
bdb_db_open: database "dc=my-domain,dc=com": db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2).
backend_startup_one (type=bdb, suffix="dc=my-domain,dc=com"): bi_db_open failed! (2)
slap_startup failed (test would succeed using the -u switch)
[root@ty-ldap01 ~]#
## 新しいディレクトリ上でパーミッションを設定
[root@ty-ldap01 ~]# chmod -R 000 /etc/openldap/slapd.d
[root@ty-ldap01 ~]# chmod -R u+rwX /etc/openldap/slapd.d
[root@ty-ldap01 ~]# chown -R ldap: /etc/openldap/slapd.d
[root@ty-ldap01 ~]# chown -R ldap: /var/lib/ldap

■LDAPサーバの起動
[root@ty-ldap01 ~]# /etc/init.d/slapd start
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
## 自動起動設定
[root@ty-ldap01 ~]# chkconfig slapd on; chkconfig --list slapd
slapd           0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@ty-ldap01 ~]#

■LDAPサーバへの接続確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -b dc=my-domain,dc=com -LLL
No such object (32)
[root@ty-ldap01 ~]#
## オプション説明
"-x" 匿名ユーザーでの簡易認証
"-h" OpenLDAPサーバを指定
"-b" ディレクトリツリーの検索ベースを指定
"-LLL"最もシンプルなLDIFフォーマットへ出力を整形

## 結果補足
起動したばかりのOpenLDAPサーバからは、「検索条件に一致する結果はなし」との応答が返ります。
現時点ではまだエントリを登録していないため、これが正しい結果です。

■LDAPパスワードの作成
## 管理用
[root@ty-ldap01 ~]# slappasswd -s secret
{SSHA}XZY46aVGlCElS13dN4ryN0kwglZCVKqG
[root@ty-ldap01 ~]#
## 各ユーザ用(共通)
[root@ty-ldap01 ~]# slappasswd -s naisyo
{SSHA}u1iYyUnYJtd4u32LN3FvpFEc34yCVoE5
[root@ty-ldap01 ~]#

■slapd.confの設定とチェック
[root@ty-ldap01 ~]# cp -p /etc/openldap/slapd.conf /etc/openldap/slapd.conf.org
[root@ty-ldap01 ~]# vi /etc/openldap/slapd.conf
[root@ty-ldap01 ~]# egrep -n "^suffix|^rootdn|^rootpw" /etc/openldap/slapd.conf
115:suffix              "dc=open_ldap,dc=com"
117:rootdn              "cn=Manager,dc=open_ldap,dc=com"
123:rootpw              {SSHA}XZY46aVGlCElS13dN4ryN0kwglZCVKqG
[root@ty-ldap01 ~]# slaptest -u -f /etc/openldap/slapd.conf
config file testing succeeded
[root@ty-ldap01 ~]#
※rootpwには先ほど作成した管理者用のエンコードされたパスワード文字列を記述します。
※my-domain → open_ldap に変更してみました。

■slapd.confの設定変更反映
一連の作業をシェルスクリプト化しておきます。
[root@ty-ldap01 ~]# vi /usr/local/bin/change_slapd.sh
[root@ty-ldap01 ~]# cat /usr/local/bin/change_slapd.sh
#!/bin/sh
# /etc/openldap/slapd.conf の設定を反映するスクリプト

rm -rf /etc/openldap/slapd.d/*
slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
chmod -R 000 /etc/openldap/slapd.d
chmod -R u+rwX /etc/openldap/slapd.d
chown -R ldap: /etc/openldap/slapd.d
/etc/init.d/slapd restart

exit 0
[root@ty-ldap01 ~]# chmod 755 /usr/local/bin/change_slapd.sh
[root@ty-ldap01 ~]# change_slapd.sh
config file testing succeeded
slapd を停止中:                                            [  OK  ]
slapd を起動中:                                            [  OK  ]
[root@ty-ldap01 ~]#
slaptestコマンドでslapd.confの内容に基づきslapd.dディレクトリ以下にファイルを 出力したいが書き込み権限が無いため更新されません。よって事前に削除しておきます。

■管理者で接続確認
[root@ty-ldap01 ~]# ldapsearch -x -h localhost -D "cn=Manager,dc=open_ldap,dc=com" -w secret
# extended LDIF
#
# LDAPv3
# base <> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1
[root@ty-ldap01 ~]#
正しく接続できました。登録されたデータはまだないため上記のように表示されます。 OpenLDAPのインストールおよび起動、接続までの手順は以上となります。


Next >> (2) LDIFによるLDAPサーバへのデータ登録

2014年4月23日水曜日

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


■概要
複数のユーザが複数のサーバにSSHでログインして作業する場合、各サーバごとにID/Passwordを準備して認証することも可能ですが、アカウント管理としては煩雑になっていしまいます。
LDAPサーバを導入してユーザのID/Passwordを一元管理することで、どのサーバにも同じPasswrodでログインでき、また、どこかのサーバでPasswordを変更しても他のサーバにログインする場合は変更後のPasswordでログインできるようになります。

OS: CentOS 6.4 (64-bit)
openldap: 2.4.23
nss-pam-ldapd: 0.7.5



■LinuxOSへのSSHログイン認証を一元管理するまでの流れ

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

(1) OpenLDAPのインストールと起動 (⇒詳細ページ)
openldap-servers、openldap-clients、nss-pam-ldapdのインストールおよびslapd.confの
設定と変更方法、slapdサービスの起動およびLDAPサーバへの接続確認方法についてまとめます。
特に、CentOS 6系からslapdの設定はslapd.dディレクトリ以下のファイルで定義される方式に変更と
なっているので注意が必要です。今回はDB_CONFIGを使用し、旧来のslapd.confに設定した内容を
slapd.dディレクトリに出力する手順をまとめます。

(2) LDIFによるLDAPサーバへのデータ登録 (⇒詳細ページ)
LinuxのOSユーザは最低1つのグループに属しているので、それを踏襲したDIT
(Directory Information Tree)をLDAP上に定義して、ユーザを登録する手順をまとめます。
LDAPサーバへデータを登録するにはLDIFファイルの利用が便利です。登録したユーザの削除や
パスワード変更、一連作業時によくあるエラーのメッセージもまとめてみます。

(3) LDAP登録ユーザでのSSHログイン認証とパスワード変更 (⇒詳細ページ)
アプリ系サーバにLDAP認証モジュール(nss-pam-ldapd)を追加してLDAPサーバに接続します。
idコマンドでLDAPに登録したユーザを確認できるものの、ログインすることができません。
認証クライアントモジュールをsssdからnslcdに変更にすることで、SSHログインできるようになります。
homeDirectoryもLDAPサーバからNFSマウントする方式にした方が一元管理レベル感が高まります。

ここまで出来ればLDAPユーザのパスワードをアプリ系サーバから変更したいところですが、またしても
エラーに出くわします。slapd.confをさらに修正することでLDAPサーバ上のパスワードも変更できる
ようなります。こちらの手順もまとめてみたいと思います。

(4) OpenLDAPのログ出力設定 (⇒詳細ページ)
OpenLDAPサーバはデフォルト設定ではログを出力しません。
slapd.confにログレベルを記述すると、シスログ経由でログを出力します。
ログレベルおよびログの出力先の設定についての手順を記載します。

概要へ戻る