« PreviousNext »

OpenLDAP構築2

13 1 月 2008


各仮想サーバーのネットワークでユーザーのアカウント情報を共有できるようにLDAPサーバーを構築します。
 
マスターサーバー: CentOS5
スレーブサーバー: CentOS5
サーバー機が1台のときもこれでOKです。その場合はマスターサーバーの設定を参照してください

なお、当サイトではレプリケーション方式では設定しておりません。
バックアップサーバーがないと不安とかスレーブサーバーのスペックに余裕のある方は

信頼性の高いLDAPシステムを構築する とか、CentOS 5+OpenLDAPでLDAPサーバの冗長化環境を構築 を参照してください。

まずは、マスターサーバーの設定からします。

これからいろいろとファイルを設定します。
赤字 はおのおの環境に合わせてください。
 は注意するところです
 はコマンドです
 は説明等です

まずOpenLDAP関係をインストールする↓
# yum -y install openldap* 

管理者パスワード生成する↓
# slappasswd -s password -h {MD5}passwprd は任意の文字
{MD5}*********************    ←   ↓で使うので控えておく
 
 
設定ファイル①修正↓
# vi /etc/openldap/slapd.conf
suffix    "dc=lunq,dc=net"
 
rootdn    "cn=Manager,dc=lunq,dc=net"
 
rootpw    {MD5}************************   近いものがあるのでその辺に上記で生成したパスワードを追加
 
↓ 最終行に以下を追加
 
------------------------------ここから------------------------------
 
access to attrs=userPassword
    by self write
    by dn="cn=Manager,dc=lunq,dc=net" write
    by anonymous auth
    by * none

access to attrs=userPassword
    by anonymous auth
    by dn="cn=Admin,dc=lunq,dc=net" read
    by * none

access to *
    by dn="cn=Manager,dc=lunq,dc=net" write
    by self write
    by * read

access to *
    by self =rwcsx
    by dn="cn=Admin,dc=lunq,dc=net" =rwcsx
    by * read
 
------------------------------ここまで------------------------------
 
設定ファイル②修正↓
# vi /etc/openldap/ldap.conf
BASE   dc=lunq, dc=net ←   コメントアウトされていれば解除する
 
# vi /etc/ldap.conf
base dc=lunq,dc=net ←   コメントアウトされていれば解除する
 
LDAPを起動する↓
# /etc/rc.d/init.d/ldap start
Checking configuration files for slapd:  /etc/openldap/slapd.conf:
line 99: rootdn is always granted unlimited privileges.
/etc/openldap/slapd.conf: line 104: rootdn is always granted unlim
ited privileges.
config file testing succeeded[  OK  ]
Starting slapd:[  OK  ]
 
自動起動設定↓
# chkconfig ldap on
 
設定ファイル③修正↓
# vi /usr/share/openldap/migration/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "lunq.net";  ←   71行目付近
 
$DEFAULT_BASE = "dc=lunq,dc=net";  ←   74行目付近
 
設定ファイル④新規作成↓
# vi base.ldif
 
------------------------------ここから------------------------------
 
dn: dc=lunq,dc=net
objectClass: dcObject
objectClass: organization
o: lunq Organization
dc: lunq 

dn: cn=Manager, dc=lunq,dc=net
objectClass: organizationalRole
cn: Manager
dn: ou=People,dc=lunq,dc=net
objectClass: organizationalUnit 

ou: People
dn: ou=Group,dc=lunq,dc=net
objectClass: organizationalUnit
ou: Group
 
------------------------------ここまで------------------------------
 
↓初期設定ファイルを読み込ませる
# ldapadd -h localhost -x -D "cn=Manager,dc=lunq,dc=net" -W -f base.ldif
Enter LDAP Password:    ←   管理者パスワード入力
adding new entry "dc=lunq,dc=net"
 
adding new entry "cn=Manager, dc=lunq,dc=net"
 
adding new entry "ou=People,dc=lunq,dc=net"
 
adding new entry "ou=Group,dc=lunq,dc=net"
 
