1.7. 使用 RHEL 系统角色配置 OpenSSH 服务器和客户端


您可以使用 sshd RHEL 系统角色配置 OpenSSH 服务器,使用 ssh RHEL 系统角色,以自动的方式同时在任意数量的 RHEL 系统上一致地配置 OpenSSH 客户端。对于需要安全远程交互的任何系统,此类配置是必需的,例如:

  • 远程系统管理:使用 SSH 客户端安全地从另一台计算机连接到您的机器。
  • 安全文件传输:OpenSSH 提供的安全文件传输协议(SFTP)可让您在本地机器和远程系统之间安全地传输文件。
  • 自动化 DevOps 管道:自动化需要安全连接到远程服务器(CI/CD 管道)的软件部署。
  • 隧道和端口转发:转发本地端口,以访问防火墙后面的远程服务器上的 Web 服务。例如,远程数据库或开发服务器。
  • 基于密钥的身份验证:对基于密码登录的更加安全的替代。
  • 基于证书的验证:集中信任管理和更好的可扩展性。
  • 增强了安全性:禁用 root 登录、限制用户访问、强制强加密和其他此类强化,确保更强的系统安全性。

sshd RHEL 系统角色 playbook 中,您可以为服务器 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的 sshd_config 文件。

在所有情况下,布尔值会在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

sshd_ListenAddress:
  - 0.0.0.0
  - '::'

呈现为:

ListenAddress 0.0.0.0
ListenAddress ::

您可以使用 sshd RHEL 系统角色配置多个 OpenSSH 服务器。这些措施通过以下方式来确保远程用户的安全通信环境:

  • 管理来自远程客户端的传入 SSH 连接
  • 凭证验证
  • 保护数据传输和命令执行
注意

您可以将 sshd RHEL 系统角色与其他更改 SSHD 配置的 RHEL 系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 sshd RHEL 系统角色使用命名空间(RHEL 8 及更早版本)或置入目录(RHEL 9 及更新版本)。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: SSH server configuration
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure sshd to prevent root and password login except from particular subnet
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.sshd
          vars:
            sshd_config:
              PermitRootLogin: no
              PasswordAuthentication: no
              Match:
                - Condition: "Address 192.0.2.0/24"
                  PermitRootLogin: yes
                  PasswordAuthentication: yes

    示例 playbook 中指定的设置包括如下:

    PasswordAuthentication: yes|no
    控制 OpenSSH 服务器(sshd)是否接受来自使用用户名和密码组合的客户端的身份验证。
    Match:
    match 块只允许来自子网 192.0.2.0/24 使用密码的 root 用户登录。

    有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件和 sshd_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  1. 登录到 SSH 服务器:

    $ ssh <username>@<ssh_server>
  2. 验证 SSH 服务器上 sshd_config 文件的内容:

    $ cat /etc/ssh/sshd_config.d/00-ansible_system_role.conf
    #
    # Ansible managed
    #
    PasswordAuthentication no
    PermitRootLogin no
    Match Address 192.0.2.0/24
      PasswordAuthentication yes
      PermitRootLogin yes
  3. 检查您是否可以以 root 用户身份从 192.0.2.0/24 子网连接到服务器:

    1. 确定您的 IP 地址:

      $ hostname -I
      192.0.2.1

      如果 IP 地址在 192.0.2.1 - 192.0.2.254 范围内,您可以连接到服务器。

    2. root 用户身份连接到服务器:

      $ ssh root@<ssh_server>

1.7.3. 对非独占配置使用 sshd RHEL 系统角色

默认情况下,应用 sshd RHEL 系统角色会覆盖整个配置。如果您之前调整了配置,例如使用不同的 RHEL 系统角色或 playbook,则这可能会出现问题。要只对所选配置选项应用 sshd RHEL 系统角色,同时保留其他选项,您可以使用非独占配置。

