FreeBSDのホストをLDAPのクライアントにする方法

1. LDAP最強?

最近、ホストをどんどんとLDAP管理下へ移行している。LDAPはその守備範囲が広く、いろいろなことができるようなのだけれど、主に自分のところではユーザ管理を行わせている。

ユーザ管理とは、UNIXユーザの管理をLDAPで行い、認証をかけることだ。

具体的には*nixなホストでログインするためのユーザ情報をLDAP上に置き、認証をかけたいホストはLDAPサーバへ認証の可否を聞きに行く。LDAPサーバで認証が終わったとき、ログイン出来るかどうかをホストで決める、という事だ。

現在管理しているホストは仮想マシンを合わせて数十台。実際UNIXユーザだけであれば現行利用しているNISで十分だ。でもNISだとちょっと不満があったりしてて・・・。

その不満はこうだ

  • samba, mail, ftpなどNISで認証が通らないサービスがある。
  • *nix用のNISなんだけれど、LinuxだとFreeBSDのNISが(そのままでは)利用できない。
  • FreeNASが(現行バージョンでは)対応していない。

と言った点だ。というわけで勉強も兼ねてLDAPを導入している。

2. LDAPクライアント導入の手順アウトライン

FreeBSDをLDAPのクライアントとして動作させるには、おおむね以下の手順で行う。

  1. !!! rootでログインしたターミナルを用意する !!!
  2. OpenLDAP24のインストール
  3. ldap.confの作成、およびシンボリックリンクの作成
  4. pam_ldap.so, nss_ldap.soの作成
  5. nsswitch.confの変更
  6. pam.dの変更
  7. 最後に試験

まず、これらの作業を始める前に、必ずrootでログインしたターミナル(実端末、sshなどの端末でsuしたもの)を用意しておく

これを用意しておかないと、ldapの設定をミスしてしまったとき、まったくログインができなくなり、single user modeにいって~、という面倒なことになってしまう。

特に 5番あたりのnsswitch.confを書き換えるあたりでミスをするとこうなるので注意。

そのほかは特に気をつけなくて手順通りに進めればうまくいくはず。

3. OpenLDAP24のインストール

さて、対象のホストはFreeBSD 8.2なのでportsでクライアントを入れる。

shell> portinstall -c net/nss_ldap
shell> portinstall -c security/pam_ldap
以前はnss_ldapの前にnet/openldap24-sasl-clientをmakeオプションの -m “FORCE_PKG_REGISTER=yes” と一緒にインストールすように、と思っていたけれど、ss_ldapを入れれば依存でうまいこと入るらしい。 by yubird先生
テキトウに見てればインストール完了

4. ldapの設定

続いて、ldapの設定を行う。

ldap.conf.distっていうファイルがあるんだけれど、色々とコメントが多いので一から/usr/local/etc/ldap.confを作成する。

その後、/usr/local/etc/以下に、

  • nss_ldap.conf
  • pam_ldap.conf
  • openldap/ldap.conf

の三つの名前で、先に作られるldap.confへシンボリックリンクを張ってやる。


shell> cat /usr/local/etc/ldap.conf

uri ldaps://192.168.1.1/ldaps://192.168.1.2/
TLS_REQCERT never
base dc=example,dc=com
bind_policy soft
ldap_version 3
pam_login_attribute uid
nss_base_passwd ou=People,dc=example,dc=com
nss_base_shadow ou=People,dc=example,dc=com
nss_base_group ou=Groups,dc=example,dc=com
pam_password ssha
pam_min_uid 1000

shell> ln -sf /usr/local/etc/ldap.conf /usr/local/etc/nss_ldap.conf
shell> ln -sf /usr/local/etc/ldap.conf /usr/local/etc/pam_ldap.conf

shell> ln -sf /usr/local/etc/ldap.conf /usr/local/etc/openldap/ldap.conf

続いて、pam_ldapとnss_ldapの shared object file(soファイル)を /usr/lib へシンボリックリンクを張っておく。


shell> ln -s /usr/local/lib/pam_ldap.so /usr/lib/pam_ldap.so
shell> ln -s /usr/local/lib/nss_ldap.so /usr/lib/nss_ldap.so

続いてnsswitch.confを設定。nsswitch.confでは失敗したときの取り決めなどもあったりする。

コレを設定しておくと、ldapが死んでいるときに処理を飛ばす、とか出来るような、できないような、デフォルトでそうなっているような・・・。

参考サイト: 日本HP – はじめてのHP-UX 第9回:ネットワーク設定の基本 – デフォルト・ゲートウェイの設定


shell> more /etc/nsswitch.conf

group: files ldap
#group_compat: nis
hosts: files dns
networks: files
passwd: files ldap
#passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files

続いて pam の設定をする。Linuxと構造が似ているFreeBSDのpamは、/etc/pam.dっていうディレクトリにファイル群が転がっている。

ここにあるファイルを編集することで、それぞれのファイルに該当するログインの制御を行うことが出来る。

今回いじるのはsystemとsshd。それぞれに


auth sufficient pam_ldap.so

account sufficient pam_ldap.so

の二つを足している。 これら二つとも、requiredじゃなくてsufficientにしないとうまく動かない。なんでかはよくわかんない。

最後のオプションにdebugを付けると/var/log/messagesあたりにデバッグメッセージがでて問題を特定しやすいかも。


shell> more system sshd
#
# $FreeBSD: src/etc/pam.d/system,v 1.1.32.1.4.1 2010/06/14 02:09:06 kensmith Exp $
#
# System-wide defaults
#

# auth
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      pam_ldap.so
auth            required        pam_unix.so             no_warn try_first_pass nullok

# account
account         sufficient      pam_ldap.so
account         required        pam_login_access.so
account         required        pam_unix.so

# session
session         required        pam_lastlog.so          no_fail

# password
password        required        pam_unix.so             no_warn try_first_pass
...skipping...
#
# $FreeBSD: src/etc/pam.d/sshd,v 1.16.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $
#
# PAM configuration for the "sshd" service
#

# auth
auth            sufficient      pam_opie.so             no_warn no_fake_prompts
auth            requisite       pam_opieaccess.so       no_warn allow_local
auth            sufficient      pam_ldap.so
auth            required        pam_unix.so             no_warn try_first_pass

# account
account         required        pam_nologin.so
account         sufficient      pam_ldap.so
account         required        pam_login_access.so
account         required        pam_unix.so

# session
session         required        pam_permit.so

# password
password        required        pam_unix.so             no_warn try_first_pass

5. テスト

最後にテストをしておしまい。


shell> id hogetan

uid=100(hogetan) gid=100(hogetan) groups=100(hogetan)

コメントを残す