====== OpenLDAP Server ====== 認証を LDAP で行うために、 OpenLDAP をインストールする。 ===== インストール ===== apt-get でインストールする。 $ sudo apt-get install slapd ldap-utils * slapd : デーモン * ldap-utils : 管理ユーティリティ ===== 設定 ===== 設定では例として "dc=example,dc=com" を使用するが、環境によって変更すること。 認証に必要なスキーマを追加する。 $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif 以下を backend.example.com.ldif というファイル名で任意の場所に作成。 # Load dynamic backend modules dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulepath: /usr/lib/ldap olcModuleload: back_hdb # Database settings dn: olcDatabase=hdb,cn=config objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {1}hdb olcSuffix: dc=example,dc=com olcDbDirectory: /var/lib/ldap olcRootDN: cn=admin,dc=example,dc=com olcRootPW: secret olcDbConfig: set_cachesize 0 2097152 0 olcDbConfig: set_lk_max_objects 1500 olcDbConfig: set_lk_max_locks 1500 olcDbConfig: set_lk_max_lockers 1500 olcDbIndex: objectClass eq olcLastMod: TRUE olcDbCheckpoint: 512 30 olcAccess: to attrs=userPassword by dn="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none olcAccess: to attrs=shadowLastChange by self write by * read olcAccess: to dn.base="" by * read olcAccess: to * by dn="cn=admin,dc=example,dc=com" write by * read * "olcRootPW: secret" は任意のパスワードに変更する。 * "dc=example,dc=com" 部分は環境に合わせて変更する。 LDIFをディレクトリに追加する。 $ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f backend.example.com.ldif 以下を frontend.example.com.ldif というファイル名で任意の場所に作成。 # Create top-level object in domain dn: dc=example,dc=com objectClass: top objectClass: dcObject objectclass: organization o: Example Organization dc: Example description: LDAP Example # Admin user. dn: cn=admin,dc=example,dc=com objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: LDAP administrator userPassword: secret dn: ou=people,dc=example,dc=com objectClass: organizationalUnit ou: people dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups dn: uid=john,ou=people,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: john sn: Doe givenName: John cn: John Doe displayName: John Doe uidNumber: 1000 gidNumber: 10000 userPassword: password gecos: John Doe loginShell: /bin/bash homeDirectory: /home/john shadowExpire: -1 shadowFlag: 0 shadowWarning: 7 shadowMin: 8 shadowMax: 999999 shadowLastChange: 10877 mail: john.doe@example.com postalCode: 31000 l: Toulouse o: Example mobile: +33 (0)6 xx xx xx xx homePhone: +33 (0)5 xx xx xx xx title: System Administrator postalAddress: initials: JD dn: cn=example,ou=groups,dc=example,dc=com objectClass: posixGroup cn: example gidNumber: 10000 * "dc=example,dc=com" 部分は環境に合わせて変更する。 * "dc: Example" は "dc=example,dc=com" に依存する。"dc=home,dc=example,dc=com" であれば Home。 エントリを LDAP のディレクトリに追加する。 $ sudo ldapadd -x -D cn=admin,dc=example,dc=com -W -f frontend.example.com.ldif * "dc=example,dc=com" 部分は環境に合わせて変更する。 正常に登録されているかをチェック。 $ ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn dn: uid=john,ou=people,dc=example,dc=com cn: John Doe sn: Doe givenName: John * -x: SASL の認証メソッドを使用しない (デフォルト) * -LLL: LDIFスキーマ情報を表示しない ===== TLS SSL の設定 ===== 暗号回線を使用できるように追加の設定を行う。 必要なライブラリをインストール。 自分の環境ではインストールしなくても動作した。現在では不要なのか、他のパッケージで代替できたのかは不明。 $ sudo apt-get install gnutls-bin [[ubuntu-server-10-04:self-signed_certificate|自己署名サーバ証明書の作成]]で作成した、 * CAの証明書 * サーバの証明書 * サーバの秘密鍵 のパスを OpenLDAP に登録して暗号回線を使用できるようにする。 sudo ldapmodify -Y EXTERNAL -H ldapi:/// SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 設定項目を入力する。 dn: cn=config add: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem - add: olcTLSCertificateFile olcTLSCertificateFile: /etc/ssl/certs/server_cert.pem - add: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ssl/private/server_key.pem 証明書と鍵のファイル名は環境に合わせて変更 間違った設定をした場合は、 add: を replace: に変更すれば上書きできる 入力が終わったら Ctrl + D か、エンターを2回。 modifying entry "cn=config" 次に、 slapd の設定を変更して SSL を利用可能にする。 $ sudo vi /etc/default/slapd SLAPD_SERVICES に ldaps:/// を追加。 SLAPD_SERVICES="ldap:/// ldapi:/// ldaps:///" openldap ユーザを ssl-cert グループに追加して、証明書と鍵を読み込めるようにする。 $ sudo adduser openldap ssl-cert Adding user `openldap' to group `ssl-cert' ... Adding user openldap to group ssl-cert Done. /etc/ssl/private/ 内の鍵ファイルが ssl-cert グループから読み込み可能なパーミッションになっているか確認しておく slapd を再起動。 $ sudo /etc/init.d/slapd restart Stopping OpenLDAP: slapd. Starting OpenLDAP: slapd. で完了。 ===== LDAP 操作用ソフト ===== コマンドでユーザの追加や管理とかめんど過ぎるので、クライアントソフトを使う。 [[http://directory.apache.org/studio/index.html|Apache Directory Studio]] これが良い感じ。 ===== phpLDAPadmin をインストール ===== ユーザが自分のパスワードをブラウザで変更可能にするために、 phpLDAPadmin をインストールする。 apt-get でインストール。 $ sudo apt-get install phpldapadmin インストールが終わると、 /etc/apache2/conf.d/phpldapadmin が作成され、http:///phpldapadmin でとりあえずアクセスできるようになる。\\ ブラウザでアクセスされるファイルは、 /usr/share/phpldapadmin/ に格納されている。 "There was a problem with the request." と出て動かなかったが cookie を無効にしていただけだった・・・。 設定ファイルを変更する。今回の要件は以下。 * OpenLDAP と phpLDAPadmin は同じサーバ * dn: ou=people,dc=example,dc=com に属するユーザがログインする * ユーザは uid と パスワードを指定してログインする * ログインした後に ou=people,dc=example,dc=com 以下を閲覧できるが、変更は自身のパスワードのみ * ou=people,dc=example,dc=com に所属するユーザは inetOrgPerson クラスにパスワードを記述 * anonymous 認証はさせない $ sudo vi /etc/phpldapadmin/config.php 以下を変更。 * $config->custom->session['blowfish'] = ''; * クッキー暗号化用のランダム文字列を設定 * $servers->setValue('server','name','My LDAP Server'); * サーバの表示名なのでわかりやすいものに変更 * $servers->setValue('server','host','127.0.0.1'); * サーバのホスト名かIPを指定するが今回は変更なし * $servers->setValue('server','base',array('ou=people,dc=example,dc=com')); * ou=people,dc=example,dc=com 以下を閲覧するように設定 * #$servers->setValue('login','bind_id','cn=admin,dc=example,dc=com'); * dn ではなく uid 指定でログインするのでコメントアウト * $servers->setValue('login','attr','uid'); * uid でログインするように設定 * $servers->setValue('login','base',array('ou=people,dc=example,dc=com')); * ログインで使用するツリーを設定 * $servers->setValue('login','class',array('inetOrgPerson')); * 認証情報が格納されているクラスを指定 * 指定しなくても動いたけど一応 * $servers->setValue('login','anon_bind',false); * anonymous でのログインを無効 ==== アクセス権を変更 ==== phpLDAPadmin に uid でログイン可能にするには認証前にツリーを read できるようにしておかなければいけないらしい。ということで、特定IPからであれば認証前に read できるようにアクセス権を変更。 * cn=admin,dc=example,dc=com は全てに書き込み許可 * anonymous で認証はできる * IPアドレスが 127.0.0.1 の端末からは認証前に read 可能 * 認証後にユーザは ou=people,dc=example,dc=com 以下を閲覧可能 * ログイン後に自身のパスワードを変更可能 以下の内容でファイルを作成。 dn: olcDatabase={1}hdb,cn=config changetype: modify replace: olcAccess olcAccess: to attrs=userPassword by dn.exact="cn=admin,dc=example,dc=com" write by anonymous auth by self write by * none olcAccess: to attrs=shadowLastChange by self write olcAccess: to dn.subtree="ou=people,dc=example,dc=com" by dn.regex="uid=([^,]+),ou=people,dc=example,dc=com$" read by peername.ip=127.0.0.1 read olcAccess: to * by dn.exact="cn=admin,dc=example,dc=com" write by * none 作成したファイルを設定する。 $ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f change_access_control.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "olcDatabase={1}hdb,cn=config" で完了。 ===== Apache2 で LDAP 認証 ===== 構築した LDAP を使って Apache2 で認証してみる。 まず Apache2 で LDAP 関連のモジュールを有効にする。 $ sudo a2enmod ldap authnz_ldap Enabling module ldap. Considering dependency ldap for authnz_ldap: Module ldap already enabled Enabling module authnz_ldap. Run '/etc/init.d/apache2 restart' to activate new configuration! 逆に無効にするには\\ $ sudo a2dismod authnz_ldap ldap \\ authnz_ldap が ldap に依存しているため Apache2 の再起動を促されるので、再起動する。 $ sudo /etc/init.d/apache2 restart LDAP で認証したいディレクトリの Apache2 設定ファイルへ以下を追加。 SSLRequireSSL SSLOptions +StrictRequire AuthType Basic AuthBasicProvider ldap AuthName "RedTiger Server" AuthLDAPURL "ldap://127.0.0.1:389/ou=people,dc=redtiger,dc=selfip,dc=com?uid" AuthzLDAPAuthoritative off require valid-user # order deny,allow # deny from all # Satisfy Any * SSLRequireSSL * SSLでの接続を強制 * SSLOptions +StrictRequire * Satisfy Any よりも SSL 接続の優先度を高くし必ず SSL を使わせる * AuthType Basic * 認証タイプ * AuthBasicProvider ldap * 認証に LDAP を使用 * AuthName "RedTiger Server" * ダイアログに表示されるのでわかりやすい名前をつける * AuthLDAPURL "ldap://127.0.0.1:389/ou=people,dc=example,dc=com?uid" * LDAP 認証に使用する URI を指定 * AuthzLDAPAuthoritative off * LDAP 以外の認証を使用できなくする * require valid-user * 認証済みのユーザのみアクセス可能 * # order deny,allow * # deny from all * 個別に IP による制限等が必要な場合はここに記述 * 必要ない場合は必ず order 部分からコメントアウト(しないと SSLOptions +StrictRequire が無効になる) * Satisfy Any * require か order を満たせばアクセス可能 * 必要ない場合は必ずコメントアウト Apache2 を再起動する。 $ sudo /etc/init.d/apache2 restart で完了。 ブラウザでアクセスして動作を確認する。 ===== DB操作コマンド ===== ==== olcRootPW を変更 ==== この、 dn: olcDatabase={1}hdb,cn=config に設定されているパスワードは何に使うのかよくわからないけど、とりあえずハッシュ化した解読困難なものに変更しておく。 === パスワードをハッシュする === 本当は Salted SHA2 とか使いたいんだけど、 OpenLDAP では使えないようなので Salted SHA を使用する。 $ slappasswd -h {SSHA} パスワードを2回入力。 $ slappasswd -h {SSHA} New password: Re-enter new password: {SSHA}3l29mzESsaUCUtEMERjBqPrO+u5WXIfQ 最後の行の {SSHA}... をパスワードとして設定する。 === ハッシュしたパスワードを設定する === $ sudo ldapmodify -Y EXTERNAL -H ldapi:/// SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 コマンドを入力できる状態になるので以下を入力 dn: olcDatabase={1}hdb,cn=config changetype: modify replace: olcRootPW olcRootPW: {SSHA}3l29mzESsaUCUtEMERjBqPrO+u5WXIfQ 入力したら Ctrl + D で完了する。 modifying entry "olcDatabase={1}hdb,cn=config" 完了。 ==== アクセス権の閲覧 ==== フロントエンドのアクセス権を閲覧。 $ sudo ldapsearch -c -Y EXTERNAL -H ldapi:/// -LLL -b cn=config olcDatabase={1}hdb olcAccess バックエンド?のアクセス権を閲覧 $ sudo ldapsearch -c -Y EXTERNAL -H ldapi:/// -LLL -b cn=config olcDatabase=config olcAccess ===== 参考 ===== * [[https://help.ubuntu.com/10.04/serverguide/C/openldap-server.html]] * Setting up ACL の節がうまくいかない * Ubuntu 10.10 のマニュアルを参考にした * [[https://help.ubuntu.com/10.10/serverguide/C/openldap-server.html]] * [[http://gihyo.jp/admin/serial/01/ldap/0010|アクセス権の設定]]