まずはアカウントの登録

では、まずはLDAPにアカウント登録する方法です。

slapd.confを設定します。


////////////////////////////slapd.conf////////////////////////////////
include /usr/local/services/ldap/etc/openldap/schema/core.schema
include /usr/local/services/ldap/etc/openldap/schema/cosine.schema
include /usr/local/services/ldap/etc/openldap/schema/nis.schema

pidfile /usr/local/services/ldap/var/run/slapd.pid
argsfile /usr/local/services/ldap/var/run/slapd.args
database bdb
suffix "dc=home"
rootdn "cn=Manager,dc=home"
rootpw {SSHA}XXXXXXXXXX
directory /usr/local/services/ldap/var/openldap-data
index objectClass eq

access to attrs=userPassword
by self write
by dn="cn=Manager,dc=home" write
by anonymous auth
by * none

access to *
by self write
by dn="cn=Manager,dc=home" write
by * read
/////////////////////////////////////////////////////

以下のふたつのschemaを追加でincludeしました。

nisUNIX認証に必要なobjectClassを持ってます。
cosineの方はnisを使うのに必要な模様。

suffix "dc=home"
rootdn "cn=Manager,dc=home"

LDAPのデータ構造DITの一番上(root)の定義です。
suffixがルートで,rootdnはこのslapdの管理者の設定かな?
なんかいまいちどの辺にきいてくるのかピンとこず。
LDIFを登録するときにこの辺りを見てるのかもしれません。
一般的にはdc=example,dc=comみたいにドメイン名が使われるみたいですが、(たぶん全世界的にユニークな空間にするため)別になんでもいけそうです。
後々内部DNSもたてるつもりなんですが、そのときのゾーン名をhomeにしようと思ってるのでdc=homeにしときました。

rootpw {SSHA}XXXXXXXXXX
管理社用のパスワードです。slappasswdコマンドで生成できます。


# slappasswd -s $passwd
$passwdのとこにパスワード入力するとよいです。
暗号化の方式にMD5とかも使えるみたいです。


access to attrs=userPassword
by self write
by dn="cn=Manager,dc=home" write
by anonymous auth
by * none

access to *
by self write
by dn="cn=Manager,dc=home" write
by * read

各属性値へのアクセス権限です。
上はuserPasswordに対するアクセス権限で

  • 自分自身(self)は書込可能(write)
  • LDAP管理ユーザー(cn=root,dc=itboost,dc=co,dc=jp)は書込可能(write)
  • 匿名接続(anonymous)した場合は 認証時のみuserPasswordを利用できる
  • そのほかのユーザー(*)は何もできない(none)

下はその他に対する権限で

  • LDAP管理ユーザー(cn=root,dc=itboost,dc=co,dc=jp)は書込可能(write)
  • 自分自身(self)は書込可能(write)
  • そのほかのユーザー(*)は読取は可能(read)

というった感じです。

とりあえずslapdの設定ができたのでいったんslapdを再起動します。


# /etc/init.d/slapd restart

さて、slapdの準備ができたので次はldifファイルをつかってldapaddコマンドでデータを追加していきます。複数ファイルで定義しても一つのファイルで定義しても良いようです。
ldapaddコマンドで登録しない限りは反映されません


///////////////////////data.ldif///////////////////////////
dn: dc=home
objectclass: dcObject
objectclass: organization
o: Home Network
dc: home

dn: cn=Manager,dc=home
objectclass: organizationalRole
cn: Manager
dn: ou=Group,dc=home
objectClass: organizationalUnit
ou: Group

dn: ou=Group,dc=home
objectClass: organizationalUnit
ou: Group

dn: ou=People,dc=home
ou: People
objectClass: top
objectClass: organizationalUnit

dn: cn=admin,ou=Group,dc=home
objectClass: posixGroup
objectClass: top
cn: admin
gidNumber: 777
memberUid: admin

dn: uid=admin,ou=People,dc=home
uid: admin
cn: admin
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
objectClass: top
userPassword: {SSHA}xxxxxxxxxxxxxx
loginShell: /bin/bash
uidNumber: 777
gidNumber: 777
homeDirectory: /home/admin
/////////////////////////////////////////////////////

さて細かいとこは端折りますが、dnは全部で6つ


・1st level
dn: dc=home (root)
・2nd level
dn: cn=Manager,dc=home (このDITの管理者)
dn: ou=Group,dc=home (UNIX group)
dn: ou=People,dc=home(UNIX account)
・3rd level
dn: cn=admin,ou=Group,dc=home (admin group)
dn: uid=admin,ou=People,dc=home (admin user)

を定義してあります。
dn: uid=admin,ou=People,dc=home
でobjectClass:posixAccountを使っています。
またshadowAccountにするためのshadowAccountなども使ってます。
みれば判ると思いますが、


userPassword: {SSHA}xxxxxxxxxxxxxx
loginShell: /bin/bash
uidNumber: 777
gidNumber: 777
homeDirectory: /home/admin

この辺が

属性⇔属性値

のペアでloginShell: /bin/bashだとログインした時のシェルがbashになるということみたいです。

さてファイルが出来たらあとはコマンドで登録です。


# ldapadd -x -D "cn=Manager,dc=home" -W -f data.ldif

データが入ってるかどうかはldapsearchで確認します。


# ldapsearch -H ldap://localhost -x -b"dc=home" "(objectclass=*)"

こんな感じです。成功していれば入れたデータがズラズラ並ぶはずです。
これで、データの登録は終わりです。
ざっと認証できるとこまでやったのでldapsearchの使い方とかはぶっちゃけまだあまり把握できてません(´・ω・`)
ま、ここから少しずつ勉強していこうかなと。
Sambaの認証もありますしね。
まあでもincludeでsamba用のスキーマを読み込んでldifに属性追加すれば行けるのだろうという予測は立ちますね。