*

LDAPについて調べたことをまとめ-01

公開日: : 最終更新日:2014/08/11 LDAP

概要

LDAPについて調べたことをまとめ

  1. OPENLDAPのインストール
  2. LDAPとLDIF
  3. LDAPのコマンド
  4. slapdの動作・設定・コマンド

OPENLDAPのインストール

 yum install openldap-servers
 yum install openldap-clients

LDAPとLDIF

キーワード
  • /etc/ldap.conf
  • objectClass
  • DN(Distinguished Name : 識別名)
LDAPディレクトリ

LDAPディレクトリに置ける情報はDN(Distinguished Name : 識別名)で指定される。
ディレクトリ構造は以下の構成で階層化されている。
DC (Domaiin Component):
 組織全体を表すのに使用する。一般的にDNSと一致させることが多い。
OU (Organization Unit):
 組織内の部門を表すのに使用する。地域、組織部門などの分類を行う。

CN (Common Name):
 ディレクトリ内に格納する情報を表記する。ユーザー名にあたる。

DNは以下のように表記される。CNから順番にDCへ向かっていく表記になる。
CN=user,OU=Tokyo,DC=wnqs,DC=co,DC=jp

OpenLDAPのサーバでは、ベースDNを決めてディレクトリを作成するので、OpenLDAPのクライアントもベースDNを指定して検索起点を固定する。
ベースDNの指定は /etc/ldap.conf に以下のように記述する。
base dc=wnqs,dc=co,dc=jp

ディレクトリ情報の記述

LDIF(LDAP Interchange Format)の様式に従って書く。

#ルートノード
dn: dc=wnqs,dc=co,dc=jp
objectClass: dcObject
dc: wnqs


#営業部
dn: ou=sales,dc=wnqs,dc=co,dc=jp
objectClass: organizationalUnit
ou: sales


#保守業務部
dn: ou=maintenance,dc=wnqs,dc=co,dc=jp
objectClass: organizationalUnit
ou: maintenance


#開発部
dn: ou=development,ou=maintenance,dc=wnqs,dc=co,dc=jp
objectClass: organizationalUnit
ou: development


#ネットワークサービス部
dn: ou=network service,ou=maintenance,dc=wnqs,dc=co,dc=jp
objectClass: organizationalUnit
ou: network service


#従業員 のエントリ
dn: cn=Tanaka Akira,ou=network service,ou=maintenance,dc=wnqs,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: organizationalUnit
cn: Tanaka Akira
sn: Tanaka
telephoneNumber: 03-0123-4567
telephoneNumber: 03-9876-5432
mobile: 090-0123-4567
description: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


objectClass は必須。objectClassで指定されているものがスキーマ。slapd.confファイル内で

include /usr/local/etc/openldap/schema/inetorgperson.schema

と記述して利用できる。slapdについては後で述べる。記述方法を守れば独自のスキーマを作成して指定できる。最初から付属しているスキーマは

  • core.schema : OpenLDAP core(必須)
  • cosine.schema : Cosine and Internet X.500
  • inetorgperson.schema : InetOrgPerson(有用)

などがある。

各スキーマ要素は一意のオブジェクト識別子(OID)で識別される。
X.500はネットワーク上での分散ディレクトリサービスに関する国際規格。X.500をベースにTCP/IPネットワークTCP/IPネットワークでの使用を前提に作られたプロトコルがLDAP
inetorgperson の補足*1

インターネット上で組織内の個人を管理するためのオブジェクトクラスで、orgnizationalPersonを基底クラスとしている。orgnizationalPersonクラスの基底クラスはperson。これらの中で必須属性は「cn」「sn」である。

inetOrgPersonクラスの主な属性
属性 説明
departmentNumber 部署コード
employeeNumber 社員番号
employeeType 雇用形態
givenNmae 名(FirstNmae)
homePhone 自宅電話番号
homePostalAddress 自宅住所
mail メールアドレス
manager 管理者のDN
mobile 携帯番号
o 所属組織
roomNumber 部屋番号
uid ユーザーID
orgnizationalPersonクラスの主な属性
属性 説明
title 役職
streetAddress 住所
postOfficeBox 私書箱
postalCode 郵便番号
ou 組織名
facsimileTelephoneNumber FAX番号
personクラスの主な属性
属性 説明
cn 一般名。必須
sn 姓(SurName)必須
userPassword パスワード
telephoneNumber 電話番号
description 説明

LDAPのコマンド

キーワード
  1. ldapsearch
  2. ldappasswd
  3. ldapadd
  4. ldapdelete
  5. ldapmodify
  6. SSSD
LDAP の主なコマンド
ldapsearch [option] <検索フィルタ> [属性]
[]は省略可能、<>内は必須。

 ldapserachコマンドはエントリの検索に使う。

