ぺーぺーSEのブログ

備忘録・メモ用サイト。

OpenLDAP入門

OpenLDAP入門。
OpenLDAPLDAPの実装のうちの1つ。
他にはMicrosoftActive Directoryなどがある。

LDAPとは

LDAPとはLightweight Directory Access Protocolの略でディレクトリサービスにアクセスするためのプロトコル

ディレクトリサービスとは

ディレクトリサービスは、コンピュータネットワーク上のリソースとその所在や属性、設定などの情報を収集・記録し、検索できるようにしたサービス。
DNSも一種のディレクトリサービス
LDAPと聞けば、認証というイメージだが、これはディレクトリサービスから得られるユーザの情報(ID、Password)をユーザが入力した情報と突合することで実現した応用形。

LDAPの概念

LDAPで管理対象となるオブジェクトの単位は、複数属性(個人名や部署名)で構成され、エントリと呼ばれる。
各エントリは、dn(Distinguished Name)と呼ばれるユニークな名前で識別される。
DNは複数の「属性名=値」という属性を持つ。

属性名 属性表記 オブジェクトタイプ
cn Common Name ユーザ名、グループ名、コンピュータ名などの一般名称
ou Organizational Unit name 組織単位
o Organization 組織名
dc Domain Component ドメイン

例えば、ルートドメインというエントリのdnは「dc=my-domain,dc=com」、
ある組織に所属するユーザのエントリは「cn=Taro,ou=MarcketDivision,dc=my-domain,dc=com」、
ルートドメインの管理者は「cn=Manager,dc=my-domain,dc=com」となる。
また、エントリとエントリの関係はDIT(Directory Information Tree)というツリー構造になる。

f:id:tanakakns:20160126232147p:plain

上記はDITの例。
上記はrdn(Relative Distinguished Name)という相対的な識別名で表現している。
例えば、太郎は「cn=Taro」とだけ表記しているが、これは「ビジネス部から見たrdn」。
太郎をdnで表現した場合、「cn=Taro,ou=Business,dc=my-domain,dc=com」となる。

ObjectClass

エントリのdnで記載する属性名は任意でつけることはできない。
ObjectClassというスキーマを属性として設定することでエントリに設定する属性名が決まる。 例えば、「person」というObjectClassには下記の属性が含まれる。

属性名 意味 必須
description 説明
seeAlso 参照
sn 姓(Sir Name)
telephoneNumber 電話番号
userPassword パスワード

ObjectClassには複数の種類があり、また、ObjectClassによって必須設定の属性がある。

OpenLDAPツールの入手と設定

OpenLDAPのインストール/LDAPサーバの構築

今回はWindowsへのインストール。
OpenLDAP for Windowsを使用する。
ここを参照してインストール。

OpenLDAP設定の確認

OpenLDAPのインストールディレクトリの直下にslapd.confという設定ファイルがある。

# BDB Backend configuration file
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
ucdata-path ./ucdata
include     ./schema/core.schema
include     ./schema/cosine.schema
include     ./schema/nis.schema
include     ./schema/inetorgperson.schema
include     ./schema/openldap.schema
include     ./schema/dyngroup.schema

pidfile     ./run/slapd.pid
argsfile    ./run/slapd.args

# Enable TLS if port is defined for ldaps

TLSVerifyClient never
TLSCipherSuite HIGH:MEDIUM:-SSLv2
TLSCertificateFile ./secure/certs/server.pem
TLSCertificateKeyFile ./secure/certs/server.pem
TLSCACertificateFile ./secure/certs/server.pem

#######################################################################
# bdb database definitions
#######################################################################

database    bdb
suffix      "dc=maxcrc,dc=com"
rootdn      "cn=Manager,dc=maxcrc,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw    {SSHA}BK/6ojR8raOgXJ5QtVFwMufdtBhqOF0u

# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory ./data
dirtyread
searchstack 20
# Indices to maintain
index mail pres,eq
index objectclass pres
index default eq,sub
index sn eq,sub,subinitial
index telephonenumber
index cn

このOpenLDAPではDBDBerkley DB)というデータベースを使用しており、5~10行目の「include」という記載がある行でスキーマを読み込んでいる。
このスキーマにObjectClassの定義が含まれている。
DBDを使用していることは27行目の「database dbd」という設定からもわかる。
その他は以下の設定を確認。

設定項目 説明 行番号
suffix ディレクトリサービスの基点 28
rootdn ディレクトリサービスの管理者(ルートdn) 29
rootpw ルートdnのパスワード 33

ディレクトリサービスにアクセスする際は上記の情報を使用する。

LDAPクライアントツール

LDAPAdminがいい感じ。
インストーラ無しのexeファイルですぐ使える。
使い方はこのへん参照。

OpenLDAPへアクセス

OpenLDAPslapd.confの設定項目suffixrootdnrootpwを確認してLDAPAdminで下記のように接続設定を行う。

f:id:tanakakns:20160127093422p:plain

エントリを追加する場合、エントリを追加したい親ノードを選択→右クリック→New→Entryを選択する。

f:id:tanakakns:20160127094445p:plain

New Entryという子ウィンドウが開いたら↓のように設定を入力する。

f:id:tanakakns:20160127094649p:plain

Rdnは親ノードから見て子ノードが一意になるように設定。(「属性名=値」は複数あってかまわない)
ObjectClassは複数選択できる。

LDIF

LDIFは「LDAP Interchange Format」の略で、LDAPデータをインポートまたはエクスポートする場合のテキストフォーマット。
書き方はこれまで説明してきた、dnやObjectClass、その他属性を記述するだけ。

dn: uid=taroId,ou=People,dc=my-domain,dc=com
uid: taroId
cn: Taro
objectClass: account
objectClass: posixAccount
objectClass: top
o: Hoge Co.,Ltd.
userPassword: {MD5}xxxxpasswordxxxxx
loginShell: /bin/bash
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/taroId

LDIFを作成したらLDAPの「ldapadd」コマンドなどを利用して登録する。
ここではLDAPのコマンドについては省略。

RedmineLDAP認証

RedmineでのLDAP認証を行う前にOpenLDAPに下記のLDIFで定義したエントリを追加しておく。

dn: cn=Taro,ou=People,dc=my-domain,dc=com
cn: Taro
objectClass: inetOrgPerson
objectClass: person
givenName: Taro
mail: TaroSato@my-domain.com
sn: Sato
uid: taroId
userPassword: taroPass

細かいところは省略するが、下記のようにRedmineLDAP認証設定を行う。

f:id:tanakakns:20160127103305p:plain

「名称」は任意、「ホスト」はホスト名かIP、「ポート」はほぼ389、「アカウント」はOpenLDAProotdnに同じ(もしくは$login@my-domain.comとしてパスワードは空白)、「パスワード」はOpenLDAProotpwに同じ、「検索範囲」はOpenLDAPsuffixに同じ(必要であれば詳細化してもいい)、「LDAPフィルタ」・「タイムアウト」は任意、「あわせてユーザーを作成」はチェック(チェックすると初回ログインでユーザが作成されるようになる)で設定する。
属性部分(「ログイン名属性」「名前属性」「苗字属性」「メール属性」)は、認証に使用したいOpenLDAPの属性名を指定する。
Active Directoryを使用する場合、ログイン名属性はuidよりもsAMAccountNameがよい。
この例であればRedmineログイン時に、「ログインID」に「taroId」(uid)、「パスワード」に「taroPass」(userPassword)と入力すればログインできる。