2021年12月4日土曜日

OpenLDAP入門③ (LinuxのSSSDを使ってOpenLDAPと認証連携する) 

前回及び前々回の記事において、OpenLDAPによるLDAPサーバ構築とLDAPS有効化を実現できた。今回は、実際にOpenLDAPサーバーに対してLDAPクライアントから認証を行うことにする。

RHELではLDAPクライアントとして、SSSD (System Security Services Daemon) と呼ばれるソフトウェアを利用できる。SSSDを使うことで、OpenLDAPにて登録したユーザを用いてOSへのログインを行うことができる。

本記事では、LinuxのSSSDを使ってOpenLDAPサーバと認証連携する手順を記載する。

環境

RHEL 7にてOpenLDAPサーバ (LDAPS有効化済み) を構築済みの環境において、同じくRHEL 7にてSSSDの設定を行い認証連携を行う。なお、RHEL 8においても一部手順が異なるだけで、ほぼ本記事に記載の手順でSSSDの設定は可能となる (手順が異なる箇所については本記事でも言及する)。

  • LDAPクライアントOS : Red Hat Enterprise Linux 7.7
  • OpenLDAPサーバOS : Red Hat Enterprise Linux 7.7
  • OpenLDAP : 2.4.44

OpenLDAPのドメイン等の情報は以下とする。

設定項目 設定値
ドメイン dc=example,dc=com
RootDN cn=Manager,dc=example,dc=com
OU ou=group,dc=example,dc=com
グループ cn=ldapgrp,ou=group,dc=example,dc=com
ユーザ1 uid=user01,ou=group,dc=example,dc=com
ユーザ2 uid=user01,ou=group,dc=example,dc=com

SSSD設定手順

1. SSSDをインストール

yumを用いてSSSDをインストールする。openldap-clientsはLDAP通信が問題なくできることの確認のためにインストールしておく。oddjob-mkhomedirはLDAP認証したユーザのホームディレクトリを自動生成するサービスとなる。

# yum install openldap-clients sssd sssd-ldap oddjob-mkhomedir -y

2. OpenLDAPサーバのサーバ証明書をコピー

LDAPSを使用する場合は、OpenLDAPサーバのサーバ証明書を登録しておく必要がある。前回記事で作成したldaps.crtを以下の通りコピーして配置する。

# cp ldaps.crt /etc/openldap/certs/core-dirsrv.ca.pem

3. OpenLDAPクライアントから認証情報を取得できることを確認

SSSDの設定を行う前に、ldapsearchコマンドでOpenLDAPサーバと問題なく通信できることを確認する。

OpenLDAPのクライアントの設定を行う前にldapsearchコマンドを実行すると、Can't contact LDAP serverのように通信に失敗することがわかる。

# ldapsearch -x -D "uid=user01,ou=group,dc=example,dc=com" -w password -b "dc=example,dc=com" -H "ldaps://192.168.11.117/"
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

以下の通りOpenLDAPのクライアントの設定を追加する。

# cat << EOF >> /etc/openldap/ldap.conf
URI ldap://192.168.11.117/
BASE ou=group,dc=example,dc=com
TLS_CACERT /etc/openldap/certs/core-dirsrv.ca.pem
EOF

再度ldapsearchコマンドを実行し、以下の通り登録されているグループやユーザの情報が出力されればOKとなる。

# ldapsearch -x -D "uid=user01,ou=group,dc=example,dc=com" -w password -b "dc=example,dc=com" -H "ldaps://192.168.11.117/"
# extended LDIF
#
# LDAPv3
# base <dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# example.com
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

# group, example.com
dn: ou=group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

~(以下略)~

4. SSSDを設定

それではSSSDの設定を行う。SSSDの設定ファイルはsssd.confとなるが、このファイルはデフォルトで存在しないため、以下の通り一から作成する。

