我在使用 FreeBSD 10.3 时遇到了很多问题
我发现二进制包相当没用。我几乎必须构建所有东西才能让它们“工作”。我喜欢使用 adcli 工具加入域(比 samba 好多了)。但是 pkg 中的二进制版本不起作用。从 ports 构建它并启用所有显而易见的东西可以让它工作。
此时,我已经可以成功执行“getent”了,但无论我怎么尝试,它都不会对我的帐户进行身份验证。SSH、sudo,甚至直接运行登录,它的行为就像我的密码不正确一样。
我想知道我是否需要使用 heimdal krb 包而不是 MIT?
以下是我的相关配置:
krb5.conf:
[libdefaults]
default_realm = MYDOMAIN-SR.NET
forwardable = true
[realms]
MYDOMAIN-SR.NET = {
admin_server = ad.mydomain-sr.net
kdc = ad.mydomain-sr.net
}
[domain_realm]
mydomain.net = MYDOMAIN-SR.NET
.mydomain.net = MYDOMAIN-SR.NET
MYDOMAIN.net = MYDOMAIN-SR.NET
.MYDOMAIN.net = MYDOMAIN-SR.NET
nsswitch.conf:
#
# nsswitch.conf(5) - name service switch configuration file
# $FreeBSD: releng/10.3/etc/nsswitch.conf 224765 2011-08-10 20:52:02Z dougb $
#
#group: compat
group: files sss
#group_compat: nis
hosts: files dns
networks: files
#passwd: compat
passwd: files sss
#passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files
sssd.conf:
[sssd]
config_file_version = 2
#domains = mydomain-sr.net
domains = MYDOMAIN-SR.NET
services = nss, pam, pac
fallback_homedir = /home/%u
debug_level = 9
[pam]
pam_verbosity = 3
[domain/MYDOMAIN-SR.NET]
id_provider = ad
access_provider = ad
auth_provider = ad
chpass_provider = ad
ldap_id_mapping = False
#cache_credentials = true
cache_credentials = false
ad_server = ad.mydomain-sr.net
override_shell = /bin/tcsh
#ldap_sasl_canonicalize = false
#krb5_canonicalize = false
答案1
(从另一个问题复制而来。这些是我关于如何在具有现有 AD 基础设施的大型客户机上使所有这些工作正常进行的笔记/指南)
这是我在撰写本文时(2017 年 6 月)通过 SSSD 与这些版本的 FreeBSD 进行 AD 集成的指南
- FreeBSD 10.3 和 11.0(10.3-RELEASE-p18 和 11.0-RELEASE-p9)
- 安装(以及有趣的打包和依赖问题)
所需的软件包似乎与 Heimdal Kerberos 不兼容,因此必须在启用 MIT Kerberos 标志的情况下安装和编译。这很可能是软件包依赖性问题,而不是实际的兼容性问题。
Heimdal 随基本系统一起安装,因此如果您安装 MIT Kerberos,则将留下两组 Kerberos 命令,一组在 中
/usr/bin
,另一组在 中/usr/local/bin
。由于基本系统文件似乎都不在包中,因此您不能简单地删除 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,尽管我们有 Heimdal 作为基础包 adcli
需要openldap-sasl-client
,但其他软件包(包括 的子依赖项sssd
)会拉入openldap-client
,而 是与 sasl 客户端互斥的(无论出于什么愚蠢的原因)。这使得安装有点麻烦,即使使用一组最小的二进制软件包。- 这些依赖关系对于二进制 repo 包和在 ports 树中构建的包都存在。这需要一种烦人的特殊安装方法来获得我们需要的一切(如下所述)。
- 我们看到
截至撰写本文时,FreeBSD 的 SSSD 二进制包不包括 SSSD 中的 AD 支持
- 必须构建 SSSD 的端口版本并启用适当的 (make config) 选项:
SMB
- SSSD 还想引入 openldap-client,但实际上它需要 openldap-sasl-client 才能正常运行。
- 必须构建 SSSD 的端口版本并启用适当的 (make config) 选项:
pkg 二进制版本
adcli
存在,但在撰写本文时,还不起作用。- 再次强调,ports 版本是在启用了适当的选项的情况下进行编译的:
GSSAPI_MIT
- 再次强调,ports 版本是在启用了适当的选项的情况下进行编译的:
cyrus-sasl-gssapi
是必需的,但是 pkg 二进制版本不起作用,并且存在奇怪的依赖问题,导致它删除 SSSD。- 从启用了 MIT-KRB5 选项的端口构建它:
GSSAPI_MIT
- 从启用了 MIT-KRB5 选项的端口构建它:
openldap-sasl-client
是功能所必需的,但 SSSD 想要引入非 SASL 版本的 openldap。- 为了实现这一目标
openldap-sasl-client
使用在端口中GSSAPI
选择的选项 ( )进行配置。make config
- 在端口中进行构建
- 在进行安装之前,请执行以下操作
pkg remove –f openldap-client
- 这将删除
openldap-client
任何其他软件包(如 SSSD),但不执行任何自动删除,并允许安装 SASL 版本
- 这将删除
- 执行 make install
openldap-sasl-client
- 这会将其安装到系统中
- 为了实现这一目标
这将为具有 AD 功能的功能性 SSSD 提供所需的内容。
请注意,如果您从端口编译 SSSD,它将引入大量依赖项,这将导致构建它们,并需要选择配置选项。
- 建议您先使用 pkg install sssd 安装二进制包,然后使用
pkg remove –f sssd
- 这将导致 SSSD 需要引入大多数二进制包,并且无需在端口中构建所有这些依赖项,这需要相当长的时间。
- 删除后,从端口重新安装 SSSD,并启用上述选项,您只需要重建上面提到的四个包即可获得正常工作的设置。
- 建议您先使用 pkg install sssd 安装二进制包,然后使用
(可选)一切正常并经过验证后,您可以使用
pkg create
创建四个软件包的二进制包,并启用适当的选项,然后使用这些包,而不是在每个系统的端口中构建它们。二进制文件的安装遵循与端口构建过程类似的模式: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
- 再次强调,你的版本可能有所不同
- 您应该已经安装了所需的软件包。
- 它可能在执行 之前可以更改 SSSD 二进制文件的元数据,
pkg create
以替换对 的依赖,openldap-client
从而openldap-sasl-client
消除执行此删除/重新安装的需要。我还没有时间研究这样做。- 另外,SSSD 还有一些子依赖项也会被引入
openldap-client
,因此您也必须修复它们。
- 另外,SSSD 还有一些子依赖项也会被引入
- 请注意,所有这些说明均基于这些软件包当前在 ports 树中的版本截至撰写本文时以及它们所关联的依赖项。随着 FreeBSD 更新端口树和二进制文件,这一切都可能发生变化。也许有一天,我们将拥有所有内容的二进制版本,它可以提取所有正确的依赖项,并为 AD 功能配置正确的选项。
Kerberos 配置:
- 示例 /etc/krb5.conf 文件:
[libdefaults] default_realm = MYDOMAIN.NET 可转发 = true # 通常情况下,在 AD 环境中你需要的是 DNS SRV 记录 # 将识别 AD/KRB 服务器/服务。如果您 # 想要手动指向你的 AD 服务器 dns_lookup_kdc = true [境界] MYDOMAIN.NET = { # 如果您手动指向与 DNS 中不同的 AD 服务器 #admin_server = adserver.mydomain.net #kdc = adserver.mydomain.net } [域名] mydomain.net = MYDOMAIN.NET .mydomain.net = MYDOMAIN.NET
- (缩进)
- SSSD 配置:
- 此示例假定 AD 中用户和组的 POSIX 属性,通常在替换已经建立 UID 和 GID 的现有环境时需要。
- 示例 /usr/local/etc/sssd/sssd.conf 文件:
- SSSD 配置:
[sssd] 配置文件版本 = 2 域名 = MYDOMAIN.NET 服务 = nss、pam、pac fallback_homedir = /home/%u [域名/MYDOMAIN.NET] id_provider = 广告 access_provider = 广告 auth_provider = 广告 chpass_provider = ad # 使用 AD POSIX 属性,如果使用自动生成的,则注释掉 # UID 和 GID。 ldap_id_mapping = 假 缓存凭据 = true ad_server = adserver.mydomain.net # 如果你没有 bash,或者 AD 账户的 loginShell 中的任何内容 # 已安装属性 override_shell = /bin/tcsh
- (缩进)
- PAM 配置:
- 由于 OpenPAM 的工作方式,FreeBSD 上的 PAM 配置有点棘手。
/etc/pam.d
以下是我必须修改的文件列表,以使 SSSD 与 FreeBSD 一起工作:
- 由于 OpenPAM 的工作方式,FreeBSD 上的 PAM 配置有点棘手。
- PAM 配置:
/etc/pam.d/sshd:
# #$FreeBSD: releng/11.0/etc/pam.d/sshd 197769 2009-10-05 09:28:54Z des $ # #“sshd”服务的 PAM 配置 # # 授权 身份验证充分 pam_opie.so no_warn no_fake_prompts auth requisite pam_opieaccess.so no_warn allow_local #auth 足够 pam_krb5.so no_warn try_first_pass #auth 足够 pam_ssh.so no_warn try_first_pass 身份验证充分 pam_sss.so forward_pass 需要身份验证 pam_unix.so no_warn use_first_pass # 帐户 需要帐户 pam_nologin.so #需要帐户 pam_krb5.so 需要帐户 pam_login_access.so 帐户需要pam_unix.so 帐户足够的pam_sss.so # 会议 #会话可选 pam_ssh.so want_agent 会话可选 pam_sss.so 会话需要 pam_mkhomedir.so 模式=0700 会话需要 pam_permit.so # 密码 #密码足够 pam_krb5.so no_warn try_first_pass #密码足够 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/系统:
# #$FreeBSD: releng/11.0/etc/pam.d/system 197769 2009-10-05 09:28:54Z des $ # # 系统范围的默认值 # # 授权 身份验证充分 pam_opie.so no_warn no_fake_prompts auth requisite pam_opieaccess.so no_warn allow_local #auth 足够 pam_krb5.so no_warn try_first_pass #auth 足够 pam_ssh.so no_warn try_first_pass #需要身份验证 pam_unix.so no_warn try_first_pass nullok 身份验证充分 pam_unix.so no_warn try_first_pass 身份验证充分 pam_sss.so use_first_pass 身份验证需要 pam_deny.so # 帐户 #需要帐户 pam_krb5.so 需要帐户 pam_login_access.so 帐户需要pam_unix.so 帐户足够的pam_sss.so # 会议 #会话可选 pam_ssh.so want_agent 会话需要 pam_lastlog.so no_fail 会话可选 pam_sss.so 会话需要 pam_mkhomedir.so 模式=0700 # 密码 #密码足够 pam_krb5.so no_warn try_first_pass #需要密码 pam_unix.so no_warn try_first_pass 密码足够 pam_unix.so no_warn try_first_pass nullok use_authtok 密码足够 pam_sss.so use_authtok #需要密码 pam_deny.so
/etc/pam.d/su:
# #$FreeBSD: releng/11.0/etc/pam.d/su 219663 2011-03-15 10:13:35Z des $ # #“su”服务的 PAM 配置 # # 授权 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 授权包括 system.dist # 帐户 帐户包括system.dist # 会议 会话需要 pam_permit.so
- (缩进)
笔记:
system.dist
是库存文件的副本/etc/pam.d/system
。它包含在/etc/pam.d/su
上面的文件中,以防止 su 命令出现问题。- 人们仍然可以
su
以 root 身份访问 AD 帐户,因为一旦成为 root,su
就不需要进行身份验证,并且帐户信息会通过 SSSD 通过名称服务交换机提取。 - 如果你确实想从一个用户(非root)切换到另一个用户,则应该
sudo
仅出于安全原因使用 - 您还可以使用
ksu
和 来从用户 A 切换到用户 B- Heimdal
ksu
(在 中/usr/bin
)默认未设置 SUID- 为了让 Heimdal
ksu
发挥作用,chmod u+s /usr/bin/ksu
- 为了让 Heimdal
- MIT Kerberos(
krb5
安装在/usr/local/bin
)在安装时是SUID
- Heimdal
- 由于 Heimdal 是基础包的一部分,因此您将拥有两组 Kerberos 二进制文件。
- 您可能需要调整默认路径,以便在此
/usr/local/bin
之前/usr/bin
等
- 您可能需要调整默认路径,以便在此
ksu
将提示用户输入目标用户的 AD/Kerberos 密码passwd
pam_sss.so
即使您将其添加到 passwd PAM 文件中,也无法更改您的 AD/Kerberos 密码。passwd
二进制文件仅支持本地和 NIS 用于kpasswd
更改 AD/Kerberos 服务器上的密码。
名称服务切换:
- 该
/etc/nsswitch.conf
文件应配置为使用 sss 服务来处理密码和组。例如:group: files sss
passwd: files sss
- 该
加入域:
- *nixs 上有两个主要工具可以加入你的 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
- 建议使用此形式,因为实用程序并不总是能正确确定 FQDN。当您提供与主机的正向和反向 DNS 匹配的 FQDN 时,将正确创建主体。如果实用程序使用错误的主机名(例如,不包括 DNS 域),则不会创建某些服务主体,并且 SSH 进入主机等操作可能会失败。
- 例子:
- Samba
net
实用程序- 该
net
实用程序是 Samba 套件的一部分。 - 该实用程序需要在配置文件中设置域详细信息
smb.conf
,这使得使用起来更加困难和不方便,尤其是非交互式使用。 - 此工具还要求您在使用之前通过 获取 Kerberos 票证
kinit
。同样,这更加不方便,并且使得在脚本中非交互使用时更加困难,因为有两个步骤而不是一个。
- 该
- *nixs 上有两个主要工具可以加入你的 Linux 机器
SSHD 注意事项:
- 让 SSHD 与 AD 和 SSSD 协同工作通常相当简单
- 需要添加以下选项
/etc/ssh/sshd_config
GSSAPIAuthentication yes
- 为 SSHD 启用 GSS API 身份验证。这将导致 SSHD 针对 AD KDC 进行身份验证
PasswordAuthentication yes
- 允许用户使用密码登录。如果您希望用户在登录时获得 KRB5 票证,则必须启用该选项。如果不启用该选项,系统将无法解密 KDC 发送的 TGT。
ChallengeResponseAuthentication yes
- 对于 FreeBSD 来说,这种方法似乎效果最好。
- 确保
PasswordAuthentication no
在使用此选项时进行配置。 - 这是我在 FreeBSD 中发现的唯一一种可以在登录时更改过期密码的方法。如果您使用其他方法,它会调用
/bin/passwd
,它不支持除 NIS 和本地密码文件之外的任何内容。
- 确保
- 对于 FreeBSD 来说,这种方法似乎效果最好。
GSSAPICleanupCredentials yes
kdestroy
(可选)退出时执行
GSSAPIStrictAcceptorCheck no
- (可选)如果 SSHD 无法识别自己的主机名,或者为多宿主主机等,或者使用其他服务主体与 KDC 通信,则通常需要此选项。通常,SSHD 将使用服务主体与 KDC 通信
host/<FQDN>@REALM
,但有时会出错(例如,如果主机名与 SSH 服务器的 DNS 名称不匹配)。此选项允许 SSHD 使用文件中的任何主体/etc/krb5.keytab
,其中包括正确的host/<FQDN>@REALM
- (可选)如果 SSHD 无法识别自己的主机名,或者为多宿主主机等,或者使用其他服务主体与 KDC 通信,则通常需要此选项。通常,SSHD 将使用服务主体与 KDC 通信
- 根据您使用的选项组合,您可能需要或不需要将主机主体添加到 KDC,以便主机的 IPv4 和 IPv6 地址可以正常
ssh -K <ip>
工作而无需提示输入密码(当然,假设您已经完成“kinit”)。