やるきなし

2013/06/24 18:50 / LDAP server + autofs

LDAP と autofs を利用して home directory や共通設定(というかアカウント)を共有するためのメモ.

% sudo aptitude install slapd

で OpenLDAP (slapd) をインストールする.この際 admin のパスワードを設定させられる.

% sudo slapcat

で保持されている情報(暗号化されたパスワードも含めて)を確認.初期状態では,以下の DN (distinguished name: 識別名)のみ.これも Debian の場合ドメイン名から適当に決まる (おそらく dpkg-reconfigure slapd でもう少し詳細に設定可能).

dn: dc=meganecco,dc=example,dc=org
objectClass: top
objectClass: dcObject
objectClass: organization
o: meganecco.example.org
dc: meganecco
(snip)

dn: cn=admin,dc=meganecco,dc=example,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: (snip)
(snip)

/etc/ldap/ldap.conf には

BASE    dc=meganecco,dc=example,dc=org
URI     ldapi:///

を書いておく.ldapi:/// は UNIX ドメインソケットでのアクセス.別計算機で LDAP server が動いている場合は ldap://192.168.xx.xx/ とかでサーバ指定.これで

% ldapsearch -x
% ldapsearch -x objectClass=account

などで情報が参照できるようになる (-x: use simple authentication instead of SASL).

クライアント設定

/etc/nsswitch.conf に

passwd:         compat ldap
shadow:         compat ldap
hosts:          files dns ldap
automount:      ldap

とか,LDAP を使いたい箇所に ldap と書いておく.ここでは user 認証と host 名と autofs (automount) のための map を想定.automount: ldap としておけば /etc/auto.master も不要.

これだけだと client にはなれず,他に,

% sudo aptitude install nslcd

で nslcd (local LDAP name service daemon) を入れておく.localhost が LDAP server になっている場合は,

[/etc/nslcd.conf]
uri ldapi:///
base dc=meganecco,dc=example,dc=org

ぐらいの設定をする(別計算機の場合は ldap://192.168.xx.xx/).

LDAPの情報操作

% ldapadd -x -D "cn=admin,dc=meganecco,dc=example,dc=org" -w (pw)
% ldapdelete -x -D "cn=admin,dc=meganecco,dc=example,dc=org" -w (pw)
% ldapmodify -x -D "cn=admin,dc=meganecco,dc=example,dc=org" -w (pw)

でLDAPの保持している情報を操作する.(pw)は設定したパスワード.-w (pw) ではなく -W とすれば,毎回パスワード入力を求められる(そのほうが安全?).ちなみに sudo せずにユーザー権限でOK.

ldapadd の場合は DN の内容をそのまま書く.空行で DN の区切れ目だと認識され,add の処理が行われる.失敗すると exit する.-f (filename) で手書き(or C&P)の 代わりにファイルから入力も可能.

% ldapadd -x -D "cn=admin,dc=meganecco,dc=example,dc=org" -w (pw)
dn: ou=People,dc=meganecco,dc=example,dc=org
objectClass: organizationalUnit
ou: People

dn: ou=Hosts,dc=meganecco,dc=example,dc=org
objectClass: organizationalUnit
objectClass: top
ou: Hosts
^D

とか.ldapdelete の場合は削除したい DN を書く.-f (filename) も可能.

% ldapdelete -x -D "cn=admin,dc=meganecco,dc=example,dc=org" -w (pw)
dn: ou=Hosts,dc=meganecco,dc=example,dc=org
^D

ldapmodify はほんのちょっとだけややこしいので省略.

上の例で示した People に /etc/passwd の内容を,Hosts に /etc/hosts の内容を追加していく.ちなみに OU は organizational unit (組織単位).イチから書くとあれなので,変換 script を使う.

% cd /usr/share/migrationtools/
% sudo vi migrate_common.ph (/etc/migrationtools/migrate_common.ph への symlink)
$DEFAULT_MAIL_DOMAIN = "meganecco.example.org";
$DEFAULT_BASE = "dc=meganecco,dc=example,dc=org";
% sudo ./migrate_passwd.pl /etc/passwd > /tmp/passwd.ldif
% sudo ./migrate_hosts.pl /etc/hosts > /tmp/hosts.ldif

これで生成した LDIF (LDAP data interchange format) を適当に編集 (共有したい部分のみ残す)して ldapadd に -f で喰わせる.簡単.たぶんこれぐらいで多分ユーザ認証はできるはず.

うまく行かない場合は /var/log/daemon を参照したり nslcd を再起動したりする.

autofs 向け LDAP 設定

http://wiki.debian.org/LDAP/AutoFSSetupにある極めて不親切な情報を参考にする.まずLDAPにautomount用のschemaを追加する.つまりautomountのマップ情報を扱えるように設定を行う.ちなみにNISによるautofsはDefaultで使える.そういった機能を追加するイメージ.

LDAPの設定は

sudo ldapsearch -Y EXTERNAL -b "cn=config"

で確認する(sudo).People とかと同様にDNで設定(schema等)が保持されている.つまりldapaddやldapdeleteで設定を変更する感じになる.

ということで/etc/ldap/schema/autofs.schemaから ldapadd するものを作成し,ldapadd する.以下の通り.

% vi hoge.conf
include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/autofs.schema
% mkdir hoge
% /usr/sbin/slaptest -f hoge.conf -F hoge
% vi hoge/cn=config/cn=schema/cn={1}autofs.ldif
(適当に整形...というか以下のようにする)
dn: cn=autofs,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: autofs
olcAttributeTypes: {0}( 1.3.6.1.1.1.1.25 NAME 'automountInformation' DESC 'Inf
 ormation used by the autofs automounter' EQUALITY caseExactIA5Match SYNTAX 1.
 3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.1.1.1.13 NAME 'automount' DESC 'An entry in an
 automounter map' SUP top STRUCTURAL MUST ( cn $ automountInformation $ object
 class ) MAY description )
