如何使用security / sssd将Active Directory与FreeBSD 10.0集成?

在FreeBSD 10.0中运行Windows Server 2012 R2的Active Directory中使用sssd与AD后端与Kerberos TGT一起工作,对用户进行身份validation所需的步骤是什么?

有一些棘手的考虑,使所有的东西都是现成的。 FreeBSD现在只支持sssd版本1.9.6。 所以不支持企业主要名称。

如果你有一个不匹配UPN的域,它将无法login,因为在这个过程中Kerberosauthentication将失败,即使FreeBSD支持使用Kerberos的企业主体名称, sssd也不能处理这种情况。

因此,在sssd实际版本中,您仅限于在同一个域名中包含用户主体名称,例如:

 Domain Name = example.com NetBIOS Name = EXAMPLE User Principal Name: [email protected] sAMAccountName: username 

知道这一点,我们可以描述在FreeBSD上成功validationAD用户的步骤。

1.configurationKerberos

使用以下内容创build文件/etc/krb5.conf

 [libdefaults] default_realm = EXAMPLE.COM dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d forwardable = yes 

2.安装Samba 4.1并将其configuration为join域

安装Samba 4.1:

 $ pkg install samba41 

使用以下内容创build文件/usr/local/etc/smb4.conf

 [global] security = ads realm = EXAMPLE.COM workgroup = EXAMPLE kerberos method = secrets and keytab client signing = yes client use spnego = yes log file = /var/log/samba/%m.log 

询问pipe理员Kerberos票据:

 $ kinit Administrator 

然后join域并创build一个keytab

 $ net ads join createupn=host/[email protected] -k $ net ads keytab create -k 

3.安装带有Kerberos支持的sssd软件包和Cyrus SASL

安装所需的软件包

 $ pkg install sssd cyrus-sasl-gssapi 

编辑文件/usr/local/etc/sssd/sssd.conf以匹配此设置:

 [sssd] config_file_version = 2 services = nss, pam domains = example.com [nss] [pam] [domain/example.com] # Uncomment if you need offline logins #cache_credentials = true id_provider = ad auth_provider = ad access_provider = ad chpass_provider = ad # Comment out if the users have the shell and home dir set on the AD side default_shell = /bin/tcsh fallback_homedir = /home/%u # Uncomment and adjust if the default principal SHORTNAME$@REALM is not available #ldap_sasl_mech = GSSAPI #ldap_sasl_authid = [email protected] 

4.将sssd支持添加到nsswitch.conf

编辑文件/etc/nsswitch.conf以匹配这个设置:

 group: files sss passwd: files sss 

5.configurationPAM以允许sssdauthentication并处理主目录创build

安装用于创build主目录的可选软件包:

 $ pkg install pam_mkhomedir 

修改必要的PAM域以匹配此设置:

 auth sufficient /usr/local/lib/pam_sss.so account required /usr/local/lib/pam_sss.so ignore_unknown_user session required /usr/local/lib/pam_mkhomedir.so mode=0700 session optional /usr/local/lib/pam_sss.so password sufficient /usr/local/lib/pam_sss.so use_authtok 

6.切换到启用SASL的OpenLDAP客户端

 $ pkg remove -f openldap-client $ pkg install openldap-sasl-client 

7.最后确认一切正常

 $ getent passwd <username> 

你在用哪个Kerberos? 内置的MIT或安全/ krb5?

在安装sssd时,需要安装secure / krb5,目前在FreeBSD上仍然被认为是实验性的。 因此这个问题。

在执行“getent”命令时,我没有任何运气获取AD用户/组。 这可能是由于NETBIOS名称与域名不同,在我的情况下,域名是dawnsign.com,NETBIOS名称是DSP。

我只configuration了pam.dlogin模块。 还有哪些其他pam模块需要进行编辑才能成功进行身份validation?

任何额外的信息将不胜感激!

从端口重新编译samba4是可能的,即使没有sssd,也可以使用像linux一样的winbindauthentication。 在启用sasl ldap后,从端口重新编译samba4

  pkg remove samba41 pkg install cyrus-sasl-gssapi samba36-libsmbclient pam_mkhomedir ldb pkg remove -f openldap-client pkg install openldap-sasl-client cd /usr/ports/security/sssd && make install 

这将重新编译与所需的所有支持(gssapi,ldap,kerberos)桑巴然后编辑nsswitch.conf像这样

 passwd: files winbind group: files winbind 

你好,

这是使用sssd v1.11.7的小小更新

