*OpenLDAP [#e2228580]
RIGHT:更新日&lastmod();
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}**********************==
# 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が参照