dockerコンテナ使ってOpenLDAPへcentos8からssh接続する

◆◆◆

とっかかりは業務での運用。

作ったことなかったので、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使うらしい。

Docker Hub

githubに詳細がある。slapdっていうデーモン使うらしい。

GitHub - osixia/docker-openldap: A docker image to run OpenLDAP 🐳
A docker image to run OpenLDAP 🐳. Contribute to osixia/docker-openldap development by creating an account on GitHub.

slapdの最新は今見たら2.5.7。

OpenLDAP, Main Page
The Open Source for LDAP software and information. Home of OpenLDAP.

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に認証情報が入る。

最初にブラウザで接続

そりゃつながるわな。

gvis-ldap

php LDAP adminにログイン

参考にさせてもらったページ。
作者さんありがとう。参考にさせていただき、アレンジしてやってみました。

dockerでldapサーバを立てる - Qiita
概要 gitlabサーバやredmineサーバを立ち上げるのユーザの一元管理をしたい思いldapサーバを立ち上げました。世の中ではsamba4などもあるみたいですが、まずはdockerでopenldapサーバだけを立ち上げました...

たとえばOpenLDAPコンテナのenvironment設定にこう書いてたとき、

LDAP_DOMAIN: "intra-gavann-it.com"
LDAP_ADMIN_PASSWORD: "hogehoge"

ログイン画面に設定するのは、

Login DNpassword
cn=admin,dc=intra-gavann-it,dc=comhogehoge

設定内容を元にして画面に入力しログインする。

gvis-ldap

左側にあるツリーをクリックし、真ん中あたりのou=gvisの下にある「create a child entry」をクリックする。

gvis-ldap

エントリの追加

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番の定義はなかった。

gvis-ldap

完成したツリー表示はこうなる。ouの中にグループとユーザがあり、ユーザはそのグループ番号に所属するようにしておく。

gvis-ldap

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の設定

これがなかなか悩ませてくれた。
設定ファイル書くのに時間かかった。

参考にしたサイト。
作者さんありがとう。アレンジして同じようなことさせてもらいました。

OpenLDAPとSSSDを利用したユーザー認証 - Qiita
これはなに OSSTech Advent Calendar 2019の5日目の記事です。 普段は自分が使っている技術の備忘録のような記事しか書いてないのですが、 一応認証に関する記事になるつもりです。 嘘ですまた備忘録です。...
sssd+SSH連携のLDAPクライアント構築手順 - Qiita
sssdを使ってLDAPクライアントを作る機会があったので、その時の手順です。 はじめに LDAPクライアントを作るとなると普通はnslcd(nss-pam-ldapd)+nscdを使うものの、nscdが障害を起こすたびに何度も...

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にログインするときに使った管理ユーザのパスワードを入力して難読化しとこう。

gvis-ldap
[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の文章だと、このへんに設定方法がある。

redhatのsssd利用方法説明

後でわかったけど、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サーバ管理するときは使うかもしれないけど、そんなたくさん普段は要らん。

コメント