↑成功
※  設定ファイルがおかしいと↓の失敗例のようになってしまう。
    失敗してしまったら設定ファイルを見直す、それでもわからなければ手動登録に進む。
 
↓失敗例 
# ldapadd -h localhost -x -D "cn=manager,dc=lunq,dc=net" -W -f base.ldif
Enter LDAP Password:
ldapadd: attributeDescription "dn": (possible missing newline after line 5 of
entry "dc=lunq,dc=net"?)
ldapadd: attributeDescription "dn": (possible missing newline after line 8 of
entry "dc=lunq,dc=net"?)
ldapadd: attributeDescription "dn": (possible missing newline after line 11 of
entry "dc=lunq,dc=net"?)
adding new entry "dc=lunq,dc=net"
ldap_add: Type or value exists (20)
        additional info: objectClass: value #3 provided more than once
 
※  手動で登録をする場合。↓
# ldapadd -h localhost -x -D "cn=Manager,dc=lunq,dc=net" -W
Enter LDAP Password:  ← 管理用パスワード応答
 
dn: dc=lunq,dc=net入力後に Enter
objectClass: dcObject入力後に Enter
objectclass: organization入力後に Enter
dc: lunq入力後に Enter
o: lunq Organization入力後に Enter
 「 Ctrl 」 + 「 D 」 押下
adding new entry "dc=lunq,dc=net"
 
dn: cn=Manager,dc=lunq,dc=net入力後に Enter
objectClass: organizationalRole入力後に Enter
cn:Manager入力後に Enter
 「 Ctrl 」 + 「 D 」 押下
adding new entry "cn=Manager,dc=lunq,dc=net"
 
dn: ou=People,dc=lunq,dc=net入力後に Enter
objectClass: organizationalUnit入力後に Enter
ou: People入力後に Enter
 「 Ctrl 」 + 「 D 」 押下
adding new entry "ou=People,dc=lunq,dc=net"
 
dn: ou=Group,dc=lunq,dc=net入力後に Enter
objectClass: organizationalUnit入力後に Enter
ou: Group入力後に Enter
 「 Ctrl 」 + 「 D 」 押下
adding new entry "ou=Group,dc=lunq,dc=net"
 「 Ctrl 」 + 「 D 」 押下でぬける
 
↓LDAPユーザー認証方式にLDAPを追加する。
# authconfig-tui

LDAP を使用 」 と
「 LDAP 認証を使用 」 に※印をつける
を選択する

サーバー: 127.0.0.1 を入力
ベース DN: dc=lunq,dc=net を入力
OKを選択する
 
登録されているかの確認をする↓
 
# ldapsearch -x -b 'dc=lunq,dc=net'
 
# extended LDIF
#
# LDAPv3
# base <dc=hoshu,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# lunq.net
dn: dc=lunq,dc=net
objectClass: dcObject
objectClass: organization
dc: lunq
o: lunq Corporation
 
# Manager, lunq.net
dn: cn=Manager,dc=lunq,dc=net
objectClass: organizationalRole
cn: Manager
 
# People, lunq.net
dn: ou=People,dc=lunq,dc=net
objectClass: organizationalUnit
ou: People
 
# Group, lunq.net
dn: ou=Group,dc=lunq,dc=net
objectClass: organizationalUnit
ou: Group
 
# search result
search: 2
result: 0 Success
 
# numResponses: 5
# numEntries: 4

登録するのにパスが長くめんどくさいので/root/直下にリンクを作成する
手動登録のときに使用する。
# ln -s /usr/share/openldap/migration/migrate_passwd.pl /root/migrate_passwd
# ln -s /usr/share/openldap/migration/migrate_group.pl /root/migrate_group
 
のちのち、Postfixでメールサーバー(LDAP)を構築するときのために
下記の内容に変更するためのスクリプト作成する。
 
初期で passwd.ldif(パスワード登録ファイル)を作成すると、こういう状態になる↓
--------------------ここから--------------------
 
