无法在使用 ldap auth for samba 的系统上添加本地用户

无法在使用 ldap auth for samba 的系统上添加本地用户

尝试将本地用户添加到使用 ldap 进行 Samba 身份验证的 CentOS 6.3 系统,但受到 ldap 中用户现有条目的阻碍。

[root@samba ~]# adduser wchandy
adduser: user 'wchandy' already exists

[root@samba ~]# useradd wchandy
useradd: user 'wchandy' already exists

用户还不是本地用户:

[root@edgar2 ~]# grep wchandy /etc/passwd

但他们是 ldap 中的 Samba 用户:

[root@edgar2 ~]# smbldap-usershow wchandy | grep uid
dn: uid=wchandy,ou=people,dc=ucsc,dc=edu
uid: wchandy
uidNumber: 30490

adduser 没有本地选项。如何才能让 adduser 在有 ldap 身份验证的情况下正常工作以添加本地用户。

其他需要考虑的事项:

  • 当前有本地用户与 ldap 条目共享 uid(具有不同的 uidNumber),他们可以独立访问 samba 和 ssh。
  • 不,我不想直接将用户编辑到 /etc/passwd 和 /etc/group 中。我想修复根本问题。此外,本地条目会干扰对 samba 的访问。
  • 不,我不想依赖 ldap 进行本地 ssh 登录。
  • 不,我不想为用户使用不同的 uid。

我最初使用方便(但似乎不可逆)的 authconfig 命令设置了我的 samba-ldap 身份验证:

[root@samba ~]# authconfig --enableshadow --enablemd5 --enableldap \
--enableldapauth --enableldaptls --enablemkhomedir \
--ldapserver=dir.mydomain.com --ldapbasedn="dc=mydomain,dc=com" \
--enablelocauthorize --updateall

我的 /etc/sysconfig/authconfig 如下所示:

IPADOMAINJOINED=no
USEMKHOMEDIR=yes
USEPAMACCESS=no
CACHECREDENTIALS=yes
USESSSDAUTH=no
USESHADOW=yes
USEWINBIND=no
PASSWDALGORITHM=sha512
FORCELEGACY=no
USEFPRINTD=yes
USEHESIOD=no
FORCESMARTCARD=no
USEDB=no
USELDAPAUTH=yes
IPAV2NONTP=no
USELDAP=yes
USECRACKLIB=yes
USEIPAV2=no
USEWINBINDAUTH=no
USESMARTCARD=no
USELOCAUTHORIZE=yes
USENIS=no
USEKERBEROS=no
USESYSNETAUTH=no
USESSSD=no
USEPASSWDQC=no

我的 samba 配置已从 RHEL4.x 系统迁移到 CentOS 6.3。现在 CentOS 6.x 不再使用 nss 和 pam 的笨拙组合,谁知道是什么,而是使用非常精巧和易用的 sssd。

我的 /etc/sssd/sssd.conf 如下所示:

[domain/default]

cache_credentials = True
#cache_credentials = False
ldap_search_base = dc=mydomain,dc=com
krb5_realm = EXAMPLE.COM
krb5_server = kerberos.example.com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://dir.mydomain.com/
ldap_tls_cacertdir = /etc/openldap/cacerts
#ldap_tls_reqcert = allow

entry_cache_timeout = 5

debug_level = 31

[sssd]
config_file_version = 2
services = nss, pam
# SSSD will not start if you do not configure any domains.
# Add new domain configurations as [domain/<NAME>] sections, and
# then add the list of domains (in the order you want them to be
# queried) to the "domains" attribute below and uncomment it.
# domains = LDAP
domains = default

#debug_level = 31

[nss]

[pam]

debug_level = 31

谢谢你的帮助。如果我能让本地和 samba-ldap 身份验证独立工作,我会很兴奋。

更新:虽然下面有一些相当有效的解决方法,但以下是我从 sssd_users 列表中的专家那里得到的建议的解释:“是的,它可能在使用 nss 和 pam 的早期操作系统版本中有效,但允许共享 UID 并不是最佳做法。使用 sssd 的较新系统可以防止这种情况发生。”虽然我的用例完全有效,但我的系统故意阻止了我想要做的事情。

但是,我始终没有找到取消或逆转 authconfig 对我的系统造成的诸多变化的方法。因此,如果我提供给 authconfig 的参数有误,就无法挽回了。

答案1

我上一个回答很糟糕,请忽略它。

我相信您唯一的选择是手动编辑/etc/passwdvipw这是首选,因为它可以避免您自己犯错)。该-o选项允许您为一个 UID 创建多个名称,但没有等效选项来告诉它passwd在执行 NSS 查找时忽略已经存在的名称。

getent passwd将显示添加用户后 uid 如何级联;第一个条目获胜。确保 uid 相同,以避免权限转移问题。(您的示例未包含-u语法)

答案2

这两种解决方法都不是最佳的,但是,当系统管理员发现自己处于 LDAP 和本地密码文件互相阻塞的棘手情况时,它们确实为他们提供了一种前进的方法。

解决方法 1:我创建了一个具有不同 UID(用户名)的本地用户,以便为已有 LDAP/Samba 条目的人提供 ssh 访问权限。这可能是我多年来做过的最愚蠢的系统管理员解决方案。

解决方法 2:稍微复杂一点,但归根结底是添加具有与 LDAP 中相同的 uidNumber 的本地用户。

  1. 使用 getent、ldapsearch 或 smbldap-usershow 查找 LDAP uidNumber
  2. 暂时禁用 LDAP 中的用户,以便添加本地用户而不会发生冲突
  3. 使用 LDAP 创建与 uidNumber 匹配的本地帐户
  4. 在 LDAP 中重新启用用户

这两种方法都有效,但都没有解决允许身份验证仅使用 LDAP 进行 Samba 身份验证和使用 /etc/passwd 进行本地身份验证的根本问题。但在没有其他解决方案的情况下,只能这样做。

相关内容