さくらVPSのCentOSにOpenLDAPをインストール

CentOS 6.4
OpenLDAP 2.4.23

ちょっとユーザIDとパスワードを共通化したいだけなのに…

LDAPって何だかややこしいんですよね〜


私が大事だと感じたポイントは以下のとおり。

  • ツリー構造になっており、ツリーの各ノードに属性を設定する
    • 「会社→部課→ユーザ」のような構造
    • ユーザIDやパスワード、氏名やメールアドレスなどを属性として設定
    • LDAP管理用のツリーとデータ登録用のツリーがある
  • ツリーの各ノードには事前に定義したデータ型(objectclass)を指定する必要がある
    • データ型は一般的なものが予め定義されている
    • 独自のデータ型を定義することもできる
    • データ型には属性名や、それが必須かどうかを定義できる
    • データ型はひとつのノードに複数適用できる
  • dnという属性がノードを一意に識別する識別子
    • dnは「当該ノードの属性どれかひとつ + "," + 親ノードのdn」で、一意になるように定める
      • データ型によってどの属性を使用するかを強制されることはなく、「一意になる」ことさえ守ればよい
  • LDAPは汎用的なので様々なツリー構造を作れるが、「一般的に期待されているツリー構造」というものがある。
    • アプリケーション側がそれを要求することがあるので、事前に調べたほうが良い

今回作成するディレクトリ(ツリー)構造

  • ルート
    • Group
    • People
      • ユーザ1
      • ユーザ2

グループは入れ物だけ作ってますが、中身は作ってません(力尽きました。とりあえずはなくてもいいし…)。
また、CentOSのログインアカウントは共通化しません。

インストール

インストールはほんと簡単…

yum install openldap-servers openldap-clients

LDAPの環境設定

#これを実行するとパスワードの入力を求められる。
#入力するとハッシュが出力される。
slappasswd
#LDAP編集用のパスワードを設定
#設定ファイルを開き下記を登録
#  olcRootPW: 上記で出力したハッシュ
vi /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
#LDAPデータを保存するDBの設定を作成
#サンプル設定をそのまま使用する
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
#LDAPデーモン起動
/etc/rc.d/init.d/slapd start
#LDAPログはデフォルトだと捨てられるので、保存するように変更
#設定ファイルを開き下記を登録
#  local4.*    /var/log/ldap
vi /etc/rsyslog.conf
#SYSLOGデーモンを再起動
/etc/init.d/rsyslog restart

LDAP管理用のツリーを編集

  • LDAPの編集はLDIFというファイルを作成し、それをLDAPに読み込ませることで行う
  • ツリーのルートのdnには通常ドメイン名を使用
mkdir /var/lib/ldap/ldif
cd /var/lib/ldap/ldif
vi bdb-init.ldif
bdb-init.ldif
#データ登録用ツリーのメタ情報を編集するため、編集するノードを指定
dn: olcDatabase={2}bdb,cn=config
#ノードの修正を行うことを宣言
changetype: modify
#olcRootDN(データ登録用ツリーのアクセス制御を無視する特権ユーザのようなもの)を編集
replace: olcRootDN
olcRootDN: cn=Manager,dc=hoge,dc=com
-
#olcSuffix(データ登録用ツリーのルート)を編集
replace: olcSuffix
olcSuffix: dc=hoge,dc=com
-
# olcRootPW(olcRootDNのパスワード)を追加
add: olcRootPW
olcRootPW: 
LDAPに適用
ldapmodify -x -D cn=config -f bdb-init.ldif -W

データ用ツリーの作成

touch init.ldif add_group.ldif add_people.ldif
init.ldif(ルートの設定)
dn: dc=hoge,dc=com
objectclass: dcObject
objectclass: organization
o: 組織名
dc: hoge

dn: cn=Manager,dc=hoge,dc=com
objectclass: organizationalRole
cn: Manager
add_group.ldif(Group, Peopleの設定)
dn: ou=People,dc=hoge,dc=com
objectclass: organizationalUnit
ou: People

dn: ou=Group,dc=hoge,dc=com
objectclass: organizationalUnit
ou: Group
add_people.ldif(ユーザの設定)
dn: uid=testuser1,ou=People,dc=hoge,dc=com
objectclass: inetOrgPerson
uid: testuser1
cn: 山田 太郎
sn: 山田
givenName: 太郎
userPassword: slappasswdで作ったパスワードのハッシュ
mail: taroyamada@hoge.com

dn: uid=testuser2,ou=People,dc=hoge,dc=com
objectclass: inetOrgPerson
uid: testuser2
cn: 川村 次郎
sn: 川村
givenName: 次郎
userPassword: slappasswdで作ったパスワードのハッシュ
mail: jirokawamura@hoge.com
LDAPに適用
ldapadd -x -W -D "cn=Manager,dc=hoge,dc=com" -f init.ldif
ldapadd -x -W -D "cn=Manager,dc=hoge,dc=com" -f add_group.ldif
ldapadd -x -W -D "cn=Manager,dc=hoge,dc=com" -f add_people.ldif