您可以应用非独占配置:

  • 在 RHEL 8 及更早版本中使用配置片段。
  • 在 RHEL 9 及更高版本中使用置入目录中的文件。默认配置文件已放入随时可访问的目录中,存为 /etc/ssh/sshd_config.d/00-ansible_system_role.conf

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    • 对于运行 RHEL 8 或更早版本的受管节点:

      ---
      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure SSHD to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_namespace: <my_application>
              sshd_config:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR
    • 对于运行 RHEL 9 或更高版本的受管节点:

      - name: Non-exclusive sshd configuration
        hosts: managed-node-01.example.com
        tasks:
          - name: Configure sshd to accept environment variables
            ansible.builtin.include_role:
              name: redhat.rhel_system_roles.sshd
            vars:
              sshd_config_file: /etc/ssh/sshd_config.d/<42-my_application>.conf
              sshd_config:
                # Environment variables to accept
                AcceptEnv:
                  LANG
                  LS_COLORS
                  EDITOR

      示例 playbook 中指定的设置包括以下内容:

      sshd_config_namespace: <my_application>
      角色将您在 playbook 中指定的配置放在给定命名空间下的现有配置文件中的配置片段中。当从不同上下文运行角色时,您需要选择一个不同的命名空间。
      sshd_config_file: /etc/ssh/sshd_config.d/<42-my_application>.conf
      sshd_config_file 变量中,定义 sshd 系统角色将配置选项写入其中的 .conf 文件。使用两位前缀,例如 42- 来指定应用配置文件的顺序。
      AcceptEnv:

      控制 OpenSSH 服务器(sshd)将接受来自客户端的哪些环境变量:

      • LANG :定义语言和区域设置。
      • LS_COLORS :定义终端中 ls 命令的显示颜色方案。
      • EDITOR: 指定需要打开编辑器的命令行程序的默认文本编辑器。

      有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件和 sshd_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 验证 SSH 服务器上的配置:

    • 对于运行 RHEL 8 或更早版本的受管节点:

      # cat /etc/ssh/sshd_config
      ...
      # BEGIN sshd system role managed block: namespace <my_application>
      Match all
        AcceptEnv LANG LS_COLORS EDITOR
      # END sshd system role managed block: namespace <my_application>
    • 对于运行 RHEL 9 或更高版本的受管节点:

      # cat /etc/ssh/sshd_config.d/42-my_application.conf
      # Ansible managed
      #
      AcceptEnv LANG LS_COLORS EDITOR

当默认加密设置不符合某些安全或兼容性需求时,您可能需要使用 sshd RHEL 系统角色覆盖 OpenSSH 服务器上的系统范围加密策略。特别是在以下值得注意的情况:

  • 与旧客户端的兼容:必须使用比默认值弱的加密算法、密钥交换协议或密码。
  • 强制执行更强大的安全策略:同时,您可以禁用较弱的算法。这样的措施可能会超出默认的系统加密策略,特别是在高度安全和监管的环境中。
  • 性能考虑:系统默认值可能会强制实施更强大的算法,这些算法对于某些系统来说可能是计算密集型的。
  • 针对特定安全需求进行自定义:针对默认加密策略未涵盖的独特要求进行调整。
警告

sshd RHEL 系统角色不可能覆盖加密策略的所有方面。例如,在不同的层上可能会禁止 SHA-1 签名,因此对于更通用的解决方案,请参阅 使用 RHEL 系统角色设置自定义加密策略

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    - name: Deploy SSH configuration for OpenSSH server
      hosts: managed-node-01.example.com
      tasks:
        - name: Overriding the system-wide cryptographic policy
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.sshd
          vars:
            sshd_sysconfig: true
            sshd_sysconfig_override_crypto_policy: true
            sshd_KexAlgorithms: ecdh-sha2-nistp521
            sshd_Ciphers: aes256-ctr
            sshd_MACs: hmac-sha2-512-etm@openssh.com
            sshd_HostKeyAlgorithms: rsa-sha2-512,rsa-sha2-256

    示例 playbook 中指定的设置包括如下:

    sshd_KexAlgorithms
    您可以选择密钥交换算法,例如 ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1diffie-hellman-group-exchange-sha256
    sshd_Ciphers
    您可以选择密码,例如 aes128-ctres192-ctraes256-ctr
    sshd_MACs
    您可以选择 MAC,例如 hmac-sha2-256hmac-sha2-512hmac-sha1
    sshd_HostKeyAlgorithms
    您可以选择一个公钥算法,如 ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521ssh-rsa

    有关 playbook 中使用的所有变量的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.sshd/README.md 文件。

    注意

    在 RHEL 9 受管节点上,系统角色会将配置写入到 /etc/ssh/sshd_config.d/00-ansible_system_role.conf 文件中,其中加密选项会被自动应用。您可以使用 sshd_config_file 变量更改文件。但是,为了确保配置有效,请使用一个按字典顺序位于 /etc/ssh/sshd_config.d/50-redhat.conf 文件之前的文件名,其中包括配置的加密策略。

    在 RHEL 8 受管节点上,您必须通过将 sshd_sysconfig_override_crypto_policysshd_sysconfig 变量设置为 true 来启用覆盖。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 您可以通过使用详细的 SSH 连接验证并在以下输出中检查定义的变量,来验证流程是否成功:

    $ ssh -vvv <ssh_server>
    ...
    debug2: peer server KEXINIT proposal
    debug2: KEX algorithms: ecdh-sha2-nistp521
    debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256
    debug2: ciphers ctos: aes256-ctr
    debug2: ciphers stoc: aes256-ctr
    debug2: MACs ctos: hmac-sha2-512-etm@openssh.com
    debug2: MACs stoc: hmac-sha2-512-etm@openssh.com
    ...

