2015年6月6日土曜日

OpenLdapを入れてみた

自PCにChatを導入してみようと思い(BYOS:Bring your own serverというらしい)、Slack風chatのLet's Chatを入れてみようとした。
デフォルトだとアカウントが自由に登録できちゃう。今回は特定ユーザだけどインターネット環境で利用することを考えると、さすがによろしくないなぁということで、ldap認証に変えようとopenldapの構築に思い立った・・

0.環境準備
 
 CentOS : 6.5
 openldap 2.4.

1.インストール

openldapのサーバー「openldap-servers」と、管理用コマンド「ldapadd」「ldapsearch」が含まれているクライアントパッケージ「openldap-clients」を入れる。
$ sudo yum install -y openldap-servers openldap-clients

 初期の設定を削除する
$ sudo rm -rf /etc/openldap/slapd.d/*
$ sudo rm -rf /var/lib/ldap/*

 設定ファイルをコピーする
$ sudo cp -a /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
$ sudo chown ldap. /var/lib/ldap/DB_CONFIG
$ sudo cp -a /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf

rootユーザ(管理者ユーザー)のパスワードを設定する
$ slappasswd -s [パスワード]

{SSHA}bl2YB5/i9fZ64tMNV/7dr9li4a3YsNc0 ・・・(*1)

設定ファイルの修正をする(/etc/openldap/slapd.conf)
# スキーマファイル設定
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/duaconf.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/java.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/ppolicy.schema
include /etc/openldap/schema/collective.schema

# 接続プロトコル
allow bind_v2

# 管理ファイル
pidfile     /var/run/openldap/slapd.pid
argsfile    /var/run/openldap/slapd.args

# userPasswordに関するアクセス権
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=example,dc=com" write
    by anonymous auth
    by * none

# その他の属性に対するアクセス権
access to *
    by self write
    by dn="cn=Manager,dc=example,dc=com" write
    by * read

# monitorデータベースに対するアクセス権
database monitor
access to *
    by dn.exact="cn=Manager,dc=example,dc=com" read
    by * none

# データベース設定
database    bdb
suffix      "dc=example,dc=com"
checkpoint  1024 15
rootdn      "cn=Manager,dc=example,dc=com"
rootpw      {SSHA}bl2YB5/i9fZ64tMNV/7dr9li4a3YsNc0 ・・・(*1)
directory   /var/lib/ldap

# indexの設定
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uid,memberUid                     eq,pres,sub
設定ファイルのチェック
$ sudo su -
# sudo -u ldap slaptest -u -v -f /etc/openldap/slapd.conf

config file testing succeeded

※設定ファイルを、設定ディレクトリ(/etc/openldap/slapd.d)に配置する場合
# sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

config file testing succeeded

この設定をすると、起動時に設定ディレクトリが優先され、設定ファイルは無視される。
設定ファイルが無くなっても大丈夫になるが、簡単に設定変更ができなくなる。
どっちがいいんでしょう・・
ちなみに設定ディレクトリを作成しないと、デフォルトの起動スクリプトで起動すると、
ls: cannot access /etc/openldap/slapd.d//cn=config/olcDatabase*.ldif: そのようなファイルやディレクトリはありません
というエラーがでる。無視できそうだけど・・わかっていないので、設定ディレクトリを使って進める。
$ sudo service slapd start
$ chkconfig slapd on
あとはログの取得設定をしておく。rsyslogの設定ファイルに以下を追加する(/etc/rsyslog.conf)
local4.*     /var/log/ldap.log
でもって再起動。
$ sudo service rsyslog restart

2.データの登録・更新・削除

基本的にデータの登録・更新は、LDIFファイルを作成し、それをコマンドを使って反映というステップで行う。Apache Directory Studioを使うと楽にできたが、 とりあえず理解を深めるために、、地道に。 まずは、ベース ldapadd -x -D "cn=Manager,dc=example,dc=com" -W -f test.ldif.txt

登録データをコマンドで確認してみる。
ldapsearch -x -b dc=example,dc=com

削除は
ldapdelete -D "cn=Manager,dc=example,dc=com" -W "削除するDN"
ldapdelete -D "cn=Manager,dc=example,dc=com" -W "uid=bind,ou=Account,dc=example,dc=com"

修正は
ldapmodify -x -W -D cn=config -f loglevel.ldif

slappasswd -h '{CRYPT}'

3.その他

・登録ユーザのパスワード変更

 $ ldappasswd -x -D "uid=<自分のアカウント>,ou=Account,dc=example,dc=com" -S -w <自分のパスワード> "uid=<自分のアカウント>,ou=Account,dc=example,dc=com"

・デバッグログ

openldapサーバーのログレベルの変更
 vi /etc/openldap/slapd.conf
  loglevel ACL

j設定ディレクトリを作成していると、上記の設定ファイルでログレベルを設定しても無視されて
しまう。ので動的にloglevelを変更する必要がある。ステップは、

 ・動的に設定変更をする際には、設定変更用のパスワードを設定する。
  パスワードを生成する。

   $ slappasswd -s [パスワード]

 ・パスワードを設定変ファイルに書き込む。
  vi /etc/openldap/slapd.d/cn=config/olcDatabase={0}config.ldif
  ==
# AUTO-GENERATED FILE - DO NOT EDIT!! Use ldapmodify.
# CRC32 b65956a0
dn: olcDatabase={0}config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to *  by * none
olcAddContentAcl: TRUE
olcLastMod: TRUE
olcMaxDerefDepth: 15
olcReadOnly: FALSE
olcRootDN: cn=config
olcRootPW: {SSHA}bl2YB5/i9fZ64tMNV/7dr9li4a3YsNc0 (*)
olcSyncUseSubentry: FALSE
olcMonitoring: FALSE
structuralObjectClass: olcDatabaseConfig
entryUUID: ac9a77d2-a08f-1034-959f-516e801fdd3a
creatorsName: cn=config
createTimestamp: 20150606120240Z
entryCSN: 20150606120240.046232Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20150606120240Z
  ==
  最初の2行を削除する
  (*)の行を追加する。パスワードは上記で生成したものを指定する。
  

・ログ変更用のファイルを作成する
  vi /etc/openldap/ldif/loglevel.ldif
  ===
  dn: cn=config
  changetype: modify
  add: olcLogLevel
  olcLogLevel: filter config ACL stats
  ===
  2回目以降に更新する場合は、
  add: olcLogLevel
  を
  replace: olcLogLevel
  に変更する。


 ・ldapmodifyコマンドで変更する
 $ ldapmodify -x -W -D cn=config -f loglevel.ldif

 Enter LDAP Password:
 modifying entry "cn=config"

 ※パスワードは上記で生成したものを!



0 件のコメント:

コメントを投稿