/etc/sudoers を LDAP で管理する

/etc/sudoers を LDAP で一元管理とかできないのかなぁ、と思っていたら、ちゃんと対応してた

利用方法はわりと簡単で、上記リンクの README.LDAP (ソースに同じものが同梱されてる)を見ればすぐわかるけど、一応ここにやったことをメモ。ほとんど README からの抜粋です。

手元の Slackware に元から入っている sudo は LDAP 対応していないので、ここからダウンロード して以下の手順でインストール。

$ ./configure --with-ldap
$ make
$ sudo make install

でもって /etc/ldap.conf に以下の記述を追加。(元々 LDAP は利用していて、基本的な設定はできているので、追加は一行だけ。)

sudoers_base   ou=SUDOers,o=southpark

LDAP 側の設定はまずスキーマの追加。

  #
  #  schema file for sudo
  #

  attributetype ( 1.3.6.1.4.1.15953.9.1.1
        NAME 'sudoUser'
        DESC 'User(s) who may  run sudo'
        EQUALITY caseExactIA5Match
        SUBSTR caseExactIA5SubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

  attributetype ( 1.3.6.1.4.1.15953.9.1.2
        NAME 'sudoHost'
        DESC 'Host(s) who may run sudo'
        EQUALITY caseExactIA5Match
        SUBSTR caseExactIA5SubstringsMatch
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

  attributetype ( 1.3.6.1.4.1.15953.9.1.3
        NAME 'sudoCommand'
        DESC 'Command(s) to be executed by sudo'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

  attributetype ( 1.3.6.1.4.1.15953.9.1.4
        NAME 'sudoRunAs'
        DESC 'User(s) impersonated by sudo'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

  attributetype ( 1.3.6.1.4.1.15953.9.1.5
        NAME 'sudoOption'
        DESC 'Options(s) followed by sudo'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )

  objectclass ( 1.3.6.1.4.1.15953.9.2.1 NAME 'sudoRole' SUP top STRUCTURAL
        DESC 'Sudoer Entries'
        MUST ( cn )
        MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoOption $
              description )
        )

次に sudoers 用のコンテナ ou=SUDOers, o=southpark と、デフォルト設定用の cn=defaults, ou=SUDOers, o=southpark を LDAP エントリに追加。

dn: ou=SUDOers,o=southpark
objectclass: organizationalunit
ou: SUDOers

dn: cn=defaults,ou=SUDOers,o=southpark
objectclass: top
objectclass: sudorole
cn: defaults
sudoOption: ignore_local_sudoers

sudoOption: ignore_local_sudoers があると、/etc/sudoers ファイルを見なくなる。

最後に sudo 用 role エントリを追加して準備 OK。

dn: cn=role1,ou=SUDOers,o=southpark
changetype: add
objectclass: top
objectclass: sudorole
cn: role1
sudouser: miya
sudohost: ALL
sudocommand: ALL

sudouser, sudohost, sudocommand は複数設定可。! で否定になる。なので、特定のユーザだけ許可しない、という場合には、

sudouser: ALL
sudouser: !miya

なんて書き方もできる。同様に特定のホストだけ許可しない、という場合には、

sudohost: ALL
sudohost: !kenny

とかできるし、特定のコマンドだけ許可しない、という場合には、

sudocommand: ALL
sudocommand: !/sbin/reboot

とかできる。もちろんこれらの組み合わせも OK。

あと、ユーザではなくグループで指定したい場合には

sudouser: %group

とする。(これは README.LDAP には明記されてない。/etc/sudoers の書き方から類推すればわかるけど。)