「2.07.4 OpenLDAPサーバーの設定」の出題内容については以下をご参照ください。
Version 10.0になって少々内容が変更されているようです。
LinuCレベル2 202試験(Version 10.0)出題範囲 | LPI-Japan
https://linuc.org/linuc2/range/202.html
LinuC レベル 1、レベル 2 の出題範囲改定について
https://linuc.org/docs/linuc_ver10.pdf
この記事のアジェンダ
- LDAPの基本概念を整理
- slapcat, slapadd, slapindexの使い方を紹介
- OpenLDAPのアクセス管理について少し補足
LDAPの基本概念
たぶんこの手の話題は図で説明したほうがわかりやすい気がするけど、ひとまずテキストベースで整理。
押さえておきたい基本概念は次のとおり。
- ディレクトリ情報ツリー (DIT)
- スキーマ (オブジェクトクラス, OID)
- エントリ, 属性, 識別名 (DN)
- LDIF
- ホワイトページ
以下、詳細です。
-
ディレクトリ情報ツリー (DIT)
- DIT: Directory Information Tree
- LDAPはツリー構造でデータを格納している
-
スキーマ
- オブジェクトクラスや属性を定義
- エントリに必須な属性、設定可能な属性を定義する属性
- core, cosine, nis, inetorgpersonスキーマなどがある
- OID
- OID: Object IDentifier
- オブジェクトクラスや属性にはOIDが割り当てられている
- 例えば、inetOrgPersonオブジェクトクラスにはOID「2.16.840.1.113730.3.2.2」が割り当てられている
- OID
<よく見かけるスキーマ>
core.schema: OpenLDAP必須スキーマ
conine.schema: ディレクトリサービスX.500規格で定義されたスキーマ
nis.schema: UNIXのユーザ/グループを扱うためのスキーマ
inetorgperson.schema: アドレス帳を扱うためのスキーマ
-
エントリ
- LDAPのデータの基本単位
-
属性
- 属性タイプと属性値から構成
-
識別名 (DN)
- DN: Distinguished Name
- 各エントリを識別するために一意に割り当てる属性
DNの例
dn: cn=woody,ou=People,dc=xxxx,dc=vs,dc=sakura,dc=ne,dc=jp
-
LDIF
- LDIF: LDAP Data Interchange Format
- LDAPのデータはLDIFという形式で表現できる
LDIF形式
dn: <識別名> <属性タイプ>: <属性値> <属性タイプ>: <属性値> ~ ~ <属性タイプ>: <属性値>
-
ホワイトページ
- inetorgpersonスキーマで定義されているinetOrgPersonオブジェクトクラスを使って、アドレス帳を実現するのが通例らしい
slapcat, slapadd, slapindexの使い方
- slapcat
-
用途
- LDAPデータベースの内容をLDIF形式で出力
- バックアップ作成時とかに使う
-
使用例
- 「-n 2」で(2)のデータベースを指定する
-
# slapcat -n 2 > ldapdb.ldif
- 注意点
- 「-n 2」を指定しないと下記のようなエラーになるはず
- 「The first database」はセッション数などの情報を扱うモニターDBでslapcatに対応していないためエラーとなる
アンチパターン
# slapcat > ldapdb.ldif
5f30e016 The first database does not allow slapcat; using the first available one (2)
-
slapadd
- 用途
- slapcatで作成したバックアップのリストア時に使う
- 後述のslapindexと組み合わせで使う
- 用途
-
slapindex
-
用途
- LDAPデータベースのインデックスを再構築する
- リストアした後にはインデックス再構築が必須となる
-
使用例
-
# slapadd -l ldapdb.ldif
# slapindex
OpenLDAPのアクセス管理
接続元IP毎のアクセス制御はTCPWrapperやfirewalldで行う。
エントリや属性のアクセス制御はolcAccess属性で設定する。
- 既存のolcAccess属性の属性値をslapcatコマンドで確認
- olcDatabase={0}config,cn=configは設定用データベース管理設定
- ↓の例の場合、全てのエントリは指定したDNユーザのみmanageアクセス*1でき、その他はアクセスできない
# slapcat -n 0
dn: olcDatabase={0}config,cn=config
~
~
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth" manage by * none
*1 アクセスレベルmanageは謎...
https://gihyo.jp/admin/serial/01/ldap/0010
- olcAccess属性の書式
olcAccess: to <アクセス制御対象> by <接続元> <アクセスレベル>
- 詳細
<アクセス制御対象>
*: 全てのエントリ
attrs=<属性タイプ>: 指定した属性
dn=: 指定したDN
<接続元>
*: 全てのユーザ
anonymous: 認証前のユーザ
user: 認証されたユーザ
self: 接続中の認証済ユーザ
dn=: 指定したDNユーザ
<アクセスレベル>
write: 属性値を変更可能
read: 検索結果を参照可能
search: 検索可能
compare: 比較可能
auth: 認証を受け付けることができる
none: アクセスできない