OpenLDAP

更新日2008-02-27 (水) 11:54:22

Vine4.xでOpenLDAPでlogin認証を行う。
Openldapをインストールするときは、認証関係を扱うので、不測の事態にそなえ、コンソールでrootでloginして作業するとよい

インストールおよびチェック

$ rpm -qa | grep openldap
openldap-2.3.27-0vl2.4
# apt-get install openldap-clients
# apt-get install openldap-servers

LDAPサーバー設定

ドメイン名の各ゾーン名部分を"dc=○○"という形式で記述

今回はism.comというゾーン名にする

Openldapのパスワードを作成

# /usr/sbin/slappasswd -s ****** -h {MD5}
{MD5}**********************==
# cd /etc/openldap

slapd.conf

#######################################################################
# ldbm and/or bdb database definitions
#######################################################################

database        bdb
##suffix                "dc=my-domain,dc=com"
suffix          "dc=ism,dc=com"              <==ゾーン名を変更
##rootdn                "cn=Manager,dc=my-domain,dc=com"
rootdn          "cn=Manager,dc=ism,dc=com"   <==ゾーン名を変更
# Cleartext passwords, especially for the rootdn, should
# be avoided.  See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
# rootpw                secret
# rootpw                {crypt}ijFYNcSNctBYg
rootpw                  {MD5}**********************==   <=先のパスワードを記述

以下を最終行へ追加

## Edit By JE2ISM

access to attrs=userPassword
        by self write
        by dn="cn=Manager,dc=ism,dc=com" write
        by anonymous auth
        by * none

access to *
        by dn="cn=Manager,dc=ism,dc=com" write
        by self write
        by * read

LDAPクライアント設定

ldap.conf

#BASE   dc=example, dc=com
BASE   dc=ism, dc=com

##BASE dc=example,dc=com
BASE   dc=ism, dc=com

NSS_LDAPクライアント設定

NSSについて
いったんユーザが認証されてからも、多くのアプリケーションはユーザ情報へのアクセスを必要とします。この情報は伝統的にはテキストファイル (/etc/passwd, /etc/shadow, /etc/group) に入れられていますが、他のネームサービスによって供給することもできます。

新しいネームサービス (たとえば LDAP) が導入されるにつれ、このような情報取得の実装は、 (NIS や DNS のように) C ライブラリ内、または その新しいネームサービスを使いたいアプリケーション内の、 どちらでも可能となってしまいました。

いずれにしても、こういったことは、共通の汎用的なネームサービス API を使って、各テクノロジに基づく動作でサービスから情報を得る ライブラリ群にそれを要求することにすれば避けられます。

GNU C Library は Name Service Switch を実装して上記を解決しました。これは Sun C library に起源を持ち、共通の API を通して種々のネームサービスから情報を得られるようにする方法です。

NSS は共通の API と設定ファイル (/etc/nsswitch.conf) を使用します。この設定ファイル内で、サポートするデータベース毎に、そのサービスを提供するライブラリを指定します。

現在 NSS によってサポートされている データベースは

  • aliases ― メールエイリアス。
  • ethers ― イーサネットの番号のデータ。
  • group ― ユーザのグループ。
  • hosts ― ホストの名前と番号のデータ。
  • negroup ― ネットワーク全体のホストとユーザの一覧。
  • network ― ネットワークに関する名前と番号のデータ。
  • protocols ― ネットワークのプロトコル。
  • passwd ― ユーザのパスワード。
  • rpc ― Remote Procedure Call に関する名前と番号のデータ。
  • services ― ネットワークサービス。
  • shadow ― ユーザのシャドウパスワード。

nss_ldap 共有ライブラリを使えば、LDAP を用いて上記の割り当てを実装することができます。ほんとうは上記すべての割り当てが実装できるのですけれども、ここでは shadow, passwd, group データベースの LDAP 実装にのみ焦点を合わせることにします。

/etc/ldap.conf

# The distinguished name of the search base.
##base dc=example,dc=com
base dc=ism,dc=com

LDAPサーバー起動

# /etc/rc.d/init.d/ldap start

既存ユーザ情報をLDAPサーバーへ移行

LDAPサーバー初期情報登録

ユーザ情報移行ツール設定ファイル編集

# cd /usr/share/openldap/migration/

migrate_common.ph

# Default base
##$DEFAULT_BASE = "dc=padl,dc=com";
$DEFAULT_BASE = "dc=ism,dc=com";

LDAPサーバー初期情報登録用ファイル新規作成

# cd
# emacs base.ldif

base.ldifファイル

dn: dc=ism,dc=com
objectClass: dcObject
objectclass: organization
o: ism Organization
dc: ism

dn: cn=manager, dc=ism,dc=com
objectclass: organizationalRole
cn:manager

dn: ou=People,dc=ism,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=ism,dc=com
objectClass: organizationalUnit
ou: Group

LDAPサーバー初期情報登録

# ldapadd -h localhost -x -D "cn=manager,dc=ism,dc=com" -W -f base.ldif
Enter LDAP Password:*****
adding new entry "dc=ism,dc=com"

adding new entry "cn=manager, dc=ism,dc=com"

adding new entry "ou=People,dc=ism,dc=com"

adding new entry "ou=Group,dc=ism,dc=com"

既存ユーザ情報をLDAPサーバーへ登録

ユーザパスワードの書き出し

grep ":5[0-9][0-9]" /etc/passwd > passwd.fil

passwd.fil

okada:x:500:501:Okada:/home/okada:/bin/bash

ユーザ情報LDAPサーバー登録用ファイル作成

# /usr/share/openldap/migration/migrate_passwd.pl passwd.fil
dn: uid=okada,ou=People,dc=ism,dc=com
uid: okada
cn: Okada
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt}$1$****************************  <=shadowファイルのパスワ ードが入る。
shadowLastChange: 13798
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 501
homeDirectory: /home/okada
gecos: Okada
# /usr/share/openldap/migration/migrate_passwd.pl passwd.fil >passwd.ldfi

一般ユーザ情報をLDAPサーバーへ登録

# ldapadd -h localhost -x -D "cn=manager,dc=ism,dc=com" -W -f passwd.ldif
Enter LDAP Password:
adding new entry "uid=okada,ou=People,dc=ism,dc=com"

既存グループ情報をLDAPサーバーへ登録

ユーザグループ情報抽出

grep ":5[0-9][0-9]" /etc/group > group.fil

group.fil

okada:x:501:

ユーザグループ情報LDAPサーバー登録用ファイル作成

# /usr/share/openldap/migration/migrate_group.pl group.fil
dn: cn=okada,ou=Group,dc=ism,dc=com
objectClass: posixGroup
objectClass: top
cn: okada
userPassword: {crypt}x
gidNumber: 501
# /usr/share/openldap/migration/migrate_group.pl group.fil > group.ldfi

般ユーザグループ情報をLDAPサーバーへ登録

# ldapadd -h localhost -x -D "cn=manager,dc=ism,dc=com" -W -f group.ldfi
Enter LDAP Password:
adding new entry "cn=okada,ou=Group,dc=ism,dc=com"

ユーザ認証方式にLDAP認証を追加

LDAP を使用とLDAP 認証を使用にチェックを入れる

# authconfig 
authconfig 4.6.1 - (c) 1999-2003 Red Hat, Inc., (c) 2002-2004 Project Vine.


 --------------------- 認証の設定 ----------------------
 |                                                     |
 |  ユーザー情報         認証                          |
 |  [ ] キャッシュ情報   [*] MD5 パスワードを使用      |
 |  [ ] Hesiod を使用    [*] シャドウパスワードを使用  |
 |  [*] LDAP を使用      [*] LDAP 認証を使用           |
 |  [ ] NIS を使用       [ ] Kerberos 5 を使用         |
 |  [ ] Winbind の使用   [ ] SMB 認証を使用            |
 |                       [ ] Winbind 認証を使用        |
 |                                                     |
 |         ------------                ------          |
 |         | 取り消し |                | 次 |          |
 |         ------------                ------          |
 |                                                     |
 |                                                     |
 -------------------------------------------------------

次の画面でOK

authconfig 4.6.1 - (c) 1999-2003 Red Hat, Inc., (c) 2002-2004 Project Vine.


 ---------------------- LDAP設定 -----------------------
 |                                                     |
 |            [ ] TLSを使用                            |
 |    サーバ: 127.0.0.1_______________________________ |
 | ベース DN: dc=ism,dc=com___________________________ |
 |                                                     |
 |          --------                  ------           |
 |          | 戻る |                  | OK |           |
 |          --------                  ------           |
 |                                                     |
 |                                                     |
 -------------------------------------------------------

これで、/etc/passwdまたはopenldapのどちらかに登録されたユーザはログインできるようになる。

authconfigでLDAPが指定しているとldapが起動しない。ldapを起動してからauthconfigでLDAPを指定する必要があるようだ。またldapが起動されていない状況ではpasswdファイルにあるユーザもリモートからloginできない。
また、boot時openldapが起動しないことにより起動時system message busで起動が停止する

対策

ldap起動時にauthconfigコマンドで、「LDAP を使用」と「LDAP 認証を使用」を一時停止し、ldapを起動して、起動後再び、「LDAP を使用」と「LDAP 認証を使用」をアクティブにする。また、合わせてldap終了時には、「LDAP を使用」と「LDAP 認証を使用」を停止する

/etc/rc.d/init/ldap

function stop() {
        # Stop daemons.
        ##Edit
        /usr/sbin/authconfig --kickstart --disableldap --disableldapauth <==追加

        prog=`basename ${slapd}`
        echo -n $"Stopping $prog: "

        (略)

        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap
        ##Edit
        /usr/sbin/authconfig --kickstart --enableldap --enableldapauth <==追加


        return $RETVAL
}

function stop() {
        # Stop daemons.
        ##Edit
        /usr/sbin/authconfig --kickstart --disableldap --disableldapauth <==追加

        prog=`basename ${slapd}`
        echo -n $"Stopping $prog: "

LDAPサーバー確認

LDAPサーバーでユーザ認証できることを確認するため、LDAPサーバー上のみに存在するユーザで、Linuxにログインできることを確認するために新しいユーザを登録し、それをopenldapに登録しuserdelコマンドで/etc/passwdファイルからそのユーザを削除し、loginできるか確認する

# /usr/sbin/adduser je2ism
# passwd je2ism
Changing password for user je2ism.
New password:******
Retype new password:*******
passwd: all authentication tokens updated successfully.
# grep je2ism /etc/passwd > passwd.fil
# /usr/share/openldap/migration/migrate_passwd.pl passwd.fil > passwd

.ldif

# ldapadd -h localhost -x -D "cn=manager,dc=ism,dc=com" -W -f passwd.ldif

Enter LDAP Password: adding new entry "uid=je2ism,ou=People,dc=ism,dc=com"

# grep je2ism /etc/group > group.fil
# /usr/share/openldap/migration/migrate_group.pl group.fil > group.ldif
# ldapadd -h localhost -x -D "cn=manager,dc=ism,dc=com" -W -f group.ldif
Enter LDAP Password:
adding new entry "cn=je2ism,ou=Group,dc=ism,dc=com"

/etc/passwdのje2ismを削除

# /usr/sbin/userdel je2ism

これで、je2ismでloginできたらOK

ldapユーザ・グループの削除

# ldapdelete -h localhost -x -D 'cn=manager,dc=ism,dc=com' - W "uid=je2ism,ou=people,dc=ism,dc=com"
Enter LDAP Password:
# ldapdelete -h localhost -x -D 'cn=manager,dc=ism,dc=com' -W "cn=je2ism,ou=group,dc=ism,dc=com"
Enter LDAP Password:

注)ldapに登録しpasswdファイルから削除した場合、新しいユーザを作成する場合、useraddコマンドではldapのuidは評価しなにので、重複する可能性があるので注意する。

ユーザの検索

uid=*もOK

# ldapsearch -x -b 'dc=ism,dc=com' uid=je2ism
# extended LDIF
#
# LDAPv3
# base <dc=ism,dc=com> with scope subtree
# filter: uid=je2ism
# requesting: ALL
#

# je2ism, People, ism.com
dn: uid=je2ism,ou=People,dc=ism,dc=com
uid: je2ism
cn: je2ism
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowLastChange: 13901
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 501
gidNumber: 502
homeDirectory: /home/je2ism

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

ldapクライアントの設定

Linux

以下のソフトを確認し、インストールされていなときはインストール

$ rpm -qa | grep ldap
openldap-2.3.27-0vl2.4
nss_ldap-251-0vl1
openldap-clients-2.3.27-0vl2.4

ユーザ認証方式にLDAP認証を追加

