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のログ出力設定

0 件のコメント:

コメントを投稿