dn: uid=hogehoge,ou=People,dc=lunq,dc=net
uid: hogehoge
cn: hogehoge
objectClass: account削除
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}xxxxxxxxxxxxxxxxxxxx
shadowLastChange: 13782
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/hogehoge
 
--------------------ここまでを--------------------
 
↑上記の内容で登録すると後々 Postfix でメールサーバーを構築するときに
全ユーザーを変更することになるので↓のように変更しなければならない
LDAP & Postfix 仮想メールユーザー作成  でメールサーバーを設定する場合
 
--------------------ここから--------------------
 
dn: uid=hogehoge,ou=People,dc=lunq,dc=net
uid: hogehoge
cn: hogehoge
objectClass: person追加
objectClass: organizationalPerson追加
objectClass: inetOrgPerson追加
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}xxxxxxxxxxxxxxxxxxxx
postalAddress: cn=hogehoge,ou=Group,dc=lunq,dc=net追加
shadowLastChange: 13782
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/hogehoge
givenName: hogehoge追加
sn: hogehoge追加
gecos: Lunq User追加
mail: hogehoge@lunq.net追加
 
--------------------ここまで--------------------
 
いちいちめんどいので、登録用ファイルを編集する。
※ Postfix と連携させない方は下記は不要。
 
ファイル修正①
# vi /usr/share/openldap/migration/migrate_common.ph
sub getsuffix   ← 201行目前後
{
・
・
}

↓ 上記の下のほうに下記を追加

--------------------ここから-------------------- 

sub gatsuffix   ← 214行目前後から
{
        local($program) = shift(@_);
        local($nc);
        $program =~ s/^migrate_(.*)¥.pl$/$1/;
        $nc = $NAMINGCONTEXT{'group'};
        if ($nc eq "") {
                return $DEFAULT_BASE;
        } else {
                return $nc . ',' . $DEFAULT_BASE;
        }
}   ← ここまで

--------------------ここまで-------------------- 

※ Postfix と連携させない方は下記は不要。
ファイル修正②
# vi /usr/share/openldap/migration/migrate_passwd.pl

--------------------ここから-------------------- 

$PROGRAM = "migrate_passwd.pl";
$NAMINGCONTEXT = &getsuffix($PROGRAM);
$PNAMINGCONTEXT = &gatsuffix($PROGRAM);44行目前後に追加

print $HANDLE "objectClass: account¥n";   ← 135行目前後
↓ 上記の内容を下記のように変更
print $HANDLE "objectClass: person¥n";

print $HANDLE "objectClass: organizationalPerson¥n";138行目前後に追加
print $HANDLE "objectClass: inetOrgPerson¥n";139行目前後に追加
print $HANDLE "objectClass: posixAccount¥n";
print $HANDLE "objectClass: top¥n";

} else {
        print $HANDLE "userPassword: {crypt}$pwd¥n";   ← 150行目前後
        print $HANDLE "postalAddress: cn=$user,$PNAMINGCONTEXT¥n";追加
}

} else {
        print $HANDLE "homeDirectory:¥n";   ← 177行目前後
}
print $HANDLE "givenName: $user¥n";上記の下に追加 179行目前後から
print $HANDLE "sn: $user¥n";追加
print $HANDLE "gecos: Lunq User¥n";追加
print $HANDLE "mail: $user¥@$DEFAULT_MAIL_DOMAIN¥n";追加

if ($pwd) {
        print $HANDLE "userPassword: {crypt}$pwd¥n";   ← 210行目前後
        print $HANDLE "postalAddress: cn=$user,$PNAMINGCONTEXT¥n";追加
}

--------------------ここまで--------------------
 
 
次に、スレーブサーバーの設定をします。
サーバー機が1台のときは次に進んでください。
なお、当サイトではレプリケーション方式では設定しておりません。
バックアップサーバーがないと不安とかスレーブサーバーのスペックに余裕のある方は

信頼性の高いLDAPシステムを構築する とか、CentOS 5+OpenLDAPでLDAPサーバの冗長化環境を構築 を参照してください。

