4.OpenLDAPサーバの構築④ -オブジェクトクラス(objectClass)/組織(ou)/グループの設定

投稿者: | 2017年12月6日

3.OpenLDAPサーバ ベースDN/管理者DNの設定が終わったら、次はオブジェクトクラス/組織/グループの設定。


■オブジェクトクラス(objectClass)と属性(attribute)の関係

オブジェクトクラス(objectClass)は、2.OpenLDAPサーバの構築② -管理者パスワードの設定で少しだけ触れているが、ベースDN、管理者DN、組織、グループ、ユーザそれぞれに対して設定されるもので、属性(attribute)を定義している根っこの部分。ベースDN、管理者DN、組織、グループ、ユーザそれぞれに設定するべきオブジェクトクラスがあり、それに紐づく属性を設定する必要がある。

オブジェクトクラスと属性の関係について、一つの例としてldapサーバの/etc/openldap/schema/core.ldifをのぞいてみる。

[root@ldapserver ~]# cat /etc/openldap/schema/core.ldif
                :
olcObjectClasses: ( 2.5.6.5 NAME 'organizationalUnit'
  DESC 'RFC2256: an organizational unit'
  SUP top STRUCTURAL
  MUST ou
  MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory $
  x121Address $ registeredAddress $ destinationIndicator $
  preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier $
  telephoneNumber $ internationaliSDNNumber $
  facsimileTelephoneNumber $ street $ postOfficeBox $ postalCode $
  postalAddress $ physicalDeliveryOfficeName $ st $ l $ description ) )
                :

