◆◆◆
※2022年6月にcentos8のdockerコンテナ使えないことに気づいたので、centosではないredhatクローンを使う方法に切り替えた。
とっかかりは業務での運用。
作ったことなかったので、dockerでOpenLDAPサーバを作っておき、centos8で接続できる方法を探し当てて検証し、同じ方法で業務のredhat8からも接続できた。
業務でdocker使えたらこんなまわりくどいことしないのに・・・。
redhat6/7ではnslcd使えてたらしいが、redhat8ではsssd接続のみに変更になってしまったので、sssd.confの書き方を見つけるために作った。
これがなかなかうまくいかず、rhel8のサポートも使わせてくれなかったので、自分で試しながら設定内容を探り当てた。
sssdはredhat7でも使えてて、8になってからnslcd使わなくなったらしい。
ここではopenldapのコンテナと、それを管理させるためのphpldapadminのコンテナを作っておき、コンテナのcentos8から認証接続させるまでの経緯。
前に一度作ったのを、普段使いの環境に追記して最近やり直したのでメモ。
コンテナ起動のためのdocker-compose.yml内容はここ。
openldapのコンテナ起動
docker使ってldapするにはopenldap使うらしい。
githubに詳細がある。slapdっていうデーモン使うらしい。
slapdの最新は今見たら2.5.7。
githubにあるosixiaは1.5で、dockerコンテナ内で使ってるopenldapを見てみたら2.4.57。openldapが最新ではないけど、コンテナ定期的に作り直すし、まぁいいか。
root@0e1af753333d:/# slapd -V
@(#) $OpenLDAP: slapd 2.4.57+dfsg-1~bpo10+1 (Jan 30 2021 06:59:51) $
Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
root@0e1af753333d:/#
docker-compose.ymlを少し書いて用意する。ちょろい。1分もかからない。
以下、このときのdocker-composeの抜粋。
nari@nafslinux-intra-gavann-it-com:/docker$ docker-compose up ldap-server
Pulling ldap-server (osixia/openldap:latest)...
latest: Pulling from osixia/openldap
45b42c59be33: Already exists
ae7fb8f59730: Pull complete
55443d9da5d5: Pull complete
:(中略)
ldap-host | 614e0e11 @(#) $OpenLDAP: slapd 2.4.57+dfsg-1~bpo10+1 (Jan 30 2021 06:59:51) $
ldap-host | Debian OpenLDAP Maintainers <pkg-openldap-devel@lists.alioth.debian.org>
ldap-host | 614e0e11 slapd starting
phpldapadminのコンテナ起動
docker-compose.ymlを少し書いて用意する。これも1分以内で終わる。
nari@nafslinux-intra-gavann-it-com:/docker$ docker-compose up ldap-admin
Pulling ldap-admin (osixia/phpldapadmin:latest)...
latest: Pulling from osixia/phpldapadmin
1ab2bdfe9778: Pull complete
0abcaf321aa9: Pull complete
6d688c3d4e02: Pull complete
:(中略)
ldap-admin | [Fri Sep 24 18:36:01.384018 2021] [mpm_event:notice] [pid 874:tid 140323192788096] AH00489: Apache/2.4.38 (Debian) OpenSSL/1.1.1c configured -- resuming normal operations
ldap-admin | [24-Sep-2021 18:36:01] NOTICE: fpm is running, pid 858
ldap-admin | [24-Sep-2021 18:36:01] NOTICE: ready to handle connections
ldap-admin | [Fri Sep 24 18:36:01.384351 2021] [core:notice] [pid 874:tid 140323192788096] AH00094: Command line: '/usr/sbin/apache2 -D FOREGROUND'
ldap-admin | [24-Sep-2021 18:36:01] NOTICE: systemd monitor interval set to 10000ms
phpldapadminからの接続とグループ・ユーザ作成
phpldapadminからつないでユーザとグループを作り、ldapに認証情報が入る。
最初にブラウザで接続
そりゃつながるわな。
php LDAP adminにログイン
参考にさせてもらったページ。
作者さんありがとう。参考にさせていただき、アレンジしてやってみました。
たとえばOpenLDAPコンテナのenvironment設定にこう書いてたとき、
LDAP_DOMAIN: "intra-gavann-it.com"
LDAP_ADMIN_PASSWORD: "hogehoge"
ログイン画面に設定するのは、
Login DN | password |
---|---|
cn=admin,dc=intra-gavann-it,dc=com | hogehoge |
設定内容を元にして画面に入力しログインする。
左側にあるツリーをクリックし、真ん中あたりのou=gvisの下にある「create a child entry」をクリックする。
エントリの追加
OU(Generic: Organisational Unit)、グループ(Generic: Posix Group)、ユーザ(Generic: User Account)の順番で作っていく。
いまだにOUとかCNの意味がよくわかっていない・・・。
雰囲気を模倣しながら覚えていこうとしてる。
ユーザは、centos8側のローカルIDと重ならないように注意して作る。linuxはデフォルトで1000からOSユーザは作られるから、それがOpenLDAP上のアカウントのuidが重ならないようにする。
以下は1000とあるけど、ひとまず2000番台をLDAPユーザのアカウントに変更しとく。たぶんグループ番号も重なったらマズいんだろうけど、centos8の/etc/groupの中には500番の定義はなかった。
完成したツリー表示はこうなる。ouの中にグループとユーザがあり、ユーザはそのグループ番号に所属するようにしておく。
centos8からのポート開放確認
自分の場合はcentos8のコンテナ用意して、そこからopenldapと疎通が取れるか確認してみる。ホストOSはubuntuやけど、これでやってみる。
[root@clcent8 script]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"
[root@clcent8 script]#
nmap使ってポート開放確認するので、入ってなかったらインストールする。
# yum install nmap
phpldapadminで接続してたopenldapのコンテナに接続できるかやってみる。「Host is up」ってあるからポートはあいてる。
[root@clcent8 ~]# nmap -p389 -Pn ldap-server
Starting Nmap 7.70 ( https://nmap.org ) at 2021-09-25 04:37 JST
Nmap scan report for ldap-server (172.18.0.11)
Host is up (0.00012s latency).
rDNS record for 172.18.0.11: ldap-host.docker_default
PORT STATE SERVICE
389/tcp open ldap
MAC Address: 02:42:AC:12:00:0B (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 0.59 seconds
[root@clcent8 ~]#
コンテナ間のネットワークだから389が有効だけど、外部のlinuxからだったらポート番号をdocker-compose.ymlに定義した別番号で読み替えること。自分の場合は389は11389。
ports:
- "11389:389"
centos8に必要なモジュールをインストール
centos7ではyumだったのが、centos8ではdnfを使う。
# dnf install openssl openldap-clients
# dnf install sssd sssd-tools sssd-ldap
# dnf install oddjob-mkhomedir
インストールできたか確認。
なんかいろいろ入る。
[root@clcent8 ~]# dnf list installed | egrep 'openssl|openldap-clients|sssd|sssd-tools|sssd-ldap|oddjob-mkhomedir'
oddjob-mkhomedir.x86_64 0.34.7-1.el8 @appstream
openldap-clients.x86_64 2.4.46-17.el8_4 @baseos
openssl.x86_64 1:1.1.1g-15.el8_3 @baseos
openssl-libs.x86_64 1:1.1.1g-15.el8_3 @baseos
openssl-pkcs11.x86_64 0.4.10-2.el8 @baseos
python3-sssdconfig.noarch 2.4.0-9.el8_4.2 @baseos
sssd.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-ad.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-client.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-common.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-common-pac.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-dbus.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-ipa.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-krb5.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-krb5-common.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-ldap.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-nfs-idmap.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-proxy.x86_64 2.4.0-9.el8_4.2 @baseos
sssd-tools.x86_64 2.4.0-9.el8_4.2 @baseos
[root@clcent8 ~]#
centos8の設定
自動設定ファイルを設置してから、openldap/sssdの設定をする。
ldapsはすぐに使わないのでレガシー設定も入れる。
自動設定ファイルの設置
コマンドラインで実行する。なんか設定してくれる。redhat8の公開文書には「この設定で触るファイルは手動変更したらアカン」って書いてあったはず。いろいろ探してたらurlどれやったかわからんくなった・・・。
[root@clcent8 ~]# authselect select sssd with-sudo with-mkhomedir --force
Backup stored at /var/lib/authselect/backups/2021-09-24-20-45-37.V1RGGq
Profile "sssd" was selected.
The following nsswitch maps are overwritten by the profile:
- passwd
- group
- netgroup
- automount
- services
- sudoers
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
[root@clcent8 ~]#
ldap.confの設定
viで/etc/openldap/ldap.confに追記する。
TLS_CACERTはcert.pemが/etcの中にあったので指定(今は使わんけど)。
URIにはさっきnmapで確認したホスト名を書く。
BASEはphpldapadminでログインに使った情報を書いておく。
TLS_CACERT /etc/pki/tls/cert.pem
URI ldap://ldap-server
BASE dc=intra-gavann-it,dc=com
opensslコマンド使って確認。
「Verify return code: 0 (ok)」って戻ってたらOKなはず。
[root@clcent8 ~]# openssl s_client -connect ldap-server:389
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 289 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
[root@clcent8 ~]#
sssd.confの設定
これがなかなか悩ませてくれた。
設定ファイル書くのに時間かかった。
参考にしたサイト。
作者さんありがとう。アレンジして同じようなことさせてもらいました。
viで/etc/sssd/sssd.confを新規作成。
[sssd]
debug_level = 4 ←★ログ出力のレベルはお好みで
services = nss, pam, ifp, sudo ←★参考ページから記述しsudoもいるかなって追記
domains = gvis ←★お好みで書く
[nss]
homedir_substring = /home ←★ldap認証した後のホームディレクトリ
filter_groups = root ←★参考ページそのまま
filter_users = root ←★参考ページそのまま
[pam]
[sudo]
[domain/gvis] ←★domain名はsssdセクションのとそろえる。あとは参考ページから記述し、いくつか追記
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
sudo_providder = ldap
autofs_provider = ldap
cache_credentials = True
case_sensitive = False
ldap_uri = ldap://ldap-server ←★nmapで確認したコンテナのホスト名
ldap_search_base = ou=gvis, dc=intra-gavann-it,dc=com ←★phpldapadminで作った情報
ldap_default_bind_dn = cn=admin, dc=intra-gavann-it,dc=com ←★phpldapadminで作った情報
ldap_auth_disable_tls_never_use_in_production = True ←★ldaps使わないのでTrueに設定
ldap_id_use_start_tls = False ←★ldaps使わないのでFalseに設定
ldap_tls_reqcert = never ←★ldaps使わないのでneverに設定(自己証明書でもこうするらしい)
ldapのパスワードを平文で書くのはちょっと・・・。
パスワードを難読化してくれる方法があるらしい。
さっきphpldapadminにログインするときに使った管理ユーザのパスワードを入力して難読化しとこう。
[root@clcent8 sssd]# sss_obfuscate -d gvis
Enter password:
Re-enter password:
[root@clcent8 sssd]# tail -13 sssd.conf
ldap_uri = ldap://ldap-server
ldap_search_base = ou=gvis, dc=intra-gavann-it,dc=com
ldap_default_bind_dn = cn=admin, dc=intra-gavann-it,dc=com
ldap_auth_disable_tls_never_use_in_production = True
ldap_id_use_start_tls = False
ldap_tls_reqcert = never
access_provider = permit
sudo_provider = ldap
resolver_provider = ldap
ldap_default_authtok_type = obfuscated_password
ldap_default_authtok = AAAQAMHjxTYytMbzEbbFP0x4tZSWkTZlBMhmQlmAjbyyxEGFXQi7yJ9o6SGcdyHW44KeYfnmPHV2CvHSwTswkUUnVmQAAQID
[root@clcent8 sssd]#
「ldap_default」で始まる最後の2行は必要だけど、その前の3行は不要なのでカット。
なんか他にも変わってるかもしれないから、念のため見直し。
あと、ファイルのパーミッションも変更。
[root@clcent8 sssd]# pwd
/etc/sssd
[root@clcent8 sssd]# chmod 600 sssd.conf
[root@clcent8 sssd]# ls -l
total 4
drwx--x--x 2 sssd sssd 6 8月 16 23:25 conf.d
drwx--x--x 2 root root 6 8月 16 23:25 pki
-rw------- 1 root root 677 9月 25 05:38 sssd.conf
[root@clcent8 sssd]#
redhat8の文章だと、このへんに設定方法がある。
後でわかったけど、LDAPSを使うときにlegacy設定を「DEFAULT」にはできても、この難読化した記述は削れなかった。
設定ファイルのリロード
設定ファイルをデーモンに読み込みなおさせる。
ここでsssd.confに設定誤りがあると、「Starting up」とある下のほうの記述にエラーメッセージが出る。
[root@clcent8 ~]# systemctl restart sssd.service
[root@clcent8 ~]# systemctl status sssd.service
● sssd.service - System Security Services Daemon
Loaded: loaded (/usr/lib/systemd/system/sssd.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2021-09-25 05:41:10 JST; 5s ago
Main PID: 1432 (sssd)
Tasks: 7 (limit: 101897)
Memory: 45.8M
CGroup: /docker/47c4f1a8ce05dabb4356a8bc70633a8f26217af558bc770ed984dc23e9caea77/syste>
tq1432 /usr/sbin/sssd -i --logger=files
tq1433 /usr/libexec/sssd/sssd_be --domain implicit_files --uid 0 --gid 0 --log>
tq1434 /usr/libexec/sssd/sssd_be --domain gvis --uid 0 --gid 0 --logger=files
tq1435 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files
tq1436 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --logger=files
tq1437 /usr/libexec/sssd/sssd_ifp --uid 0 --gid 0 --logger=files
mq1438 /usr/libexec/sssd/sssd_sudo --uid 0 --gid 0 --logger=files
9月 25 05:41:10 clcent8 systemd[1]: Starting System Security Services Daemon...
9月 25 05:41:10 clcent8 sssd[sssd][1432]: Starting up
9月 25 05:41:10 clcent8 sssd[be[gvis]][1434]: Starting up
9月 25 05:41:10 clcent8 sssd[be[implicit_files]][1433]: Starting up
9月 25 05:41:10 clcent8 sssd[nss][1435]: Starting up
9月 25 05:41:10 clcent8 sssd[ifp][1437]: Starting up
9月 25 05:41:10 clcent8 sssd[pam][1436]: Starting up
9月 25 05:41:10 clcent8 sssd[sudo][1438]: Starting up
9月 25 05:41:10 clcent8 systemd[1]: Started System Security Services Daemon.
他にも、TLS関連設定がうまくできていないと、認証したときに「Could not start TLS encryption」ってメッセージが出る。
認証がうまくいかないときは、ここを見るとヒントがある。
9月 25 07:00:16 clcent8 sssd[ifp][313]: Starting up
9月 25 07:00:16 clcent8 sssd[pam][312]: Starting up
9月 25 07:00:16 clcent8 sssd[nss][311]: Starting up
9月 25 07:00:16 clcent8 sssd[sudo][314]: Starting up
9月 25 07:00:16 clcent8 systemd[1]: Started System Security Services Daemon.
9月 25 07:00:40 clcent8 sssd[be[gvis]][310]: Could not start TLS encryption. unknown error
9月 25 07:01:54 clcent8 sssd[be[gvis]][310]: Backend is online
9月 25 07:10:44 clcent8 sssd[be[gvis]][310]: Could not start TLS encryption. unknown error
9月 25 07:11:27 clcent8 sssd[be[gvis]][310]: Could not start TLS encryption. unknown error
もしもできてなかったら、oddjobdはsssdとペアなので、OS起動時に有効になるようにしておく。sshログインしたとき、/home/xxxxのフォルダを作ってくれる。
[root@clcent8 ~]# systemctl enable oddjobd
Created symlink /etc/systemd/system/multi-user.target.wants/oddjobd.service → /usr/lib/systemd/system/oddjobd.service.
[root@clcent8 ~]# systemctl status oddjobd
● oddjobd.service - privileged operations for unprivileged applications
Loaded: loaded (/usr/lib/systemd/system/oddjobd.service; enabled; vendor preset: disab>
Active: active (running) since Sat 2021-09-25 05:49:34 JST; 1min 11s ago
Main PID: 1464 (oddjobd)
Tasks: 1 (limit: 101897)
Memory: 656.0K
CGroup: /docker/47c4f1a8ce05dabb4356a8bc70633a8f26217af558bc770ed984dc23e9caea77/syste>
mq1464 /usr/sbin/oddjobd -n -p /run/oddjobd.pid -t 300
レガシー設定
ldaps接続(ポート636)をするときには必要ないらしい。
でもldap接続(ポート389)のときは設定必要。
「OS再起動を推奨」ってあるので、docker-composeでコンテナ再起動しとく。
dockerでなければ、「shutdown -r now」が必要。
[root@clcent8 /]# update-crypto-policies --show
DEFAULT
[root@clcent8 /]# update-crypto-policies --set LEGACY
Setting system policy to LEGACY
Note: System-wide crypto policies are applied on application start-up.
It is recommended to restart the system for the change of policies
to fully take place.
[root@clcent8 /]# update-crypto-policies --show
LEGACY
[root@clcent8 /]#
centos8からの接続
sssd.confに書いたドメインの状態確認からやって、OpenLDAPにあるユーザ情報が取れるか確認する。
sssd.confに書いたドメインの状態確認
sssd.confに書いたドメインの状態を確認してみる。
コマンドラインに「Online」って戻るとOK。
oddjobdでのパスワード設定内容が違ってたり、OpenLDAPサーバが停止するとOfflineになる。OpenLDAPが停止しても、起動しなおしたらまた元に戻る。
[root@clcent8 ~]# sssctl domain-status gvis
Online status: Online
Active servers:
LDAP: ldap-server
Discovered LDAP servers:
- ldap-server
[root@clcent8 ~]#
次にアカウント情報がOpenLDAPから取得できるか確認してみる。
ここまで来るのに1週間ぐらい悩んだ。長かった。
[root@clcent8 ~]# getent passwd gavann-it
gavann-it:*:2000:500:gavann it:/home/gavann-it:/bin/bash
[root@clcent8 ~]#
キャッシュの削除
OpenLDAPから取る情報はキャッシュされているので、わけわかめになったときはクリアする。デーモンも再起動しとく。
[root@clcent8 ~]# sssctl cache-remove
SSSD must not be running. Stop SSSD now? (yes/no) [yes] yes
Creating backup of local data...
SSSD backup of local data already exists, override? (yes/no) [no] yes
Removing cache files...
SSSD needs to be running. Start SSSD now? (yes/no) [yes] yes
[root@clcent8 ~]#
いざ接続、あれ?
sshしてみると、あれれ? 拒否される?
centos8を別の検証でいじったからか?
[root@clcent8 ~]# ssh gavann-it@localhost
gavann-it@localhost's password:
Permission denied, please try again.
sshdには許可設定があるので入れておく。
viで/etc/sshd_configに追記(ssh_configとちゃうで)
AllowUsers *
気を取り直してssh接続やってみると、ホームディレクトリの作成をやってくれてログインできてる。
[root@clcent8 sssd]# ssh gavann-it@localhost
gavann-it@localhost's password:
Activate the web console with: systemctl enable --now cockpit.socket
Creating home directory for gavann-it.
Last failed login: Sat Sep 25 07:11:51 JST 2021 from 127.0.0.1 on ssh:notty
There were 8 failed login attempts since the last successful login.
[gavann-it@clcent8 ~]$ pwd
/home/gavann-it
[gavann-it@clcent8 ~]$ cat /etc/passwd | grep gavann
[gavann-it@clcent8 ~]$
useraddせず/etc/passwdにユーザがなくても、OpenLDAPに作ったユーザで認証されてログインできるようになった。
それにしてもLDAPめんどくさい。たくさんlinuxサーバ管理するときは使うかもしれないけど、そんなたくさん普段は要らん。