まずOpenLDAP関係をインストールする↓
# yum -y install openldap*
 
自動起動させない設定↓
※レプリケーション方式の場合はonにする
# chkconfig ldap off
 
設定ファイル②修正↓
# vi /etc/ldap.conf
base dc=lunq,dc=net
 
設定ファイル③修正↓
# vi /usr/share/openldap/migration/migrate_common.ph
$DEFAULT_MAIL_DOMAIN = "lunq.net";  ←   71行目付近
 
$DEFAULT_BASE = "dc=lunq,dc=net";  ←   74行目付近
 
↓LDAPユーザー認証方式にLDAPを追加する。
# authconfig-tui

LDAP を使用 」 と
「 LDAP 認証を使用 」 に※印をつける
を選択する

サーバー: 192.168.0.100 LDAPサーバーのアドレスを入力
ベース DN: dc=lunq,dc=net を入力
OKを選択する
 
マスターサーバーに認証できるかの確認をする↓
# ldapsearch -x -b 'dc=lunq,dc=net'
 
# extended LDIF
#
# LDAPv3
# base <dc=hoshu,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
 
# lunq.net
dn: dc=lunq,dc=net
objectClass: dcObject
objectClass: organization
dc: lunq
o: lunq Corporation
 
# Manager, lunq.net
dn: cn=Manager,dc=lunq,dc=net
objectClass: organizationalRole
cn: Manager
 
# People, lunq.net
dn: ou=People,dc=lunq,dc=net
objectClass: organizationalUnit
ou: People
 
# Group, lunq.net
dn: ou=Group,dc=lunq,dc=net
objectClass: organizationalUnit
ou: Group
 
# search result
search: 2
result: 0 Success
 
# numResponses: 5
# numEntries: 4

登録するのにパスが長くめんどくさいので/root/直下にリンクを作成する
手動登録のときに使用する。
# ln -s /usr/share/openldap/migration/migrate_passwd.pl /root/migrate_passwd
# ln -s /usr/share/openldap/migration/migrate_group.pl /root/migrate_group 

登録用ファイルを編集する。
※ Postfix と連携させない方は下記は不要。
 
ファイル修正①
# vi /usr/share/openldap/migration/migrate_common.ph
sub getsuffix   ← 201行目前後
{
・
・
}

↓ 上記の下のほうに下記を追加

--------------------ここから-------------------- 

sub gatsuffix   ← 214行目前後から
{
        local($program) = shift(@_);
        local($nc);
        $program =~ s/^migrate_(.*)¥.pl$/$1/;
        $nc = $NAMINGCONTEXT{'group'};
        if ($nc eq "") {
                return $DEFAULT_BASE;
        } else {
                return $nc . ',' . $DEFAULT_BASE;
        }
}   ← ここまで

--------------------ここまで-------------------- 

※ Postfix と連携させない方は下記は不要。
ファイル修正②
# vi /usr/share/openldap/migration/migrate_passwd.pl

--------------------ここから-------------------- 

$PROGRAM = "migrate_passwd.pl";
$NAMINGCONTEXT = &getsuffix($PROGRAM);
$PNAMINGCONTEXT = &gatsuffix($PROGRAM);44行目前後に追加

print $HANDLE "objectClass: account¥n";   ← 135行目前後
↓ 上記の内容を下記のように変更
print $HANDLE "objectClass: person¥n";

print $HANDLE "objectClass: organizationalPerson¥n";138行目前後に追加
print $HANDLE "objectClass: inetOrgPerson¥n";139行目前後に追加
print $HANDLE "objectClass: posixAccount¥n";
print $HANDLE "objectClass: top¥n";

} else {
        print $HANDLE "userPassword: {crypt}$pwd¥n";   ← 150行目前後
        print $HANDLE "postalAddress: cn=$user,$PNAMINGCONTEXT¥n";追加
}

} else {
        print $HANDLE "homeDirectory:¥n";   ← 177行目前後
}
print $HANDLE "givenName: $user¥n";上記の下に追加 179行目前後から
print $HANDLE "sn: $user¥n";追加
print $HANDLE "gecos: Lunq User¥n";追加
print $HANDLE "mail: $user¥@$DEFAULT_MAIL_DOMAIN¥n";追加

