LDAP経由でsudoができない

Scientific Linux 6で、LDAPによるsudoの制御でぶつかった問題とその解決までのメモ。 おそらくRed Hat Enterprise Linux 6を含む同様のOSでも同じ問題が起きると思われる。

sudoのためのLDAPの設定

本題はここではないので、大雑把な手順だけ示しておく。

sudo用スキーマの準備

LDAPサーバでsudo用のスキーマを準備する。sudoのパッケージにOpenLDAP用のスキーマがあるので、これを参照できるようにしておく。

# cd /etc/openldap/schema
# ln -s /usr/share/doc/sudo-xxxxx/schema.OpenLDAP sudo.schema

次の行をOpenLDAPの設定ファイルに追加して、slapdを再起動しておく。

include /etc/openldap/schema/sudo.schema

sudo用のLDIFの作成と読み込み

次の内容でLDIFを作成して、読み込ませておく。 domainname、username、hostnameの部分には環境に合わせた情報を入れておくこと。 また、sudoユーザにすべての操作を許可する設定になっているが、必要に応じて適切にコントロールするとよい。

dn: ou=Sudoers,dc=domainname
ou: Sudoers
objectClass: top
objectClass: organizationalUnit

dn: cn=hostname,ou=Sudoers,dc=domainname
sudoUser: username 
sudoCommand: ALL
sudoHost: hostname
objectClass: top
objectClass: sudoRole
sudoOption: ignore_local_sudoers
cn: hostname 

sudoを利用するユーザには、authorizedServiceにsudoを加えておくこと。

LDAPクライアントの設定

sudoを利用する対象クライアントで次の設定を行う。

/etc/nsswitch.confに次の行を加える。

sudoers:   files ldap

/etc/pam_ldap.confに次の行を加える。 RHEL5系ではこのクライアント側のLDAPの設定ファイルは/etc/ldap.confになっている。

sudoers_base ou=Sudoers,dc=domainname

問題点その1

CentOS 4やCentOS 5ではこのやり方で問題はなかったのだが、Scientific Linux 6では、該当ユーザがsudoersにいないといった旨のメッセージが表示されて、sudoを実行することができない。

結論から言うと、どうやらsudoが利用するLDAP用の設定ファイルは、ビルド時に指定する必要があるようだ。 これがOpenLDAPが実際に利用する設定ファイル(pam_ldap.conf)ではないところに問題がある。

sudo-1.7.2p2-9.el6のconfigureオプションの該当部分は次の通り。

%configure \
    --prefix=%{_prefix} \
    ...
    --with-ldap \
    --with-ldap-conf-file="%{_sysconfdir}/ldap.conf" \
    --with-ldap-secret-file="%{_sysconfdir}/ldap.secret" \
    --with-selinux \
    --with-passprompt="[sudo] password for %p: " \

/etc/ldap.confを参照していることがわかる。

次のようにシンボリックリンクを張って回避した。

# ln -s /etc/pam_ldap.conf /etc/ldap.conf

問題点その2

Scientific Linux 6.1へのアップグレードを実施したところ、sudoが1.7.4p5-5.el6までバージョンがあがった。 これを境にまた最初の問題が起きるようになった。

以前はコンパイルオプションを調べたが、インストール済みのsudoでLDAP用の設定ファイルへのパスを確認することができる。一般ユーザではバージョン番号以外の情報を取得できないので、rootになってから実行すること。

# sudo -V | grep "ldap.conf path"
ldap.conf path: /etc/nss_ldap.conf

ということで、今回もシンボリックリンクを張りなおして回避した。

# ln -s /etc/pam_ldap.conf /etc/nss_ldap.conf

問題点その3

Red Hat Enterprise Linux 6.2を利用する機会があり、同様の設定をしたところ、また同じ問題が出てしまった。 今回のsudoのバージョンは1.7.4p5-7.el6になっている。Scientific Linux 6.1のfastbugsには入っていたので、6.2までアップグレードすれば同じ問題が起きると思われる。

# sudo -V | grep "ldap.conf path"
ldap.conf path: /etc/nslcd.conf

今回はちょっと問題がある。既にnslcd.confはnslcdの設定ファイルとして利用しているので、シンボリックリンクを張ることができない。nslcd.confに次の行を書き加えて回避することを試みた。

sudoers: ou=Sudoers,dc=domainname

sudoはこれで機能するようになる。 ところが、この記述はnslcd的には問題で、シンタックスエラーと判断されnslcdを再起動できなくなってしまった。

そのままパッケージを利用することは諦めて、sudoのldap.confの参照先をnss_ldap.confに指定して、ビルドをしなおして回避した。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>