'Memo/Linux/OpenLDAP/' には、下位層のページがありません。
OpenLDAP †
バイナリ値: base64 †
属性に "::" がついているとバイナリ値。base64でエンコードされている。
- 例:"\r\n"が入っている、画像等
- 日本語等は文字コード:UTF-8で、base64エンコードして入れる
例:
# 通常の場合
sshPublicKey: ssh-rsa ...
# 末尾に"\r\n"が入っている場合
sshPublicKey:: c3NoLXJ...
パスワード変更時に「Must supply old password to be changed as well as new one」 †
- 環境
- CentOS release 6.8
- openldap-servers-2.4.40-12.el6.x86_64
- 現象
- ldapmodify時にldap serverの/var/log/openldap/slapd.logに「Must supply old password to be changed as well as new one」と表示され、client(php)側は「LDAP - Modify password error 50 (Insufficient access)」となる。
- パスワードの変更時に古いパスワード入力が必須になっている
- 原因
- 「pwdSafeModify:TRUE」が /etc/openldap/slapd.conf の「ppolicy_default」で指定されたcnレコードに追加されていると発生する
- 解決
- 「pwdSafeModify:FALSE」に変更する。
- LDAPのadminユーザで変更する
- または、Re: [ldapext] ppolicy questions LDAP Server側ppolicyを変更しないで実施する場合、削除後に追加する
dn: uid=jayson,ou=people,o=example,dc=com
changetype: modify
delete: userPassword
userPassword: OldPassword
add: userPassword
userPassword: NewPassword
- PHP: ldap_modify_batch - Manualの場合
$modifications = array(
array(
"attrib" => "userPassword",
"modtype" => LDAP_MODIFY_BATCH_REMOVE,
"values" => array($oldpassword),
),
array(
"attrib" => "userPassword",
"modtype" => LDAP_MODIFY_BATCH_ADD,
"values" => array($password),
),
);
$bmod = ldap_modify_batch($ldap, $dn, $modifications);
index †
- config databaseを使っている場合、後からindexを追加し、slapd.d を消して、slapdを再起動すると、nslcdから名前解決できなくなる。ldapsearchは成功し、サーバのopenldapのログや、nslcdにはエラーは出ない。この場合、slapindex を実行すると解決した。
loglevel †
- デフォルトでは何もログが出ない
- syslog経由で出力する事が出来る。解説サイトでは数値だが、文字でも指定できる
- /etc/openldap/slapd.conf
loglevel stats sync
- /etc/rsyslog.d/openldap.conf
local4.* /var/log/openldap/slapd.log
- /etc/logrotate.d/openldap
/var/log/openldap/*.log {
daily
missingok
compress
notifempty
copytruncate
}
- サービスの再起動
sudo service rsyslog restart
標準入力を使う †
- ヒアドキュメントを使う場合
ldapmodify -x -H 'ldap://localhost' -D 'cn=Manager,dc=my-domain,dc=com' -W <<EOS
dn: uid=user01,ou=People,dc=my-domain,dc=com
changetype: modify
replace: sshPublicKey
sshPublicKey: ssh-rsa replaced
EOS
- echoを使う場合
echo "dn: uid=user01,ou=People,dc=my-domain,dc=com
changetype: modify
replace: sshPublicKey
sshPublicKey: ssh-rsa replaced
" | ldapmodify -x -H 'ldap://localhost' -D 'cn=Manager,dc=my-domain,dc=com' -W
ACL(Access Control Lis) / アクセス制限 †
ブラウザから一般ユーザのパスワード/公開鍵変更 †
LDAPの一般ユーザが以下の事をブラウザから簡単に行いたい。
- パスワード変更(userPassword属性)
- SSH公開鍵変更(sshPublicKey属性)
- Easy LDAP management | LDAP Account Manager
- php製。php5.4以上。yumインストール可能
- SSH public key extensionに編集があった
- 有償Pro版あり
- 見た目は綺麗な方
- ツリービューの部分がphpLDAPadminとほぼ同じ
- 右上のツリービュー、新規ユーザ作成を無効化したい
- ユーザタブで、ログインユーザだけを表示したい。(@@LOGIN_DN@@でうまく絞れなかった)
- 項目毎のreadonlyが出来ない。Pro版はできそう
- 設定:/usr/share/ldap-account-manager/config/lam.conf
トラブル †
local userでもLDAPに問い合わせてしまう †
- 構成:CentOS 6/7, nss-pam-ldapd, openldap, openssh-ldap, nscd
- 問題
- local userで認証成功した場合は、LDAPに問い合わせないで欲しい。
- CentOS 6.x/7.x で確認する限り、local user認証が成功してもLDAPに問い合わせてしまう
- local userのログインでも遅くなるし、無駄な問い合わせでLDAPサーバの負荷が上がる
- Man page of NSSWITCH.CONFの通りに指定しても目的の挙動にならない
- 「files [NOTFOUND=return] ldap」local user=>成功、ldap user=>失敗(想定通り)
- 「files [!NOTFOUND=return] ldap」local user=>LDAP接続、ldap user=>LDAP接続(想定外)
- 「files [NOTFOUND=continue] ldap」local user=>LDAP接続、ldap user=>LDAP接続(想定外)
- 「files [SUCCESS=return] ldap」local user=>LDAP接続、ldap user=>LDAP接続(想定外)
Can't contact LDAP server †
- 「ldap_result() failed: Can't contact LDAP server」が/var/log/messagesによく出る
/etc/pam.d/以下がsymlinkの場合にauthconfigを使うと壊れる場合がある †
- ○:/etc/pam.d/*-authがsymlink、*-acが実体
- ×:/etc/pam.d/*-authが実体、*-ac がsymlink
attribute 'c' not allowed †
- slapaddでエラーが出る。schemaファイル名は同じでもopenldap-serversのバージョンによって微妙に違いがあるようだ。古い schema を上書きしたら動作した
- /etc/openldap/schema/
- OK: openldap-servers-2.4.23-34.25.amzn1.x86_64
- NG: openldap-servers-2.4.40-12.el6.x86_64
diff -uwr schema/inetorgperson.schema schema.2.4.40-12/inetorgperson.schema
--- schema/inetorgperson.schema 2012-11-30 22:38:35.000000000 +0900
+++ schema.2.4.40-12/inetorgperson.schema 2016-05-11 08:32:09.000000000 +0900
@@ -151,5 +151,5 @@
labeledURI $ mail $ manager $ mobile $ o $ pager $
photo $ roomNumber $ secretary $ uid $ userCertificate $
x500uniqueIdentifier $ preferredLanguage $
- userSMIMECertificate $ userPKCS12 $ c )
+ userSMIMECertificate $ userPKCS12 )
)
LDAPスキーマの追加 †
slapadd等でLDAPスキーマが不足している場合は、「str2ad(sudoUser): attribute type undefined」の様なエラーが出る。
- CentOS6.x: sudo.schema, openssh.schema, ldapns.schema を追加
# sudo.schemaを追加
find /usr/share/doc/ -name schema.OpenLDAP
/usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP
sudo cp /usr/share/doc/sudo-1.8.6p3/schema.OpenLDAP /etc/openldap/schema/sudo.schema
# openssh.schema, ldapns.schemaを追加
sudo yum install openssh-ldap pam_ldap -y
find /usr/share/doc/ -name openssh-lpk-openldap.schema
/usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-openldap.schema
sudo cp /usr/share/doc/openssh-ldap-5.3p1/openssh-lpk-openldap.schema /etc/openldap/schema/openssh.schema
find /usr/share/doc/ -name ldapns.schema
/usr/share/doc/pam_ldap-185/ldapns.schema
sudo cp /usr/share/doc/pam_ldap-185/ldapns.schema /etc/openldap/schema/
sudo vim /etc/openldap/slapd.conf
----
include /etc/openldap/schema/sudo.schema
include /etc/openldap/schema/openssh.schema
include /etc/openldap/schema/ldapns.schema
----
デバッグ †
認証方式の変更 †
- CentOS7では /etc/nsswitch.conf 内がldapではなく、sssに変わるので注意
- コマンドライン
LANG=C; authconfig-tui
LDAPでssh認証する場合に、sudoできない時 †
LDAPでssh公開鍵認証を使う †
現状2つ方法があるようだ。
- nslcd + nscd を使う
- sssd を使う
- sshのバージョンによって/etc/ssh/sshd_configの記述が違う。「sshd -t」で設定ファイルのテストできる
- /etc/sysconfig/authconfig は初回存在しない。(CentOS 6.5) 作成するには、
sudo authconfig --update
ldapdelete:エントリの削除 †
- 指定階層以下も削除したい場合は「-r」オプション
ldapdelete -x -H ldap://localhost:389 \
-D "cn=Manager,dc=my-domain,dc=com" \
-W \
'uid=user03,ou=People,dc=my-domain,dc=com'
バージョンアップ †
password hash methodの変更 †
sudo vim /etc/openldap/slapd.conf
----
# database config より上に記述
password-hash {SHA}
----
sudo service slapd stop
sudo rm -rf /etc/openldap/slapd.d/{cn=config,cn=config.ldif}
sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
sudo service slapd restart
slappasswd : パスワード生成 †
ハッシュ化パスワードを生成する。
- Google Apps Directory Syncで同期する時には {SHA} が必要。で{SSHA}だとエラーになる
- CentOS6.x には openldap-servers パッケージに入っていた
# 入力待ち
slappasswd
New password:
Re-enter new password:
{SSHA}CfGz6P2+x1YoIAjBnIsezTJvROGXQFMw
# パスワード指定
slappasswd -s secret
{SSHA}H8R+xa45GRrDhntW8NzXO0pP5btUnAz3
# Hash methodの指定: {SHA}, {SSHA}, {MD5}, {SMD5}, {CRYPT}, {CLEARTEXT}
slappasswd -s secret -h {SHA}
{SHA}5en6G6MezRroT3XKqkdPOmY/BfQ=
ldappasswd : パスワード変更 †
- 一般ユーザが自分でパスワードで変更する場合。
ldappasswd -x -H 'ldap://localhost' \
-D 'uid=user01,l=apac,ou=users,dc=my-domain,dc=com' \
-W -S -A 'uid=user01,l=apac,ou=users,dc=my-domain,dc=com'
Old password: ***
Re-enter old password: ***
New password: ***
Re-enter new password: ***
Enter LDAP Password: ***
- 他ユーザを使ってパスワードの変更(-W, -A, -S でそれぞれ入力待ちになる)
ldappasswd -x -H 'ldap://localhost' -D 'cn=Manager,dc=my-domain,dc=com' -w 'Manager password' -s 'new password' 'uid=user01,l=apac,ou=users,dc=my-domain,dc=com'
objectClass: value #0 invalid per syntax †
- 原因
- objectClassの上から#0番目がエラー
- 未定義のobjectClassを使用している
LDIFファイル †
- 1行1レコード
- 行頭が空白文字の場合、継続行
- コメント: 行頭 "#"
- 空行で区切り
# 1つめのエントリ
dn: uid=user01,ou=People,dc=my-domain,dc=com
uid: user01
cn: Test User 01
objectClass: account
objectClass: posixAccount
objectClass: top
loginShell: /bin/bash
uidNumber: 5001
gidNumber: 3001
homeDirectory: /home/user01
# 2つめのエントリ
dn: uid=user02,ou=People,dc=my-domain,dc=com
uid: user02
cn: Test User 02
objectClass: account
objectClass: posixAccount
objectClass: top
loginShell: /bin/bash
uidNumber: 5002
gidNumber: 3002
homeDirectory: /home/user02
uidNumberの最大値を検索 †
ldapsearch -x -H 'ldap://localhost' -b 'dc=my-domain,dc=com' -D 'cn=Manager,dc=my-domain,dc=com' -w 'YOUR PASSWORD' '(objectClass=posixAccount)' -LLL | \
grep uidNumber: | \
cut -f 2 -d ' ' | \
sort -nr | \
head -n 1
ldapsearch : 登録済みエントリーの検索 †
- ldaps:// を使って uid=hoge を検索。("-W" の代わりに "-w password" でパスワードを直接指定)
ldapsearch -x -b 'dc=my-domain,dc=com' '(uid=hoge)' \
-H ldaps://localhost:636 \
-D "cn=Manager,dc=my-domain,dc=com" \
-W
- -b: 指定階層以下を検索したい場合、filterではなく、-b 'ou=users,dc=my-domain,dc=com' のように指定する
- -A: 属性名のみを表示。属性値は非表示
- o ldif-wrap=no: 出力時に改行しない。OpenLDAP 2.4.24以降で指定可能。デフォルトでは78文字で改行される。
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1) †
ldaps://での通信時に発生。SSL自己証明書等を利用していると出る。
openldap-clientsのみの場合でも有効。
sshログインにldapを使う †
- クライアント側
# インストール
yum install pam_ldap nscd nss-pam-ldapd
# デフォルトでTLS認証が嫌な場合は以下をyesに変更
vim /etc/sysconfig/authconfig
----
FORCELEGACY=yes
----
# 認証情報設定(/etc/nsswitch.conf, /etc/pam.d/system-auth-ac, /etc/openldap/ldap.conf が変更される)
authconfig --enableldap --enableldapauth --ldapserver="ldap://[LDAP SERVER]/" --ldapbasedn="dc=my-domain,dc=com" --update
authconfig --test | grep -i ldap
chkconfig nslcd on
# ホームディレクトリが無い場合は自動作成
echo "session optional pam_mkhomedir.so skel=/etc/skel umask=022" >> /etc/pam.d/system-auth-ac
- sshログインできるかテスト
設定(cn=config) 監視(cn=monitor) データベースを有効にする †
デフォルトでは以下のディレクトリはadminユーザでも見えない。
- cn=config ディレクトリ
- LDAPサーバ設定自体をデータベースに格納して管理
- CentOS6.x
- ユーザ:cn=Manager,dc=my-domain,dc=com でアクセス可能にする場合
# "database bdb" の前に追加
sudo vim /etc/openldap/slapd.conf
----
# 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 dn.exact="cn=Manager,dc=my-domain,dc=com" manage
by * none
# enable server status monitoring (cn=monitor)
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by dn.exact="cn=Manager,dc=my-domain,dc=com" read
by * none
----
sudo service slapd stop
sudo rm -rf /etc/openldap/slapd.d/{cn=config,cn=config.ldif}
sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
sudo service slapd restart
- Apache Directory Studioからのアクセス
- Network Parameterタブ
- Hostname: 環境に合わせて
- Port: 389(デフォルト)
- Authenticationタブ
- Authentication Method: Simple Authentication
- Bind DN or user: cn=Manager,dc=my-domain,dc=com
- Bind password: ****
- Browser Options
- Get base DNs from Root DSEのチェックを外して、見たいディレクトリ(cn=config , cn=monitor)を直接入力
- Fetch Operational Attributes while browsing: チェック
- 例:OpenLDAPが起動している秒数(Uptime)取得。("-W" の代わりに "-w password" でパスワードを直接指定)
ldapsearch -x \
-b "cn=Uptime,cn=Time,cn=Monitor" \
-D "cn=Manager,dc=my-domain,dc=com" \
-W \
monitoredInfo -LLL
# 結果
dn: cn=Uptime,cn=Time,cn=Monitor
monitoredInfo: 111
- Apache Directory Studioで見る
- cn=monitor > cn=Time > cn=Uptime までツリーをたどる
- 表示されない場合は 右クリック > Fetch Operational Attributes
レプリケーション/冗長化 †
readonly replica †
- slapd.conf: でミラーモードをoffにする
mirrormode off
監視 †
- 監視。それぞれサーバでcontextCSNを取得して比較。同じならOK。contextCSNのソート順はバラバラなので自分でソートする必要がある
ldapsearch -x -H ldap://localhost \
-s base -b "dc=my-domain,dc=com" \
-D "cn=Manager,dc=my-domain,dc=com" \
-W contextCSN
contextCSN: 20130906022414.910401Z#000000#001#000000
contextCSN: 20130906013314.290742Z#000000#002#000000
- スクリプトにした
ldap-status.sh
yum install openldap-clients
chmod 755 ldap-status.sh
./ldap-status.sh --servers ldap://server01/,ldap://server02/ \
--base-dn dc=my-domain,dc=com \
--bind-dn cn=Manager,dc=my-domain,dc=com \
--bind-password YOUR-PASSWORD \
replication-status
監視 †
CN=Monitor - 管理ツール †
Apache Directory Studio - 管理ツール †
- 詳細プロパティの表示: エントリ上で右クリック > Fetch Operational Attributes
- 詳細プロパティをデフォルトで表示させる: Connections:選択 > 右クリックしてproperties > Browser Optionsタブ > Fetch Operational Attributes while browsing: チェック
- 不具合?
- 表示されないエントリがある。ldapsearchコマンドだと表示される。
phpLDAPadmin - 管理ツール †
バックアップ/リストア †
インストール †
- CentOS 6.x
- インストール
yum install openldap-servers openldap-clients
# rootパスワードの設定。"{SSHA}〜"をメモ
slappasswd -s secret
# Berkeley DB設定
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
vim /var/lib/ldap/DB_CONFIG
----
# one 0.25 GB cache
set_cachesize 0 268435456 1
# Transaction Log settings
set_lg_regionmax 262144
set_lg_bsize 2097152
# automatically delete transaction logs
set_flags DB_LOG_AUTOREMOVE
----
# slapd.conf 設定変更
cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
vim /etc/openldap/slapd.conf
----
# suffixの変更
suffix "dc=my-domain,dc=com"
# rootdnの変更
rootdn "cn=Manager,dc=my-domain,dc=com"
# rootpwの変更
rootpw {SSHA}XACqUDuUFVNjgfn+JPFilYB1X852Xepi
----
# slapd.conf テスト
slaptest -u -f /etc/openldap/slapd.conf -v
# slapd.conf 更新
sudo service slapd stop
sudo rm -rf /etc/openldap/slapd.d/{cn=config,cn=config.ldif}
sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
sudo service slapd restart
- サンプルドメイン(dc=my-domain,dc=com)追加。
ldif-example.zip
- user passwor:secret
ldapadd -x -D "cn=Manager,dc=my-domain,dc=com" -W -f ./base.ldif
ldapadd -x -D "cn=Manager,dc=my-domain,dc=com" -W -f ./group.ldif
ldapadd -x -D "cn=Manager,dc=my-domain,dc=com" -W -f ./user.ldif
- 確認
# rootユーザで検索
ldapsearch -x -b 'dc=my-domain,dc=com' '(objectClass=*)' \
-H ldap://localhost \
-D "cn=Manager,dc=my-domain,dc=com" \
-W
# 外部サービス接続用のユーザで検索
ldapsearch -x -b 'dc=my-domain,dc=com' '(objectClass=*)' \
-H ldap://localhost \
-D "cn=connector,ou=People,dc=my-domain,dc=com" \
-W
|
|