Fedoa14でLDAPサーバを構築

追記[2013/2/19]:再度構築を行った際、新たな情報を手にしたので記事を修正してます。

ユーザ管理がされていなかったので、デスクトップPCとして使っていたFedora14にOpenLDAPを構築。
サーバ機を購入できるまではこれで頑張る!

サーバ・クライアントをインストール

パッケージで用意されているので、必要な物をyumコマンドを使ってインストール。

sudo yum install openldap-servers openldap-clients

サーバの環境設定

インストールしたら設定だぜ。
でも、/etc/openldap/slapd.confがないなー。
あれか、「Ubuntu10.10 に OpenLDAPサーバのインストール&設定 - クマーのえんじにありんぐ 」と一緒か。

でも初っぱなからこけてうまくいかない。ググったら以下の記事を発見!

http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/6/html/Migration_Planning_Guide/ch07s03.html

  1. まず、/usr/share/openldap-servers/slapd.conf.obsolete から /etc/openldap/slapd.conf にコピー。
  2. ハッシュ化したパスワード生成
  3. コピーしてきた設定ファイルを環境に合わせて変更
  4. 新しくできた設定ファイルをDBに反映させる。

って流れで作業する。あとデータベースをサンプルからコピーする。

sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
sudo slappasswd
sudo vi /etc/openldap/slapd.conf

slappasswdコマンドでは、パスワードを二回聞かれるので、新しく設定したい管理用のパスワードを入力する。
{SSHA}**************** の様に結果が返るので(*は文字で入力した値により変化)それをコピーしておく。
そして、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

# bind_v2を使用しないのであれば、不具合が起きにくくなるようコメントアウト
#allow bind_v2

# -- 略 --

suffix  "dc=your-domain,dc=net"  # 個別の環境に合わせてドメイン設定
rootdn  "cn=Manager,dc=your-domain,dc=net" # 個別の環境に合わせてドメインと管理者を設定
rootpw  {SSHA}************ # slapdpasswd で生成された文字列を貼り付け

# -- 略 --

access to attrs=userPassword
        by dn="cn=Manager,dc=your-domain,dc=net" write
        by self write
        by anonymous auth
        by * none
access to *
        by dn="cn=Manager,dc=your-domain,dc=net" write
        by self write
        by * none

database monitor
rootdn "cn=admin,cn=monitor"
rootpw {SSHA}************* # slappasswdで生成された文字列を貼付け

access to *
        by dn="cn=admin,cn=monitor" read

database config
rootdn "cn=config"
rootpw {SSHA}************* # slapdpasswdで生成された文字列を貼付け

#TLS用に証明書関連の設定
TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt #CA証明書
TLSCertificateFile /etc/pki/tls/certs/slapd.pem #サーバ証明書
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem #証明書秘密鍵

追記:今回構築する環境は、ログイン認証にsssdが使用される。
sssdは認証やら問い合わせやらを一手に引き受けてくれるのだが、認証処理はTLSまたはLDAPSプロトコルが必須となる。(詳しくはぐーぐる先生に聞こう)
その為に、証明書と秘密鍵が必要になる。イントラ内での使用なので、おれおれ証明書を使う事にした。
といっても、わざわざ証明書を発行するのも手間。
そんな時見つけた情報
http://almondy.net/xoops/modules/pukiwiki/?LDAP%A4%CESSL%A1%BFTLS%B2%BD
を参考に、OpenLDAPインストール時に用意されているデフォルトの証明書を使用する事にした。
要件的に厳格な証明書である必要がないので、こりゃ楽ちんだ。


設定ができたら、redhatのドキュメントにあった通りに実行する。
これはslapd.confの内容をLDAPのデータベースに変換する作業。
slaptest実行でslapd.dディレクトリ配下に作成されたDBを読むらしい。
設定の状態を常にオンメモリしてる。以前とは違うのね。

