Samba:使用 winbind 针对 Active Directory 进行身份验证,但针对单独的 OpenLDAP 服务器进行授权

Samba:使用 winbind 针对 Active Directory 进行身份验证,但针对单独的 OpenLDAP 服务器进行授权

简洁版本

如何配置 CentOS 7 机器,使用 Samba 4.8.0 为 Windows 7 客户端上的用户提供服务认证使用他们的域登录凭据(winbindd和 Active Directory),但已授权(即针对单独的 OpenLDAP 服务器执行用户/组查找)?

这是简单的使用 CentOS 6 和 Samba 回退机制。一旦必须使用 winbind,情况似乎会更加复杂。

长版本

我们有一台 CentOS 7 计算机,需要与 Active Directory 域(我不控制)中的 Windows 7 计算机共享文件,供 EXAMPLE.COM 域中的用户使用,但针对 ldap.mydomain.com 上的单独 OpenLDAP 服务器(我控制)执行用户/组查找。使用当前版本的 CentOS 7(截至 Samba 4.8.0),winbindd 后备不再可用,需要 winbindd

因此我们执行以下操作:

  • 打开防火墙端口 445(但为了测试,systemctl stop firewalld
  • 设置 SELinux 布尔值以共享主目录(但用于测试,setenforce 0
  • 添加对已认证 ldap.mydomain.com 的证书颁发机构的信任(已测试并且 LDAP 查找在系统上正常运行)
  • 安装包samba,,,,和samba-clientsamba-winbindsamba-winbind-clientssamba-winbind-krb5-locator
  • net ads join -U 'user'(域允许非管理员创建机器账户;net ads testjoin返回‘加入成功’)
  • authconfig --enablesssd --enablesssdauth --disablemkhomedir --update

以下是smb.conf针对 winbind 的规定,上面没有对其进行配置authconfig

[global]
    strict locking = no
    workgroup = EXAMPLE
    server string = Samba Server Version %v
    disable netbios = yes
    log file = /var/log/samba/log.%m
    max log size = 50
    security = ads
    realm = EXAMPLE.COM
    ldap ssl = off
    idmap config * : backend = ldap
    idmap config * : ldap_url = ldaps://ldap.mydomain.com:636/
    idmap config * : ldap_base_dn = dc=mydomain,dc=com
    idmap config * : ldap_user_dn = uid=samba,ou=agents,dc=mydomain,dc=com
    idmap config * : read only = yes
    idmap config * : range = 1000-65535
    kerberos method = secrets and keytab
    load printers = no
    printcap name = /dev/null
    printing = bsd
    disable spoolss = yes
[home]
    comment = Home Directories
    path = /home/%U
    browseable = no
    writable = yes
    create mask = 0600
    directory mask = 0700
    valid users = EXAMPLE\%U
    preexec = ls /home/%U
[share]
    path = /home/share
    writable = yes
    valid users = @share
    force group = share
    create mask = 0660
    directory mask = 0770
    preexec = ls /home/share

问题如下:

  • smbclient //myhost.fqdn/home -U <user>执行 winbind 身份验证并成功连接到共享,任何值为<user>
  • smbclient //myhost.fqdn/share -U <user执行 winbind 身份验证,但无法确定 ldap.mydomain.com 是否<user>属于“共享”组,因此返回tree connect failed: NT_STATUS_ACCESS_DENIED

附加信息:

  • testparm没有显示任何错误或警告
  • wbinfo -u返回 EXAMPLE.COM 域用户列表
  • wbinfo -g返回 EXAMPLE.COM 域组列表
  • 域用户的 SSH 登录(即 ssh user@host)有效
  • log.winbindd-idmap显示:
[2019/06/08 15:58:23.175342,  3] ../source3/winbindd/idmap.c:397(idmap_init_domain)
  idmap backend ldap not found
[2019/06/08 15:58:23.177972,  3] ../lib/util/modules.c:167(load_module_absolute_path)
  load_module_absolute_path: Module '/usr/lib64/samba/idmap/ldap.so' loaded
[2019/06/08 15:58:23.179407,  2] ../source3/lib/smbldap.c:847(smbldap_open_connection)
  smbldap_open_connection: connection opened
[2019/06/08 15:58:23.340963,  3] ../source3/lib/smbldap.c:1069(smbldap_connect_system)
  ldap_connect_system: successful connection to the LDAP server
[2019/06/08 15:58:23.343603,  1] ../source3/winbindd/idmap_ldap.c:484(idmap_ldap_db_init)
  idmap_ldap_db_init: failed to verify ID pool (NT_STATUS_UNSUCCESSFUL)
[2019/06/08 15:58:23.343810,  1] ../source3/winbindd/idmap.c:447(idmap_init_domain)
  idmap initialization returned NT_STATUS_UNSUCCESSFUL

设置更高的调试级别表明最终的 NT_STATUS_UNSUCCESSFUL 来自于尝试对 basedn 进行更改,但我不明白为什么idmap backend ldap not found会出现这种情况,或者为什么 Samba/winbind 需要对 LDAP 数据库进行更改,特别是在设置 readonly 属性时smb.conf。最后,我不确定这些行是否能解释问题。

我们有一个有效的 CentOS 6 部署,它在执行此拆分 Active Directory 身份验证并使用单独的 LDAP 用户/组查找时,无需 winbind 即可完美运行。我们如何在 CentOS 7 中使用 Samba 4.8.0 实现我们想要的功能?为什么idmap configsmb.conf 中的行没有指示 Samba 从中获取组成员身份信息ldap.mydomain.com

相关内容