ユーザーの管理と認証（NSS, PAM, SSSD）

# NSS(Name Service Switch)とは？

- ユーザーやホストなどの各種情報の検索先と検索順序を指定する為に使用
- /etc/nsswitch.confファイルに対象カテゴリのデータベースと検索先を優先順に記載

```conf:/etc/nsswitch.conf

# /etc/nsswitch.conf

# To use db, put the "db" in front of "files" for entries you want to be
# looked up first in the databases
#
# Example:
#passwd:    db files nisplus nis
#shadow:    db files nisplus nis
#group:     db files nisplus nis

passwd:     files sss
shadow:     files sss
group:      files sss
#initgroups: files sss

#hosts:     db files nisplus nis dns
hosts:      files dns myhostname

ethers:     files
netmasks:   files
networks:   files
protocols:  files
rpc:        files
services:   files sss

netgroup:   nisplus sss

publickey:  nisplus

automount:  files nisplus sss
aliases:    files nisplus
# 関連するファイルの一つを確認
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        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
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
```

# SSSD(System Security Service Daemon)の設定と使用

- SSSDの導入により、OpenLDAP, Active Directory, FreeIPAなどの認証システムへのアクセスが可能になる
- 認証情報をキャッシュし、オフラインでの利用が可能になる

## SSSDを使用する為にはNSSとPAMの設定が必要

```bash
# authconfigコマンドを実行し、/etc/nsswitch.confにsssモジュールの記述を追加する
authconfig --enablesssd --enablesssdauth --update
# 実行前から既に追加されていた模様ですが、再度確認。
cat /etc/nsswitch.conf
passwd:     files sss
shadow:     files sss
group:      files sss
#initgroups: files sss
(略)
ethers:     files
netmasks:   files
networks:   files
protocols:  files
rpc:        files
services:   files sss

netgroup:   nisplus sss

publickey:  nisplus

automount:  files nisplus sss
aliases:    files nisplus

# /etc/pam.d/system-authと/etc/pam.d/password-authファイルを確認
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        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        [default=1 ignore=ignore success=ok] pam_succeed_if.so uid >= 1000 quiet
auth        [default=1 ignore=ignore success=ok] pam_localuser.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
# pam_sss.soモジュール確認OK
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
# pam_sss.soモジュール確認OK
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
# pam_sss.soモジュール確認OK
password    sufficient    pam_sss.so use_authtok
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
# pam_sss.soモジュール確認OK
session     optional      pam_sss.so

cat /etc/pam.d/password-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        [default=1 ignore=ignore success=ok] pam_succeed_if.so uid >= 1000 quiet
auth        [default=1 ignore=ignore success=ok] pam_localuser.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
# pam_sss.soモジュール確認OK
auth        sufficient    pam_sss.so forward_pass
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
# pam_sss.soモジュール確認OK
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
# pam_sss.soモジュール確認OK
password    sufficient    pam_sss.so use_authtok


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
# pam_sss.soモジュール確認OK
session     optional      pam_sss.so

```
これで　systemctl start sssd を試すとエラー　(/etc/sssd/sssd.conf がない)
/etc/sssd/conf.d は作成されていたがディレクトリ配下にはファイルなし

参考書通りに /etc/sssd/sssd.conf を作成する

```conf:/etc/sssd/sssd.conf

[sssd]
config_file_version = 2
service = nss, pam
domain = LOCAL

[nss]
filter_groups = root
filter_users = root
entry_cache_timeout = 300

[pam]
offline_credentials_expiration = 2
offline_failed_login_attempts = 3
offline_failed_login_delay = 5

[domain/LOCAL]
id_provider = local
auth_provider = local
access_provider = permit

```

が今度は /etc/sssd/sssd.conf が権限がないので読めないとかいうエラーメッセージが出力された。

- 上位ディレクトリに実行権限はある
   - 所有者はsssdユーザー
- その他のユーザーにファイルの読み取り権限あり
   - 所有者はrootユーザー

sssd.conf の権限を変更し、所有者、グループをsssdユーザーに変更 ⇒ エラーメッセージ出力(内容は変わらず) ← イマココ

ググってみると ssd.conf のユーザーは rootユーザーのままで良いみたいなので戻す
（パーミッションは600だという事なのでこれも変更）

```bash
chown root:root /etc/sssd/sssd.conf

chmod 600 /etc/sssd/sssd.conf

```

sssdを起動するとやはりエラー　だがメッセージ内容が「SSSD couldn't～」に変わり、これを調べると sssd.conf の記述が間違っている可能性がある。
一度 sssd.conf の内容を変更する（usr/share/ に雛形があるらしい）

```conf:/usr/share/doc/sssd-common-1.16.4/sssd-example.conf
cat /usr/share/doc/sssd-common-1.16.4/sssd-example.conf
[sssd]
config_file_version = 2
services = nss, pam
# SSSD will not start if you do not configure any domains.
# Add new domain configurations as [domain/<NAME>] sections, and
# then add the list of domains (in the order you want them to be
# queried) to the "domains" attribute below and uncomment it.
; domains = LDAP

[nss]

[pam]

# Example LDAP domain
; [domain/LDAP]
; id_provider = ldap
; auth_provider = ldap
# ldap_schema can be set to "rfc2307", which stores group member names in the
# "memberuid" attribute, or to "rfc2307bis", which stores group member DNs in
# the "member" attribute. If you do not know this value, ask your LDAP
# administrator.
; ldap_schema = rfc2307
; ldap_uri = ldap://ldap.mydomain.org
; ldap_search_base = dc=mydomain,dc=org
# Note that enabling enumeration will have a moderate performance impact.
# Consequently, the default value for enumeration is FALSE.
# Refer to the sssd.conf man page for full details.
; enumerate = false
# Allow offline logins by locally storing password hashes (default: false).
; cache_credentials = true

# An example Active Directory domain. Please note that this configuration
# works for AD 2003R2 and AD 2008, because they use pretty much RFC2307bis
# compliant attribute names. To support UNIX clients with AD 2003 or older,
# you must install Microsoft Services For UNIX and map LDAP attributes onto
# msSFU30* attribute names.
; [domain/AD]
; id_provider = ldap
; auth_provider = krb5
; chpass_provider = krb5
;
; ldap_uri = ldap://your.ad.example.com
; ldap_search_base = dc=example,dc=com
; ldap_schema = rfc2307bis
; ldap_sasl_mech = GSSAPI
; ldap_user_object_class = user
; ldap_group_object_class = group
; ldap_user_home_directory = unixHomeDirectory
; ldap_user_principal = userPrincipalName
; ldap_account_expire_policy = ad
; ldap_force_upper_case_realm = true
;
; krb5_server = your.ad.example.com
; krb5_realm = EXAMPLE.COM
```

これを sssd.conf に上書きして sssd を起動しても同じエラーメッセージ出力
内容を書き換える必要があると思うがよくわからないので、元の sssd.conf に戻し設定ファイルを雛形の内容と見比べる・・・・・・

設定ファイル「domain = LOCAL」　　雛形ファイル「; domains = LDAP」
sがない・・・！！

domain を domainsに書き換えて試す　　　

```conf:/etc/sssd/sssd.conf
[sssd]
config_file_version = 2
service = nss, pam
domains = LOCAL

[nss]
filter_groups = root
(略)
```

これだけの変更で起動した！！
あー疲れた。