久々の更新です(○´・д・)ノ
ldapのRewriteをご存知でしょうか?検索の条件を書き換えてくれる機能です(`・ω・。)っ
Rewriteの設定を変えようとしていたところで、ldapのバグを発見しました!!
コミュニティに連絡(連絡したのは私ではないですが)したところ、速攻で修正/反映してくれました。
対応がすばらしいですね。いや、本当に。こんな対応を見習いたいものです。
とりあえず、Rewriteについて簡単に説明します。
使用している環境は、いつものCentOSではなく、debianなのでご注意を。そんな変わる部分はないかとは思いますが、若干設定のdnが違うような気がします。
とりあえず、ldapが動いているものとして話を始めますねφ(・д・。
ldapのインストール教えてよ!という人はコメントに連絡ください。別途書きますので。
早速Rewriteの登録です。
◆ Rewriteモジュールのインストール
# cat module.ldif dn: cn=module,cn=config cn: module objectclass: olcModuleList objectclass: top olcmoduleload: rwm.la olcmodulepath: /usr/lib/ldap |
# ldapadd -Y EXTERNAL -H ldapi:// -f module.ldif ASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=module,cn=config" |
◆ Rewriteの設定
# cat rwm.ldif
dn: olcOverlay=rwm,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: rwm
olcRwmRewrite: rwm-rewriteEngine on
olcRwmRewrite: rwm-rewriteContext searchFilter
olcRwmRewrite: rwm-rewriteRule "(.*)mail=([a-z0-9_]+)\\-([a-zA-Z0-9_=\\.]+)@(nightmare-yk.com)(.*)" "$1mail=$2@$4$5" ":@"
|
# ldapadd -Y EXTERNAL -H ldapi:// -f rwm.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "olcOverlay=rwm,olcDatabase={1}mdb,cn=config"
|
登録を確認してみましょう。
# ldapsearch -LLL -Y EXTERNAL -H ldapi:// -b " olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmRewrite: {0}rwm-rewriteEngine on
olcRwmRewrite: {1}rwm-rewriteContext searchFilter
olcRwmRewrite: {2}rwm-rewriteRule "(.*)mail=([a-z0-9_]+)\-([a-zA-Z0-9_=\.]+)@(nightmare-yk\.com)(.*)" "$1mail=$2@$4$5" ":@"
|
登録できましたね!
ちなみに上記は、test-sub@nightmare-yk.comのようなメールアドレスの-より後ろの部分
を無視して検索してくれるようにする設定になります。
実際に確かめてみると以下のようになります。
– メールアドレスそのまま
# ldapsearch -h 127.0.0.1 -LLL -x -D "cn=manager,dc=nightmare-yk,dc=com" -b "dc=nightmare-yk,dc=com" -w secret "(mail=yosuke@nightmare-yk.com)" dn: uid=yosuke,dc=nightmare-yk,dc=com objectClass: inetOrgPerson sn: yosuke cn: yosuke mail: yosuke@nightmare-yk.com uid: yosuke |
– メールアドレスに-testがついたとき
# ldapsearch -h 127.0.0.1 -LLL -x -D "cn=manager,dc=nightmare-yk,dc=com" -b "dc=nightmare-yk,dc=com" -w secret "(mail=yosuke-test@nightmare-yk.com)" dn: uid=yosuke,dc=nightmare-yk,dc=com objectClass: inetOrgPerson sn: yosuke cn: yosuke mail: yosuke@nightmare-yk.com uid: yosuke |
– メールアドレスに+testがついたとき
# ldapsearch -h 127.0.0.1 -LLL -x -D "cn=manager,dc=nightmare-yk,dc=com" -b "dc=nightmare-yk,dc=com" -w secret "(mail=yosuke+test@nightmare-yk.com)" |
-より後ろが無視されて検索できていると思います。
勿論、Rewriteの設定追加や変更、削除もできます。
◆ 追加
# cat rwm_add.ldif
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
changetype: modify
add: olcRwmRewrite
olcRwmRewrite: rwm-rewriteRule "test" "test2" ":@"
|
# ldapmodify -Y EXTERNAL -H ldapi:/// -f rwm_add.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
|
# ldapsearch -LLL -Y EXTERNAL -H ldapi:// -b "olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmRewrite: {0}rwm-rewriteEngine on
olcRwmRewrite: {1}rwm-rewriteContext searchFilter
olcRwmRewrite: {2}rwm-rewriteRule "(.*)mail=([a-z0-9_]+)\-([a-zA-Z0-9_=\.]+)@(
nightmare-yk\.com)(.*)" "$1mail=$2@$4$5" ":@"
olcRwmRewrite: {3}rwm-rewriteRule "test" "test2" ":@"
|
◆ 変更
# cat rwm_mod.ldif
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcRwmRewrite
olcRwmRewrite: {0}rwm-rewriteEngine on
olcRwmRewrite: {1}rwm-rewriteContext searchFilter
olcRwmRewrite: {2}rwm-rewriteRule "(.*)mail=([a-z0-9_]+)\-([a-zA-Z0-9_=\.]+)@(nightmare-yk\.com)(.*)" "$1mail=$2@$4$5" ":@"
olcRwmRewrite: rwm-rewriteRule "kome" "kome2" ":@"
|
# ldapmodify -Y EXTERNAL -H ldapi:/// -f rwm_mod.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
|
# ldapsearch -LLL -Y EXTERNAL -H ldapi:// -b " olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmRewrite: {0}rwm-rewriteEngine on
olcRwmRewrite: {1}rwm-rewriteContext searchFilter
olcRwmRewrite: {2}rwm-rewriteRule "(.*)mail=([a-z0-9_]+)\-([a-zA-Z0-9_=\.]+)@(
nightmare-yk\.com)(.*)" "$1mail=$2@$4$5" ":@"
olcRwmRewrite: {3}rwm-rewriteRule "kome" "kome2" ":@"
|
ただ、削除にバグがあったのです。∑ヾ( ̄0 ̄;
◆ 削除
# cat rwm_del.ldif
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
changetype: modify
delete: olcRwmRewrite
olcRwmRewrite: rwm-rewriteRule "kome" "kome2" ":@"
|
# ldapmodify -Y EXTERNAL -H ldapi:/// -f rwm_del.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
ldap_result: Can't contact LDAP server (-1)
|
Can’t contact LDAP server (-1)…?ん?
# ps -ef | grep ldap | grep -v grep |
…死んでるやん!
ということで、コミュニティに問い合わせたところ、
Looks like it. Please file an ITS for tracking. http://www.openldap.org/its/
と返信を頂きました。
すぐにITSに登録しましたところ、改修パッチの連絡を頂きました。
8月14日に OpenLDAP 2.4.42 がリリースされており、この改修が反映されていました。
早速、debianのldapに入れてみましょう。
◆ パッチ用意
# cat rwm.patch
--- openldap_2.4.40+dfsg.orig/servers/slapd/overlays/rwm.c 2014-09-19 10:48:49.000000000 +0900
+++ openldap-2.4.40+dfsg/servers/slapd/overlays/rwm.c 2015-09-16 07:16:31.368000000 +0900
@@ -2179,7 +2179,10 @@
ca.line = rwmap->rwm_bva_rewrite[ i ].bv_val;
ca.argc = 0;
config_fp_parse_line( &ca );
-
+
+ argv0 = ca.argv[ 0 ];
+ ca.argv[ 0 ] += STRLENOF( "rwm-" );
+
if ( strcasecmp( ca.argv[ 0 ], "suffixmassage" ) == 0 ) {
rc = rwm_suffixmassage_config( &db, c->fname, c->lineno,
ca.argc, ca.argv );
@@ -2189,6 +2192,8 @@
ca.argc, ca.argv );
}
+ ca.argv[ 0 ] = argv0;
+
ch_free( ca.tline );
ch_free( ca.argv );
|
◆ パッケージ作成
# apt-get source slapd # patch -p0 < rwm.patch # cd openldap-2.4.40+dfsg # debuild -uc -us -b |
少々というかだいぶ時間がかかります。
早速入れてみましょう。
# dpkg -i slapd_2.4.40+dfsg-1_amd64.deb (データベースを読み込んでいます ... 現在 43305 個のファイルとディレクトリがインストールされています 。) slapd_2.4.40+dfsg-1_amd64.deb を展開する準備をしています ... slapd (2.4.40+dfsg-1) で (2.4.40+dfsg-1 に) 上書き展開しています ... slapd (2.4.40+dfsg-1) を設定しています ... Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.4.40+dfsg-1... done. man-db (2.7.0.2-5) のトリガを処理しています ... systemd (215-17+deb8u1) のトリガを処理しています ... libc-bin (2.19-18) のトリガを処理しています ... |
LDAPを再起動して
# systemctl restart slapd |
設定の削除にトライ☆
# ldapmodify -Y EXTERNAL -H ldapi:/// -f rwm_del.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
|
確認してみると…
# ldapsearch -LLL -Y EXTERNAL -H ldapi:// -b " olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config"
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcOverlay={0}rwm,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcRwmConfig
olcOverlay: {0}rwm
olcRwmRewrite: {0}rwm-rewriteEngine on
olcRwmRewrite: {1}rwm-rewriteContext searchFilter
olcRwmRewrite: {2}rwm-rewriteRule "(.*)mail=([a-z0-9_]+)\-([a-zA-Z0-9_=\.]+)@(
nightmare-yk\.com)(.*)" "$1mail=$2@$4$5" ":@"
|
おっ!消えてる消えてる(●´∀`)ノ