ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

OpenLDAP on FreeBSD


FreeBSD 6.3-Rlease を使っていますが...
ports/openldap24-server が腐ってて一日つぶしました。

  • 起動はできる
  • ldapsearch で検索もできる
  • SIGTERM, SIGINTで死なない
  • SIGKILLでなら死ぬ(当然)
  • だから /usr/local/etc/rc.d/slapd stop じゃ止まらない

デバッガで追いかけてみたところ、どうやらシグナルが受信できてないようです。


しょうがないので今回は openldap23 を使って構築。
こちらはインストールしたらすぐに動きました。やったね。


で、問題は現状の FreeBSD デフォルトの /etc/passwd, group からの移行方法。
ググると MigrationTool なるものがあって、Perl スクリプトで変換してくれる模様。
http://www.padl.com/OSS/MigrationTools.html


ところが。
Linux の /etc/shadow 用に作ってあるため、FreeBSD の /etc/master.passwd とは
フォーマットが微妙に異なってきちんと変換できない。


こんな適当なパッチで一応動いたので備忘録代わりに公開。

diff -u MigrationTools-47/migrate_group.pl MigrationTools-new/migrate_group.pl
--- MigrationTools-47/migrate_group.pl  2006-01-25 13:18:16.000000000 +0900
+++ MigrationTools-new/migrate_group.pl 2008-07-01 23:21:43.000000000 +0900
@@ -67,12 +67,7 @@

        print $HANDLE "dn: cn=$group,$NAMINGCONTEXT\n";
        print $HANDLE "objectClass: posixGroup\n";
-       print $HANDLE "objectClass: top\n";
        print $HANDLE "cn: $group\n";
-       if ($pwd) {
-               print $HANDLE "userPassword: {crypt}$pwd\n";
-       }
-
        print $HANDLE "gidNumber: $gid\n";

        @members = uniq($group, @members);
@@ -80,6 +75,7 @@
                print $HANDLE "memberUid: $_\n";
        }

+       print $HANDLE "memberUid: $group\n";
        print $HANDLE "\n";
 }

diff -u MigrationTools-47/migrate_passwd.pl MigrationTools-new/migrate_passwd.pl
--- MigrationTools-47/migrate_passwd.pl 2006-01-25 13:18:16.000000000 +0900
+++ MigrationTools-new/migrate_passwd.pl        2008-07-01 08:34:14.000000000 +0900
@@ -75,7 +75,7 @@
        s/哲Ae/g;
        s/絲ae/g;

-       local($user, $pwd, $uid, $gid, $gecos, $homedir, $shell) = split(/:/);
+       local($user, $pwd, $uid, $gid, $n1, $2, $n3, $gecos, $homedir, $shell) = split(/:/);

        if ($use_stdout) {
                &dump_user(STDOUT, $user, $pwd, $uid, $gid, $gecos, $homedir, $shell);
@@ -135,7 +135,7 @@
        }

        print $HANDLE "objectClass: posixAccount\n";
-       print $HANDLE "objectClass: top\n";
+       print $HANDLE "objectClass: shadowAccount\n";

        if ($DEFAULT_REALM) {
                print $HANDLE "objectClass: kerberosSecurityObject\n";

これで変換するとこんな感じに整形されます。

dn: uid=hossy,ou=Users,dc=padl,dc=com
uid: hossy
cn: hossy
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
userPassword: {CRYPT}$1$HOGEHOGE$FOOBARFOOBAR
loginShell: /bin/tcsh
uidNumber: 10000
gidNumber: 10000
homeDirectory: /home/hossy
gecos: hossy
dn: cn=hossy,ou=Groups,dc=padl,dc=com
objectClass: posixGroup
cn: hossy
gidNumber: 10000
memberUid: hossy

おっと。dn が padl.com のままだ。migrate_common.pl の書き換えも忘れぬよう。


それと、FreeBSD のパスワードって、/etc/master.passwd には $1$[SEED]$[MD5HASH] の形式で書いてあるから
OpenLDAP に変換したときにどうすればいいのかいろいろ探してみたけど、普通に {CRYPT}$1$[SEED]$[MD5HASH] で動いてます。


最近の FreeBSD はデフォルトではパスワードを seed 付き MD5 でハッシュしますが、/etc/auth.conf がデフォルトのままの場合、
crypt(3) の salt 引数が $1$ で始まっていればそれと同じ seed を使って MD5 ハッシュをしてくれるので問題ないみたいです。