久々の更新です(○´・д・)ノ
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" ":@" |
おっ!消えてる消えてる(●´∀`)ノ