如果您使用“id_provider = ad”,并在sssd日志文件中看到以下错误: /var/log/sssd/sssd_example.com.log (Sun Oct 5 18:41:37 2014) [sssd[be[alidaho.com]]] [sasl_bind_send] (0x0020): ldap_sasl_bind failed (-12)[Not Supported] (Sun Oct 5 18:41:37 2014) [sssd[be[alidaho.com]]] [sasl_bind_send] (0x0080): Extended failure message: [unknown error] ​

您可以使用以下过程来解决此问题,并使AD集成正常工作。 现在使用Samba支持构buildsssd v1.11.7,需要从src构buildsssd,以便与libsasl2

​pkg remove samba41 pkg install cyrus-sasl-gssapi samba36-libsmbclient pam_mkhomedir ldb pkg remove -f openldap-client pkg install openldap-sasl-client cd /usr/ports/security/sssd && make install ​

这是我写这篇文章的时候通过SSSD与这些版本的FreeBSD进行AD集成的指南(6/2017)

  • FreeBSD 10.3和11.0(10.3-RELEASE-p18和11.0-RELEASE-p9)
  • 安装(以及有趣的打包和依赖性问题)

    • 所需的软件包似乎与Heimdal Kerberos不兼容,因此必须在启用MIT Kerberos标志的情况下进行安装和编译。 这可能比实际的兼容性问题更像是一个打包依赖问题。
    • Heimdal与基本系统一起安装,因此如果您安装了MIT Kerberos(一个设置在/usr/bin ,另一个设置在/usr/local/bin ,则会为您提供两套Kerberos命令。 由于没有基本系统文件似乎在一个包中,你不能简单地删除Heimdal KRB的东西。 有些事情要注意。
    • 各种软件包的转发依赖关系(有趣的粗体斜体,斜体斜体粗体):

      • net-mgmt/adcli: net/openldap24-sasl-client
      • security/cyrus-sasl2-gssapi: security/cyrus-sasl2
      • net/openldap24-sasl-client: security/cyrus-sasl2
      • security/sssd: security/nss
      • security/sssd: security/krb5
      • security/sssd: security/cyrus-sasl2
      • security/sssd: net/openldap24-client
      • security/sssd: lang/python27
      • security/sssd: lang/python2
      • security/sssd: dns/c-ares
      • security/sssd: devel/tevent
      • security/sssd: devel/talloc
      • security/sssd: devel/popt
      • security/sssd: devel/pcre
      • security/sssd: devel/libunistring
      • security/sssd: devel/libinotify
      • security/sssd: devel/gettext-runtime
      • security/sssd: devel/ding-libs
      • security/sssd: devel/dbus
      • security/sssd: databases/tdb
      • security/sssd: databases/ldb
    • 各种软件包的反向依赖关系:

      • net/openldap24-sasl-client: sysutils/msktutil
      • net/openldap24-sasl-client: net/nss-pam-ldapd-sasl
      • net/openldap24-sasl-client: net-mgmt/adcli
        • 正如我们所见, sssd本身需要MIT Kerberos,尽pipe我们有Heimdal作为基础包
        • adcli openldap-sasl-client ,但其他软件包(包括sssd子依赖sssd )需要拉入openldap-client ,这是与sasl客户端互斥(无论什么原因)。 即使使用最less的二进制包,这也会使安装变得有点痛苦。
        • 这些依赖关系对于二进制回购软件包都是存在的,并且如果软件包是在ports树中构build的。 这需要一个恼人的特定安装方法来获取我们需要的一切(下面将会介绍)。
    • 在撰写本文时,FreeBSD的SSSD二进制包不包括SSSD中的AD支持

      • 必须使用适当的(make config)选项启用SSSD的端口版本:
        • SMB
      • SSSD也希望在openldap-client中引用,当它真的需要openldap-sasl-client才能正常工作。
    • adcli的pkg二进制版本存在,但在撰写本文时不起作用。
      • 同样,端口版本在启用适当选项的情况下编译:
        • GSSAPI_MIT
    • cyrus-sasl-gssapi是必需的,但pkg二进制版本不起作用,并且具有奇怪的相关性问题,导致它删除SSSD。
      • 使用启用MIT-KRB5选项的端口构build它:
        • GSSAPI_MIT
    • openldap-sasl-client是function所必需的,但SSSD想要拉入非SASL版本的openldap。
      • 做这个工作
        • 在端口中selectGSSAPI选项( make config )来configurationopenldap-sasl-client
        • 做在港口build造它
        • 在安装之前,请执行pkg remove –f openldap-client
          • 这将删除openldap-client而不做任何其他包的自动删除(如SSSD),并允许安装SASL版本
        • openldap-sasl-client进行make install
          • 这会将其安装到系统中
    • 这将提供具有ADfunction的functionSSSD所需的function。
    • 请注意,如果您从端口编译SSSD,它将引入大量的依赖关系,这将导致它们被构build,并要求selectconfiguration选项。
      • build议先用pkg install sssd安装二进制包,然后用pkg remove –f sssd删除它
        • 这将导致SSSD需要拉入的大部分东西的二进制包,并删除需要build立所有这些取决于港口,这需要相当一段时间。
      • 一旦删除,重新安装SSSD从上面提到的选项启用的端口,你只需要重build上面提到的四个包得到一个工作设置。
    • (可选)一切正常并validation完毕后,可以使用pkg create创build启用了适当选项的四个软件包的二进制包,并使用这些包而不是在每个系统的端口上构build它们。 二进制安装遵循与端口构build过程类似的模式:

      • pkg install sssd-1.11.7_8.txz
        • 当然你的版本可能会有所不同
        • 这将安装SSSD的二进制包,并从FreeBSD的仓库中取出所需的所有东西。
      • pkg add其他软件包(不安装,添加),最后保存openldap软件包。
      • 在添加openldap-sasl-client请执行pkg remove –f openldap-client
        • 这摆脱了非SASL版本,并允许我们的版本被安装
      • pkg add openldap-sasl-client-2.4.44.txz
        • 再一次,你的版本可能会有所不同
      • 您应该安装所需的软件包。
      • 在执行pkg create之前, 可能会更改SSSD二进制文件的元数据,以便用openldap-sasl-clientreplace对openldap-client的依赖关系,以便删除/重新安装。 我没有时间去研究这个。
        • 另外,还有SSSD的子依赖关系,它们也会引入openldap-client ,所以你也必须修复这些依赖关系。
      • 请注意,所有这些笔记都是截至本文撰写时 ,当前位于ports树中的这些包的版本,以及它们与之相关的依赖关系。 这一切都可能随FreeBSD更新ports树和二进制文件而改变。 也许有一天,我们将拥有一个二进制版本的所有东西,所有的正确的依赖关系,适当的选项configuration为ADfunction开箱即用。
    • Kerberosconfiguration:

      • 示例/etc/krb5.conf文件:
 [libdefaults]
    default_realm = MYDOMAIN.NET
   可转换= true
 #通常情况下,你需要在AD环境中,因为DNS SRVlogging
 #将识别AD / KRB服务器/服务。 评论如果你
 #想要手动指向你的AD服务器
 dns_lookup_kdc = true
 [领域]
    MYDOMAIN.NET = {
 #如果您手动指向与DNS中不同的AD服务器
 #admin_server = adserver.mydomain.net
 #kdc = adserver.mydomain.net
    }
 [domain_realm]
    mydomain.net = MYDOMAIN.NET
    .mydomain.net = MYDOMAIN.NET
  • (缩进)
    • SSSDconfiguration:
      • 示例/usr/local/etc/sssd/sssd.conf文件:
 [SSSD]
 config_file_version = 2
域= MYDOMAIN.NET
服务= nss,pam,pac
 fallback_homedir = / home /%u

 [域/ MYDOMAIN.NET]
 id_provider = ad
 access_provider = ad
 auth_provider = ad
 chpass_provider = ad
 #使用AD POSIX属性
 ldap_id_mapping = False
 cache_credentials = true
 ad_server = adserver.mydomain.net
 #如果您没有bash,或AD帐户的loginShell中有任何内容
 #属性安装
 override_shell = / bin / tcsh
  • (缩进)
    • PAMconfiguration:
      • 在写这篇文章的时候,FreeBSD上的PAMconfiguration是令人沮丧的。
        • 无论出于何种原因,其行为不一定与PAM或PAM README文件的手册页中描述的行为相匹配
        • 它与SSHD的交互很大程度上取决于configuration了哪个sshd_config选项。
        • 没有简单的linux authconfig style命令为SSSD正确设置PAM文件。 相反,您必须直接编辑文件。
        • 我发现为了使SSSD能够与PAM sshd和system realm文件一起工作,必须禁用FreeBSD的一次性密码functionOPIE。 如果我不注释掉pam_opie.sopam_opieaccess.so行,PAM将允许用户在没有密码的情况下,或者根本不会让任何人login。我试图做这个工作,但似乎是不可能。
          • 如果任何人有运气让它在PAM中的OPIE的东西,请评论!
        • 为了让sshdsudosulogin和大多数正常的服务与SSSD和AD一起工作,我不得不修改sshd和system pam.d文件,还要创build一个默认系统文件的副本,我称其为system.dist ,并将其包含在su文件中而不是修改后的系统中。 否则su停止工作。
        • 下面是我必须修改的/etc/pam.d文件的列表,以使SSSD能够在FreeBSD中工作:

上将/etc/pam.d/sshd:

 #
 #$ FreeBSD:releng / 11.0 /etc/pam.d/sshd 197769 2009-10-05 09:28:54Z des $
 #
 #“sshd”服务的PAMconfiguration
 #

 #auth
 #禁用禁用。 启用opie似乎打破了添加其他的东西
 #modules,如pam_sss.so。 它打破了任何人都可以login的方式
 #if pam_sss.so设置为必需,它打破本​​地loginw /密码
 #足够的pam_opie.so no_warn no_fake_prompts
 #auth requisite pam_opieaccess.so no_warn allow_local
 #足够的pam_krb5.so no_warn try_first_pass
 #足够的pam_ssh.so no_warn try_first_pass
 auth足够pam_unix.so no_warn try_first_pass nullok
 auth足够pam_sss.so use_first_pass
 #如果在sshd_conf中使用PasswordAuthentification yes,则这些行是必需的
 #而不是ChallengeResponseAuthentication是的。 如果你使用
 #ChallengeResponseAuthentication yes然后注释掉这些行。 然而
 #如果使用PasswordAuthentification yes,则在login时更改密码(过期
 #密码)将不起作用,因为这会导致sshd调用/ bin / passwd,哪个
 #在FreeBSD上不支持KRB。  ChallengeResponeAuthentification会的
 #工作,但会要求你的旧密码两次。  
 #auth需要pam_deny.so

 #帐户
需要帐户pam_nologin.so
 #account需要pam_krb5.so
需要帐户pam_login_access.so
帐户需要pam_unix.so
足够的帐户pam_sss.so

 #会话
 #session可选pam_ssh.so want_agent
会话可选pam_sss.so
 #安装security / pam_mkhomedir,并取消注释,自动制作家用目录
 #session需要pam_mkhomedir.so模式= 0700
会话需要pam_permit.so

 #密码
 #password足够的pam_krb5.so no_warn try_first_pass
 #password足够的pam_unix.so try_first_pass use_authtok nullok
足够的密码pam_unix.so try_first_pass use_authtok
足够的密码pam_sss.so use_authtok

/etc/pam.d/system:

 #
 #$ FreeBSD:releng / 11.0 / etc / pam.d / system 197769 2009-10-05 09:28:54Z des $
 #
 #系统范围的默认值
 #

 #auth
 auth足够pam_opie.so no_warn no_fake_prompts
 auth requisite pam_opieaccess.so no_warn allow_local
 #足够的pam_krb5.so no_warn try_first_pass
 #足够的pam_ssh.so no_warn try_first_pass
 #auth需要pam_unix.so no_warn try_first_pass nullok
validation足够的pam_unix.so no_warn try_first_pass
 auth足够pam_sss.so use_first_pass
 auth需要pam_deny.so

 #帐户
 #account需要pam_krb5.so
需要帐户pam_login_access.so
帐户需要pam_unix.so
足够的帐户pam_sss.so

 #会话
 #session可选pam_ssh.so want_agent
会话需要pam_lastlog.so no_fail
会话可选pam_sss.so
 #安装security / pam_mkhomedir,并取消注释,自动制作家用目录
 #session需要pam_mkhomedir.so模式= 0700

 #密码
 #password足够的pam_krb5.so no_warn try_first_pass
 #password必需pam_unix.so no_warn try_first_pass
足够的密码pam_unix.so no_warn try_first_pass nullok use_authtok
足够的密码pam_sss.so use_authtok

/etc/pam.d/su中:

 #
 #$ FreeBSD:releng / 11.0 /etc/pam.d/ su 219663 2011-03-15 10:13:35Z des $
 #
 #“su”服务的PAMconfiguration
 #

 #auth
 auth足够pam_rootok.so no_warn
 auth足够pam_self.so no_warn
 auth requisite pam_group.so no_warn group = wheel root_only fail_safe ruser
 auth包含system.dist

 #帐户
账户包括system.dist

 #会话
会话需要pam_permit.so
  • (缩进)

    • 笔记:
      • system.dist是股票/etc/pam.d/system文件的副本。 它包含在上面的/etc/pam.d/su文件中,以防止su命令出现问题。
      • 一个仍然可以作为根帐户的AD帐户,因为一旦根, su不需要authentication,帐户信息通过名称服务开关通过SSSD拉。
      • 如果你真的想从一个用户(不是root用户)切换到另一个用户,你应该单独使用sudo
      • 您也可以使用ksu ,并且用于从用户A切换到用户B.
        • Heimdal的ksu (在/usr/bin )默认没有设置SUID
          • 为了使Heimdal ksu工作, chmod u+s /usr/bin/ksu
        • MIT Kerberos(安装在/usr/local/bin krb5软件包)在安装时是SUID
      • 由于Heimdal是基本包的一部分,因此您将拥有两套Kerberos二进制文件。
        • 您可能需要调整默认path,以便/usr/local/bin位于/usr/bin之前
      • ksu将提示用户input目标用户的AD / Kerberos密码
      • 即使您将pam_sss.so添加到passwd PAM文件, passwd也无法更改您的AD / Kerberos密码。 passwd二进制文件仅支持本地和NIS使用kpasswd在AD / Kerberos服务器上更改您的密码。
    • 名称服务开关:

      • 应将/etc/nsswitch.conf文件configuration为使用密码和组的sss服务。 例:
        • group: files sss
        • passwd: files sss
    • join域名:

      • 在* nixs上有两个主要工具可以join你的linux系统
        • adcli
          • 这是我首选的工具。 它工作得很好,一切都可以在一个命令行上完成。 凭证可以非交互方式给出(通过stdin等)
          • 在使用之前不需要做一个kinit ,它是基于提供的信誉为你做的。
            • 例:
              • adcli join -D mydomain.net -U Administrator--show-details –v
              • adcli join –H adclient.mydomain.net -D mydomain.net -U Administrator --show-details -v
                • build议使用这种forms,因为该实用程序并不总是正确地找出FQDN。 当您提供与主机的正向和反向DNS匹配的FQDN时,正确创build原则。 如果该实用程序使用不正确的主机名(例如不包括DNS域),则某些服务主体将不会创build,而SSH等主机可能会失败。
        • Samba net实用程序
          • net utility是Samba套件的一部分。
          • 此实用程序要求在smb.confconfiguration文件中设置域详细信息,这使得使用起来更加困难和不便,特别是非交互式。
          • 此工具还要求您在使用kinit之前获取Kerberos票证。 再次,这是更不方便的,并且使得在脚本中非交互地使用有点困难,因为有两个步骤而不是一个步骤。
    • SSHD注意事项:

      • 让SSHD与AD和SSSD一起工作通常相当简单
      • 需要将以下选项添加到/etc/ssh/sshd_config
        • GSSAPIAuthentication yes
          • 为SSHD打开GSS APIauthentication。 这将导致SSHD对AD KDC进行授权
        • PasswordAuthentication yes
          • 允许用户使用密码login。 如果您希望用户在login时获得KRB5票据,则为必填项。 如果未启用此function,系统将无法解密由KDC发送的TGT。
        • ChallengeResponseAuthentication yes
          • 对于FreeBSD来说,这个方法似乎效果最好。
            • 确保在使用此选项时configurationPasswordAuthentication no
            • 这是我为FreeBSD发现的唯一一种在login时更改过期密码的方法。 如果使用另一个,它会调用/bin/passwd ,除了NIS和本地passwd文件之外,它不支持任何内容。
        • GSSAPICleanupCredentials yes
          • (可选)退出时将执行kdestroy
        • GSSAPIStrictAcceptorCheck no
          • (可选)如果SSHD对自己的主机名称感到困惑,或者是多宿主等,或者使用不同的服务主体与KDC进行通信,则通常需要此选项。 通常,SSHD将使用服务主体host/<FQDN>@REALM与KDC通话,但有时会出错(例如,如果主机名与SSH服务器的DNS名称不匹配)。 此选项允许SSHD使用/etc/krb5.keytab文件中的任何主体,其中包括正确的host/<FQDN>@REALM
      • 根据您使用的选项的组合,您可能需要也可能不需要将主机主机添加到KDC,以获取主机的IPv4和IPv6地址,以便ssh -K <ip>在不提示input密码的情况下工作(假定您已完成当然已经是'kinit'了)。