openLDAPバグ発見 – Rewrite機能にて –

久々の更新です(○´・д・)ノ

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に登録しましたところ、改修パッチの連絡を頂きました。

http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=commitdiff;h=7380354270758201408200253efff729a8e7deee

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" ":@"

おっ!消えてる消えてる(●´∀`)ノ


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です