Authentication

無法在使用 ldap auth for samba 的系統上添加本地使用者

  • March 6, 2014

嘗試將本地使用者添加到使用 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 沒有本地選項。在存在 ldap 身份驗證的情況下,如何讓 adduser 正常工作以添加本地使用者。

其他需要考慮的事項:

  • 目前有本地使用者與 ldap 條目(具有不同的 uidNumber)共享一個 uid,他們可以獨立訪問 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 的笨拙混搭,而誰知道呢,CentOS 6.x 使用了漂亮而簡單的 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 的參數是錯誤的,就沒有回頭路了。

這兩種解決方法都不是最佳的,但如果系統管理員發現自己處於 LDAP 和本地密碼文件相互阻塞的棘手情況,它們確實為系統管理員提供了一種前進的方式。

**解決方法 1:**我創建了一個具有不同 UID(使用者名)的本地使用者,以便為已經擁有 LDAP/Samba 條目的人提供 ssh 訪問權限。可能是我多年來做過的最俗氣的系統管理員解決方案。

**解決方法 2:**稍微複雜一點,但歸結為添加具有與 LDAP 中相同的 uidNumber 的本地使用者。

  1. 使用 getent、ldapsearch 或 smbldap-usershow 查找 LDAP uidNumber
  2. 暫時禁用 LDAP 中的使用者,以便添加本地使用者而不會發生衝突
  3. 創建將 uidNumber 與 LDAP 匹配的本地帳戶
  4. 在 LDAP 中重新啟用使用者

這兩種方法都有效,但都沒有解決允許身份驗證僅將 LDAP 用於 Samba 身份驗證和 /etc/passwd 用於本地身份驗證的根本問題。但是在沒有其他解決方案的情況下,這將不得不這樣做。

我的最後一個答案很糟糕,忽略它。

我相信您唯一的選擇是手動編輯/etc/passwd(vipw是首選,因為它可以使您免於自己的錯誤)。該-o選項允許您為一個 UID 創建多個名稱,但沒有等效選項可以告訴passwd在執行 NSS 查找時忽略已經存在的名稱。

getent passwd添加使用者後,將向您展示 uids 如何級聯;第一個條目獲勝。確保 uid 相同以避免轉移權限的問題。(您的範例不包括-u語法)

引用自:https://serverfault.com/questions/526646