Fedoa14でLDAPサーバを構築
追記[2013/2/19]:再度構築を行った際、新たな情報を手にしたので記事を修正してます。
ユーザ管理がされていなかったので、デスクトップPCとして使っていたFedora14にOpenLDAPを構築。
サーバ機を購入できるまではこれで頑張る!
サーバ・クライアントをインストール
パッケージで用意されているので、必要な物をyumコマンドを使ってインストール。
sudo yum install openldap-servers openldap-clients
サーバの環境設定
インストールしたら設定だぜ。
でも、/etc/openldap/slapd.confがないなー。
あれか、「Ubuntu10.10 に OpenLDAPサーバのインストール&設定 - クマーのえんじにありんぐ 」と一緒か。
でも初っぱなからこけてうまくいかない。ググったら以下の記事を発見!
- まず、/usr/share/openldap-servers/slapd.conf.obsolete から /etc/openldap/slapd.conf にコピー。
- ハッシュ化したパスワード生成
- コピーしてきた設定ファイルを環境に合わせて変更
- 新しくできた設定ファイルを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をインストールした後、認証方法の変更をする。
- ユーザ情報で「LDAP を使用」を有効にする(該当欄でスペースを押す)
- 認証で「LDAP 認証を使用」を有効にする(該当欄でスペースを押す)
- 「次」を選択
- LDAPの設定で以下の値を設定する
- 「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コマンドからシステムのサービスでできるよ。