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
  - '::'
Copy to Clipboard Toggle word wrap

呈现为:

ListenAddress 0.0.0.0
ListenAddress ::
Copy to Clipboard Toggle word wrap

您可以使用 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
    Copy to Clipboard Toggle word wrap

    示例 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
    Copy to Clipboard Toggle word wrap

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  1. 登录到 SSH 服务器:

    $ ssh <username>@<ssh_server>
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  3. 检查您是否可以以 root 用户身份从 192.0.2.0/24 子网连接到服务器:

    1. 确定您的 IP 地址:

      $ hostname -I
      192.0.2.1
      Copy to Clipboard Toggle word wrap

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

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

      $ ssh root@<ssh_server>
      Copy to Clipboard Toggle word wrap

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
      Copy to Clipboard Toggle word wrap
    • 对于运行 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
      Copy to Clipboard Toggle word wrap

      示例 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
    Copy to Clipboard Toggle word wrap

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 验证 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>
      Copy to Clipboard Toggle word wrap
    • 对于运行 RHEL 9 或更高版本的受管节点:

      # cat /etc/ssh/sshd_config.d/42-my_application.conf
      # Ansible managed
      #
      AcceptEnv LANG LS_COLORS EDITOR
      Copy to Clipboard Toggle word wrap

当默认加密设置不符合某些安全或兼容性需求时,您可能需要使用 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
    Copy to Clipboard Toggle word wrap

    示例 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
    Copy to Clipboard Toggle word wrap

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 您可以通过使用详细的 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
    ...
    Copy to Clipboard Toggle word wrap

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

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

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

LocalForward:
  - 22 localhost:2222
  - 403 localhost:4003
Copy to Clipboard Toggle word wrap

呈现为:

LocalForward 22 localhost:2222
LocalForward 403 localhost:4003
Copy to Clipboard Toggle word wrap
注意

配置选项区分大小写。

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
    Copy to Clipboard Toggle word wrap

    示例 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
    Copy to Clipboard Toggle word wrap

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

  3. 运行 playbook:

    $ ansible-playbook ~/playbook.yml
    Copy to Clipboard Toggle word wrap

验证

  • 通过显示 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
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat