debianでアカウント情報をLDAPで管理する

debian でアカウント情報をOpenLDAPで管理する手順をまとめます.

インストール(LDAPサーバ側)

$ sudo apt-get install  ldap-server ldap-utils

設定(LDAPサーバ側)

以前はopenldapの設定ファイルといえば /etc/ldap/slapd.conf でしたが,最近のldapではこのファイルは使いません.設定自体も ldapのデータベース上に保存するようになっています.

ですので,LDAPサーバの再設定を行なう場合はとりあえず

$ sudo dpkg-reconfigure slapd

とするのが簡単です.

本エントリでは,ここで

  • base は dc=local
  • rootdnは cn=admin,dc=local

と設定した場合を想定して,以下手順を説明していきます.

初期設定

slapdの設定が終わったら,とりあえず動作確認します

ldapのデータベースにある slapdの設定値を眺めてみます.

$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config

なお"-Y EXTERNAL"を付けると, root権限を使い,LDAP側の認証を経由せずに直接DBへアクセスします.


エラーがでなければ,初期設定を開始します.

まずldapのデータベースを変更する場合は ldapmodify コマンドを使います.
ldapmodifyコマンドは,次のように shell script 経由で使用するのが便利です.

たとえば slapd のログレベルを変更する場合は bash を使って

#!/bin/bash
# Changes log level
ldapmodify -Y external -H ldapi:///  <<EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: none
EOF

という scriptを書いて,root権限で実行します.面倒ですね.

ldapのデータベースにオブジェクトを新規追加する場合は ldapadd コマンドを使います.

早速,ユーザを登録するために使うオブジェクト

  • ou=people,dc=local
  • ou=group,dc=local

を追加してみます.

#!/bin/bash
ldapadd -Y external -H ldapi:///  <<EOF
dn: ou=people,dc=local
objectClass: organizationalUnit
ou: people

dn: ou=group,dc=local
objectClass: organizationalUnit
ou: group
EOF

というスクリプトを書いて,これを実行します.

同じ方法で,アカウントを登録します.

まずユーザグループを登録

#!/bin/bash

NAME=users
GID=10000

ldapadd -Y external -H ldapi:///  <<EOF
dn: cn=$NAME,ou=group,dc=local
cn: users
objectClass: posixGroup
gidNumber: $GID
description: Group account

次にユーザを登録

#!/bin/bash

USER=username
PASS=hogehoge
UID=10000
GID=10000

ldapadd -Y external -H ldapi:///  <<EOF
dn: uid=$USER,ou=people,dc=local
uid: $USER
cn:  $USER
objectClass: posixAccount
objectClass: account
userPassword: $PASS
loginShell: /bin/bash
uidNumber: $UID
gidNumber: $GID
homeDirectory: /home/$USER

実際にシステムを運用するときは,このスクリプトをちょっと改造して,

  • コマンドライン引数でユーザ名を受け取る
  • 初期パスワードはユーザ名から自動生成する

といった機能を付けることになります.詳細は割愛します.

インストール(LDAPクライアント側)

クライアント側はlibpam-ldapを使います.

$ sudo apt-get install ldap-utils libpam-ldap

これで pamレベルで ldapに対応します.

設定ファイルは

になります.

/etc/pam_ldap.conf は

の3つの設定が必須です.

/etc/pam_ldap.secretにはLDAPサーバのパスワードを記述します.とりあえず最初は平文で書いてテストしましょう :-)
平文ですので,パーミッションを0600にしておきます.

$ sudo chmod 0600 /etc/pam_ldap.secret

/etc/ldap/ldap.conf

BASE dc=local
URI ldap://[LDAPサーバのIPアドレス]/

の2行が必須です.

最後に /etc/nssswitch.conf で ldap を使うように指定します.

passwd:         files ldap
group:          files ldap
shadow:         files ldap

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

念の為 /etc/pam.d/common-auth 等に ldap のモジュールが組み込まれていることを確認しておきます.

$ grep pam_ldap /etc/pam.d/common-*

私の手元のdebian/unstableなPCでは

/etc/pam.d/common-account:account       [success=ok new_authtok_reqd=done ignore=ignore user_unknown=ignore authinfo_unavail=ignore default=bad]        pam_ldap.so minimum_uid=1000
/etc/pam.d/common-auth:auth     [success=1 default=ignore]      pam_ldap.so minimum_uid=1000 use_first_pass
/etc/pam.d/common-password:password     [success=1 default=ignore]      pam_ldap.so minimum_uid=1000 try_first_pass
/etc/pam.d/common-session:session       [success=ok default=ignore]     pam_ldap.so minimum_uid=1000
/etc/pam.d/common-session-noninteractive:session        [success=ok default=ignore]     pam_ldap.so minimum_uid=1000

と言う出力になりました.pam_ldap.so という文字列が含まれているのでLDAPに対応できています.

設定は以上です.idコマンドなどでLDAP経由でユーザ情報が参照できるか確認しましょう.