ssh RHEL 系统角色 playbook 中,您可以为客户端 SSH 配置文件定义参数。

如果没有指定这些设置,角色会生成一个与 RHEL 默认值匹配的全局 ssh_config 文件。

在所有情况下,布尔值在受管节点上的最终配置中正确呈现为 yesno。您可以使用列表来定义多行配置项。例如:

LocalForward:
  - 22 localhost:2222
  - 403 localhost:4003

呈现为:

LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
注意

配置选项区分大小写。

1.7.6. 使用 ssh RHEL 系统角色配置 OpenSSH 客户端

您可以使用 ssh RHEL 系统角色配置多个 OpenSSH 客户端。这些措施可通过确保以下内容让本地用户与远程 OpenSSH 服务器建立一个安全连接:

  • 安全连接启动
  • 凭证置备
  • 与 OpenSSH 服务器协商有关用于安全通信渠道的加密方法
  • 能够安全地向和从 OpenSSH 服务器发送文件
注意

您可以将 ssh RHEL 系统角色与更改 SSH 配置的其他系统角色(如 Identity Management RHEL 系统角色)一起使用。要防止配置被覆盖,请确保 ssh RHEL 系统角色使用置入目录(RHEL 8 及更高版本中的默认设置)。

先决条件

流程

  1. 创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml

    ---
    - name: SSH client configuration
      hosts: managed-node-01.example.com
      tasks:
        - name: Configure ssh clients
          ansible.builtin.include_role:
            name: redhat.rhel_system_roles.ssh
          vars:
            ssh_user: root
            ssh:
              Compression: true
              GSSAPIAuthentication: no
              ControlMaster: auto
              ControlPath: ~/.ssh/.cm%C
              Host:
                - Condition: example
                  Hostname: server.example.com
                  User: user1
            ssh_ForwardX11: no

    示例 playbook 中指定的设置包括如下:

    ssh_user: root
    使用特定配置在受管节点上配置 root 用户的 SSH 客户端首选项。
    Compression: true
    压缩被启用。
    ControlMaster: auto
    ControlMaster 多路复用设置为 auto
    Host
    创建别名 example,来以名为 user1 的用户身份连接到 server.example.com 主机。
    ssh_ForwardX11: no
    X11 转发被禁用。

    有关 playbook 中使用的角色变量和 OpenSSH 配置选项的详情,请查看控制节点上的 /usr/share/ansible/roles/rhel-system-roles.ssh/README.md 文件和 ssh_config (5) 手册页。

  2. 验证 playbook 语法:

    $ ansible-playbook --syntax-check ~/playbook.yml

    请注意,这个命令只验证语法,不能防止错误的、但有效的配置。

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml

验证

  • 通过显示 SSH 配置文件来验证受管节点是否有正确的配置:

    # cat ~/root/.ssh/config
    # Ansible managed
    Compression yes
    ControlMaster auto
    ControlPath ~/.ssh/.cm%C
    ForwardX11 no
    GSSAPIAuthentication no
    Host example
      Hostname example.com
      User user1
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部