sudo rm -rf /etc/openldap/slapd.d/*
sudo slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
sudo chown -R ldap:ldap /etc/openldap/slapd.d
sudo chmod -R 000 /etc/openldap/slapd.d
sudo chmod -R u+rwX /etc/openldap/slapd.d

そして再起動させて問題なければ今回作成したconfファイルは削除。
・・・削除しなくても問題ないので、残しておいた方が後々の為になるかも。
キャッシュさせて負荷軽減を図るためnscdも起動。
あと、パーミション設定だけしておくか。

sudo /etc/init.d/slapd restart
sudo /etc/init.d/nscd start
chmod 600 /etc/openldap/slapd.conf

LDAPでログインさせるために(authconfig-tui編)

sudo yum install nss-pam-ldapd
sudo authconfig-tui

nss_ldapをインストールした後、認証方法の変更をする。

  1. ユーザ情報で「LDAP を使用」を有効にする(該当欄でスペースを押す)
  2. 認証で「LDAP 認証を使用」を有効にする(該当欄でスペースを押す)
  3. 「次」を選択
  4. LDAPの設定で以下の値を設定する
    1. [*]TLSを使用
    2. サーバー:ldap://127.0.0.1/
    3. ベース DN:dc=your-domain,dc=net
  5. 「OK」を選択

と行えばよいはずなんだが、うまく認証できない。
ググっていたら「http://clehou.com/article.php?story=20110523220534275」な記事を見つけた。
どうやら、生成される設定ファイルに問題があるようだ。
pam_ldap.soを使用しなければならぬ所を、pam_sss.soと記述されているので直す必要がある。
対象は /etc/pam.d/password-auth と /etc/pam.d/system-auth だ。
vimで :%s/pam_sss/pam_ldap/g コマンド一発で終わる。
system-authファイルは以下のようになる。初めからエディターで設定したほうがいいかもね。

追記:初期で設定されているpam_sssがTLS必須になっていた。
そのため、認証がうまくいかない状態であった。
今回はイントラ内なので、おれおれ証明書を用意して/etc/sssd/sssd.confに修正を行う。
そうすれば、pam_sssのまま置換しなくても問題ない。
TSLでない方法を模索したけど、どれもうまくいかない。

service_err=ignore と system_err=ignore、pam_mkhomedir項目を追加
authinfo_unavail=ignoreを設定しないと、slapdが起動していない場合に/etc/passwdのユーザもログイン出来なくなるらしいので、こちらも追加。
ldapサーバが落ちても問題ないようにする。
/etc/pam.d/password-auth と /etc/pam.d/system-auth の両方

auth        sufficient    pam_sss.so use_first_pass
account     [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_sss.so
session     optional      pam_sss.so
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
#最後の項目は、ログイン時にホームディレクトリが存在していなければ自動で生成する指定

/etc/sssd/sssd.conf の[domain/default]項目内に追加

  • おれおれ証明書対応の設定
  • getent passwd コマンド等で一覧を取得出来るようにする
[domain/default]
ldap_tls_reqcert = never #おれおれ証明書対策
enumerate = True #getentコマンド対策

この設定を変更したら、CA認証局をOSが既に持っている物をコピー。
nss-pam-ldapdに含まれているnslcdデーモンを起動する事でLDAPに問い合わせ出来る。
最後にsssdも再起動。

cp /etc/pki/tls/certs/ca-bundle.crt /etc/openldap/cacerts/
/etc/init.d/nslcd start
/etc/init.d/sssd restart

/etc/nsswitch.conf の以下の項目も修正
追記:特に修正しないでそのままでOK。以下の通りにはしない。

passwd: files ldap
shadow: files ldap
group:  files ldap

netgroup: files ldap

/etc/pam_ldap.conf /etc/nss_ldap.conf に以下の設定が必要。
これを行う事で、LDAPサーバが応答ない場合は処理を待たない。
OS起動時にslapdが起動する前にユーザ参照が行われる様で、この設定をしておかないと起動に20分とかかかる。。。。

bind_policy soft

getent passwd コマンドで登録したユーザーが引けるか確認。
問題なく引ければサーバ設定完了。

ちょっとはまった

ログインは出来たのに、passwdコマンドでパスワード変更ができない。
/var/log/secure には pam_sss(passwd:chauthtok): Password change failed for user xxx: 4 (システムエラー) が残されていた。
試しにslappasswdコマンドで変更を試みたけどエラー。どうやらパーミッション関連らしい・・・
ldapaclコマンドでxxxユーザ情報の権限を確認してみた。

ldapacl -b "uid=xxx,ou=People,dc=yourdomain,dc=net"

userPassword が auth ではなくread。あれ??
設定されているアクセス権限情報をみてみた。

ldapsearch -x -D "cn=config" -W -b "cn=config" olcAccess

bdb, config の項目の olcAccess が access to * by * read だけだと!?
原因は、slapd.conf の access to attr=userPassword 項目の前にdatabase monitor が書かれていた事だった。
なぜこの設定がこのような場所に書かれていたのかは謎であるが・・・
そのおかげで、本来は認証情報が入っているbdbへのACL(アクセス権限)設定が違うデータベースに反映されていた。
上記のslapd.conf設定内容はそれを回避した設定になっているので問題ない。

再設定を終えてslapsearchコマンドでもちゃんとアクセス権限ができているのに読めないorz
しかも色々トライしていて、いつの間にか認証そのものや getent passwd でもでてこないorz

なーんて泣きながら色々してたら突如出来るようになった。
あぁ、キャッシュしてたんだっけね・・・・その辺の再起動もし忘れないように!

LDAPでログインさせるために(手動で設定ファイル編集編)

最近の構成は、色々なモジュールが絡み合っているのでかなり複雑。
なので、手動で設定ファイルを書き換えるこの方法はおすすめしない。
どうしてもと言う場合の参考程度にしかならない。
実際にこの方法ではpasswdコマンドでパスワード変更ができなかった。

authconfig-tuiは何だか問題あるので手動で行う場合はこっち。
ログイン用のモジュールをインストール。これは一緒。

sudo yum install nss_ldap
sudo vim /etc/pam.d/system-auth
sudo vim /etc/sysconfig/authconfig
sudo vim /etc/nsswitch.conf

system-authの設定

auth        sufficient    pam_ldap.so use_first_pass
account     [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_ldap.so
#ldapサーバが落ちていてもシステムを止めないaccount設定
session     optional      pam_ldap.so
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
#最後の項目は、ログイン時にホームディレクトリが存在していなければ自動で生成する指定

authconfigの設定

USELDAP=yes             # noからyesに変更
USELDAPAUTH=yes         # noからyesに変更

nsswitch.confの設定

password:  files ldap
shadow:    files ldap
group:     files ldap

次に行うのが、 /etc/ldap.conf の設定。

……ファイルがない…だと!?
認証に使用されるnss_ldap,pam_ldapが参照する設定ファイルが存在しない。
ダミーで作っても設定が反映されない。
ググっても、さも当然のように/etc/ldap.confを設定しろとでてくる。

が!!

/etc/ldap.conf の代わりに、/etc/nss_ldap.conf /etc/pam_ldap.conf を使用するらしい事を発見。
それぞれのファイルに以下を設定する。

base dc=your-domain,dc=net
uri ldap://127.0.0.1/
bind_policy soft
tls_cacertdir /etc/openldap/cacerts

bind_policy soft の設定をしないと、認証処理などでLDAPサーバが起動していないときに長いこと待たされる。
これは、問い合わせができなかったら諦めろ的な内容。hardに設定するとリトライを繰り返す。
特に注意したいのは、サーバー自体を起動した際、LDAPが起動する前にユーザー権限などを参照する処理が走る事。
その時にユーザー等を問い合わせているのでLDAPに問い合わせができず起動が失敗したかのように待たされる。
実際に設定し損ねて際起動した際は、20分も待たされた。遅いでしょ。
この /etc/ldap.conf がない& bind_policy soft が設定できないで3日間もハマったのは、今となってはいい思い出。・・・・・・・でもないな(怒

もう一つハマったのが、mdmonitorさん。
OSを再起動したら、slapdが起動できない。なにやら、DBがなくなったとか何とかでエラー。
たまたまかと思ったけど、再度DB構築し無事slapd起動できても同じ現象になった。
犯人はmdmonitorモジュール。ソフトウェアRAIDの監視をしてるらしいんだが。
標準で組み込まれているサービスモジュールだが、そもそもRAID組んでないので必要ない。
だからサービスで起動させないで、さよならしたった。
setupコマンドからシステムのサービスでできるよ。