AlmaLinuxにOpenLDAPクライアントをインストールした

# はじめに
ラズパイで389-ds環境を作った。

https://qiita.com/Nats72/items/b1d1439933e03f3849ba

今回は、クライアント側を作っていく。
クライアント側のサーバは、`AlmaLinux9.2`。

# 各種インストール
まずはパッケージインストール。
```console
# dnf -y install openldap-clients sssd sssd-ldap oddjob-mkhomedir sssd-tools
```

### インストールパッケージの確認
```console
# dnf list --installed | grep -e openldap -e sssd
openldap.x86_64                          2.6.3-1.el9                  @baseos   
openldap-clients.x86_64                  2.6.3-1.el9                  @baseos   
openldap-compat.x86_64                   2.6.3-1.el9                  @baseos   
sssd.x86_64                              2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-ad.x86_64                           2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-client.x86_64                       2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-common.x86_64                       2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-common-pac.x86_64                   2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-ipa.x86_64                          2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-kcm.x86_64                          2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-krb5.x86_64                         2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-krb5-common.x86_64                  2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-ldap.x86_64                         2.9.1-4.el9_3.1.alma.1       @baseos   
sssd-proxy.x86_64                        2.9.1-4.el9_3.1.alma.1       @baseos 
```

# LDAP(Lightweight Directory Access Protocol)
ディレクトリサービスへ接続するためのプロトコル。
LDAPサーバー用のソフトウェアと、クライアント向けのパッケージがある。
今回使っているのはクライアント向けの方。

## LDAP設定
初期設定ファイルはバックアップを取っておく。
```console
# cp -p /etc/openldap/ldap.conf /etc/openldap/ldap.conf.org
```
編集する。
```
# vi /etc/openldap/ldap.conf
```
編集後の差分比較。
```console
# diff /etc/openldap/ldap.conf.org /etc/openldap/ldap.conf
8,9c8,9
< #BASE dc=example,dc=com
< #URI  ldap://ldap.example.com ldap://ldap-master.example.com:666
---
> BASE  ou=people,dc=example,dc=com
> URI   ldap://192.168.0.254/
13c13
< #DEREF                never
---
> DEREF         always
28a29
> TLS_REQCERT = never
```
#### DEREF
エイリアスの実名参照をどのように行うかを指定。
| 設定 | 説明 |
|:-|:-|
| never | 名参照しない。（デフォルト）|
| searching | 検索で実名参照する。 |
| finding | 検索のためのベースオブジェクトを 探すときのみ実名参照する。 |
| always  | 常に実名参照する。 |

#### TLS_REQCERT
TLS セッション開設時にサーバ認証をどうするかを指定。
| 設定 | 説明 |
|:-:|:-:|
| never | サーバ証明書を要求しないし、チェックもしない。 |
| allow | 証明書を要求するが、なければ正常に進む。証明書があって不正あっても無視して進める。|
| try | 証明書を要求するが、なければ正常に進む。証明書があって不正があればセッションを終了する。 |
| demand | hard | 証明書が出てこなかったり、不正な証明書が提供されればセッションを終了する。 |

## 接続テスト
```console
# ldapsearch -H ldap://192.168.0.254 -x -w password -D cn=Manager -b ou=people,dc=example,dc=com -LLL
dn: dc=example,dc=com
objectClass: top
objectClass: organizationalunit
ou: people

dn: uid=app-user,ou=people,dc=example,dc=com
uid: app-user
cn: app-user
objectClass: account
objectClass: posixAccount
objectClass: top
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/app-user
userPassword:: e1BCS0RGMl9TSEEyNTZ9QUFBSUFQVjBNd002K1BESXIrTFpHdkdGaTc3cXN2NzN
 YbWczVE5FSG10YjFYUzA0T1JuL2EyMjZaVjVnVmNWM3psODlIVEdGQ1o4NlV3NERPQ1NtMGdjb3dS
 WnJRSGJWS1VQNGZHQVNmSngrYUdNS05GWXJvY3dEQkFCcTExdUw2ZVlheC9pRm8ydXBZNXp5ZzdlU
 jBpL2dqNlQvMUI5cGlpQ1piamxRRnlmM0lORTJPRnNqaGorWTEzTnQxVXZLTER3UDRLeS8vZzdOUn
 prYnRkTXE0R0lmWXUzT2k1V3JBd2g2a0VwQml5ZEtOcXVZODYyb2E0YlkvOUxsUGhWWTVSeExJTmF
 uV3VrdGl5K1A5K1JNdklOSjFHdE0vbkdrTWJYc2IvMlFxRWpvZzlUZmVwUHY1blkwTFBDUHpvVHFx
 REh4MExYTW5FeDh3UmwveWpjYisrUVV1aFBxZ0s1SzZNSlJsYys1SXpPUGxJWDBRckowL21uYVBTQ
 jFzbFNKZytQbGd2MGtUSThya0c1VzdQSGdqeHg4RXYzVlJiRHRibXVzdzFvVzU0TEZPKzNU

dn: cn=app-group,ou=people,dc=example,dc=com
objectClass: posixGroup
objectClass: top
cn: app-group
gidNumber: 1000
```


## SSSD(System Security Services Daemon)
- リモートディレクトリと認証メカニズムにアクセスするシステム・サービス。
- ユーザー認証、アカウント管理、名前解決、ポリシー管理などのセキュリティ機能を提供する。
- SSSDクライアントがリモートプロバイダーに接続して、ID・認証情報を取得、キャッシュを行う。ローカルシステムのユーザーはキャッシュされたアカウント情報を使用して認証を行う。オフラインでも使える。（キャッシュ有効の場合）
- SSSDはローカルでユーザーアカウントを作成しない。ユーザーが初回ログインしたときに、クライアントはリモートプロバイダーに接続する。なので、ユーザーは最低でも1度はログインしていないといけない。
- SSSDクライアントは、LDAP、IdM(Identity Manager)、AD(ActiveDirectory)、Kerberosレルムなどの外部IDおよび認証プロバイダーに接続ができる。

