■LDAPの概要
LDAP をイメージしやすくするためにおなじみのファイルシステムと対比 してみます。Linuxのファイルシステムは/を頂点とする階層構造を持ちます。/にはetcやhomeといった子ディレクトリが存在し各ディレクトリに はファイルが子ディレクトリが存在します。
ディ レクトリやファイルにはそれを識別するためのi-node番号という情報が割り当てられています。例えば/には直下にあるファイルやディレクトリの名前と i-node番号の対応情報が格納サれています。同様に/etcにはファイル「/etc/hosts」など/etcディレクトリ直下にあるファイルやディ レクトリの名前とi-node番号の対応情報が格納されています。
ディレクトリにはi-node番号 の他に もファイルのサイズ、パーミッション、タイムスタンプといった情報も格納されています。つまりファイルシステムにおけるディレクトリは子ファイルや子ディ レクトリの名前とi-node番号の対応情報やサイズ、パーミッションといった情報を提供するディレクトリサービスと言えます。
LDAPのディレクトリ構造もこれに似ています。ファイルシステムにおけるディレクトリが直下のファイルやディレクトリの情報をもつようにLDAPディレクトリのエントリは「属性」を呼ばれる情報を持ちます。
ただし、LDAPディレクトリでは属性情報の種類を利用者が定義できます。つまりファイルシステムのディレクトリが保持するi-node、ファイルサイズ、 パーミッションなど既定の情報しか持たないのに対してLDAPではエントリごとに異なる属性情報を持てます。このようなLDAPの特徴をいかすと普段はパスワードファイル「/etc/passwd」に格納されているLinuxのシステムのアカウント情報やメーラのアドレス帳で管理されている住所録データを LDAPサーバに格納できます。
ディレクトリのエントリには相対識別名 ( RDN : Relative Distnguish Name ) と呼ばれる名前が付けられます。相対識別名は「属性=属性値」という形式で記述され、例えばunix-powerドメインを表すエントリの相対識別名は「dc=unix-power」となります。またエントリを一意に表すために識別名 ( DN : Distinguish Name ) と呼ばれる名前があります。これは木構造の頂点に位置するエントリと当該エントリ間に存在する全エントリの相対識別名(RDN)を連結して記述 されます。例えば下記に示すUsersエントリの識別名(DN)は「ou=Users,dc=unix-power,dc=net」となります。
■属性の種類
LDAP ディレクトリの各エントリには属性情報が格納されています。属性情報は「属性名」と「属性値」の対で構成されます。属性の種類は様々で例えばcn属性 (Common Name)の値は人物の名前などです。また、dc属性(Domain Component)の値はDNSのドメイン名などです。
属性名 | 値の種類 | もともと の名前 |
c | 国名 | Country |
cn | 一般名、人名 | Common Name |
dc | ドメイン名 | Domain Component |
o | 団体名 | The Organization |
ObjectClass | スキーマ | – |
ou | 部署名 | Organization Unit |
sn | 姓 | Sumame |
st | 都道府県 | State |
uid | ユーザID | User ID |
このうちObjectClass属性は少し特殊です。この属性で指定される値はスキーマと呼ばれ、全てのエントリで指定する必要があります。スキーマでは当該エントリに格納されなければならない属性や格納できる属性などが定義されています。例えば「organizationUnit」スキーマが指定されたエントリにはou属性を必ず指定する必要があります。また「dcObject」スキーマを指定したエントリにはdc属性が必須です。
名前 | 必須属性 |
dcObject | dc |
organization | o |
organizationalRole | cn |
organizationalUnit | ou |
account | uid |
simpleSecurityObject | userPassword |
inetOrgPerson | cn, sn |
posixAccount | uid ( accountなど構造型オブジェクトクラスと一緒に使用する必要あり ) |
posixGroup | cn |
逆 に言えばLDAPディレクトリにエントリを追加する際はまず電話番号や氏名といった自分の登録したい情報の種類を整理しそれらを格納するための属性(cnやdc)を決めます。それからその属性を格納するためのスキーマを探すことになります。
■OpenLDAPのインストール
以下、openldapのインス トールコマンドです。
# yum install openldap openldap-servers openldap-clients # rpm -qa | grep openldap openldap-servers-2.4.23-32.el6_4.1.i686 openldap-2.4.23-32.el6_4.1.i686 openldap-devel-2.4.23-32.el6_4.1.i686 openldap-clients-2.4.23-32.el6_4.1.i686 |
OpenLDAPでは他のサービスプログラムのようにファイルで設定を管理するのではなくディレクトリサービスを使って管理することができるようになっています。この管理のためのディレクトリを設定用ディレクトリ ( Config Diretory )と呼びます。それに対してLinuxユーザアカウントをのデータベースなどを保管する場所をデータ用ディレクトリと呼びます。
上記はディレクトリを図で表したものです。設定用ディレクトリはデータ用ディレクトリとは完全に独立して管理します。設定用ディレクトリのトップはcn=configであり、DN名を変更することはできません。サーバ全体に及ぶ設定についてはcn=configエントリで管理します。
また、cn=configの配下には用途に合わせていくつかのエントリが作成されます。cn=schema , cn=configはスキーマデータを管理するためのコンテナです。olcDatabase={0}config,cn=configは設定用ディレクトリへのアクセス権など設定用ディレクトリに関する設定を管理するエントリです。さらにolcDatabase={2}bdbはデータ用ディレクトリの設定を管理するエントリです。エントリの属性の値を設定することでLDAPサーバへの設定を行うのです。
■設定用ディレクトリのパスワード設定
最初に設定用ディレクトリを管理するためのパスワードを用意します。パスワード生成は次のようにslappasswdコマンドで行います。
# slappasswd New password:[パスワード入力] Re-enter new password:[パスワード入力] {SSHA}3pVTGxVxrS7tFJXrp+sAA6EdSgO8y1NE |
パスワードの設定は/etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldifに行います。次の例のようにolcRootPWという項目を追加し先ほど生成したパスワードを設定します。
# vi /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif dn: olcDatabase={0}config objectClass: olcDatabaseConfig olcDatabase: {0}config olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=externa l,cn=auth" manage by * none olcAddContentAcl: TRUE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcRootDN: cn=config olcRootPW: {SSHA}3pVTGxVxrS7tFJXrp+sAA6EdSgO8y1NE olcSyncUseSubentry: FALSE olcMonitoring: FALSE structuralObjectClass: olcDatabaseConfig entryUUID: 050f47b0-1e9e-1032-838a-8d09b2d447dc creatorsName: cn=config createTimestamp: 20130311134754Z entryCSN: 20130311134754.903473Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20130311134754Z |
■データベースチューニング設定
LDAPサーバで利用できるデータベースには幾つかの種類が存在します。ここではバーク レーDBというのを利用しま すがその場合はデータベースがファイルが保存されているディレクトリにキャッシュサイズなどを指定するための設定ファイル「DB_CONFIG」を配置す る必要があります。そこで予め用意されている「DB_CONFIG」のサンプル「/etc/openldap/DB_CONFIG.example」を /var/lib/ldapディレクトリにコピーします。
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG |
ここまでくればサービスを起動します。
# /etc/rc.d/init.d/slapd start slapd を起動中: [ OK ] |
■LDAPサーバのログ
LDAPクライアントの設定を行なっても正常に動作しないような場合には原因がわからず調査が難しい場合があります。そのような場合にはLDAPサーバのログを参照することができるととても便利です。LDAPサーバのログは標準ではlocal4ファシリティでsyslogへ出力されるようになっています。しかし、標準的な設定ではlocal4ファシリティはどのログファイルにも保存されません。そのためログを参照するには明示的にlocal4ファシリティのログを保存するようrsyslogdの設定を行う必要があります。
標準のログファシリティのlocal4の都合が悪い場合にはログファシリティを変更することができます。また同様にログのレベルも変更することができます。設定は/etc/sysconfig/ldapで行います。
vi /etc/sysconfig/ldap # Options of slapd (see man slapd) SLAPD_OPTIONS="-l local4 -s 512" |
SLAPD_OPTIONSの設定を変更します。この設定はslapdに引数として渡されます。-lオプションはsyslogのファシリティを設定します。-sオプションでは記録するログの内容を設定します。実際の設定する数値は以下のデバッグレベルを元に必要な情報を選択しレベルの合算を設定します。例えば256の「コネクション、LDAP命令、結果」の内容と16384の「LDAP同期レプリケーション」の内容の両方を表示したい場合には合算した数値16640を設定します。/etc/sysconfig/ldapの設定を変更したらslapdサービスを再起動する必要があります。
レベル | 名称 | 記録内容 |
0 | – | メッセージを出力しない |
1 | trace | slapd内部の関数のトレース |
2 | packets | パケット処理のデバック情報 |
4 | args | slapd内部の関数のトレースで引数も表示 |
8 | conns | コネクション管理 |
16 | BER | 送受信したパケット |
32 | filter | 検索フィルタ処理 |
64 | config | 設定ファイルに関する処理 |
128 | ACL | アクセス制御に関する処理 |
256 | stats | コネクション、LDAP命令、結果 |
512 | stats2 | 送られたエントリのステータス |
1024 | shell | シェルバックエンドとの通信 |
2048 | parse | エントリの解析処理 |
16384 | sync | LDAP同期レプリケーション |
32768 | none | どのログレベルにも属さないもの |
65535 | any | 全てのレベルを表示 |
デフォルトではレベル256のログが記録されます。
■ログレベルの動的変更
ログレベルはcn=configのエントリにolcLogLevelを設定することで動的に変更することも可能です。以下はその設定を行うためのLDIFファイルです。
# vi loglevel.ldif dn: cn=config changetype: modify add: olcLogLevel olcLogLevel: filter config ACL stats |
olcLogLevelにはslapdの引数での指定と同様の数値でレベルを書くこともできますが、上のように名称で設定することもできます。なお、cn=configにすでにolcLogLevelの設定が行われている場合にはadd:をreplace:に変更する必要があります。以下、適用例です。
# ldapmodify -x -W -D cn=config -f loglevel.ldif |
■LDAPデータベースの基本設定
openldap-serversをインストールすると標準的なLDAPデーターベースの設定が行われます。しかし、次の3つの情報は利用者の環境に合わせて修正する必要があります。
・LDAPデータベースツリーのDN ( olcSuffix )
・LDAPサーバの管理用のアクセス権である特権DN ( olcRootDN )
・特権DNのパスワード ( olcRootPW )
LDAPデータベースツリーのDNはいわば名前に相当するものです。OpenLDAPではLDAPサーバ自体の設定はcn=configという名前のデータベースとして管理します。しかしユーザデータを登録するデータベースには自由に名前を設定することができます。一般的にはその組織のドメイン名などを元に作成しますのでここではunix-power.netというドメイン名を元に作成したdc=unix-power,dc=netという名称前提で記載します。
特権DNはLinuxシステムのrootユーザに相当するものでそのLDAPデータベースの全てのデータにアクセスすることのできる権限を持ちます。ここでは特権DNをcn=Manager,dc=unix-power,dc=netとして記載します。
まずはデータ用ディレクトリの基本設定がどうなっているのか確認します。設定の確認は次の例のようにldapsearchコマンドを使用します。
# ldapsearch -x -LLL -b 'olcDatabase={2}bdb,cn=config' -D cn=config -W Enter LDAP Password: [設定用ディレクトリパスワードを入力] dn: olcDatabase={2}bdb,cn=config objectClass: olcDatabaseConfig objectClass: olcBdbConfig olcDatabase: {2}bdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=my-domain,dc=com olcAddContentAcl: FALSE olcLastMod: TRUE olcMaxDerefDepth: 15 olcReadOnly: FALSE olcRootDN: cn=Manager,dc=my-domain,dc=net olcSyncUseSubentry: FALSE olcMonitoring: TRUE olcDbCacheSize: 1000 olcDbCheckpoint: 1024 15 olcDbConfig: {0}# $OpenLDAP: pkg/ldap/servers/slapd/DB_CONFIG,v 1.3.2.4 2007/1 2/18 11:53:27ghenry Exp$ olcDbConfig: {1}# Example DB_CONFIG file for use with slapd(8) BDB/HDB databases. olcDbConfig: {2}# olcDbConfig: {3}# See the Oracle Berkeley DB documentation olcDbConfig: {4}# <http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html> olcDbConfig: {5}# for detail description of DB_CONFIG syntax and semantics. olcDbConfig: {6}# olcDbConfig: {7}# Hints can also be found in the OpenLDAP Software FAQ olcDbConfig:: ezh9Iwk8aHR0cDovL3d3dy5vcGVubGRhcC5vcmcvZmFxL2luZGV4LmNnaT9maWxl PTI+ olcDbConfig: {9}# in particular: olcDbConfig: {10}# <http://www.openldap.org/faq/index.cgi?file=1075> olcDbConfig: {11} olcDbConfig: {12}# Note: most DB_CONFIG settings will take effect only upon rebuilding olcDbConfig: {13}# the DB environment. olcDbConfig: {14} olcDbConfig: {15}# one 0.25 GB cache olcDbConfig: {16}set_cachesize 0 268435456 1 olcDbConfig: {17} olcDbConfig: {18}# Data Directory olcDbConfig: {19}#set_data_dir db olcDbConfig: {20} olcDbConfig: {21}# Transaction Log settings olcDbConfig: {22}set_lg_regionmax 262144 olcDbConfig: {23}set_lg_bsize 2097152 olcDbConfig: {24}#set_lg_dir logs olcDbConfig: {25} olcDbConfig: {26}# Note: special DB_CONFIG flags are no longer needed for "quick" olcDbConfig:: ezI3fSMgc2xhcGFkZCg4KSBvciBzbGFwaW5kZXgoOCkgYWNjZXNzIChzZWUgdGhlaXIgLXEgb3B0aW9uKS4g olcDbNoSync: FALSE olcDbDirtyRead: FALSE olcDbIDLcacheSize: 0 olcDbIndex: objectClass pres,eq olcDbIndex: cn pres,eq,sub olcDbIndex: uid pres,eq,sub olcDbIndex: uidNumber pres,eq olcDbIndex: gidNumber pres,eq olcDbIndex: ou pres,eq,sub olcDbIndex: loginShell pres,eq olcDbIndex: mail pres,eq,sub olcDbIndex: sn pres,eq,sub olcDbIndex: givenName pres,eq,sub olcDbIndex: memberUid pres,eq,sub olcDbIndex: nisMapName pres,eq,sub olcDbIndex: nisMapEntry pres,eq,sub olcDbLinearIndex: FALSE olcDbMode: 0600 olcDbSearchStack: 16 olcDbShmKey: 0 olcDbCacheFree: 1 olcDbDNcacheSize: 0 |
ldapsearchの引数の-bオプションは検索場所の指定です。ここではolcDatabase={2}bdb,cn=configを指定しています。これはユーザ・データを格納するためのデータベースの設定データが格納されているエントリです。-Dオプションではサーバ管理用DNを指定しています。
出力結果のolcDbDirectoryは実際のデータが格納されるディレクトリです。標準では/var/lib/ldapにデータが格納されます。olcSuffixがLDAPデータベースツリーのDN、olcRootDNがLDAPサーバの管理用のアクセス権である特権DNの設定です。olcRootPWは設定されていないことがわかります。なお、ldapsearchの詳しい使い方は後述します。
■データ用ディレクトリの管理情報の変更
LDAPエントリーのデータ修正はldapmodifyコマンドで行います。設定を行うには以下のようなLDIFファイルを用意します。
# vi bdb-init.ldif -W # 設定を行うDNを指定 dn: olcDatabase={2}bdb,cn=config # このLDIFファイルで修正を行うことを宣言します changetype: modify # olcRootDNを書き換えることを指定し値を指定する replace: olcRootDN olcRootDN: cn=Manager,dc=unix-power,dc=net - # olcSuffixを書き換えることを指定し値を指定する replace: olcSuffix olcSuffix: dc=unix-power,dc=net - # olcRootPWを追加することを指定し値を指定する add: olcRootPW olcRootPW: {SSHA}en/K3sLikQDCWk/lMmWLNh8svNQ+ggf0 |
上記ファイルをldapmodifyコマンドでldapサーバに適用します。
# ldapmodify -x -D cn=config -f bdb-init.ldif -W Enter LDAP Password: modifying entry "olcDatabase={2}bdb,cn=config" |
■初期データの登録
初めてのLDAPサーバを起動した段階ではデータベースにディレクトリ情報が一切ありません。これからデータベースに住所録などのディレクトリ情報を登録するわけですがその前に基本となるディレクトリ情報を登録します。登録内容は以下の図のようにします。
登録すべき情報はLDIF形式と呼ばれるテキストファイルに記述します。たとえば unix-power.netドメインの情報を登録する場合は以下のようなLDIFファイルを作成し、init.ldifファイルとして保存します。
# vi init.ldif dn: dc=unix-power,dc=net objectclass: dcObject objectclass: organization o: VIRTUAL CORPORATION dc: unix-power dn: cn=Manager,dc=unix-power,dc=net objectclass: organizationalRole cn: Manager |
LDIF ファイルにかいた情報をデータベースに登録するにはldapaddコマンドを使います。例えば上記ファイルを内容をデータベースに登録するには以下の ldapaddコマンドを実行します。すると-Dオプションで指定したユーザのパスワードを尋ねられますのでこれを入力します。認証に成功すると 「adding new entry~」というメッセージがエントリごとに表示されます。
# ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f init.ldif Enter LDAP Password: adding new entry "dc=unix-power,dc=net" adding new entry "cn=Manager,dc=unix-power,dc=net" |
上記では-Wで対話的にパスワード入力していますが、-w ******でコマンドラインでも指定できます。続いてOUを登録します。同様に追加の内容を予めファイルに保存しておきまとめて実行します。
# vi add.ldif dn: ou=Users,dc=unix-power,dc=net objectclass: organizationalUnit ou: Users dn: ou=Groups,dc=unix-power,dc=net objectclass: organizationalUnit ou: Groups dn: ou=Computers,dc=unix-power,dc=net objectclass: organizationalUnit ou: Computers # ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f add.ldif Enter LDAP Password: adding new entry "ou=Users,dc=unix-power,dc=net" adding new entry "ou=Groups,dc=unix-power,dc=net" adding new entry "ou=Computers,dc=unix-power,dc=net |
続いてグループを登録します。
# vi groupadd.ldif dn: cn=develop,ou=Groups,dc=unix-power,dc=net objectClass: posixGroup cn: develop gidNumber: 1000 dn: cn=sales,ou=Groups,dc=unix-power,dc=net objectClass: posixGroup cn: sales gidNumber: 1001 dn: cn=market,ou=Groups,dc=unix-power,dc=net objectClass: posixGroup cn: market gidNumber: 1002 # ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f groupadd.ldif Enter LDAP Password: adding new entry "cn=develop,ou=Groups,dc=unix-power,dc=net" adding new entry "cn=sales,ou=Groups,dc=unix-power,dc=net" adding new entry "cn=market,ou=Groups,dc=unix-power,dc=net" |
続いてUserを登録します。同様にLDIFファイルを登録します。
# vi useradd.ldif dn: uid=takeda,ou=Users,dc=unix-power,dc=net objectclass: posixAccount objectclass: inetOrgPerson sn: takeda cn: kazuma displayName: Takeda Kazuma uid: takeda uidNumber: 1000 gidNumber: 1000 homeDirectory: /home/takeda loginShell: /bin/bash userPassword: {CRYPT}B5fKzlwfatuy2 mail: takeda@unix-power.net dn: uid=suzuki,ou=Users,dc=unix-power,dc=net objectclass: posixAccount objectclass: inetOrgPerson sn: suzuki cn: hajime displayName: Suzuki Hajime uid: suzuki uidNumber: 1001 gidNumber: 1000 homeDirectory: /home/suzuki loginShell: /bin/bash userPassword: {CRYPT}B5fKzlwfatuy2 mail: suzuki@unix-power.net dn: uid=tanaka,ou=Users,dc=unix-power,dc=net objectclass: posixAccount objectclass: inetOrgPerson sn: tanaka cn: takuya displayName: Tanaka Takuya uid: tanaka uidNumber: 1002 gidNumber: 1000 homeDirectory: /home/tanaka loginShell: /bin/bash userPassword: {CRYPT}B5fKzlwfatuy2 mail: tanaka@unix-power.net # ldapadd -x -W -D "cn=Manager,dc=unix-power,dc=net" -f useradd.ldif Enter LDAP Password: adding new entry "uid=takeda,ou=Users,dc=unix-power,dc=net" adding new entry "uid=suzuki,ou=Users,dc=unix-power,dc=net" adding new entry "uid=tanaka,ou=Users,dc=unix-power,dc=net" |
各ユーザに登録するパスワードは次のようにしてslappasswdコマンドで予め作成しておきます。
# slappasswd -h '{CRYPT}' New password: Re-enter new password: {CRYPT}B5fKzlwfatuy2 |
slappaswdの引数の-hオプションは暗号化のタイプの指定です。nss-pam-ldapを使用する場合には暗号化方式には{CRYPT}にします。
■LDAPの追加 ( ldapadd )
ldapaddコマンドは標準入力からLDIFテキストフォーマットのLDAPエントリーのデータを読み込み、それをLDAPサーバに登録します。実際に使用する場合には以下のオプションでサーバとの通信方法を指定する必要があります。
オプション | 説明 |
-H <uri> | LDAPサーバを参照するURIを指定する。 プロトコル、ホスト、ポートのみ指定できる。 指定しない場合、ldap://localhost:389となる。 |
-h <host> | LDAPサーバを指定する。指定しない場合、ローカルホストになる ( 非奨励オプション。-Hの使用を奨励 ) |
-p <port> | LDAPサーバのポート番号を指定する。指定しない場合、389となる ( 非奨励オプション。-Hの使用を奨励 ) |
-x | 簡易認証設定 |
-D <binddn> | LDAPサーバの認証に使うDN ( バインドDN ) を指定する。 指定しない場合は匿名接続となる。 |
-w <passwd> | LDAPサーバの認証に使うDNのパスワードを指定する。 |
-W | LDAPサーバの認証に使うDNのパスワードをプロンプトから入力することを指定する。 |
-f <file> | LDIFテキストフォーマットファイルを標準入力ではなく、指定したファイルから読み込む。 |
■LDAPの削除 ( ldapdelete )
ldapdeleteはLDAPエントリの削除を行うためのコマンドです。削除するDNを指定して実行することでLDAPサーバの該当するDNを削除することができます。実際に利用する場合にはオプションでLDAPサーバとの通信方法を指定する必要があります。ldapdeleteで利用できるオプションは-fオプションを除いてldapaddと同様です。以下にユーザtanakaを削除する場合の例を示します。
# ldapdelete -x -W -D "cn=Manager,dc=unix-power,dc=net" "uid=tanaka,ou=Users,dc=unix-power,dc=net" |
■LDAPの検索 ( ldapsearch )
ldapsearchはLDAPに登録されているエントリの検索を行うためのコマンドです。検索フィルタを指定することで条件付き検索を行うことができます。また、表示する属性タイプを指定することもできます。実際に利用する場合にはオプションでLDAPサーバとの通信方法を指定する必要があります。ldapsearchでは以下のオプションを使用することができます。
オプション | 説明 |
-H <uri> | LDAPサーバを参照するURIを指定する。 プロトコル、ホスト、ポートのみ指定できる。 指定しない場合、ldap://localhost:389となる。 |
-h <host> | LDAPサーバを指定する。指定しない場合、ローカルホストになる ( 非奨励オプション。-Hの使用を奨励 ) |
-p <port> | LDAPサーバのポート番号を指定する。指定しない場合、389となる ( 非奨励オプション。-Hの使用を奨励 ) |
-x | 簡易認証設定 |
-D <binddn> | LDAPサーバの認証に使うDN ( バインドDN ) を指定する。 指定しない場合は匿名接続となる。 |
-w <passwd> | LDAPサーバの認証に使うDNのパスワードを指定する。 |
-W | LDAPサーバの認証に使うDNのパスワードをプロンプトから入力することを指定する。 |
-b | 検索の起点を指定。例えばBaseDNに「ou=dept,dc=unix-power,dc=net」に 指定した場合は上位のエントリは検索対象外となります。 |
-s [Scope] | 検索範囲を指定します。[Scope]の値は「base」「one」「sub」の3種類です。 「base」はBaseDNエントリのみです。「one」はBaseDNエントリ自身と直下のエントリ、 「sub」はBaseDN以下全てのエントリを指します。 -sに何も指定しなければ「sub」が適用されます。 |
[Filter] | 検索フィ ルタを指定します。 例えば全てのエントリを抽出するには「(objectclass=*)」を指定します。 また、cn属性が「tanaka」で終わるエントリを抽出するには 「(cn=*tanaka)」とワイルドカードを指定できます。 その他、複数のフィルタを組み合わせたAND検索やOR検索も実行できます。 例えばcn属性が「tanaka」で終わり、かつcn属性が「taro」で始まるエントリ を抽出するには「(&(cn=*tanaka)(cn=taro*))」とAND検索を表す&を使って 複数指定できます。OR検索には「|」、否定記号には「!」記号を使います。 |
[Attr] | 表示対象 とする属性を指定します。 例えばあるエントリのtelephonenumber属性値を表示対象にする場合は AttrにtelnephoneNumberを指定します。 何も指定しなければ全ての属性値が表示されます。 |
-L | 検索結果をLDIFv1フォーマットで表示する |
-LL | 検索結果をコメントのないフォーマットで表示する |
-LLL | 検索結果をコメント無し、LDIFバージョン表示なしで表示する。 |
ldapsearchの実行例を一つ上げます。この例ではLDAPサーバへの接続に簡易認証を使います。(-x)認証はユーザfooで試行し(-D)、パスワード入力用のプロンプトを画面に表示させます。(-W)検索の起点は出版部の住所録エントリで(-b)、それ以下全てのエントリを検索対象としています。(-s)また、cn属性値で名前を絞込み(‘(cn=*tanaka)’)、抽出されたエントリの勤務先電話番号(telephoneNuber)を表示します。
# ldapsearch -x -W -D "cn=Manager,dc=unix-power,dc=net" ↑① -b "ou=Users,dc=unix-power,dc=net" -s sub '(uid=*tanaka)' telephoneNumber ↑② ↑③ ↑④ ↑⑤ ①:ユーザManager(DN : cn=Manager,dc=unix-power,dc=net)で接続する。 その際、パスワード入力用のプロンプトを表示する ②:検索の起点を「ou=Users,dc=unix-power,dc=net」とする ③:起点以下全てのエントリを検索対象とする ④:cn属性がtanakaで終わるエントリを抽出する ⑤:該当するエントリに格納される「telephoneNumber」属性値を表示する |
■LDAPの修正 ( ldapmodify )
同様にldifファイルを用意 してldapmodifyを実行します。例えばtanakaさんのメールアドレスが既に登録されており、それをあとで変更したい場合、以下のような ldifファイルを 用意します。
# vi modify1.ldif dn: uid=tanaka,ou=Users,dc=unix-power,dc=net changetype: modify replace: mail mail: tanaka-replace@unix-power.net
これを任意のファイル名(ここではmodify.ldif)として保存し、以下のコマンドを実行します。
# ldapmodify -x -W -D "cn=Manager,dc=unix-power,dc=net" -f modify1.ldif Enter LDAP Password: modifying entry "uid=tanaka,ou=Users,dc=unix-power,dc=net" |
ldapsearchで更新されたか確認を行います。
# ldapsearch -x -W -D "cn=Manager,dc=unix-power,dc=net" \ -b "ou=Users,dc=unix-power,dc=net" -s sub '(uid=tanaka)' Enter LDAP Password: # extended LDIF # # LDAPv3 # base <ou=Users,dc=unix-power,dc=net> with scope subtree # filter: (uid=tanaka) # requesting: ALL # # tanaka, Users, unix-power.net dn: uid=tanaka,ou=Users,dc=unix-power,dc=net objectClass: posixAccount objectClass: inetOrgPerson sn: tanaka cn: takuya displayName: Tanaka Takuya uid: tanaka uidNumber: 1002 gidNumber: 1000 homeDirectory: /home/tanaka loginShell: /bin/bash userPassword:: e1NTSEF9OFBvMTVDSWt2cUpWZy9ZQVV2NDduaC9rSXBMdmJ1NTk= mail: tanaka-replace@unix-power.net # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1 |
このように changetypeという特別な行を使用する事により既存の属性を変更することが可能になります。また、次のLDIFを日本語で説明すると次のようになります。
dn: uid=tanaka,ou=Users,dc=unix-power,dc=net changetype: modify add: mail mail: newaddress@example.com |
- dn: uid=tanaka,ou=Users,dc=unix-power,dc=comをこれから編集する
- 変更内容はmodify
- mail属性を追加
- mail属性の内容はnewaddress@example.com
同様に以下のような書き方もできます。 最初に実行したldapmodifyと一見同様な書式ですが、属性を2個記載することで既存を取り払い、新たに2個登録という意味になります。
dn: uid=tanaka,ou=Users,dc=unix-power,dc=net changetype: modify replace: mail mail: newaddress1@example.com mail: newaddress2@example.com |
次はchangetypeにaddを指定した場合です。以下は既存のものを残すという点を除いて上のLDIFと同様の意味となります。
dn: uid=tanaka,ou=Users,dc=unix-power,dc=net changetype: add mail: newaddress2@example.com |
次は属性の一部を削除する場合です。これによりmail属性が削除されます。
dn: uid=tanaka,ou=Users,dc=unix-power,dc=net changetype: modify delete: mail mail: newaddress2@example.com |
特定のDNを削除する場合は以下のコマンドを実行します。
# ldapdelete -x -W -D "cn=Manager,dc=unix-power,dc=net" "uid=tanaka,ou=Users,dc=unix-power,dc=net" |
■セキュリティ対策
一般的にパスワードはLDAP認証のために使用しており、参照することはありません。このためuserPassword属性のアクセス許可レベルをバインド時の認証のみとすることがあります。次はそのような設定を行うためのLDIFです。
# vi access.ldif dn: olcDatabase={2}bdb,cn=config changetype: modify add: olcAccess olcAccess: to attrs=userPassword by anonymous auth by * none olcAccess: to * by * read |
上記ではuserPassword属性は匿名ユーザのみバインド可能とし、他のユーザはアクセス権をなしにしています。それ以外の属性は全てのユーザに参照可能としています。なお、既にアクセス制御の設定が行われている場合にはadd:をreplace:とします。このファイルを適用するためldapmodifyコマンドを実行します。
# ldapmodify -x -W -D cn=config -f access.ldif Enter LDAP Password: modifying entry "olcDatabase={2}bdb,cn=config" |
これによりアクセス制御設定後はuserPassowrd属性が参照できなくなります。但し、nslcdのようにuserPassword属性を参照する必要のあるクライアントがある場合、特定のユーザのみ参照を許可する設定を行うことができます。そのような設定を行うLDIFファイルは下記のようになります。
# vi access-nonanon.ldif dn: olcDatabase={2}bdb,cn=config changetype: modify add: olcAccess olcAccess: to attrs=userPassword by anonymous auth by dn="cn=Manager,dc=unix-power,dc=net" read by * none olcAccess: to * by self read by dn="cn=Manager,dc=unix-power,dc=net" read by * none |
userPassword属性は匿名ユーザをバインド可能、DNが”cn=Manager,dc=unix-power,dc=net”のユーザを参照可能とし、他のユーザはアクセス権をなしにしています。それ以外の属性はDNが”cn=Manager,dc=unix-power,dc=net”のユーザとユーザ自身を参照可能とし、それ以外のユーザはアクセス権をなしにしています。LDIFが用意できれば先ほどと同様にコマンドを使ってLDIFファイルを登録します。
参考までに、アクセス元の種類として主に以下のものを指定可能です。
種類 | 内容 |
* | 全ユーザにマッチする |
self | 接続元のユーザにマッチする |
anonymous | 匿名ユーザ |
users | 認証済みユーザ |
正規表現 | 指定された正規表現にマッチするユーザ |
操作内容の種類は以下のものがあります。
種類 | 許可される操作内容 |
none | 何もできない |
auth | 認証を要求できる |
compare | ある属性の値が存在するか否か確認できる |
search | ある属性の値を検索できる |
read | 検索結果を読み取れる |
write | 属性の値を変更できる |
上記の設定で匿名参照禁止の設定を行いましたが、nslcdでは特に指定しない限りLDAPサーバに匿名参照を行なっています。nslcdがLDAPサーバに接続するためにバインドDNとそのパスワードを指定することでnslcdがLDAPエントリを参照できるようになります。
# vi /etc/nslcd.conf binddn cn=Manager,dc=unix-power,dc=net bindpw password |
設定を追加したらnslcdを再起動する必要があります。これでnslcdはLDAPサーバ接続時に”cn=Manager,dc=unix-power,dc=net”を使用するようになります。