if ($pwd) {
        print $HANDLE "userPassword: {crypt}$pwd¥n";   ← 210行目前後
        print $HANDLE "postalAddress: cn=$user,$PNAMINGCONTEXT¥n";追加
}

--------------------ここまで-------------------- 

既存のユーザーとグループをLDAPサーバーに登録
※マスターサーバースレーブサーバー のシステムユーザーが別々の場合どちらのサーバーでも行う。
既存ユーザー一括登録用スクリプトを作成する
そのスクリプトがこちら↓
# vi ld-uadd.sh既存パスワード登録スクリプト作成
 
--------------------ここから--------------------
 
#!/bin/bash
 
LDAPPASS="**********";  # LDAP管理用パスワードを平文で入力
MANAGER="cn=Manager,dc=lunq,dc=net";  # LDAP管理用ユーザーを入力
SVRADDR="localhost";  # LDAPサーバーのアドレスを入力

MIGPASSWD=/usr/share/openldap/migration/migrate_passwd.pl;
MIGGROUP=/usr/share/openldap/migration/migrate_group.pl;
 
grep ":5[0-9][0-9]" /etc/passwd > passwd
grep ":5[0-9][0-9]" /etc/group > group
$MIGPASSWD passwd > passwd.ldif
$MIGGROUP group > group.ldif
 
ldapadd -h $SVRADDR -x -D $MANAGER -w $LDAPPASS -f group.ldif
ldapadd -h $SVRADDR -x -D $MANAGER -w $LDAPPASS -f passwd.ldif 

rm -f passwd
rm -f group
rm -f passwd.ldif
rm -f group.ldif 

# スレーブサーバーの場合この下の2行を削除
ldapadd -h $SVRADDR -x -D $MANAGER -w $LDAPPASS -f admin.ldif
rm -f admin.ldif
 
--------------------ここまでを--------------------
 
 
実行権付与
# chmod +x ./ld-uadd.sh
 
↓参照用ユーザーのパスワードを生成する
# slappasswd -s password -h {MD5}passwprd は任意の文字
{MD5}*********************    ←   ↓で使うので控えておく
 
↓ LDAPデータ参照用アカウントファイル作成   ←  マスターサーバーのみ
# vi admin.ldif
 
--------------------ここから--------------------
 
dn: cn=Admin,dc=lunq,dc=net
objectClass: person
cn: Admin
sn: Admin
userPassword: {MD5}*********************  ←   上記で生成したものを指定
 
--------------------ここまで--------------------
 
↓既存ユーザーとLDAPデータ参照用アカウントをLDAPサーバーへ登録
# ./ld-uadd.sh
 
adding new entry "uid=hogehoge,ou=People,dc=lunq,dc=net"
 
adding new entry "uid=honyarara,ou=People,dc=lunq,dc=net"
 
adding new entry "cn=hogehoge,ou=Group,dc=lunq,dc=net"
 
adding new entry "cn=honyarara,ou=Group,dc=lunq,dc=net"
 
adding new entry "cn=admin,dc=lunq,dc=net" 

↓ グループやユーザーの登録情報を確認するときは
# ldapsearch -x -b 'cn=honyarara,ou=Group,dc=lunq,dc=net'
# ldapsearch -x -b 'uid=honyarara,ou=People,dc=lunq,dc=net'

新規ユーザーの登録手順 (マスターサーバーで行う)

手動登録の手順
※ 一括登録したければ システム+LDAPユーザー一括登録用スクリプト作成 をご利用ください。 

↓ システムユーザーを登録する
# useradd -s /sbin/nologin honyarara
# passwd honyarara
Changing password for user honyarara.
New UNIX password:    ← ユーザーのパスワードを入力
Retype new UNIX password: ← ユーザーのパスワード確認
passwd: all authentication tokens updated successfully. 

