管理对网络上系统的访问权限并非易事。我发现有些管理员在所有计算机上创建所有用户,有些管理员使用 SSH 密钥甚至密码共享帐户,还有一些管理员使用 LDAP 绑定(有时使用现有的 Active Directory 基础架构,有时使用单独的域),这要求他们编写用于过滤访问权限的 LDAP 查询。
所有这些方法都使得管理对计算机的访问权限变得困难,并且当有人离开或加入团队时,还需要通知管理员。共享帐户会使得日志记录变得几乎毫无用处,因为每个人都将使用相同的用户名。并且,当团队出现变动时,可能会导致很多人拥有糟糕的体验,人力资源部门会将这种情况告知技术团队。不过,有一种解决方案可以解决所有这些问题,而且效果很好,可以与常见的企业设置集成。
我遇到的大多数公司都具有某种形式的 ERP 系统,可以自动在 Microsoft Active Directory(AD)中创建、禁用或删除用户帐户,从而是您可以利用其他人正在完成的工作。例如,SSSD 可以直接连接到 AD。
如果您曾经为 Linux 设置过信任 AD 的身份验证服务器,那么您就已经让 SSSD 与您的 AD 服务器通信。如果您查看信任的工作方式,您设置的身份验证服务器会向 AD 服务器返回一个引用,导致 SSSD 直接查询您的 AD 服务器。以下设置无需额外身份验证服务器,并将 SSSD 配置为首先直接访问 AD。
下一个问题通常是如何控制访问权限。这正是基于角色的访问权限控制(RBAC)的用武之地。RBAC 允许您停止为用户分配访问权限,并开始为角色分配访问权限。安排好分组后,您可以向团队分配新的团队成员,而该团队已是对一组服务器拥有适当访问权限的角色的一部分。这样一来,就无需发送“我刚刚被录用,需要获取与 X 一样的访问权限”请求,因为这些请求种引用了数月前已离职且所有访问权限均已被清除的人员。
相反,一旦您将新用户添加到其团队的组中,这些用户就会拥有所需的访问权限。此方法还会删除所发现的一年前已离开公司但仍然可以访问所有服务器的用户,因为没有人告诉管理员该人员已离职。当 ERP 系统自动更新其 AD 帐户时,这些用户将失去所有访问权限。
通过非 Windows 操作系统管理 AD 曾一度颇具挑战性。不过,Microsoft 发布了 Windows Admin Center,允许您直接通过在任何操作系统上运行的任何浏览器访问 Active Directory 用户和计算机。它还会向您授予对各种其他 Windows 管理工具的访问权限。将该工具安装到 Windows 服务器上,就不必担心会话限制或 RemoteApp 相关问题。您只需启动浏览器并访问 Web 界面即可。
为 AD 组配置基于角色的访问权限控制
您公司的命名方案可能与本文中的示例有所不同。组名称并不重要。重要的组成部分是每个组的预期用途。
由于 SSSD 不会同步 AD 组,而只是在登录过程中获取用户所属组的列表,因此缺少组并不会妨碍此设置正常运作。但是,如果您有多个团队在 AD 中拥有委托权限,建议您创建所有的组,以防止在错误的组织单位(OU)中创建这些组,并让错误的团队控制访问权限。
访问特定机器
在 Active Directory 中为每台机器创建两个组。这两个组都必须包含机器的简称。
其中一个组用于特定于机器的 SSH 访问(在本文的其余部分中称为“Machine_SSH_Access
”)。
另一个组提供特定于机器的 sudo 访问(在本文的其余部分中称为“Machine_SUDO_Access
”)。
组格式示例:
<DOMAIN> Linux <hostname> ssh access <DOMAIN> Linux <hostname> sudo access
- <hostname>是机器的简称
- <DOMAIN>是您的域的简称,它是可选的
访问所有机器
在 Active Directory 中创建两个组,以实现全局机器访问。
其中一个组将用于所有计算机的 SSH 访问(在本文的其余部分中称为“Global_SSH_Access
”)。
另一个组用于所有计算机的 sudo 访问(在本文的其余部分中称为“Global_SUDO_Access
”)。
组格式示例:
<DOMAIN> Linux ssh access <DOMAIN> Linux sudo access
<DOMAIN>是您的域的简称,它是可选的。
嵌套
允许在 AD 组内进行嵌套。如果您想要创建拥有多台机器访问权限的组,则无需更改 RHEL 机器中的配置。相反,您可以将新组设置为特定机器的访问组的成员。这种方法允许您直接通过 AD 控制访问权限。
嵌套示例:
- CONTOSO Linux Webserver1 ssh 访问
- CONTOSO Linux Webservers ssh 访问
- CONTOSO Web 开发人员
- 用户 1
- 用户 2
- CONTOSO Web 开发人员
- CONTOSO Linux Webservers ssh 访问
这种嵌套允许您将角色(CONTOSO Web 开发人员)分配到机器组(CONTOSO Linux Webservers ssh 访问),而不是将用户分配到特定系统。
将 Linux 机器加入域
如果您的环境当前启用了 RC4,请遵循 Microsoft 的安全公告,立即将其禁用。
要将 Linux 机器加入域,请执行以下操作:
- 安装所需的软件包:
$ sudo dnf install -y chrony krb5-workstation \ samba-common-tools oddjob-mkhomedir samba-common \ sssd authselect
- 通过创建
/etc/sssd/pki/sssd_auth_ca_db.pem
并编写域的 CA 链,添加域的 CA 链。这不需要包含域控制器(DC)本身的证书。它可以从签署其证书的证书开始。 - 将 CA 链添加到系统的信任锚:
$ sudo trust anchor /etc/sssd/pki/sssd_auth_ca_db.pem
- 通过编辑 /etc/sssd/sssd.conf 或 /etc/sssd/conf.d/<DOMAIN>.conf 并匹配以下行来配置 SSSD。
编辑 /etc/sssd/conf.d/<DOMAIN>.conf 是现代的首选方法,但编辑 /etc/sssd/sssd.conf 也可以实现该目标。
[domain/<DOMAIN>] access_provider = simple auth_provider = ad chpass_provider = ad id_provider = ad dyndns_update = true override_homedir = /home/%u override_shell = /bin/bash default_shell = /bin/bash ldap_idmap_range_size = 4000000 cache_credentials = true simple_allow_groups = Global_SSH_Access, Global_SUDO_Access, Machine_SSH_Access, Machine_SUDO_Access ignore_group_members = true ad_gpo_access_control = disabled ad_enable_gc = false ad_use_ldaps = true [sssd] services = nss, pam config_file_version = 2 domains = <DOMAIN>
- <DOMAIN>是您的域的完全限定域名(FQDN),所有字母均采用大写形式。如果未全部使用大写字母,可能会出现身份验证问题。
ldap_idmap_range_size
是可选的。如果您拥有大型 AD 环境,则此值是必需的。更改此值会导致 UID 哈希值发生变化,因此在将机器加入域后切勿更改它,并确保在所有机器上使用相同的值。Global_SSH_Access
、Global_SUDO_Access
、Machine_SSH_Access
和Machine_SUDO_Access
您在前面为 RBAC 创建的组。
- 为您刚刚撰写的文件设置权限:/etc/sssd/sssd.conf 或 /etc/sssd/conf.d/<DOMAIN>.conf:
$ sudo chmod 400 /etc/sssd/sssd.conf
或者
$ sudo chmod 400 /etc/sssd/conf.d/*.conf
- 通过编辑 /etc/krb5.conf 并匹配以下行来配置 KRB5:
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] dns_lookup_realm = true dns_lookup_kdc = true ticket_lifetime = 24h renew_lifetime = 7d forwardable = true rdns = true default_ccache_name = KEYRING:persistent:%{uid} default_realm = <DOMAIN> [realms] [domain_realm]
您不需要在 [realms]
或 [domain_realm]
下指定任何内容。SSSD 会自动从 DNS 发现这些信息。
- 通过在 /etc/sudoers.d 中创建文件来配置 SUDO 访问权限:
$ sudo visudo -f /etc/sudoers.d/<DOMAIN>
为 AD sudo
组的成员指定默认的 sudo 访问权限。文件名可以是您选择的任何名称,不一定要命名为“DOMAIN
”。
您必须使用反斜杠(\)转义所有空格。例如:“Linux sudo access”必须写成“Linux\ sudo\ access”。
%Global_SUDO_Access ALL=(ALL) ALL %Machine_SUDO_Access ALL=(ALL) ALL
Global_SUDO_Access 和 Machine_SUDO_Access 是您为 RBAC 创建的 AD 组。组名称前的百分号(%)表示它是一个组。
您可以在单独的文件或同一文件中以相同的方式定义要授予 AD 组的任何其他 sudo 访问权限。
- 确保将机器的主机名设置为“FQDN”。机器的主机名不能是简称:
$ sudo hostnamectl set-hostname $(hostname -f)
- 使用以下命令之一加入计算机(
adcli
与 SMBv1 和 SMBv2 兼容)。要在加入机器时设置 AD 内的操作系统信息,请使用以下命令:
$ source /etc/os-release $ sudo adcli join -U <join_user> --os-name="${NAME}" \ --os-version="${VERSION}" --os-service-pack="${VERSION_ID}"
或者,您可以在不设置操作系统信息的情况下加入机器:
$ sudo adcli join -U <join_user>
<join_user> 是 AD 帐户,将用于将机器加入域中。系统不会存储 adcli
请求的密码。委派权限描述了加入机器所需的权限。
- 开始启用
SSSD
和oddjobd
:
$ sudo systemctl enable sssd oddjobd $ sudo systemctl restart sssd oddjobd
- 启用 AD 登录:
$ sudo authselect select sssd with-mkhomedir --force
只要您的帐户是您创建的任一组的成员,您就可以立即登录机器。您不需要指定域。使用在 /etc/krb5.conf
中指定为 default_realm
的域。GNOME 可能需要重新启动,但 sshd
通常很乐意在未重新启动的情况下接受更改。
使操作系统信息保持最新状态
默认情况下,计算机对象没有更新自身操作系统信息的权限。确保进入 Active Directory 用户和计算机(ADUAC),并授予 SELF 在计算机对象上写入每个操作系统字段的权限(您可以在组织单元级别执行此操作)。添加后,使用最新的操作系统信息更新 AD 对象:
$ source /etc/os-release $ sudo /usr/sbin/adcli update --os-name="${NAME}" \ --os-version="${VERSION}" --os-service-pack="${VERSION_ID}"
这可以添加为 cron 作业或 systemd 服务。例如:
[Unit] Description=Updates AD with current OS information After=sssd.service [Service] Type=oneshot EnvironmentFile=/etc/os-release ExecStart=/usr/sbin/adcli update --os-name="${NAME}" --os-version="${VERSION}" --os-service-pack="${VERSION_ID}" [Install] WantedBy=multi-user.target
启用智能卡身份验证
本章节假定您的 Windows 计算机上采用了智能卡身份验证机制。如果没有,请先在 Windows 机器上配置智能卡身份验证,然后再继续。
- 将您的域的证书链写入
/etc/sssd/pki/sssd_auth_ca_db.pem
。这不需要包含域控制器(DC)本身的证书。它可以从签署其证书的证书开始。 - 将证书添加到机器受信任的 CA 列表:
$ sudo trust anchor /etc/sssd/pki/sssd_auth_ca_db.pem
- 根据您在将系统加入到域中时使用的文件,编辑 /etc/sssd/sssd.conf or /etc/sssd/conf.d/<DOMAIN>.conf,并将下面这一行代码添加到 [domain/<DOMAIN>] 部分中。此条目告知 SSSD 在哪里查找用户证书。Windows 使用
userCertificate
属性,因此如果我们使用相同的属性,则同一张智能卡可以同时在 Linux 和 Windows 上使用。
ldap_user_certificate = userCertificate;binary
将下面这几行代码添加到同一配置文件的末尾:
[pam] pam_cert_auth = true
- 编辑
/etc/krb5.conf
,并将下面这几行代码添加到[realms]
下方,将 <DOMAIN>替换为您的域的完全限定域名(全部采用大写字母)。这是为了解决由于 Windows 不区分大小写而 Linux 区分大小写所导致的不匹配问题。
<DOMAIN> = { pkinit_anchors = DIR:/etc/sssd/pki pkinit_kdc_hostname = <DOMAIN> }
- 使用下列命令之一在 PAM 中启用智能卡身份验证:
authselect enable-feature with-smartcard
:允许将智能卡身份验证作为一个选项。authselect enable-feature with-smartcard-required
:要求进行智能卡身份验证。默认情况下,sshd 在使用 SSH 密钥进行身份验证时不会调用 PAM。authselect enable-feature with-smartcard-lock-on-removal
:要求进行智能卡身份验证,并在智能卡被删除时锁定机器。
使用智能卡证书启用 SSH 访问
在 RHEL 8 及更高版本上,您可以使用智能卡启用 SSH 访问。
- 验证是否从 AD 正确读取了智能卡证书:
sss_ssh_authorizedkeys ${USER}
如果未返回公钥,请验证是否正确配置了智能卡身份验证。
- 编辑
/etc/ssh/sshd_config
以添加下面这几行代码:
AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys AuthorizedKeysCommandUser nobody
- 重新启动
sshd
:
$ sudo systemctl restart sshd
要使用 SSH 从客户端登录,请使用选项 PKCS11Provider=/usr/lib64/opensc-pkcs11.so
。只要智能卡与用户的公钥匹配,系统就会提示您输入智能卡 PIN 或密码:
$ ssh -o PKCS11Provider=/usr/lib64/opensc-pkcs11.so <host>
其他信息
您现在已将机器加入到了域中,并且利用基于角色的访问控制功能来控制哪些人员可以登录或执行特权命令。管理工作很快将会变得更加轻松,因为您可以利用其他人已经在做的工作。下面是一些需要注意的事项:
- 在 AD 中禁用用户会立即阻止对机器的访问。与 Windows 一样,已登录的任何人员都将保持登录状态。
- 对用户组的修改会在登录期间更新,这点也与 Windows 一样。这是在检查是否允许用户登录之前完成的。
- SSSD 具有站点感知能力。如果您在 AD 站点和服务中配置站点,SSSD 将连接到相应的域控制器。
- SSSD 会自动轮转机器密码。
- 只要启用了动态更新(安全或不安全),SSSD 就会自动为机器创建和管理 DNS 记录。
我通常不建议使用 Windows 工具来管理 Linux 系统,或使用 Linux 工具来管理 Windows,因为经常会丢失重要功能、缺乏安全防护,或者因为使用原生工具更容易完成相同的任务。但是,这与 AD 不同。SSSD 的开发人员经过不懈努力,使其能够与 AD 兼容,并且最终使您的工作变得更加轻松。
关于作者
Jason Nagin joined Red Hat in 2022 as a RHEL Specialist Solutions Architect. He is based out of Dallas, Texas.
产品
工具
试用购买与出售
沟通
关于红帽
我们是世界领先的企业开源解决方案供应商,提供包括 Linux、云、容器和 Kubernetes。我们致力于提供经过安全强化的解决方案,从核心数据中心到网络边缘,让企业能够更轻松地跨平台和环境运营。