# cat << EOF >> /etc/sssd/sssd.conf
[domain/default]
id_provider = ldap
autofs_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://192.168.11.117/
ldap_search_base = ou=group,dc=example,dc=com
ldap_id_use_start_tls = True
cache_credentials = True
ldap_tls_cacertdir = /etc/openldap/certs
ldap_tls_cacert = /etc/openldap/certs/core-dirsrv.ca.pem
ldap_tls_reqcert = hard

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

[nss]
homedir_substring = /home
EOF

この設定ファイルは以下の通りパーミッションを設定することがセオリーのようなので、以下コマンドで設定しておこう。

# chmod 600 /etc/sssd/sssd.conf
# chown root:root /etc/sssd/sssd.conf

5. SSSDの有効化

SSSDの設定ファイルを作成したら、認証プロバイダーとしてSSSDを使用できるようにする。今回はRHEL 7がクライアントとなるため、authconfigコマンドにて設定する。RHEL 8の場合はauthselectコマンドを利用するため注意すること。

以下、RHEL 7とRHEL 8の設定コマンドを記載する。

RHEL 7の場合

# authconfig --update --enablesssd --enablesssdauth --enablemkhomedir

↓★確認コマンド。pam_sssとpam_mkhomedirがenableになっていることを確認
# authconfig --test | egrep 'pam_sss|pam_mkhomedir'
pam_sss is enabled by default
pam_mkhomedir or pam_oddjob_mkhomedir is enabled (umask=0077)

RHEL 8の場合

# authselect select sssd with-mkhomedir --force
プロファイル "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
  - systemctl enable oddjobd.service
  - systemctl start oddjobd.service

6. SSSDを再起動

ここで一度SSSDを再起動して、各種設定を反映させる。

# systemctl restart sssd oddjobd
# systemctl enable sssd oddjobd

今回の手順では問題は発生しないはずだが、SSSD再起動時に、以下のようなstatus=4/NOPERMISSIONのエラーが発生することがある。

# systemctl restart sssd oddjobd
Job for sssd.service failed because the control process exited with error code. See "systemctl status sssd.service" and "journalctl -xe" for details.
# systemctl status sssd -l

~(中略)~

10月 24 06:26:21 localhost.localdomain systemd[1]: Starting System Security Services Daemon...
10月 24 06:26:22 localhost.localdomain systemd[1]: sssd.service: main process exited, code=exited, status=4/NOPERMISSION
10月 24 06:26:22 localhost.localdomain systemd[1]: Failed to start System Security Services Daemon.
10月 24 06:26:22 localhost.localdomain systemd[1]: Unit sssd.service entered failed state.
10月 24 06:26:22 localhost.localdomain systemd[1]: sssd.service failed.

このエラーの原因はsssd.confが正しく記載されていないことが原因となる。authconfigコマンドにて、他オプションを指定して実行した場合は、sssd.confの一部設定が消えることがあるようなので、再度記載に問題がないか確認したうえで、サービス再起動をすること。私の遭遇した事象ではdomainsの設定が本来defaultであるところが空白になっており、サービス再起動に失敗していた。

[sssd]
services = nss, pam, autofs
domains =  ←★本来ここがdefaultになっている必要あり

7. LDAP登録ユーザにてログイン確認

最後に実際にSSHを用いてLDAP登録ユーザでログインできることを確認する。

Tera Termを用いてLDAPに登録されているuser01でログインする。なお、ドメイン名 (本環境ではexample.com) は不要となる。

特に設定に問題がなければ、以下の通りホームディレクトリが自動作成され、ログインに成功する。UIDやGIDを確認するとOpenLDAPサーバにて登録された番号となっていることも確認できる。

Creating home directory for user01.
Last login: Sat Oct 23 20:41:07 2021 from t1081w219.intrat.local
[user01@localhost ~]$ pwd
/home/user01
[user01@localhost ~]$ id
uid=10001(user01) gid=10000(ldapgrp) groups=10000(ldapgrp) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

以上で、SSSDを用いてにてOpenLDAPサーバと認証連携する手順は完了となる。

0 件のコメント:

コメントを投稿

人気の投稿