core.ldif内にorganizationalUnitというオブジェクトクラスの記述があるが、下の「MUST ou」「MAY ( userPassword ・・・」という記述に注目すると、organizationalUnitというオブジェクトクラスを設定した場合、
・属性「ou」は必須で設定が必要
・userPassword ・・・ は任意で設定する。
という内容が設定されていることが分かる。これがオブジェクトクラスと属性の関係になる。さらにオブジェクトクラスには継承関係というものがあるが、それは後々に説明する。


■ベースDN/組織(ou)に対して、オブジェクトクラスと属性の設定

上の図で赤い四角で囲んだ箇所が4つあるが、それぞれに対してオブジェクトクラスと属性を設定していく。 ここではベースDN「dc=abc,dc=edf,dc=com」のオブジェクトクラスと組織「ou=Group」「ou=People」の設定を行う。 /root/ldif配下に以下の内容のldifファイルを作成する。

[root@ldapserver ~]#  vi /root/ldif/base_ou.ldif    ->  ファイル名は任意。
dn: dc=abc,dc=def,dc=com
objectClass: dcObject
objectClass: organization
dc: abc
o: AbcDef Inc.

dn: ou=People,dc=abc,dc=def,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=abc,dc=def,dc=com
objectClass: organizationalUnit
ou: Group

ベースDN「dc=abc,dc=edf,dc=com」にdcObjectとorganizationというオブジェクトクラスを設定。dcObjectに紐づく属性が「dc」で、organizationに紐づく属性が「o」となる。「dc」という属性にはベースDN一番最初の「dc=abc」のabcを指定し、「o」という属性には任意の文字列を設定する。ここでは会社の名前っぽく「AbcDef Inc.」にしてみた。
組織のDN「ou=People,dc=abc,dc=def,dc=com」「ou=Group,dc=abc,dc=def,dc=com」のオブジェクトクラスは「organizationalUnit」で、それに紐づく属性が「ou」となる。ouはそれぞれ「People」「Group」となっているが、組織のDNの「ou=」の部分と同じ文字列になるように設定する。

上記内容のファイルをldapaddコマンドで投入する。

[root@ldapserver ~]# ldapadd -x -D "cn=Manager,dc=abc,dc=def,dc=com" -w manager -f /root/ldif/base_ou.ldif
adding new entry "dc=abc,dc=def,dc=com"

adding new entry "ou=People,dc=abc,dc=def,dc=com"

adding new entry "ou=Group,dc=abc,dc=def,dc=com"

ldapaddコマンドのオプションは以下の通り。
「-x」 : 簡易認証。(-Y EXTERNALでSASL認証をしないやり方。)
「-D」 : どのDNに結び付けるかを指定する。グループやユーザを設定する場合は、管理者DNを指定する。
「-w」 : 管理者パスワードを設定する。ここでは2.OpenLDAPサーバの構築② -管理者パスワードの設定で「manager」と設定したので、managerと指定する。対話式(コマンド実行後パスワードを聞かれるようにする)の場合は「-W」を使い、コマンド上ではパスワードを設定しない。
「-f」 : 実行するldifファイルを指定する。

実行結果でadding new entry ~ 以外にエラーが出なければ投入OK。ldapsearchコマンドで投入された内容が確認できる。

[root@ldapserver ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'dc=abc,dc=def,dc=com' '(objectClass=*)'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: dc=abc,dc=def,dc=com
objectClass: dcObject
objectClass: organization
dc: abc
o: AbcDef Inc.

dn: ou=People,dc=abc,dc=def,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=abc,dc=def,dc=com
objectClass: organizationalUnit
ou: Group

ldapsearchコマンドのオプションは以下の通り。
「-LLL」 : 検索結果の内容の指定。-Lの場合はコメント行が付加され、-LLの場合はLDIFバージョンが付加される。その両方を省略するのが-LLL。
「-Y EXTERNAL」 : SASL認証を使用。
「-H」 : ldapサーバの指定。「ldapi:///」はローカルとなる。
「-b」 : 検索対象とするDNやolcDatabase、objectClassや属性を指定する。bはbindのb。複数の検索箇所を指定することも可能で、複数指定した場合AND条件での検索となる。上記の場合、「dc=abc,dc=def,dc=comというベースDN配下にある、すべてのobjectClassを検索する」という意味になる。


■スキーマの追加

次はグループの設定を行うが、その前にスキーマの追加を行う。
スキーマとは、ldapサーバ上でオブジェクトクラスや属性を使えるようにするための元になっているデータ。CentOS7の場合、openldap-serversをyumインストールすると、/etc/openldap/schema配下に複数のldifファイルとschemaファイルが格納される。ここには単に格納されているだけで、それらがデフォルトでスキーマ登録されているわけではない。ただし上記の組織で設定したオブジェクトクラスや属性は、openldap-serversの初期インストールからデフォルトでスキーマ登録されており、改めてスキーマを追加する作業は不要だった。

初期インストール直後の時点では、グループ設定に必要となるposixGroupというオブジェクトクラス(及び、それに紐づく属性)がスキーマ登録されていないため、グループ設定の前にスキーマを登録する必要がある。
ここでは、デフォルトで格納されている/etc/openldap/schema/cosine.ldifとnis.ldifをスキーマ登録する。cosine.ldifにはposixAccount等のオブジェクトクラスが記述されており、nis.ldifにはposixGroup等のオブジェクトクラスが記述されている。順序としてはcosine.ldif -> nis.ldifでldapaddコマンドで実行する。
※2018/3/23追記
今のパッケージバージョンだと、nis.ldifだけをいきなりスキーマ登録すると「AttributeType not found」となり登録できないことが判明。少し前はnis.ldifだけでいけたのですが。。。
事前にcosine.ldifも登録必要のようです。

[root@ldapserver ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"

[root@ldapserver ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

ldapaddコマンドのオプションについて
「-Y EXTERNAL」 ⇒ SASLのEXTERNAL認証を使用。
「-H」 ⇒ ldapi:で指定するホスト名(IPアドレス)を指定。ldapサーバ上で操作しているため、ldapi:///という記述でOK。-Yオプションとセットで使用する。
「-f」 ⇒ ldifファイルを指定して投入する際に使用する。

ldapaddコマンドの実行結果で「adding new entry~」の後にエラーが出なければスキーマ登録完了。これでグループ設定用のオブジェクトクラスと属性が使えるようになった。


■グループ(cn)の設定

スキーマ登録が終わったら、組織の配下にグループを設定する。実はこの作業は必須ではなく、組織の配下に直にユーザを置くこともできる。ここでは、例えば会社の中に複数の部署や課があるようなイメージで、組織の中にもグループを作成していくことにする。

グループを作成するためのldifファイルを、以下のように作成する。

[root@ldapserver ~]# vi /root/ldif/groupadd.ldif    ->  ファイル名は任意。
dn: cn=ldapmanager,ou=Group,dc=abc,dc=def,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapmanager
gidNumber: 1001

「dn:」はグループのDNを設定。「ou=Group,dc=abc,dc=def,dc=com」の配下におく場合、先頭に「cn=~」を記述する。「ldapmanager」は任意の文字列なので、なんでもよい。
オブジェクトクラスは「posixGroup」と「top」を設定。topの必須属性はobjectClassなので、objectClassを設定するためのobjectClass。。。ということになる。topの要否は不明だが、グループやユーザを作成するときに使うことが多い。
posixGroupに紐づく属性がcnとgidNumber。cnはdnの「cn=ldapmanager」と同じく「ldapmanager」に設定する。gidNumberはUNIXの/etc/groupに該当する部分なので、現状/etc/groupに設定されていない数字を設定する。

上記ファイルを作成したら、ldapaddコマンドでグループ追加を実行する。

[root@ldapserver ~]# ldapadd -x -D "cn=Manager,dc=abc,dc=def,dc=com" -w manager -f /root/ldif/groupadd.ldif
adding new entry "cn=ldapmanager,ou=Group,dc=abc,dc=def,dc=com"

ldapaddコマンドの実行結果で「adding new entry~」の後にエラーが出なければグループ設定OK。
ldapsearchコマンドでグループが投入されたかを確認する。

[root@ldapserver ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'dc=abc,dc=def,dc=com' 'cn=ldapmanager'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=ldapmanager,ou=Group,dc=abc,dc=def,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapmanager
gidNumber: 1001

ldifファイルに記述した内容が出力されればOK。これで組織とグループの設定は完了!

4.OpenLDAPサーバの構築④ -オブジェクトクラス(objectClass)/組織(ou)/グループの設定」への3件のフィードバック

  1. siki

    コメント失礼いたします。大変参考にさせていただいてます。
    ひとつ質問なのですが、スキーマの追加で、”ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif”
    実行時に”ldap_add: Other (e.g., implementation specific) error (80) additional info: olcObjectClasses: AttributeType not found: “manager”と表示され悩んでおります。何かお気づきの点があれば指摘して頂けると幸いです。

    返信
    1. タン 投稿作成者

      閲覧くださり大変にありがとうございます。また、返信が遅くなり申し訳ありません。ネタ集めのためにしばらく更新が滞っていました。
      もし自己解決されていましたら申し訳ない限りですが、私の方で気づいた点を記載させて頂きます。

      エラーの内容で「AttributeType not found」と表示されているので、nis.ldifの登録に必要な属性がまだないのではと存じます。
      私の経験上、nis.ldifの前にcosine.ldifの登録が必要でした。
      すでにcosine.ldifは登録済みでしたでしょうか?

      返信
  2. タン 投稿作成者

    大変申し訳ないです。
    投稿の記述ですが、cosine.ldifが後に来ていました。
    修正しておきますね。失礼しました。

    返信

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA