*OpenLDAP [#e2228580]
RIGHT:更新日&lastmod(); 
OpenLDAPでlogin認証を行う

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

**インストールおよびチェック [#cc058073]

 $ rpm -qa | grep openldap
 openldap-2.3.27-0vl2.4

 # apt-get install openldap-clients
 # apt-get install openldap-servers

**LDAPサーバー設定 [#xfdddfee]
ドメイン名の各ゾーン名部分を"dc=○○"という形式で記述

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

''Openldapのパスワードを作成''
 # /usr/sbin/slappasswd -s ****** -h {MD5}
{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クライアント設定 [#sc4ba080]

ldap.conf

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

***NSS_LDAPクライアント設定 [#tcf91374]

''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サーバー起動 [#gc4e51d6]

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

**既存ユーザ情報をLDAPサーバーへ移行 [#o4b06d02]
***LDAPサーバー初期情報登録 [#xb5dba73]

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

 # 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サーバー初期情報登録 [#q119e073]

 # 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サーバーへ登録 [#qd0e46a3]
ユーザパスワードの書き出し
 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サーバーへ登録 [#g7662c19]

ユーザグループ情報抽出
 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認証を追加 [#ada789d8]
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のどちらかに登録されたユーザはログインできるようになる。

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

***対策 [#w50396e6]
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サーバー確認 [#j993d330]
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ユーザ・グループの削除 [#r11279d7]

 # 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:

----

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

***ユーザの検索 [#s39c7c74]

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クライアントの設定 [#kd1668ba]

**Linux [#p3f1ae98]

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

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

***ユーザ認証方式にLDAP認証を追加 [#ada789d8]
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
を確認

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

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

**SSL TLSで接続認証 [#h3174a91]

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

***サーバ側の設定 [#v14962a6]

/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再起動

***クライアントの設定 [#cbcedbef]

/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)について [#n10c3045]
''/etc/openldap/ldap.conf''

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

''/etc/ldap.conf''

nss_ldapやpamが参照


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS