LDAP 認証
関連記事
イントロダクションとコンセプト
このガイドでは LDAP ディレクトリから Arch Linux を認証できるように設定します。LDAP ディレクトリはローカル (同一のコンピュータにインストール) でもネットワーク (中央認証が必要なラボ環境など) でもかまいません。
ガイドは2つのパートに分かれています。最初のパートでは認証ディレクトリをホストする OpenLDAP サーバーをセットアップします。次のパートではクライアントコンピュータで認証を行うのに必要な NSS と PAM モジュールを設定します。既存の LDAP サーバーが存在して Arch の認証を設定したいだけの場合、2番目のパートまでスキップしてください。
NSS と PAM
NSS (Name Service Switch の略) は設定データベースの様々なソースを設定するシステム機構です。例えば、/etc/passwd
は passwd
データベースの file
タイプのソースです。
PAM (Pluggable Authentication Module の略) は様々なプラグインを使って認証スキームを拡張するために Linux (やその他の *nix) によって使われている機構です。
まとめると、NSS を設定して OpenLDAP サーバーを passwd
や shadow
などの設定データベースのソースとして使うようにして、それから設定したソースを使ってユーザーを認証するように PAM を設定することになります。
LDAP サーバーのセットアップ
インストール
インストールや基本的な設定については OpenLDAP の記事に書かれています。インストールが完了したら、このページに戻ってきて下さい。
アクセス制御の設定
LDAP サーバーから (暗号化された) パスワードに誰もアクセスできないように、そしてユーザーだけが自分のパスワードを編集できるようにするため、以下を /etc/openldap/slapd.conf
に追加して slapd.service
を再起動してください:
slapd.conf
access to attrs=userPassword by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none access to * by self write by dn.base="cn=Manager,dc=example,dc=org" write by * read
上記の行だけで OpenLDAP サーバーをテストすることはできますが、ACL の書き込み権限が与えられるため、uidNumber や gidNumber などのシステム属性の値をユーザーが変更できてしまいます。書き込み権限を userPassword と個人情報に関連する属性だけに留めるほうが良いでしょう。上よりもセキュアな設定は以下のようになります:
slapd.conf
access to attrs=userPassword,givenName,sn,photo by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none access to * by self read by dn.base="cn=Manager,dc=example,dc=org" write by * read
ベースデータで LDAP ツリーを作成
以下の内容で base.ldif
という名前の一時ファイルを作成してください。
base.ldif
# example.org dn: dc=example,dc=org dc: example o: Example Organization objectClass: dcObject objectClass: organization # Manager, example.org dn: cn=Manager,dc=example,dc=org cn: Manager description: LDAP administrator objectClass: organizationalRole objectClass: top roleOccupant: dc=example,dc=org # People, example.org dn: ou=People,dc=example,dc=org ou: People objectClass: top objectClass: organizationalUnit # Groups, example.org dn: ou=Group,dc=example,dc=org ou: Group objectClass: top objectClass: organizationalUnit
OpenLDAP ツリーに追加:
$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f base.ldif
データがインポートされたことをテスト:
$ ldapsearch -x -b 'dc=example,dc=org' '(objectclass=*)'
ユーザーの追加
ユーザーを手動で追加するには、以下のような .ldif
ファイルを作成:
user_joe.ldif
dn: uid=johndoe,ou=People,dc=example,dc=org objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: johndoe cn: John Doe sn: Doe givenName: John title: Guinea Pig telephoneNumber: +0 000 000 0000 mobile: +0 000 000 0000 postalAddress: AddressLine1$AddressLine2$AddressLine3 userPassword: {CRYPT}xxxxxxxxxx labeledURI: https://archlinux.org/ loginShell: /bin/bash uidNumber: 9999 gidNumber: 9999 homeDirectory: /home/johndoe/ description: This is an example user
userPassword
エントリの xxxxxxxxxx
は /etc/shadow
内の値で置き換えるか slappasswd
コマンドを使って下さい。そしてユーザーを追加:
$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f user_joe.ldif
クライアントのセットアップ
OpenLDAP に書かれているようにして OpenLDAP クライアントをインストールしてください。ldapsearch
でサーバーにクエリが送信できることを確認してください。
次に、公式リポジトリから nss-pam-ldapd をインストールします。
オンライン認証
NSS の設定
NSS は様々なソースを設定データベースとして管理するシステムファリシティです。例えば、/etc/passwd
は passwd
データベースの file
タイプのソースであり、ユーザーアカウントが保存されます。
NSS のメインの設定ファイルである /etc/nsswitch.conf
を編集してください。システムデータベースとしてどのソースを使うのか NSS を設定します。ldap
ディレクティブを passwd
, group
, shadow
データベースに追加してください。ファイルは以下のようになります:
passwd: files ldap group: files ldap shadow: files ldap
/etc/nslcd.conf
を編集して base
と uri
行をあなたの ldap サーバーの設定にあわせて変更してください。
systemd を使って nslcd.service
を起動します。
これでクライアント側で getent passwd
を実行すると LDAP ユーザーが確認できるはずです。
PAM の設定
PAM の設定は大まかに言って pam_unix.so
が書かれているところ全てに pam_ldap.so
も記述するだけです。Arch は pambase に移行しているため、編集が必要な箇所は減っています。pam の設定に関する詳細は RedHat のドキュメント によくまとまっています。nss-pam-ldapd の上流のドキュメントも読むと良いでしょう。
まず /etc/pam.d/system-auth
を編集してください。このファイルは pam.d
内の他のファイルからも大抵インクルードされているので、/etc/pam.d/system-auth
に変更を加えることで、ほとんどのファイルに変更を適用できます。pambase をアップデートすると /etc/pam.d/system-auth
は変化することがあります。
各セクションの一番上に sufficient の pam_ldap.so
を追加してください。ただし session セクションだけは例外で、optional にしておきます。
/etc/pam.d/system-auth
auth sufficient pam_ldap.so auth required pam_unix.so try_first_pass nullok auth optional pam_permit.so auth required pam_env.so account sufficient pam_ldap.so account required pam_unix.so account optional pam_permit.so account required pam_time.so password sufficient pam_ldap.so password required pam_unix.so try_first_pass nullok sha512 shadow password optional pam_permit.so session required pam_limits.so session required pam_unix.so session optional pam_ldap.so session optional pam_permit.so
次に /etc/pam.d/su
と /etc/pam.d/su-l
を同じように編集してください。su-l
ファイルはユーザーが su --login
を実行したときに使われます。
各セクションの一番上に sufficient の pam_ldap.so
を追加して、auth セクションの pam_unix
に use_first_pass
を追加してください。
/etc/pam.d/su
#%PAM-1.0 auth sufficient pam_ldap.so auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid auth required pam_unix.so use_first_pass account sufficient pam_ldap.so account required pam_unix.so session sufficient pam_ldap.so session required pam_unix.so
ユーザーが自分のパスワードを編集できるように、/etc/pam.d/passwd
を編集:
/etc/pam.d/passwd
#%PAM-1.0 password sufficient pam_ldap.so #password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 #password required pam_unix.so sha512 shadow use_authtok password required pam_unix.so sha512 shadow nullok
ログイン時にホームフォルダを作成
ログイン時にホームフォルダを作成したい場合 (例: ホームフォルダを共有するのに NFS を使わない場合)、/etc/pam.d/system-login
を編集して pam_mkhomedir.so
を session セクションの "sufficient" アイテムの上に追加してください。ssh, xdm, kdm, gdm などから tty にログインしたときにホームフォルダが作成されるようになります。同じように /etc/pam.d/su
や /etc/pam.d/su-l
などのファイルも編集することで、su
や su --login
でもホームフォルダの作成を有効にできます。ssh ログインの場合はホームフォルダを作成して欲しくないときは system-login
などのかわりに system-local-login
を編集してください。
/etc/pam.d/system-login
...top of file not shown... session optional pam_loginuid.so session include system-auth session optional pam_motd.so motd=/etc/motd session optional pam_mail.so dir=/var/spool/mail standard quiet -session optional pam_systemd.so session required pam_env.so session required pam_mkhomedir.so skel=/etc/skel umask=0022
/etc/pam.d/su-l
...top of file not shown... session required pam_mkhomedir.so skel=/etc/skel umask=0022 session sufficient pam_ldap.so session required pam_unix.so
sudo の有効化
LDAP ユーザーから sudo を使うようにするには、/etc/pam.d/sudo
を編集します。sudoers もあわせて編集する必要があります。
/etc/pam.d/sudo
#%PAM-1.0 auth sufficient pam_ldap.so auth required pam_unix.so try_first_pass auth required pam_nologin.so
また、/etc/openldap/ldap.conf
に以下を追加してください:
/etc/openldap/ldap.conf
sudoers_base ou=sudoers,dc=AFOLA
SSSD によるオンライン・オフライン認証
SSSD はシステムデーモンです。主な機能は共通フレームワークを通してリモートのリソースを識別・認証できるようにすることで、システムのキャッシュやオフラインのサポートを提供します。PAM や NSS モジュールも含まれており、将来的には D-BUS ベースのインタフェースによって拡張ユーザー情報も含める予定です。拡張ユーザーデータだけでなくローカルユーザーを保存するデータベースとしても使えます。
sssd パッケージは公式リポジトリからインストールできます。
SSSD の設定
/etc/sssd/sssd.conf
が存在しない場合は作成してください:
/etc/sssd/sssd.conf
[sssd] config_file_version = 2 services = nss, pam domains = LDAP [domain/LDAP] cache_credentials = true id_provider = ldap auth_provider = ldap ldap_uri = ldap://server1.example.org, ldap://server2.example.org ldap_search_base = dc=example,dc=org ldap_id_use_start_tls = true ldap_tls_reqcert = demand ldap_tls_cacert = /etc/openldap/certs/cacerts.pem chpass_provider = ldap ldap_chpass_uri = ldap://server1.example.org entry_cache_timeout = 600 ldap_network_timeout = 2 ldap_group_member = uniquemember
上記はあくまで例です。詳しくは man sssd.conf
を見てください。
最後に chmod 600 /etc/sssd/sssd.conf
でパーミッションを設定してください。そうしないと sssd は起動しません。
NSCD の設定
sssd のキャッシュに干渉するので /etc/nscd.conf
で passwd と group エントリのキャッシュを無効化します。
NSS の設定
以下のように /etc/nsswitch.conf
を編集してください:
/etc/nsswitch.conf
# Begin /etc/nsswitch.conf passwd: files sss group: files sss shadow: files sss sudoers: files sss publickey: files hosts: files dns myhostname networks: files protocols: files services: files ethers: files rpc: files netgroup: files # End /etc/nsswitch.conf
PAM の設定
まず /etc/pam.d/system-auth
を以下のように編集:
/etc/pam.d/system-auth
#%PAM-1.0 auth sufficient pam_sss.so forward_pass auth required pam_unix.so try_first_pass nullok auth optional pam_permit.so auth required pam_env.so account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so account required pam_unix.so account optional pam_permit.so account required pam_time.so password sufficient pam_sss.so use_authtok password required pam_unix.so try_first_pass nullok sha512 shadow password optional pam_permit.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0077 session required pam_limits.so session required pam_unix.so session optional pam_sss.so session optional pam_permit.so
sudo の設定
/etc/pam.d/sudo
を以下のように編集:
/etc/pam.d/sudo
#%PAM-1.0 auth sufficient pam_sss.so auth required pam_unix.so try_first_pass auth required pam_nologin.so
パスワード管理
ユーザーが passwd
を使って自分のパスワードを変えられるように /etc/pam.d/passwd
を以下のように編集:
/etc/pam.d/passwd
#%PAM-1.0 password sufficient pam_sss.so #password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3 #password required pam_unix.so sha512 shadow use_authtok password required pam_unix.so sha512 shadow nullok
systemctl start sssd
で sssd を起動して systemctl enable sssd
で有効化してください。
これで getent passwd <username>
や id <username>
で ldap ユーザーの詳細情報が確認できるはずです。
ユーザーを使ってログインすると、ログイン情報がキャッシュされ、ldap サーバーがオフラインだったり利用できない状態であってもキャッシュされた情報を使ってログインすることができるようになります。