Docker 容器内的 OpenLDAP 客户端

Docker 容器内的 OpenLDAP 客户端

我有一个运行 CentOS 6 的 docker 容器,其中有一个非 root 用户和 OpenLDAP。当我使用getent passwd它时,它只会返回来自的数据/etc/passwd。配置文件/etc/nsswitch.conf是相应定制的(见下文)并authconfig-gtk用于配置。有趣的是,我能够使用

ldapsearch -x -b "dc=physik,dc=rwth-aachen,dc=de"

但它在 docker 容器内无法访问或使用。我配置错误还是遗漏了什么?

已安装的软件包:

openldap openldap-clients nss-pam-ldapd authconfig-gtk

/etc/nsswitch.conf

passwd:     files ldap
shadow:     files ldap
group:      files ldap

hosts:      files dns

bootparams: nisplus [NOTFOUND=return] files

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

netgroup:   files ldap

publickey:  nisplus

automount:  files ldap
aliases:    files nisplus

/etc/pam.d/系统身份验证

#%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        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 500 quiet
auth        sufficient    pam_ldap.so use_first_pass
auth        required      pam_deny.so

account     required      pam_access.so
account     required      pam_unix.so broken_shadow
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
password    sufficient    pam_unix.so md5 shadow nullok try_first_pass use_authtok
password    sufficient    pam_ldap.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
session     optional      pam_ldap.so

答案1

我发现该地址已被主机系统占用。我通过nslcd -d在执行时安装套接字来修复此问题docker run

-v /var/run/nslcd/socket:/var/run/nslcd/socket

答案2

我花了今天下午的大部分时间尝试运行一项服务,该服务似乎需要在启动时在容器内拥有 root 权限 (nslcd),同时以非 root 用户 (-u NON_ROOT_USER) 的身份运行容器,这是出于良好的安全性考虑。正如 Docker 专家所知,您无法这样做,因为 Docker 容器不使用典型的 init.d 进程,因此所有内容(包括 CMD 和 ENTRYPOINT)都以指定的容器用户身份运行。

Bonzai 自己的答案是解决此问题的一个有趣的方法,但应该注意的是,这样做,您使用的是主机的 nslcd 守护程序,而不是容器内启动的任何程序。我也让这个方法对我有用,无需在容器内启动 nslcd,而是只需将容器配置为好像 nslcd 是在 init.d 期间启动的。然后我使用 docker run -u NON_ROOT_USER 运行容器并从主机“借用”nslcd 守护程序。

以下是 Dockerfile 的片段,用于回答评论中 Mark 的问题:

# Install ldap client and daemon (matching version with host)
RUN apt-get install -y libnss-ldapd=0.9.9-1 nslcd=0.9.9-1

# Use sed to edit ldap config files as desired (use host as example)
RUN \
  sed -i '/^passwd:/ s/$/ ldap/' /etc/nsswitch.conf && \
  sed -i '/^group:/ s/$/ ldap/' /etc/nsswitch.conf   
RUN \
  echo "BASE dc=domain,dc=more_domain" >> /etc/ldap/ldap.conf
RUN \
  sed -i 's~^uri.*~uri ldaps://ldap.server.domain/~' /etc/nslcd.conf && \
  sed -i 's~^#base.*~base dc=domain,dc=more_domain~' /etc/nslcd.conf && \
  sed -i 's~^#tls_reqcert~tls_reqcert~' /etc/nslcd.conf

我还要指出的是,自从最初撰写本文以来,我已经看到了一些其他容器通过文件系统而不是网络端口与主机服务(然后是外部世界)交互的示例。

我绝不是这方面的专家,因此欢迎在下面对此讨论发表评论……

相关内容