391.1 PAMおよびNSSとLDAPの統合
主題391:OpenLDAPの認証バックエンドとしての利用
391.1 PAMおよびNSSとLDAPの統合
LinuC300の試験範囲である主題390~397まであるうちの「主題391:OpenLDAPの認証バックエンドとしての利用」から「391.1 PAMおよびNSSとLDAPの統合」についてのまとめ
重要度:2
説明:
PAMとNSSを設定して、情報をLDAPディレクトリから取り出せること。主要な知識範囲:
- PAMを設定して、認証にLDAPを使用する
- NSSを設定して、情報をLDAPから取り出す
- PAMモジュールをさまざまなUNIX環境で設定する重要なファイル、用語、ユーティリティ:
- PAM
- NSS
- /etc/pam.d/*
- /etc/nsswitch.conf
前置き
認証にLDAPを使おうとした場合、PAMやNSSの設定をすることになるが設定が複雑で難解であるがゆえに様々なツールや手段がある。
しかし、OSのバージョンによって使用しているツールが異なっているので注意が必要で、筆者の個人的な見解としてはLinuC300の前身にあたるLPIC300 ver1.0のリリースが2013年10月であることを考慮すれば、CentOS6.x前半+OpenLDAP2.4+nss-pam-ldap+authconfig という組み合わせが試験範囲になってくるのではないかと予想している。
~PAM/NSSを利用する際のツール~
authconfig:~RHEL7.4
RHEL7.4(=CentOS7.4)で非推奨となり、代替ツールはauthselectになる。
参考) 第53章 Red Hat Enterprise Linux 7 での非推奨の機能 Red Hat Enterprise Linux 7 | Red Hat Customer Portalauthselect:RHEL7.4~
特定のプロファイルを選択して、システム ID および認証ソースを設定できるようにするユーティリティーです。profile は、作成される PAM (Pluggable Authentication Modules) および Network Security Services (NSS) の設定を記述するファイルのセットです。nscd(Name Service Caching Daemon)
一般的なネームサービスに必要な多くのものを キャッシュとして提供するデーモンである。
SSSDにもキャッシュ機能が備わっているため、SSSDを利用する際はnscdは使用しない。nlscd(Naming services LDAP client daemon):~RHEL7.8
nss-pam-ldapdに含まれているデーモン。
RHEL7.8(=CentOS7.8)で非推奨となり、代替ツールはSSSDになる。
参考) 9.4. その他の非推奨の機能 Red Hat Enterprise Linux 7 | Red Hat Customer PortalSSSD(System Security Services Daemon):RHEL7.8~
リモートディレクトリーと認証メカニズムにアクセスできるようにするシステムサービスです。(LDAP、IdM、AD、Kerberos)
NSS (Name Service Switch) や PAM (Pluggable Authentication Modules) などの複数のシステムサービスのキャッシュを提供することもできます。
~PAM/NSSを利用する際のツールの組み合わせ~
CentOS7の場合
nss-pam-ldapd(nslcd)、nscd、authconfigRockyLinux9の場合
sssd、authselect
(参考文献)
PAMを設定して、認証にLDAPを使用する
(補足)
本記事「前置き」にあるとおり、試験対策という観点から以下操作例はCentOS7+OpenLDAP2.4+nss-pam-ldapについて紹介しています。
authconfigコマンドについては試験範囲に含まれてないので省略します。
~PAM(Pluggable Authenticaton Modules)とは~
Linuxでユーザー認証を行うためのフレームワーク。
アプリケーションをPAMに対応させることでアプリケーション側で認証の仕組みを作らなくても済む。
~設定~
PAMの設定ファイルは/etc/pam.dディレクトリにある。
その設定ファイルで呼び出すライブラリは/usr/lib64/securityデュレクトリにある。
LDAPで認証するためのpam_ldap.soが使われる。
(補足)
CentOS7のPAMの設定ファイル(/etc/pam.d/*)に「This file is auto-generated. User changes will be destroyed the next time authconfig is run.(このファイルは自動生成されたものです。 ユーザーによる変更は、次回 authconfig が実行されるときに破棄されます)」とあるので、PAMの設定ファイルを直接編集するのではなく、authconfig コマンドで変更するのが正解。
本記事は試験対策を目的としているので、仕組みを理解するためにauthconfigコマンドでは使っていません。
設定する前の状態で、LDAPに登録済みのuser00~user02が参照できてないことを確認する。
★ ローカルにはuser00~user02は存在しない ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# grep user /etc/passwd
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# getent passwd | grep user
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# id user00
id: user00: no such user
[root@centos7-ldap28 ~]#
★ LDAPにはuser00~user02が存在している ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# slapcat -n 2 | grep "dn: uid=user"
dn: uid=user00,ou=Users,dc=example,dc=co,dc=jp
dn: uid=user01,ou=Users,dc=example,dc=co,dc=jp
dn: uid=user02,ou=Users,dc=example,dc=co,dc=jp
[root@centos7-ldap28 ~]#
PAM認証に必要なパッケージをインストールする
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# yum install nss-pam-ldapd nscd
[root@centos7-ldap28 ~]#
設定に必要なファイルを確認
★ PAMの設定ファイル ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# ls -ld /etc/pam.d
drwxr-xr-x 2 root root 23 10月 7 11:33 /etc/pam.d
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# ls -l /etc/pam.d
total 20
-rw-r--r-- 1 root root 192 Oct 5 07:14 chfn
-rw-r--r-- 1 root root 192 Oct 5 07:14 chsh
-rw-r--r-- 1 root root 232 Oct 5 07:14 config-util
-rw-r--r-- 1 root root 289 Oct 5 07:14 crond
-rw-r--r-- 1 root root 701 Oct 5 07:14 fingerprint-auth
-rw-r--r-- 1 root root 798 Oct 5 07:14 login
-rw-r--r-- 1 root root 154 Oct 5 07:14 other
-rw-r--r-- 1 root root 188 Oct 5 07:14 passwd
-rw-r--r-- 1 root root 760 Oct 5 07:14 password-auth
-rw-r--r-- 1 root root 329 Oct 5 07:14 postlogin
-rw-r--r-- 1 root root 683 Oct 5 07:14 remote
-rw-r--r-- 1 root root 143 Oct 5 07:14 runuser
-rw-r--r-- 1 root root 138 Oct 5 07:14 runuser-l
-rw-r--r-- 1 root root 743 Oct 5 07:14 smartcard-auth
-rw-r--r-- 1 root root 540 Oct 5 07:14 su
-rw-r--r-- 1 root root 137 Oct 5 07:14 su-l
-rw-r--r-- 1 root root 200 Oct 5 07:14 sudo
-rw-r--r-- 1 root root 178 Oct 5 07:14 sudo-i
-rw-r--r-- 1 root root 760 Oct 5 07:14 system-auth <---★ このファイルを変数する
-rw-r--r-- 1 root root 129 Oct 5 07:14 systemd-user
[root@centos7-ldap28 ~]#
★ PAMで使われるモジュール ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# ls -ld /usr/lib64/security
drwxr-xr-x 3 root root 59 10月 5 23:30 /usr/lib64/security
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# ls /usr/lib64/security
pam_access.so pam_group.so pam_postgresok.so pam_timestamp.so
pam_cap.so pam_issue.so pam_pwhistory.so pam_tty_audit.so
pam_chroot.so pam_keyinit.so pam_pwquality.so pam_umask.so
pam_console.so pam_lastlog.so pam_rhosts.so pam_unix.so
pam_cracklib.so pam_ldap.so pam_rootok.so pam_unix_acct.so
pam_debug.so pam_limits.so pam_securetty.so pam_unix_auth.so
pam_deny.so pam_listfile.so pam_selinux.so pam_unix_passwd.so
pam_echo.so pam_localuser.so pam_selinux_permit.so pam_unix_session.so
pam_env.so pam_loginuid.so pam_sepermit.so pam_userdb.so
pam_exec.so pam_mail.so pam_shells.so pam_warn.so
pam_faildelay.so pam_mkhomedir.so pam_stress.so pam_wheel.so
pam_faillock.so pam_motd.so pam_succeed_if.so pam_xauth.so
pam_filter pam_namespace.so pam_systemd.so
pam_filter.so pam_nologin.so pam_tally2.so
pam_ftp.so pam_permit.so pam_time.so
[root@centos7-ldap28 ~]#
★ NSSの設定ファイル ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# ls -l /etc/nsswitch.conf
-rw-r--r-- 1 root root 1964 10月 7 11:21 /etc/nsswitch.conf <---★ このファイルを変数する
[root@centos7-ldap28 ~]#
★ nslcdの設定ファイル ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# ls -l /etc/nslcd.conf
-rw------- 1 root root 4850 10月 7 10:55 /etc/nslcd.conf
[root@centos7-ldap28 ~]#
/etc/pam.d/system-authにpam_ldap.soを追加する。
またホームディレクトリを自動生成させるためのpam_mkhomedir.soも追加する。
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth sufficient pam_ldap.so <---★ 追加
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass nullok
auth required pam_deny.so
account sufficient pam_ldap.so <---★ 追加
account required pam_unix.so
password sufficient pam_ldap.so <---★ 追加
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow
password required pam_deny.so
session optional pam_keyinit.so revoke
session required pam_limits.so
-session optional pam_systemd.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
session optional pam_ldap.so <---★ 追加
session required pam_mkhomedir.so <---★ 追加
[root@centos7-ldap28 ~]#
/etc/nslcd.confにLDAPサーバーの情報を環境に合わせて修正して、nscdとnslcdを起動する。
★ 設定ファイルを環境に合わせて修正 ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# vi /etc/nslcd.conf
:
# The uri pointing to the LDAP server to use for name lookups.
# Multiple entries may be specified. The address that is used
# here should be resolvable without using LDAP (obviously).
#uri ldap://127.0.0.1/
#uri ldaps://127.0.0.1/
#uri ldapi://%2fvar%2frun%2fldapi_sock/
# Note: %2f encodes the '/' used as directory separator
uri ldap://192.168.56.28/ <---★ 修正
:
# The distinguished name of the search base.
base dc=example,dc=co,dc=jp <---★ 修正
:
[root@centos7-ldap28 ~]#
★ nscd起動 ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# systemctl start nscd
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# systemctl status nscd
● nscd.service - Name Service Cache Daemon
Loaded: loaded (/usr/lib/systemd/system/nscd.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/system/nscd.service.d
mqzzz-lxc-service.conf
Active: active (running) since 金 2023-10-06 16:43:22 JST; 56min ago
Main PID: 848 (nscd)
CGroup: /system.slice/nscd.service
mq848 /usr/sbin/nscd
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring file `/etc/hosts` (4)
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring directory `/etc` (2)
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring file `/etc/resolv...)
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring directory `/etc` (2)
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring file `/etc/servic...)
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring directory `/etc` (2)
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 disabled inotify-based monit…ん
10月 06 16:43:22 centos7-ldap28 nscd[848]: 848 stat failed for file `/etc/n…ん
10月 06 16:43:22 centos7-ldap28 systemd[1]: Started Name Service Cache Daemon.
10月 06 16:43:41 centos7-ldap28 nscd[848]: 848 checking for monitored file …ん
Hint: Some lines were ellipsized, use -l to show in full.
[root@centos7-ldap28 ~]#
★ nslcd起動 ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# systemctl start nslcd
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# systemctl status nslcd
● nslcd.service - Naming services LDAP client daemon.
Loaded: loaded (/usr/lib/systemd/system/nslcd.service; disabled; vendor preset: disabled)
Drop-In: /run/systemd/system/nslcd.service.d
mqzzz-lxc-service.conf
Active: active (running) since 金 2023-10-06 17:08:55 JST; 31min ago
Docs: man:nslcd(8)
man:nslcd.conf(5)
Process: 1482 ExecStart=/usr/sbin/nslcd (code=exited, status=0/SUCCESS)
Main PID: 1483 (nslcd)
CGroup: /system.slice/nslcd.service
mq1483 /usr/sbin/nslcd
10月 06 17:15:33 centos7-ldap28 nslcd[1483]: [efd79f] <passwd(all)> (re)loa...f
10月 06 17:20:41 centos7-ldap28 nslcd[1483]: [e45d32] <authc="user01"> uid=...o
10月 06 17:20:41 centos7-ldap28 nslcd[1483]: [2dba31] <authc="user01"> uid=...o
10月 06 17:28:29 centos7-ldap28 nslcd[1483]: [8c895d] <authc=""> request de...n
10月 06 17:28:35 centos7-ldap28 nslcd[1483]: [3ab105] <authc=""> request de...n
10月 06 17:28:39 centos7-ldap28 nslcd[1483]: [1d5ae9] <authc=""> request de...n
10月 06 17:28:42 centos7-ldap28 nslcd[1483]: [63845e] <authc=""> request de...n
10月 06 17:28:44 centos7-ldap28 nslcd[1483]: [838cb2] <authc=""> request de...n
10月 06 17:28:47 centos7-ldap28 nslcd[1483]: [53d0cd] <authc=""> request de...n
10月 06 17:39:39 centos7-ldap28 nslcd[1483]: [f32454] <passwd="user00"> (re...f
Hint: Some lines were ellipsized, use -l to show in full.
[root@centos7-ldap28 ~]#
/etc/nsswitch.confでldapを参照するように設定する。
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# vi /etc/nsswitch.conf
:
passwd: files sss ldap <---★ ldapを追加
shadow: files sss ldap <---★ ldapを追加
group: files sss ldap <---★ ldapを追加
:
[root@centos7-ldap28 ~]#
getentコマンドでLDAPサーバーに登録しているuser00~user02が表示されるか確認する。
★ getentコマンドで確認 ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# getent passwd | grep user
user00:x:1000:1000:user00:/home/user00:/bin/bash
user01:x:1001:1001:user01:/home/user01:/bin/bash
user02:x:1002:1002:user02:/home/user02:/bin/bash
[root@centos7-ldap28 ~]#
★ idコマンドで確認 ★
[rootcentos7-ldap28 ~]#
[root@centos7-ldap28 ~]# id user00
uid=1000(user00) gid=1000(user00) groups=1000(user00)
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# id user01
uid=1001(user01) gid=1001(user01) groups=1001(user01)
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# id user02
uid=1002(user02) gid=1002(user02) groups=1002(user02)
[root@centos7-ldap28 ~]#
suコマンドでLDAPサーバーに登録しているuser00にログインしてみる。
ホームディレクトリが存在しなければ自動生成されuser00でログインできることが確認できる。 また、LDAPサーバーに登録されている情報が反映されていることも確認できる。
★ LDAPサーバーに登録しているuser00でログインする ★
[root@centos7-ldap28 ~]#
[root@centos7-ldap28 ~]# su - user00
ディレクトリ '/home/user00' を作成中
最終ログイン: 2023/10/07 (土) 11:28:26 JST日時 pts/1
[user00@centos7-ldap28 ~]$
[user00@centos7-ldap28 ~]$ id
uid=1000(user00) gid=1000(user00) groups=1000(user00)
[user00@centos7-ldap28 ~]$
[user00@centos7-ldap28 ~]$ echo $HOME
/home/user00
[user00@centos7-ldap28 ~]$
[user00@centos7-ldap28 ~]$ echo $SHELL
/bin/bash
[user00@centos7-ldap28 ~]$
★ LDAPに登録されている情報が反映されていることがわかる ★
[user00@centos7-ldap28 ~]$
[user00@centos7-ldap28 ~]$ ldapsearch -LLL -x -W -D "cn=Manager,dc=example,dc=co,dc=jp" -b "dc=example,dc=co,dc=jp" cn=user00
Enter LDAP Password:
dn: uid=user00,ou=Users,dc=example,dc=co,dc=jp
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: user00
sn: example
loginShell: /bin/bash <---★ $SHELL
uidNumber: 1000 <---★ uid
gidNumber: 1000 <---★ gid
homeDirectory: /home/user00 <---★ $HOME
shadowMax: 0
shadowWarning: 0
uid: user00
userPassword:: e1NTSEF9emtidTV3NHZuVU5VZTg5SmNDQnZWUWtxeHdZV0ZGY0U=
shadowLastChange: 19637
dn: cn=user00,ou=Groups,dc=example,dc=co,dc=jp
objectClass: posixGroup
cn: user00
gidNumber: 1000 <---★ gid
memberUid: user00
[user00@centos7-ldap28 ~]$
NSSを設定して、情報をLDAPから取り出す
~NSS(Name Service Switch)とは~
名前解決の仕組みをコントロールする仕組み
どの名前解決の仕組みを使うかは/etc/nsswitch.confで名前解決サービス名にldapを追加する。
書式:
データベース: 名前解決サービス名
[root@rocky9-openssl ~]#
[root@rocky9-openssl ~]# cat /etc/nsswitch.conf
:
:
# In order of likelihood of use to accelerate lookup.
passwd: sss files systemd
shadow: files
group: sss files systemd
hosts: files dns myhostname
services: files sss
netgroup: sss
automount: files sss
aliases: files
ethers: files
gshadow: files
# Allow initgroups to default to the setting for group.
# initgroups: files
networks: files dns
protocols: files
publickey: files
rpc: files
[root@rocky9-openssl ~]#
~データベースの種類~
aliases
メールエイリアスether
MACアドレスとホスト名の対応group
ユーザーが所属するグループhosts
ホスト名とIPアドレスの対応initgroups
netgroup
ホスト名とユーザー名とドメイン名の対応表networks
ネットワーク名とネットワークアドレスの対応表passwd
ユーザーデータベースprotocols
ネットワークプロトコルpublickey
Secure_RPCの公開鍵と秘密鍵。rpc
RPC(remote procedure call)の名前と番号services
TCP/UDPのポート番号とサービス名の対応表shadow
ユーザーのシャドウパスワード
~名前解決サービス~
dns
/etc/resolv.confに記述されたDNSサーバーを参照する。files
自分自身の/etcディレクトリ以下にあるデータベース名のファイルを参照する。
/etc/hostsや/etc/passwdなどldap
LDAPサーバーを参照する。myhostname
自分自身のホスト名をIPアドレスに変換する。resolve
systemd-resolvedで名前解決をする。systemd
sss
System Security Services Daemon (sssd)で名前解決をする。winbind
WINBINDで名前解決をする。wins
WINSサーバーを参照する。
(参考文献)
PAMモジュールをさまざまなUNIX環境で設定する
LinuxのディストリビューションによってPAMの設定ファイルの場所、PAMのモジュールの場所、PAMの設定方法が異なる。
~PAMの設定ファイル~
CentOS7, RockyLinux9の場合:
PAMの設定ファイルは/etc/pam.confもしくは/etc/pam.dディレクトリにあるファイルになる。
設定する際は、/etc/pam.dディレクトリの設定ファイルを直接編集するのではなく、authconfigマンドでもしくはauthselectコマンドで設定することが推奨されている。
なお、PAMの設定ファイルを直接編集してもauthconfigマンドでもしくはauthselectコマンドに上書きされてしまうので注意。Ubuntu22.04の場合:
/etc/pam.dディレクトリの設定ファイルを直接編集する。
~PAMで使われるモジュール~
CentOS7, RockyLinux9の場合:
/lib64/securityディレクトリ
(実体は/usr/lib64/securityディレクトリ)Ubuntu22.04の場合:
/lib/x86_64-linux-gnu/securityディレクトリ
(実体は/usr/lib/x86_64-linux-gnu/securityディレクトリ)
参考文献
LDAPー設定・管理・プログラミングー(OpenLDAP2.1)
この記事が気に入ったらサポートをしてみませんか?