option
option 説明
-x 簡易認証を使用する(デフォルトはSASL認証)。SASL認証を設定していない場合は必ず指定する
-w パスワードを指定する
-W パスワードを対話的に入力する
-L LDIFフォーマットで検索結果を表示する
-LL コメントなしで検索結果を表示する
-LLL コメントなし・LDAPバージョン表示なしで検索結果を表示する
-b 検索を開始するベースDNを指定する
-D バインドDNを指定する(指定しなければ匿名接続)
-h LDAPサーバを指定する(デフォルトはlocalhost)
-p LDAPサーバのポート番号を指定する(デフォルトは389)

 検索フィルタは、基本的に「(属性タイプ=属性値)」のように指定する。するとフィルタにマッチしたエントリのみが出力される。検索フィルタではAND検索やOR検索も行える。

  • (属性タイプ=属性値) : 属性値で検索する
  • (&(属性タイプ=属性値)(属性タイプ=属性値)) : AND検索する
  • (|(属性タイプ=属性値)(属性タイプ=属性値)) : OR検索する
 ldapserach -x -LLL -b 'dc=wnqs,dc=biz' '(|(ou=Groups)(ou=Users))' cn
ldapadd [option]
[]は省略可能、<>内は必須。

 エントリを追加する

option
option 説明
-x 簡易認証を使用する(デフォルトはSASL認証)。SASL認証を設定していない場合は必ず指定する
-w パスワードを指定する
-W パスワードを対話的に指定する
-D バインドDNを指定する(指定しなければ匿名接続)
-f LDIFファイルを指定する
-h LDAPサーバを指定する(デフォルトはlocalhost)
-p LDAPサーバのポートを指定する(デフォルトは389)
-n 実際には処理をせずテストのみ行う
 ldapadd -x -D "cn=Manager,dc=wnqs,dc=biz" -w -f top.ldif

 LDAPサーバに管理者DN(cn=Manager,dc=wnqs,dc=biz)としてバインドし、対話的にパスワードを入力して任hそうされた後、LDIFファイル top.ldif に記述されたエントリを追加する。

ldapdelete [option] <削除するDN>
[]は省略可能、<>内は必須。

 ディレクトリからエントリを削除する

option
option 説明
-x 簡易認証を使用する(デフォルトはSASL認証)。SASL認証を設定していない場合は必ず指定する
-w パスワードを指定する
-W パスワードを対話的に指定する
-D バインドDNを指定する(指定しなければ匿名接続)
-f 削除するDNのリストを記述したファイルを指定する
-h LDAPサーバを指定する(デフォルトはlocalhost)
-p LDAPサーバのポートを指定する(デフォルトは389)
-n 実際には処理をせずテストのみ行う
 ldapdelete -x -D "cn=Manager,dc=wnqs,dc=biz" -W cn=frep,ou=People,Dc=lpic,dc=jp
ldappasswd [option] 
[]は省略可能、<>内は必須。

 LDAPエントリのパスワードを変更する。パスワード変更の定義がされたのはLDAPバージョン3なのでバージョン2のプロトコルでは利用できない

option
option 説明
-x 簡易認証を使用する(デフォルトはSASL認証)
-w バインド時のパスワードを指定する
-W バインド時のパスワードを対話的に入力する
-D バインドDNを指定する
-h LDAPサーバを指定する
-p LDAPサーバのポート番号を指定する(デフォルトは389)
-n 実際には処理せずテストする
-S 新しいパスワードを対話的に入力する
-s 新しいパスワードを指定する
 ldappasswd -x -D "cn=Manager,dc=wnqs,dc=biz" -w "cn=fred,ou=People,dc=wnqs,dc=biz" -S
New Password:
Re-enter new password:
Enter LDAP Password:
*ユーザー自身のパスワードを変更する場合は、管理DNの権限は不要
ldapmodify [option]
[]は省略可能、<>内は必須。

エントリに変更を加えるには、変更点を記述したLDIFファイルを用意し ldapmodify コマンドを実行する。LDIF ファイルに changetype: modify と記述し属性を追加する場合は add を、属性を削除する場合は delete を、属性を修正する場合はreplace を指定する。
option は ldapadd とほぼ同じ

dn: cn=fred,ou=People,dc=wnqs,dc=biz
changetype: modify
replace: mail
mail: takeru@wnqs.biz
-
add: o
o: Develop
-
delete: description
SSSD : キャッシュサービス

SSSD (System Security Services Daemon) は、LDAPやアクティブディレクトリにおける認証サーバでのユーザー認証情報をキャッシュするサービス。認証が成功すると、その 情報がキャッシュされ、システムがオフラインになっているときでも、各種サービスはキャッシュされた認証情報を利用することができる。

slapdの動作・設定・コマンド

キーワード

slapd.conf

  1. slapd.conf
  2. slaptest
  3. slapindex
  4. slapadd
slapd の主な機能

slapd とは多くのプラットフォームで動作するLDAPディレクトリサーバ(Standalone LDAP Daemon)。フロントエンドとモジュールの2つの部分から成り立っている。フロントエンドはLDAPクライアントとのプロトコル通信を処理する。モジュールはデータベース操作のような特定の作業を処理する。
Transport Layer Security
TLS(もしくはSSL)を利用して高いセキュリティで通信を行うことが可能。暗号化。
トポロジー制御
 TCP wrappersを利用してアクセス制御することが可能。
