willshersystems.sshd
OpenSSH 服务器
此角色配置 OpenSSH 守护进程。它:
- 默认使用操作系统的正常配置配置 SSH 守护进程。
- 支持多种
UN*X
发行版。 - 可以通过字典或简单变量进行配置。
- 支持 Match 集合。
- 支持所有
sshd_config
选项,模板是程序生成的。 (查看meta/make_option_lists
) - 在重新加载 sshd 之前会测试
sshd_config
。
警告 误配置此角色可能导致无法访问服务器! 请在生产环境中使用之前,测试您的配置及其与用户配置的交互。
警告 Digital Ocean 在 Debian 和 Ubuntu 上允许使用密码的 root 登录 SSH。这不是此模块的默认设置 - 它会将 PermitRootLogin
设置为 without-password
,这将允许通过 SSH 密钥访问,但不允许使用简单密码。如果需要此功能,请确保在这些主机上设置 sshd_PermitRootLogin yes
。
要求
已在以下环境中测试:
- Ubuntu precise, trusty, xenial, bionic, focal, jammy, noble
- Debian wheezy, jessie, stretch, buster, bullseye, bookworm
- EL 6, 7, 8, 9, 10 派生的发行版
- 所有 Fedora 版本
- 最新 Alpine
- FreeBSD 10.1
- OpenBSD 6.0
- AIX 7.1, 7.2
- OpenWrt 21.03
它可能在其他版本上也能正常工作,适当的 vars/ 文件的直接支持是受欢迎的。
可选要求
如果您希望使用此角色的高级功能,例如为您配置防火墙和 SELinux(主要是在使用自定义端口时有用),该角色需要在 meta/collection-requirements.yml
中指定的额外集合。这些不会自动安装。如果您想管理 rpm-ostree
系统,则需要额外的集合。您必须这样安装它们:
ansible-galaxy install -vv -r meta/collection-requirements.yml
有关更多信息,请参见下面的 sshd_manage_firewall
和 sshd_manage_selinux
选项,以及 rpm-ostree
部分。此附加功能仅在基于 Red Hat 的 Linux 上受支持。
角色变量
主要角色变量
未配置时,此角色将提供一个匹配操作系统默认值的 sshd_config
,不包括注释,顺序不同。
sshd_enable
如果设置为 false,则该角色将完全禁用。默认值为 true。
sshd_skip_defaults
如果设置为 true,则不会应用默认值。这意味着您必须通过 sshd
字典或 sshd_Key
变量拥有完整的配置默认值。默认情况下为 false,除非设置了 sshd_config_namespace
,或者 sshd_config_file
指向一个 drop-in 目录以避免递归包含。
sshd_manage_service
如果设置为 false,则服务/守护进程不会被 管理,即不会尝试在启动时启用或启动或重新加载服务。 默认值为 true,除非:在 docker 容器中运行(假设在构建阶段使用 ansible)或 AIX(Ansible 的 service
模块当前不支持 AIX 的 enabled
)。
sshd_allow_reload
如果设置为 false,则在更改时不会重新加载 sshd。这有助于故障排除。如果您想应用更改的配置,必须手动重新加载 sshd。默认值与 sshd_manage_service
相同。
(在 AIX 上除外,sshd_manage_service
默认值为 false,但 sshd_allow_reload
默认值为 true)
sshd_install_service
如果设置为 true,该角色将安装 SSH 服务的服务文件。默认值为 false。
所使用服务文件的模板由以下变量指向:
sshd_service_template_service
(默认值:templates/sshd.service.j2
)sshd_service_template_at_service
(默认值:templates/[email protected]
)sshd_service_template_socket
(默认值:templates/sshd.socket.j2
)
通过这些变量,您可以使用自己的自定义模板。使用上述默认模板,安装的 SSH 服务的名称将由 sshd_service
变量提供。
sshd_manage_firewall
如果设置为 true,防火墙将打开 SSH 端口。请注意,这仅对基于 Red Hat 的操作系统有效。默认值为 false。
注意:sshd_manage_firewall
仅限于 添加 端口,不能用于 删除 端口。如果要删除端口,需要直接使用防火墙系统角色。
sshd_manage_selinux
如果设置为 true,则将配置 SELinux 以允许 sshd 在给定的 SSH 端口上监听。请注意,这仅对基于 Red Hat 的操作系统有效。默认值为 false。
注意:sshd_manage_selinux
限制为 添加 策略,不能用于 删除 策略。如果要删除端口,需要直接使用 SELinux 系统角色。
sshd
包含配置的字典。例如:
sshd:
Compression: delayed
ListenAddress:
- 0.0.0.0
sshd_<OptionName>
可以使用简单变量而不是字典。简单值可以覆盖字典值。例如:
sshd_Compression: off
在所有情况下,布尔值在 sshd 配置中将正确渲染为 yes 和 no。可以使用列表进行多行配置项。例如:
sshd_ListenAddress:
- 0.0.0.0
- '::'
将渲染为:
ListenAddress 0.0.0.0
ListenAddress ::
sshd_match, sshd_match_1 到 sshd_match_9
为 Match 部分提供的字典列表或仅一个字典。请注意,这些变量不会覆盖 sshd
字典中定义的 match 块。所有来源都将反映在生成的配置文件中。使用 sshd_match_*
变体已不再推荐。
sshd_backup
当设置为 false 时,原始的 sshd_config
文件将不被备份。默认值为 true。
sshd_sysconfig
在基于 RHEL 的系统上,sysconfig 用于配置 sshd 服务的更多细节。如果设置为 true,该角色还将根据以下配置管理 /etc/sysconfig/sshd
配置文件。默认值为 false。
sshd_sysconfig_override_crypto_policy
在基于 RHEL8 的系统上,这可以通过设置为 true 来覆盖系统范围的加密策略。如果没有此选项,则对密码、MAC 和公钥算法的更改不会对 RHEL8 中的服务产生影响。默认值为 false。
sshd_sysconfig_use_strong_rng
在基于 RHEL 的系统上(RHEL9 之前),这可以强制 sshd 使用指定字节数的参数重新种子 openssl 随机数生成器。默认值为 0,这将禁用此功能。如果系统没有硬件随机数生成器,不推荐开启此选项。
sshd_config_file
此角色生成的 openssh 配置应保存的路径。这主要在生成配置片段以从 drop-in 目录包含时很有用(Fedora 和 RHEL9 的默认设置)。
当此路径指向一个 drop-in 目录时(如 /etc/ssh/sshd_config.d/00-custom.conf
),检查主配置文件(由变量 sshd_main_config_file
定义)是否包含适当的 Include
指令。
sshd_main_config_file
在系统使用 drop-in 目录时,可以使用此选项设置主配置文件的路径,并让您仅使用 sshd_config_file
配置 drop-in 配置文件。这在需要配置第二个独立的 sshd 服务时很有用,其配置文件不同。这也是在服务文件中使用的文件。
在没有 drop-in 目录的系统上,默认值为 None
。否则,默认值为 /etc/ssh/sshd_config
。当 sshd_config_file
设置在 drop-in 目录之外(其父目录不是 sshd_main_config_file
~ '.d')时,将忽略此变量。
sshd_config_namespace
默认情况下(null),该角色定义配置文件的整个内容,包括系统默认值。您可以使用此变量从其他角色或在单个 playbook 的多个地方调用此角色,作为使用 drop-in 目录的替代方案。在这种情况下,将忽略 sshd_skip_defaults
,并且不使用系统默认值。
当设置此变量时,角色将在给定命名空间下的现有配置文件中将指定的配置放置到配置片段中。您需要在多次调用角色时选择不同的命名空间。
请注意,openssh 配置文件的限制仍然适用。例如,配置文件中指定的第一个选项对大多数变量是有效的。
从技术上讲,角色将片段放置在 Match all
块中,除非它们包含其他匹配块,以确保它们在现有配置文件中的先前匹配块之前应用。这允许从不同角色调用中配置不冲突的任何选项。
sshd_config_owner, sshd_config_group, sshd_config_mode
使用这些变量来设置此角色生成的 openssh 配置文件的所有权和权限。
sshd_verify_hostkeys
默认情况下(auto),此列表包含生成的配置文件中存在的所有主机密钥。如果没有,将在 FIPS 模式下使用 OpenSSH 默认列表,排除不符合 FIPS 标准的密钥。检查路径的存在,如果缺少新密钥,则将生成。此外,权限和文件所有者设置为合理的默认值。如果在部署阶段使用此角色,这非常有用,以确保服务能够在第一次尝试时启动。
要禁用此检查,请将其设置为空列表。
sshd_hostkey_owner, sshd_hostkey_group, sshd_hostkey_mode
使用这些变量来设置上述列表中主机密钥的所有权和权限。
次要角色变量
这些变量由角色内部使用,并可以用来覆盖每个平台对应的默认值。它们未经过测试,并且通常不需要,因为角色会从操作系统类型中确定它们。
sshd_packages
使用此变量来覆盖要安装的默认软件包列表。
sshd_binary
openssh 可执行文件的路径。
sshd_service
openssh 服务的名称。默认情况下,此变量包含目标平台使用的 ssh 服务的名称。但当使用 sshd_install_service
变量时,也可以用来设置自定义 ssh 服务的名称。
sshd_sftp_server
sftp 服务器可执行文件的默认路径。
角色导出的变量
sshd_has_run
成功执行角色后,此变量被设置为 true。
配置 SSH 证书身份验证
要在 SSH 服务器上配置 SSH 证书身份验证,您需要提供至少受信任的用户 CA 密钥,这些密钥将用于验证客户端证书。这通过变量 sshd_trusted_user_ca_keys_list
来完成。
如果您需要将某些授权主体映射到系统用户,可以使用 sshd_principals
变量做到这一点。
其他变量
sshd_trusted_user_ca_keys_list
受信任用户 CA 公钥的列表,以 OpenSSH 一行格式表示(必填)。
sshd_trustedusercakeys_directory_owner, sshd_trustedusercakeys_directory_group, sshd_trustedusercakeys_directory_mode
使用这些变量设置受信任用户 CA 密钥目录的所有权和权限。默认值分别为 root、root 和 0755。
sshd_trustedusercakeys_file_owner, sshd_trustedusercakeys_file_group, sshd_trustedusercakeys_file_mode
使用这些变量设置受信任用户 CA 密钥文件的所有权和权限。默认值分别为 root、root 和 0640。
sshd_principals
包含操作系统中用户主体的字典(可选)。例如:
sshd_principals:
admin:
- frontend-admin
- backend-admin
somelinuxuser:
- some-principal-defined-in-certificate
sshd_authorizedprincipals_directory_owner, sshd_authorizedprincipals_directory_group, sshd_authorizedprincipals_directory_mode
使用这些变量设置授权主体目录的所有权和权限。默认值分别为 root、root 和 0755。
sshd_authorizedprincipals_file_owner, sshd_authorizedprincipals_file_group, sshd_authorizedprincipals_file_mode
使用这些变量设置授权主体文件的所有权和权限。默认值分别为 root、root 和 0644。
其他配置
SSH 服务器需要将此信息存储在文件中,因此除了上述变量外,执行角色时 sshd
字典中还需要存在相应的配置选项 TrustedUserCAKeys
(必填)和 AuthorizedPrincipalsFile
(可选)。例如:
sshd:
TrustedUserCAKeys: /etc/ssh/path-to-trusted-user-ca-keys/trusted-user-ca-keys.pub
AuthorizedPrincipalsFile: "/etc/ssh/path-to-auth-principals/auth_principals/%u"
要了解有关 SSH 证书的更多信息,可以参考 wikibooks 上的关于纯 SSH 证书的优质教程。
要理解主体并使用 Vault 设置 SSH 证书,这是 Hashicorp 的一个很好解释的教程。
依赖关系
无
对于测试,需要 ansible.posix
集合用于 mount
角色以模拟 FIPS 模式。
示例 Playbook
危险! 此示例用于显示该角色提供的配置范围。运行它可能会导致您无法访问服务器的 SSH!
---
- hosts: all
vars:
sshd_skip_defaults: true
sshd:
Compression: true
ListenAddress:
- "0.0.0.0"
- "::"
GSSAPIAuthentication: false
Match:
- Condition: "Group user"
GSSAPIAuthentication: true
sshd_UsePrivilegeSeparation: false
sshd_match:
- Condition: "Group xusers"
X11Forwarding: true
roles:
- role: willshersystems.sshd
结果为:
# Ansible 管理: ...
Compression yes
GSSAPIAuthentication no
UsePrivilegeSeparation no
Match Group user
GSSAPIAuthentication yes
Match Group xusers
X11Forwarding yes
自 Ansible 2.4 以来,可以使用 include_role
关键字调用该角色,例如:
---
- hosts: all
become: true
tasks:
- name: "配置 sshd"
include_role:
name: willshersystems.sshd
vars:
sshd_skip_defaults: true
sshd:
Compression: true
ListenAddress:
- "0.0.0.0"
- "::"
GSSAPIAuthentication: false
Match:
- Condition: "Group user"
GSSAPIAuthentication: true
sshd_UsePrivilegeSeparation: false
sshd_match:
- Condition: "Group xusers"
X11Forwarding: true
您可以仅使用 sshd_config_namespace
选项添加配置片段:
---
- hosts: all
tasks:
- name: 配置 sshd 接受一些有用的环境变量
include_role:
name: willshersystems.sshd
vars:
sshd_config_namespace: accept-env
sshd:
# 有一些方便的环境变量需要接受
AcceptEnv:
LANG
LS_COLORS
EDITOR
下面的片段将被添加到默认配置文件中(如果尚不存在):
# BEGIN sshd 系统角色管理块: 命名空间 accept-env
Match all
AcceptEnv LANG LS_COLORS EDITOR
# END sshd 系统角色管理块: 命名空间 accept-env
更多示例 playbook 可在 examples/
目录中找到。
模板生成
sshd_config.j2
和 sshd_config_snippet.j2
模板是通过 meta 中的脚本程序生成的。新选项应添加到 options_body
和/或 options_match
中。
要重新生成模板,请在 meta/
目录中运行:
./make_option_lists
rpm-ostree
请参见 README-ostree.md
许可证
LGPLv3
作者
Matt Willsher matt@willsher.systems
© 2014,2015 Willsher Systems Ltd.
Jakub Jelen jjelen@redhat.com
© 2020 - 2024 Red Hat, Inc.
OpenSSH SSH daemon configuration
ansible-galaxy install willshersystems.sshd