OpenLDAP入門
OpenLDAP入門。
OpenLDAPはLDAPの実装のうちの1つ。
他にはMicrosoftのActive 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)というツリー構造になる。
上記は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ではDBD(Berkley DB)というデータベースを使用しており、5~10行目の「include」という記載がある行でスキーマを読み込んでいる。
このスキーマにObjectClassの定義が含まれている。
DBDを使用していることは27行目の「database dbd」という設定からもわかる。
その他は以下の設定を確認。
設定項目 | 説明 | 行番号 |
---|---|---|
suffix | ディレクトリサービスの基点 | 28 |
rootdn | ディレクトリサービスの管理者(ルートdn) | 29 |
rootpw | ルートdnのパスワード | 33 |
ディレクトリサービスにアクセスする際は上記の情報を使用する。
LDAPクライアントツール
LDAPAdminがいい感じ。
インストーラ無しのexeファイルですぐ使える。
使い方はこのへん参照。
OpenLDAPへアクセス
OpenLDAPのslapd.confの設定項目suffix、rootdn、rootpwを確認してLDAPAdminで下記のように接続設定を行う。
エントリを追加する場合、エントリを追加したい親ノードを選択→右クリック→New→Entryを選択する。
New Entryという子ウィンドウが開いたら↓のように設定を入力する。
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のコマンドについては省略。
RedmineでLDAP認証
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
細かいところは省略するが、下記のようにRedmineのLDAP認証設定を行う。
「名称」は任意、「ホスト」はホスト名かIP、「ポート」はほぼ389、「アカウント」はOpenLDAPのrootdnに同じ(もしくは$login@my-domain.comとしてパスワードは空白)、「パスワード」はOpenLDAPのrootpwに同じ、「検索範囲」はOpenLDAPのsuffixに同じ(必要であれば詳細化してもいい)、「LDAPフィルタ」・「タイムアウト」は任意、「あわせてユーザーを作成」はチェック(チェックすると初回ログインでユーザが作成されるようになる)で設定する。
属性部分(「ログイン名属性」「名前属性」「苗字属性」「メール属性」)は、認証に使用したいOpenLDAPの属性名を指定する。
Active Directoryを使用する場合、ログイン名属性はuidよりもsAMAccountNameがよい。
この例であればRedmineログイン時に、「ログインID」に「taroId」(uid)、「パスワード」に「taroPass」(userPassword)と入力すればログインできる。