LDAP を使用とLDAP 認証を使用にチェックを入れる

# authconfig 
authconfig 4.6.1 - (c) 1999-2003 Red Hat, Inc., (c) 2002-2004 Project Vine.


 --------------------- 認証の設定 ----------------------
 |                                                     |
 |  ユーザー情報         認証                          |
 |  [ ] キャッシュ情報   [*] MD5 パスワードを使用      |
 |  [ ] Hesiod を使用    [*] シャドウパスワードを使用  |
 |  [*] LDAP を使用      [*] LDAP 認証を使用           |
 |  [ ] NIS を使用       [ ] Kerberos 5 を使用         |
 |  [ ] Winbind の使用   [ ] SMB 認証を使用            |
 |                       [ ] Winbind 認証を使用        |
 |                                                     |
 |         ------------                ------          |
 |         | 取り消し |                | 次 |          |
 |         ------------                ------          |
 |                                                     |
 |                                                     |
 -------------------------------------------------------

次の画面でOK

authconfig 4.6.1 - (c) 1999-2003 Red Hat, Inc., (c) 2002-2004 Project Vine.


 ---------------------- LDAP設定 -----------------------
 |                                                     |
 |            [ ] TLSを使用                            |
 |    サーバ: 192.168.0.1_____________________________ |
 | ベース DN: dc=ism,dc=com___________________________ |
 |                                                     |
 |          --------                  ------           |
 |          | 戻る |                  | OK |           |
 |          --------                  ------           |
 |                                                     |
 |                                                     |
 -------------------------------------------------------

これで/etc/openldap/ldap.conf

HOST 192.168.0.1
BASE dc=ism,dc=com

を確認

確認

以下のようにloginが確認できたらOK、homeディレクトリがないので以下のようなメッセージが出る

$ su je2ism
パスワード(P):
bash-2.05b$ cd
bash: cd: /home/je2ism: そのようなファイルやディレクトリはありません

SSL TLSで接続認証

以下の設定でldaps(636)で受け入れるようになりldapsearch -x -H ldaps://10.99.99.132/ -b 'dc=abc-u,dc=ac,dc=jp' 等のコマンドでユーザサーチはできるが、linux認証でauthconfigでTLSを設定した場合は問い合わせポートldapsではなくldapだがパケット自身は暗号化されているようだ。(Wiresharkなどで確認)

サーバ側の設定

/etc/openldapの

slapd.confを変更

TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt ←CA証明書
TLSCACertificateFile /usr/share/ssl/certs/ca-bundle.crt

TLSCertificateFile /etc/pki/tls/certs/slapd.pem ←サーバ証明書
TLSCertificateFile /etc/apache2/conf/ssl.crt/server.crt

TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem ←サーバ用の秘密鍵 
TLSCertificateKeyFile /etc/apache2/conf/ssl.key/server.key

ldap再起動

クライアントの設定

/etc/openldapの

ldap.conf

tls_reqcert     allow <==最終行に追加

これは自分で認証局を作成した相手(サーバ)に対して接続を行う設定

TLS_REQCERT <level>

TLS セッション開設時にサーバ認証をどうするかを指定します。引数の <level> には次のキーワードのいずれかを指定できます。

  • never クライアントはサーバ証明書を求めません。
  • allow サーバ証明書が要求されます。証明書が与えらていない場合でもセッションは普通に継続します。不適当な証明書が与えられた場合でもセッションは普通に継続します。
  • try サーバ証明書が要求されます。証明書が与えらていない場合でもセッションは普通に継続します。不適当な証明書が与えられた場合はセッションをすぐに切断します。
  • demand | hard これらのキーワードは同じ意味を持ちます。サーバ証明書が要求されます。証明書が与えらていない場合、あるいは不適当な証明書が与えられた場合はセッションをすぐに切断します。これはデフォルトの設定です。

TLSを使用にマーク

# authconfig

 ---------------------- LDAP設定 -----------------------
 |                                                     |
 |            [*] TLSを使用                            |
 |    サーバ: 192.168.0.1_____________________________ |

参考(ldap.conf)について

/etc/openldap/ldap.conf

ldapコマンド(ldapadd, ldapmodifyなど)が参照するファイル

/etc/ldap.conf

nss_ldapやpamが参照


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-02-27 (水) 11:54:22 (3770d)