LDAP 認証

提供: ArchWiki
2022年10月20日 (木) 12:04時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎SSSD によるオンライン・オフライン認証: 章立てを修正(英語版準拠))
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

イントロダクションとコンセプト

このガイドでは LDAP ディレクトリから Arch Linux を認証できるように設定します。LDAP ディレクトリはローカル (同一のコンピュータにインストール) でもネットワーク (中央認証が必要なラボ環境など) でもかまいません。

ガイドは2つのパートに分かれています。最初のパートでは認証ディレクトリをホストする OpenLDAP サーバーをセットアップします。次のパートではクライアントコンピュータで認証を行うのに必要な NSS と PAM モジュールを設定します。既存の LDAP サーバーが存在して Arch の認証を設定したいだけの場合、2番目のパートまでスキップしてください。

NSS と PAM

NSS (Name Service Switch の略) は設定データベースの様々なソースを設定するシステム機構です。例えば、/etc/passwdpasswd データベースの file タイプのソースです。

PAM (Pluggable Authentication Module の略) は様々なプラグインを使って認証スキームを拡張するために Linux (やその他の *nix) によって使われている機構です。

まとめると、NSS を設定して OpenLDAP サーバーを passwdshadow などの設定データベースのソースとして使うようにして、それから設定したソースを使ってユーザーを認証するように 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 という名前の一時ファイルを作成してください。

ノート: ドメイン名の "example" や "org" は適宜置き換えてください。
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
ノート: PADL Software の Migration Tools を使うことでローカルアカウント (とグループなど) を全て自動的に LDAP ディレクトリに移行できます。

クライアントのセットアップ

OpenLDAP に書かれているようにして OpenLDAP クライアントをインストールしてください。ldapsearch でサーバーにクエリが送信できることを確認してください。

次に、公式リポジトリから nss-pam-ldapdインストールします。

オンライン認証

NSS の設定

NSS は様々なソースを設定データベースとして管理するシステムファリシティです。例えば、/etc/passwdpasswd データベースの file タイプのソースであり、ユーザーアカウントが保存されます。

NSS のメインの設定ファイルである /etc/nsswitch.conf を編集してください。システムデータベースとしてどのソースを使うのか NSS を設定します。ldap ディレクティブを passwd, group, shadow データベースに追加してください。ファイルは以下のようになります:

passwd: files ldap
group: files ldap
shadow: files ldap

/etc/nslcd.conf を編集して baseuri 行をあなたの ldap サーバーの設定にあわせて変更してください。

systemd を使って nslcd.service を起動します。

これでクライアント側で getent passwd を実行すると LDAP ユーザーが確認できるはずです。

PAM の設定

PAM の設定は大まかに言って pam_unix.so が書かれているところ全てに pam_ldap.so も記述するだけです。Arch は pambase に移行しているため、編集が必要な箇所は減っています。pam の設定に関する詳細は RedHat のドキュメント によくまとまっています。nss-pam-ldapd の上流のドキュメントも読むと良いでしょう。

ヒント: システムのローカルユーザーの UID が衝突しないようにしたい場合、pam_ldap.so 行の末尾に minimum_uid=10000 などと記述します。LDAP サーバーによって返ってくる uidNumber を確認してください。
ノート: Each facility (auth, session, password, account) forms a separate chain and the order matters. Sufficient lines will sometimes "short circuit" and skip the rest of the section, so the rule of thumb for auth, password, and account is sufficient lines before required, but after required lines for the session section; optional can almost always go at the end. When adding your pam_ldap.so lines, do not change the relative order of the other lines without good reason! Simply insert LDAP within the chain.

まず /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_unixuse_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.sosession セクションの "sufficient" アイテムの上に追加してください。ssh, xdm, kdm, gdm などから tty にログインしたときにホームフォルダが作成されるようになります。同じように /etc/pam.d/su/etc/pam.d/su-l などのファイルも編集することで、susu --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 サーバーがオフラインだったり利用できない状態であってもキャッシュされた情報を使ってログインすることができるようになります。

参照