#### (参考)IdM(Identity Manager)
RHELに付属するID管理ソフトウェアで、LDAPおよびKerberosによる認証を行う。
WindowsでいうところのActiveDirectoryのようなもの。
アップストリームプロジェクトは、FreeIPA。

#### (参考)nslcd,nscd
一昔前は、LDAP接続を行う`nslcd(Name Service LDAP Connection Daemon)`と、キャッシュを行う`nscd(Name Service Cache Daemon)`を使っていたようだが、SSSDへの移行が推奨されているようである。


## 設定ファイル編集
IDおよび認証プロバイダーは、SSSD設定ファイル`/etc/sssd/sssd.conf`で設定する。
```console
# vi /etc/sssd/sssd.conf
```
```conf:/etc/sssd/sssd.conf
[domain/default]
id_provider = ldap
auth_provider = ldap
autofs_provider = ldap
chpass_provider = ldap
cache_credentials = True
ldap_uri = ldap://192.168.0.254/
ldap_id_use_start_tls = True
ldap_tls_cacertdir = /etc/openldap/certs
ldap_tls_reqcert = never
ldap_search_base = ou=people,dc=example,dc=com
ldap_search_timeout = 3
ldap_network_timeout = 3
ldap_deref = always
enumerate = True

[sssd]
services = nss, pam, autofs
domains = default

[nss]
homedir_substring = /home
```

| 設定 | 内容 |
|:-|:-|
| id_provider | 使用するデータバックエンドを指定 |
| auth_provider | 認証プロバイダーを指定(デフォルト値はid_providerの値) |
| cache_credentials | キャッシュにユーザー認証情報を保存するかどうか(デフォルトはFalse) |
| chpass_provider | パスワード変更要求をどのデータベースで処理するのかを指定 |
| ldap_id_use_start_tls | SSL/TLS通信を行うかどうか |
| ldap_tls_cacert | 使用するルートCA証明書ファイルを指定 |
| ldap_tls_cacertdir | 使用するルートCA証明書ファイルが格納されたディレクトリを指定したいときは、ldap_tls_cacert の代わりにこちらを使用 |
| ldap_tls_reqcert | 証明書をどのように検証するか<br>neverは要求もチェックもしない |
| enumerate | getent passwd(ユーザーやグループの一覧を表示するコマンド)に対応させる |
| services | 使用するサービスを指定 |
| domains | SSSDではユーザ情報を保持するデータベースのことをdomainと呼ぶ<br>複数定義可能 |

(参考)
今回は、IDプロバイダーの設定をする。
- IDプロバイダー(ユーザー情報を提供)
[domain/name of the domain]セクションのid_providorオプションを使用して設定。

- 認証プロバイダー(認証要求を処理)
[domain/name of the domain]セクションのauth_providerオプションを使用して設定。

- アクセス制御プロバイダー(認可要求を処理)
[domain/name of the domain]セクションのaccess_providerオプションを使用して設定。

- プロキシープロバイダー
SSSDと、SSSDが使用できないリソースとの間で中間リレーとして機能。


パーミッション変更しておく。
```console
# chmod 600 /etc/sssd/sssd.conf
# chown root:root /etc/sssd/sssd.conf
```

## SSSD有効化
一昔前は、`authconfig`とやらで設定していたようだが、今は非推奨になっているらしい。
その代わり、`authselect`を使って設定する。
```console
# authselect select sssd with-mkhomedir
バックアップは /var/lib/authselect/backups/2024-01-01-10-14-15.1x1fd2 に保存されました
プロファイル "sssd" が設定されました。
以下の nsswitch マップはプロファイルで上書きされます:
- passwd
- group
- netgroup
- automount
- services

Make sure that SSSD service is configured and enabled. See SSSD documentation for more information.
 
- with-mkhomedir is selected, make sure pam_oddjob_mkhomedir module
  is present and oddjobd service is enabled and active
  - systemctl enable --now oddjobd.service
```

## oddjobデーモン起動＆自動起動設定
oddjobは、LDAP認証したユーザのホームディレクトリを自動生成するサービス。
```console
# systemctl start oddjobd
# systemctl enable oddjobd
```

## SSSD起動
起動もしくは再起動させる。
```console
# systemctl srart sssd
# systemctl resrart sssd
```
## LDAPサーバーとの接続確認
`sssctl`は、`sssd-tools`に含まれる。
Online statusがOnlineなら正常。
```console
# sssctl domain-status default
Online status: Online

Active servers:
LDAP: not connected

Discovered LDAP servers:
- 192.168.0.254
```
うまく起動しなかったらログ読んで調べるといいと思う。
```console
# less /var/log/sssd/sssd_default.log
```

## idコマンドでユーザーを引けるかどうか確認
idコマンドでユーザーを引けるかどうか確認する。
匿名バインドを無効化してるとうまく引けない気がする。
```console
# id demo_user
uid=99998(demo_user) gid=99998 groups=99998
```
```console
# getent passwd | grep demo_user
demo_user:*:99998:99998:Demo User:/var/empty:/bin/false
```

# 参考にしたサイト

https://tsugihagi.hatenablog.com/entry/2020/03/01/140203

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_authentication_and_authorization_in_rhel/index

https://tech-mmmm.blogspot.com/2021/12/openldap-linuxsssdopenldap.html