データベースバックエンドの選択
 slapdはデータベースバックエンドをいろいろと選ぶことができる。BDB、DBM、LDBM、SHELL、PASSWD。
そのほか、マルチスレッド化して多くのクライアントのリクエストを処理したり、キャッシュLDAP代理サービスとなるように設定できる。

slapd.conf の書き方*2
slapd.conf の主な設定ディレクティブ
ディレクティブ 説明
include 読み込む外部ファイル(主にスキーマファイル)を指定する
pidfile slapdのPIDを保管するファイル名を指定する
argsfile slapdの起動時に指定された引数の情報を格納するファイルを指定
security セキュリティ強度(SSF)を指定する
database バックエンドデータベースを指定する
shuffix 管理するディレクトリのトップDN
rootdn ディレクトリ管理者であるルートDNを指定する
rootpw ルートDNのパスワードを指定する
directory バックエンドデータベースを格納するディレクトリを指定する(/var/lib/ldapなど)
index インデックスを管理する属性と種類を指定する
access アクセス制御(ACL)の設定。後述
include        /etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema

pidfile        /usr/local/var/run/slapd.pid
argsfile       /usr/local/var/run/slapd.args

database       bdb

suffix         "dc=wnqs,dc=co,dc=jp"
rootdn         "cn=Manager,dc=wnqs,dc=co,dc=jp"
rootpw         {SSHA}4AITKz9idWZTfV6zN2QfH29D0wGGe8jf
directory      /usr/local/var/openldap-data
index   objectClass    eq

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

 slappasswd
New password: 
Re-enter new password: 
{SSHA}4AITKz9idWZTfV6zN2QfH29D0wGGe8jf

アクセス制御について
ユーザーのパスワードが誰にでも参照できてしまうのはセキュリティ上問題であるためアクセス制御を設定できる。
上の例だと

  • ルートDNは更新可能
  • ユーザー自身は更新可能
  • 匿名ユーザー(認証前のユーザー)は認証可能
  • 上記以外のユーザーはアクセス権なし

となる。

access to <アクセス制御対象>
	by <接続元> <アクセスレベル>
[]は省略可能、<>内は必須。
  • * …すべてのエントリを対象
  • attrs= …指定した属性だけを対象とする
  • filter= …フィルタで指定した条件にマッチするエントリを対象とする
  • dn= …DNで指定したエントリだけを対象とする
接続元
接続元 説明
* すべてのユーザー
anonymous 認証されていないユーザー(匿名ユーザー)
users 認証されているユーザー
self 接続中の認証済みユーザー自身
dn=”hoge” 任意のユーザー(正規表現を使って指定することができる)
アクセスレベル
アクセスレベル 説明
write 属性値を変更できる
read 検索結果を参照できる
serach 検索できる
compare 比較できる
auth バインドすることができる
none アクセス権なし
access to *
        by dn="cn=Manager,dc=examples,dc=com" write
        by * read

すべてのエントリを読み込むことができるが更新はrootdnだけに許可される

slapd のコマンド

slapdのバックエンドデータベースにアクセスしてさまざまな処理を行ったり、
アクセス制御をするためのさまざまなコマンド

slaptest
[]は省略可能、<>内は必須。

 slapd.conf の構文チェックをする

 slapdtest
config file testing succeded
slapcat

 OpenLdapのバックエンドデータベースの情報を直接読み込み、LDIF形式で標準出力に出力する。バックアップに使ったりする。引数に何も指定しなければ、slapd.conf 内で一番最初にdatabaseディレクティブで指定したデータベースの情報を出力する。(複数のデータベースがある場合は-nオプションで指定する)

オプション
オプション 説明
-v 詳細に出力
-c エラーを無視する
-d デバッグレベルを指定する
-f 設定ファイルを指定する
-n データベース番号を指定する
-b サフィックスを指定する
-l 出力した情報を書き込むLDIFファイルを指定する
slapadd

 slapcatコマンドによってLDIF形式で出力されたテキストデータを読み込み、Berkeley DB形式でデータベースを保存する。その際slapd.conf の設定が参照されるため、slapd.conf はバックアップ時と同じにしておく必要がある。

 slapadd -l openldap-data.ldif

 リストア後は、slapindexコマンドを使ってデータベースのインデックスを再構築しておく

 slapindex
参考・引用

徹底攻略LPI問題集Level2[Ver 4.0]対応 中島 能和、 株式会社ソキウス・ジャパン (2014/4/4)
http://www5f.biglobe.ne.jp/~inachi/openldap/admin22/intro-ja.html
http://www.lpi.or.jp/ex/202/ex_2041.shtml
http://arinux.net/?eid=6

admax_area



関連記事

no image

OpenLDAP レプリケーション

概要 LDAPについて調べたことをまとめ-02 OpenLDAPのレプリケーションについて

記事を読む

admax_area



Message

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

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

admax_area



PAGE TOP ↑