LDAP(slapd) on Debian

導入(wheezy)

slapdというパッケージになっているのでそれを入れる

# apt-get install slapd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  libltdl7 libodbc1 libperl5.14 libslp1
提案パッケージ:
  libmyodbc odbc-postgresql tdsodbc unixodbc-bin slpd openslp-doc ldap-utils
以下のパッケージが新たにインストールされます:
  libltdl7 libodbc1 libperl5.14 libslp1 slapd
アップグレード: 0 個、新規インストール: 5 個、削除: 0 個、保留: 0 個。
3,116 kB のアーカイブを取得する必要があります。
この操作後に追加で 6,898 kB のディスク容量が消費されます。
続行しますか [Y/n]?

adminのパスワードを聞かれるので適当に入力

あなたの LDAP ディレクトリでの admin エントリのパスワードを入力してくだ
さい。                                                                 
                                                                       
admin パスワード:                                                      

とりあえずdpkg-reconfigure slapdとしておく OpenLDAP サーバの設定を省略しますか? →いいえ

 DNS ドメイン名は LDAP ディレクトリのベース DN を形成するのに使われます。
 たとえば、'foo.example.org' は、ベース DN として 'dc=foo, dc=example,
 dc=org' のディレクトリを作成します。                                                   
                                                                         
 DNS ドメイン名:                                                         

ここには通常のfoo.bar.orgなどを入れる。dc=fooなどはいれない事。 何を言っているのわからん場合は適当にexample.orgとかにしておけばいいんではないか?一番根っこの部分を作っている。

あとは適当に…という所だが、LDAPv2を許可するかどうかは割とデカい所だ。とりあえず今の世の中になったのでv2は許可しない事とする。

適当に追加/削除してみる

slapなんとかコマンド

とりあえずou=memberとかいうorganizationalUnitを作成してみる。本当は(基本的に)DNS ドメイン名から生成されるベースDNのdcObjectをも作成しなくてはならないのだけれど、debianの場合はやらなくても最初から作られている。とにかくどんな内容がslapdに格納されているのか適当に知りたいのであればまずslapcatしてみるべき。

# slapcat
# (rootで行う)

slapなんちゃらのコマンドはldapプロトコルを経由しない(つまり、TCPなどをしない)コマンド群で、これらはslapdパッケージに内包されている。基本 /usr/sbinの下に入っている事からわかるように、スーパーユーザで実行するべきものだ。

# dpkg -L slapd | grep sbin
/usr/sbin
/usr/sbin/slappasswd
/usr/sbin/slapindex
/usr/sbin/slapd
/usr/sbin/slapauth
/usr/sbin/slapcat
/usr/sbin/slapacl
/usr/sbin/slapschema
/usr/sbin/slapadd
/usr/sbin/slapdn
/usr/sbin/slaptest

ファイルシステムを直接読みに行くタイプのコマンドであり、LDAPプロトコルを利用しない。つまりslapdだけに作用するものである。

逆にldapなんちゃらで始まる類のコマンドはldapプロトコルを利用するオンラインなコマンド群であり、これはldap-utilsを導入しないとついてこない。

先にも書いた通り、slap*なコマンドはslapd特有であり、ldap*なコマンドは汎用ldapツールであるので、対象がslapdだろうがactive directoryだろうが、ldapプロトコルを話せるのであれば使えるというわけだ。

slap系のコマンドを利用する時、気をつけないといけないのは、読取だけならまだしも、書き込みを行う類(slapaddとか)を行う場合はslapdを止めたオフラインの状態で行った方が無難であるという事。(openldap2.1からはオンラインでも可とされているが、オフラインの方が良いかと思う。)

またrootでやった場合所有者が変更されてデーモンが正常に動かなくなる事もままある。Debianでは、openldapというユーザでslapdのデータを管理しており、その実態は/var/lib/ldapにある。念のためlsで確認しておくと良いかも。 基本的にはslap系のコマンドはreadonlyで利用したい所である。

slapcat

さて、前置きが長くなりすぎたが、とりあえず現状のslapdの内容をまるっとldifで吐き出すにはslapcatとすれば良いのであった

# slapcat

-lオプションを渡せばファイルに落としこむ事もできるが、リダイレクトしても良い。要するにこれは基本にdumperである。mysqldumpでダンプしたデータがmysqlから投入できるように、ここでも同じ事が出来る。slapcatの内容をバックアップしておくと共に実データもどこぞにバックアップしておくと安全だろう。