olcObjectClasses: {1}( 1.3.6.1.4.1.2312.4.2.2 NAME 'automountMap' DESC 'An gro
 up of related automount objects' SUP top STRUCTURAL MUST ou )
% sudo cp hoge/cn=config/cn=schema/cn={1}autofs.ldif /etc/ldap/schema/autofs.ldif
(今後使うことがあるかもしれないから保存しとく)
% sudo ldapadd -Y EXTERNAL -f /etc/ldap/schema/autofs.ldif

autofs からLDAPを参照(するための設定他)

先の nsswitch.conf に automount: ldap とあれば ldap の ou=auto.master,dc=meganecco,dc=example,dc=orgがまず参照される.そこから順に情報をたどっていくっぽい.ということで以下を ldapadd.

## /etc/auto.master の代わりの入れ物
dn: ou=auto.master,dc=meganecco,dc=example,dc=org
ou: auto.master
objectClass: top
objectClass: automountMap

## /etc/auto.master の書いていただろう内容
dn: cn=/home,ou=auto.master,dc=meganecco,dc=example,dc=org
objectClass: automount
cn: /home
automountInformation: ldap://192.168.xx.xx/ou=auto.home,dc=meganecco,dc=example,dc=org

dn: cn=/-,ou=auto.master,dc=meganecco,dc=example,dc=org
objectClass: automount
cn: /-
automountInformation: ldap://192.168.xx.xx/ou=auto.direct,dc=meganecco,dc=example,dc=org

dn: cn=/net,ou=auto.master,dc=meganecco,dc=example,dc=org
objectClass: automount
cn: /net
automountInformation: -hosts

## 上から辿られる MAP (auto.home)
dn: ou=auto.home,dc=meganecco,dc=example,dc=org
ou: auto.home
objectClass: top
objectClass: automountMap

dn: cn=/,ou=auto.home,dc=meganecco,dc=example,dc=org
cn: /
objectClass: automount
automountInformation: -rw,intr,soft 192.168.xx.xx:/export/home/&

## 上から辿られる MAP (auto.direct)
dn: ou=auto.direct,dc=meganecco,dc=example,dc=org
objectClass: top
objectClass: automountMap
ou: auto.direct

dn: cn=/opt,ou=auto.direct,dc=meganecco,dc=example,dc=org
objectClass: automount
cn: /opt
automountInformation: 192.168.xx.xx:/export/opt

あとは client 側で service autofs restart 等で autofs を再起動する.うまく動かない場合は,

# /usr/sbin/automount -v -d -f

で様子を探る(-v verbose and -d debug and -f foreground).

Related articles