↓ LDAP用グループ情報ファイル生成
# grep ^honyarara /etc/group > group
# ./migrate_group group > group.ldif 

↓ LDAP用パスワード情報ファイル生成
# grep ^honyarara /etc/passwd > passwd
# ./migrate_passwd passwd > passwd.ldif 

↓ LDAPサーバーにパスワード情報を登録
# ldapadd -h localhost -x -D "cn=Manager,dc=lunq,dc=net" -W -f passwd.ldif
Enter LDAP Password:  ← 管理用パスワード応答
adding new entry "uid=honyarara,ou=People,dc=lunq,dc=net" 

↓ LDAPサーバーにグループ情報を登録
# ldapadd -h localhost -x -D "cn=Manager,dc=lunq,dc=net" -W -f group.ldif
Enter LDAP Password:  ← 管理用パスワード応答
adding new entry "cn=honyarara,ou=Group,dc=lunq,dc=net" 

↓ グループ登録情報の確認
# ldapsearch -x -b 'cn=honyarara,ou=Group,dc=lunq,dc=net'
# extended LDIF
#
# LDAPv3
# base <cn=honyarara,ou=Group,dc=lunq,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# 

# honyarara, Group, lunq.net
dn: cn=honyarara,ou=Group,dc=lunq,dc=net
objectClass: posixGroup
objectClass: top
cn: honyarara
gidNumber: 5104 

# search result
search: 2
result: 0 Success 

# numResponses: 2
# numEntries: 1 

↓ ユーザー登録情報の確認
# ldapsearch -x -b 'uid=honyarara,ou=People,dc=lunq,dc=net'
# extended LDIF
#
# LDAPv3
# base <uid=honyarara,ou=People,dc=lunq,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# 

# honyarara, People, lunq.net
dn: uid=honyarara,ou=People,dc=lunq,dc=net
uid: honyarara
cn: honyarara
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
postalAddress: cn=honyarara,ou=Group,dc=lunq,dc=net
shadowLastChange: 13874
shadowMax: 99999
shadowWarning: 7
loginShell: /sbin/nologin
uidNumber: 5104
gidNumber: 5104
homeDirectory: /home/honyarara
givenName: honyarara
sn: honyarara
gecos: Lunq User
mail: honyarara@lunq.net 

# search result
search: 2
result: 0 Success 

# numResponses: 2
# numEntries: 1

LDAPサーバーに登録したユーザーとグループを削除する場合。 (マスターサーバーで行う)

手動削除の手順
※ 一括削除したければ システム+LDAPユーザー一括登録用スクリプト作成 をご利用ください。 

# ユーザー削除
# userdel honyarara 

# ユーザーディレクトリ削除
# rm -rf /home/honyarara 

# LDAPサーバー削除
# ldapdelete -h localhost -x -D 'cn=Manager,dc=lunq,dc=net' -W "cn=honyarara,ou=Group,dc=lunq,dc=net"
# ldapdelete -h localhost -x -D 'cn=Manager,dc=lunq,dc=net' -W "uid=honyarara,ou=People,dc=lunq,dc=net" 

# グループ登録情報確認
# ldapsearch -x -b 'cn=honyarara,ou=Group,dc=lunq,dc=net'
# extended LDIF
#
# LDAPv3
# base <cn=moekichi,ou=Group,dc=lunq,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# 

# search result
search: 2
result: 32 No such object ← 削除したユーザーが検索できない
matchedDN: ou=Group,dc=lunq,dc=net 

# numResponses: 1 

# ユーザー登録情報確認
# ldapsearch -x -b 'uid=honyarara,ou=People,dc=lunq,dc=net'
# extended LDIF
#
# LDAPv3
# base <uid=moekichi,ou=People,dc=lunq,dc=net> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
# 

# search result
search: 2
result: 32 No such object ← 削除したユーザーが検索できない
matchedDN: ou=People,dc=lunq,dc=net  

# numResponses: 1

Posted in OpenLDAP | Trackback | del.icio.us | Top Of Page

No comments yet

Leave a Reply