また横道にそれてしまったけれども、slapcatのldifの内容には非常に沢山のエントリが含まれているのだが、dn: の値にルートオブジェクトと管理者description: LDAP administratorが含まれているのがわかるはず。

実は管理者に関してはslapdの中に入っている必要は無い。/etc/ldap/slapd.confrootdnで管理者エントリが定義できるし、rootpwという設定ファイルにてマスターパスワードを設定する事もできる。あえて設定ファイルにつっこまず、実態のDBにつっこんでACLで管理するのがdebian流のようである。もちろん設定ファイルにこれらを書く事もできる。そして設定ファイルの方が優先される

他にslapindexslappasswdなどといったコマンドもある。

ou=membersでも作ってみる

前置きがひじょーに長くなったわけだが、いよいよ実際にエントリを追加していく作業に入る。ouとはorganizationalUnitの略で、簡単に言うと「単純にエントリを格納しておくだけの箱」=「フォルダ」というような概念である。ここではmembersというouを作成してみる。エントリの作成、更新、何から何までこの世界ではldifというちょっとアレだけど他に変わりもなさそうなテキストファイルで用を済ます。

dn: ou=members, dc=catatsumuri, dc=org
ou: members
objectClass: organizationalUnit

というようなldifを実際のテキストとして起こすわけである(がそのうち面倒になってくるので何らかのツールを使う事になるのだが、コマンドとldifが基本なので何はともあれ最初は手作業で)

さて、このエントリを追加する方法は2種類ある。それはオフラインのslapaddを使う場合と、ldapプロトコルを利用したldapaddを利用する方法である。ldapaddはTCPで接続してバインドを行って権限を決定するので一般ユーザで行っても良い(というかTCPで繋がりさえすればLinuxの権限は関係ない)。slapaddはldapデータベース(ファイルシステム)を直接触るので、然るべき権限が必要となるのは先に書いた通りだ。

というわけでldapaddしてみる事にしよう。「おや、コマンドが無いぞ」って場合はldap-utilsいれてやってください…

% ldapadd -D cn=admin,dc=catatsumuri,dc=org -x -W < members.ldif
Enter LDAP Password:
adding new entry "ou=members, dc=catatsumuri, dc=org"

ここで重要なコマンドラインオプションが出てきた

  • -D: どのエントリでバインドするか
  • -x: (SASLを利用しない)簡易認証を行う
  • -W: プロンプトから認証を行う(-wにするとコマンドラインにベタ書きする)

ldapaddは標準入力から吸いあげるのだが、-lオプションでファイルを指定してやっても良い。

さらに追加してみる

とりあえずouの下にベタっと何かのエントリを置いてみましょ。ともあれ何かではアレなのでobjectClass: inetOrgPersonあたりでいってみましょう。objectClassっていうのはスキーマと呼ばれるもので、予めいろいろと規格が用意されています。この規格が用意されている事によってアドレス帳の共有が出来たり、とかそういう事になるのですが…マアここでは割愛

dn: cn=catatsumuri, ou=members, dc=catatsumuri, dc=org
objectClass: inetOrgPerson
cn: catatsumuri
sn: catatsumuri

修正してみる

mailでも足してみましょう

dn: cn=catatsumuri, ou=members, dc=catatsumuri, dc=org
objectClass: inetOrgPerson
cn: catatsumuri
sn: catatsumuri
mail: root@catatsumuri.org

ldapaddの変わりにldapmodifyを利用すれば該当するdnが削除されても一度書き直されます。 がしかしこれは「たまたまそうなった」だけで実は修正用のldifというのがあったりします。

例えばmailを消す時はこんな感じ

dn: cn=catatsumuri, ou=members, dc=private, dc=emit-japan, dc=com
changetype: modify
delete: mail
mail: root@catatsumuri.org

追加するときはこんな具合でもいいわけです。

dn: cn=catatsumuri, ou=members, dc=private, dc=emit-japan, dc=com
changetype: modify
mail: root@catatsumuri.org
mail: admin@catatsumuri.org

changetypeは以下の5つがあります

  • add
  • delete
  • modify
  • modrdn
  • moddn

いずれにしても面倒な話ですね

こんな感じで追加、修正をするわけだが

やっぱり手作業はしんどいのでツールを使っていこうかと思います。

あと、今だと誰でも情報が読取放題になっているのでACL(権限設定)も考えないといけません。

$ ldapsearch -x -H ldap://127.0.0.1 -b "dc=catatsumuri,dc=org"
# 見え放題
slapd/install.txt · 最終更新: 2014/01/16 16:39 by admin
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0