見出し画像

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 Portal

  • authselect: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 Portal

  • SSSD(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、authconfig

  • RockyLinux9の場合
    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 107 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 105 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 107 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 107 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

1006 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring file `/etc/hosts` (4)
1006 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring directory `/etc` (2)
1006 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring file `/etc/resolv...)
1006 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring directory `/etc` (2)
1006 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring file `/etc/servic...)
1006 16:43:22 centos7-ldap28 nscd[848]: 848 monitoring directory `/etc` (2)
1006 16:43:22 centos7-ldap28 nscd[848]: 848 disabled inotify-based monit…ん
1006 16:43:22 centos7-ldap28 nscd[848]: 848 stat failed for file `/etc/n…ん
1006 16:43:22 centos7-ldap28 systemd[1]: Started Name Service Cache Daemon.
1006 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

1006 17:15:33 centos7-ldap28 nslcd[1483]: [efd79f] <passwd(all)> (re)loa...f
1006 17:20:41 centos7-ldap28 nslcd[1483]: [e45d32] <authc="user01"> uid=...o
1006 17:20:41 centos7-ldap28 nslcd[1483]: [2dba31] <authc="user01"> uid=...o
1006 17:28:29 centos7-ldap28 nslcd[1483]: [8c895d] <authc=""> request de...n
1006 17:28:35 centos7-ldap28 nslcd[1483]: [3ab105] <authc=""> request de...n
1006 17:28:39 centos7-ldap28 nslcd[1483]: [1d5ae9] <authc=""> request de...n
1006 17:28:42 centos7-ldap28 nslcd[1483]: [63845e] <authc=""> request de...n
1006 17:28:44 centos7-ldap28 nslcd[1483]: [838cb2] <authc=""> request de...n
1006 17:28:47 centos7-ldap28 nslcd[1483]: [53d0cd] <authc=""> request de...n
1006 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ディレクトリ)


参考文献


この記事が気に入ったらサポートをしてみませんか?