Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
ansible-ssh-hardening — 此 Ansible 角色提供了众多与安全相关的 SSH 配置,提供全方位的基线防护。 | Kitploit
工具/GitHubGitHub/dev-sec/ansible-ssh-hardening
云基础设施安全配置审计网络安全DevSecOps身份验证Archived
GitHubdev-sec/ansible-ssh-hardening

ansible-ssh-hardening

此 Ansible 角色提供了众多与安全相关的 SSH 配置,提供全方位的基线防护。

查看仓库
7861905年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站

ssh-hardening(Ansible 角色)

注意: 此角色已迁移至我们的 hardening-collection:

  • https://github.com/dev-sec/ansible-os-hardening/
  • https://galaxy.ansible.com/devsec/hardening

请在那里提交任何 issue 和 pull request!

要求

  • Ansible > 2.5

角色变量

  • network_ipv6_enable
    • 默认值:false
    • 描述:如果需要 IPv6,则设为 true。ssh_listen_to 也必须设置为监听 IPv6 地址(例如 [::])。
  • ssh_server_ports
    • 默认值:['22']
    • 描述:ssh-server 应监听的端口
  • ssh_client_port
    • 默认值:'22'
    • 描述:ssh-client 应连接的端口
  • ssh_listen_to
    • 默认值:['0.0.0.0']
    • 描述:一个或多个 IP 地址,ssh-server 应监听这些地址。默认是所有 IPv4 地址,但出于安全原因应配置为特定地址!
  • ssh_host_key_files
    • 默认值:[]
    • 描述:sshd 的主机密钥。如果为空,将使用 ['/etc/ssh/ssh_host_rsa_key', '/etc/ssh/ssh_host_ecdsa_key', '/etc/ssh/ssh_host_ed25519_key'](只要已安装的 sshd 版本支持)。
  • ssh_host_key_algorithms
    • 默认值:[]
    • 描述:服务器提供的主机密钥算法。如果为空,将使用默认列表,否则使用指定的算法列表覆盖该设置。
  • ssh_client_alive_interval
    • 默认值:600
    • 描述:指定发送 keepalive 消息的间隔
  • ssh_client_alive_count
    • 默认值:3
    • 描述:定义 keep-alive 消息发送的次数
  • ssh_permit_tunnel
    • 默认值:false
    • 描述:如果需要 SSH 端口隧道,则设为 true
  • ssh_remote_hosts
    • 默认值:[]
    • 描述:一个或多个主机及其自定义选项,用于 ssh-client。默认为空。请参阅 defaults/main.yml 中的示例。
  • ssh_permit_root_login
    • 默认值:no
    • 描述:禁用 root 登录。设置为 without-password 或 yes 以启用 root 登录
  • ssh_allow_tcp_forwarding
    • 默认值:no
    • 描述:'no' 禁用 TCP 转发。设置为 'yes' 允许 TCP 转发。如果您使用 OpenSSH >= 6.2 版本,可以指定 'yes'、'no'、'all' 或 'local'。
      注意:传递给此变量的值必须是字符串,因此 'yes' 和 'no' 应带引号传递。
  • ssh_gateway_ports
    • 默认值:false
    • 描述:false 禁用将转发端口绑定到非回环地址。设置为 true 强制绑定到通配符地址。设置为 clientspecified 允许客户端指定要绑定的地址。
  • ssh_allow_agent_forwarding
    • 默认值:false
    • 描述:false 禁用代理转发。设置为 true 允许代理转发。
  • ssh_x11_forwarding
    • 默认值:false
    • 描述:false 禁用 X11 转发。设置为 true 允许 X11 转发。
  • ssh_pam_support
    • 默认值:true
    • 描述:如果 SSH 支持 PAM,则设为 true。
  • ssh_use_pam
    • 默认值:true
    • 描述:false 禁用 pam 认证。
  • ssh_gssapi_support
    • 默认值:false
    • 描述:如果 SSH 支持 GSSAPI,则设为 true。
  • ssh_kerberos_support
    • 默认值:true
    • 描述:如果 SSH 支持 Kerberos,则设为 true。
  • ssh_deny_users
    • 默认值:''
    • 描述:如果指定,则与任一模式匹配的用户名将被禁止登录。
  • ssh_allow_users
    • 默认值:''
    • 描述:如果指定,则仅允许与任一模式匹配的用户名登录。
  • ssh_deny_groups
    • 默认值:''
    • 描述:如果指定,则主组或附加组列表与任一模式匹配的用户将被禁止登录。
  • ssh_allow_groups
    • 默认值:''
    • 描述:如果指定,则仅允许主组或附加组列表与任一模式匹配的用户登录。
  • ssh_authorized_keys_file
    • 默认值:''
    • 描述:更改包含可用于用户认证的公钥的默认文件。
  • ssh_trusted_user_ca_keys_file
    • 默认值:''
    • 描述:指定包含用于签署用户证书的可信证书颁发机构公钥的文件。
  • ssh_trusted_user_ca_keys
    • 默认值:[]
    • 描述:设置用于签署用户证书的可信证书颁发机构公钥。仅在设置了 ssh_trusted_user_ca_keys_file 时使用。
  • ssh_authorized_principals_file
    • 默认值:''
    • 描述:指定包含允许的主体(principals)的文件。仅在设置了 ssh_trusted_user_ca_keys_file 时使用。
  • ssh_authorized_principals
    • 默认值:[]
    • 描述:包含文件路径和授权主体的哈希列表,所有选项请参阅 default_custom.yml。仅在设置了 ssh_authorized_principals_file 时使用。
  • ssh_print_motd
    • 默认值:false
    • 描述:false 禁用 MOTD 的打印
  • ssh_print_pam_motd
    • 默认值:false
    • 描述:false 禁用通过 pam 打印 MOTD(Debian 和 Ubuntu)
  • ssh_print_last_log
    • 默认值:false
    • 描述:false 禁用上次登录信息的显示
  • sftp_enabled
    • 默认值:false
    • 描述:true 启用 sftp 配置
  • sftp_umask
    • 默认值:'0027'
    • 描述:指定 sftp 的 umask
  • sftp_chroot
    • 默认值:true
    • 描述:false 禁用 sftp 的 chroot
  • sftp_chroot_dir
    • 默认值:/home/%u
    • 描述:更改默认的 sftp chroot 位置
  • ssh_client_roaming
    • 默认值:false
    • 描述:启用实验性的客户端漫游
  • sshd_moduli_file
    • 默认值:'/etc/ssh/moduli'
    • 描述:SSH moduli 文件的路径
  • sshd_moduli_minimum
    • 默认值:2048
    • 描述:移除小于定义大小的 Diffie-Hellman 参数以缓解 logjam 攻击
  • ssh_challengeresponseauthentication
    • 默认值:false
    • 描述:指定是否允许质询-响应认证(例如通过 PAM)
  • ssh_client_password_login
    • 默认值:false
    • 描述:true 允许 ssh 客户端使用基于密码的认证
  • ssh_server_password_login
    • 默认值:false
    • 描述:true 允许 ssh 服务器使用基于密码的认证
  • ssh_banner
    • 默认值:false
    • 描述:true 在登录时打印横幅
  • ssh_banner_path
    • 默认值:'/etc/sshd/banner.txt'
    • 描述:SSH 横幅文件的路径
  • ssh_client_hardening
    • 默认值:true
    • 描述:false 停止加固客户端
  • ssh_client_port
    • 默认值:'22'
    • 描述:指定连接远程主机的端口号。
  • ssh_client_compression
    • 默认值:false
    • 描述:指定客户端是否请求压缩。
  • ssh_compression
    • 默认值:false
    • 描述:指定用户成功认证后是否启用服务器端压缩。
  • ssh_login_grace_time
    • 默认值:30s
    • 描述:指定 SSH 服务器允许成功认证的时间
  • ssh_max_auth_retries
    • 默认值:2
    • 描述:指定每次连接允许的最大认证尝试次数。
  • ssh_max_sessions
    • 默认值:10
    • 描述:指定给定连接允许的最大打开会话数。
  • ssh_print_debian_banner
    • 默认值:false
    • 描述:true 打印 Debian 特定的横幅
  • ssh_server_enabled
    • 默认值:true
    • 描述:false 禁用 opensshd 服务器
  • ssh_server_hardening
    • 默认值:true
    • 描述:false 停止加固服务器
  • ssh_server_match_address
    • 默认值:''
    • 描述:引入一个条件块。如果 Match 行上的所有条件都满足,则以下行上的关键字将覆盖配置文件全局部分中设置的关键字,直到另一个 Match 行或文件末尾。
  • ssh_server_match_group
    • 默认值:''
    • 描述:引入一个条件块。如果 Match 行上的所有条件都满足,则以下行上的关键字将覆盖配置文件全局部分中设置的关键字,直到另一个 Match 行或文件末尾。
  • ssh_server_match_user
    • 默认值:''
    • 描述:引入一个条件块。如果 Match 行上的所有条件都满足,则以下行上的关键字将覆盖配置文件全局部分中设置的关键字,直到另一个 Match 行或文件末尾。
  • ssh_server_match_local_port
    • 默认值:''
    • 描述:引入一个条件块。如果 Match 行上的所有条件都满足,则以下行上的关键字将覆盖配置文件全局部分中设置的关键字,直到另一个 Match 行或文件末尾。
  • ssh_server_permit_environment_vars
    • 默认值:no
    • 描述:yes 指定 sshd 处理 ~/.ssh/environment 和 ~/.ssh/authorized_keys 中的 environment= 选项。使用 openssh 7.8 版本时,除了全局的 "yes" 或 "no" 设置外,还可以指定环境变量名称的白名单。
  • ssh_server_accept_env_vars
    • 默认值:''
    • 描述:指定客户端发送的哪些环境变量将被复制到会话的环境中,多个环境变量可以用空格分隔。
  • ssh_use_dns
    • 默认值:false
    • 描述:指定 sshd 是否应查找远程主机名,并检查远程 IP 地址解析出的主机名是否映射回完全相同的 IP 地址。
  • ssh_server_revoked_keys
    • 默认值:[]
    • 描述:ssh 服务器将始终拒绝的已撤销公钥列表,可用于撤销已知的弱密钥或已泄露密钥。
  • ssh_max_startups
    • 默认值:'10:30:100'
    • 描述:指定 SSH 守护进程允许的最大并发未认证连接数。
  • ssh_macs
    • 默认值:[]
    • 描述:更改此列表以覆盖 MAC 算法。默认值见 defaults/main.yml
  • ssh_kex
    • 默认值:[]
    • 描述:更改此列表以覆盖 KEX 算法。默认值见 defaults/main.yml
  • ssh_ciphers
    • 默认值:[]
    • 描述:更改此列表以覆盖加密算法。默认值见 defaults/main.yml
  • ssh_custom_options
    • 默认值:[]
    • 描述:SSH 客户端配置的自定义行
  • sshd_custom_options
    • 默认值:[]
    • 描述:SSH 守护进程配置的自定义行
  • sshd_syslog_facility
    • 默认值:'AUTH'
    • 描述:sshd 记录消息时使用的 facility 代码
  • sshd_log_level
    • 默认值:'VERBOSE'
    • 描述:sshd 记录消息时使用的详细级别
  • sshd_strict_modes
    • 默认值:true
    • 描述:在接受登录前检查用户文件和主目录的文件模式及所有权
  • sshd_authenticationmethods
    • 默认值:publickey
    • 描述:指定用户必须成功完成的认证方法才能获得访问权限。请确保为所选认证方法设置所有必需的变量。默认值见 defaults/main.yml

配置角色变量中未列出的设置

如果您想配置上面未列出的 ssh 选项,可以使用 ssh_custom_options(用于 /etc/ssh/ssh_config)或 sshd_custom_options(用于 /etc/ssh/sshd_config)进行设置。这些选项将设置在文件的开头,因此您可以在文件后面覆盖这些选项。

示例 playbook:

root@kitploit:~
- hosts: localhost
  roles:
    - dev-sec.ssh-hardening
  vars:
    ssh_custom_options:
      - "Include /etc/ssh/ssh_config.d/*"
    sshd_custom_options:
      - "AcceptEnv LANG"

更改默认端口和幂等性

此角色使用默认端口 22 或清单中配置的端口来连接服务器。如果通过 ssh_server_ports 更改了默认的 ssh 端口,一旦 ssh 服务器重启,它仍将尝试使用之前的端口连接。为了在同一服务器上再次运行此角色,必须更新清单以使用新的 ssh 端口。

如果幂等性很重要,请考虑使用角色 ssh-hardening-fallback,它是此角色的包装器,当配置的端口不可达时会回退到端口 22。

示例 Playbook

root@kitploit:~
- hosts: localhost
  roles:
    - dev-sec.ssh-hardening

本地测试

本地测试此角色的首选方式是使用 Docker。您需要在系统上安装 Docker。请参阅入门获取适合您系统的 Docker 软件包。

您也可以使用 vagrant 和 Virtualbox 或 VMWare 在本地运行测试。您需要在系统上安装 Virtualbox 和 Vagrant。请参阅 Vagrant 下载获取适合您系统的 vagrant 软件包。我们所有的测试都使用 test-kitchen。如果您不熟悉 test-kitchen,请查看他们的指南。

接下来安装 test-kitchen:

root@kitploit:~
# 安装依赖
gem install bundler
bundle install

使用 Docker 测试

root@kitploit:~
# 在单台机器上快速测试
bundle exec kitchen test ssh-ubuntu1804-ansible-latest

# 在所有机器上测试
bundle exec kitchen test

# 用于开发
bundle exec kitchen create ssh-ubuntu1804-ansible-latest
bundle exec kitchen converge ssh-ubuntu1804-ansible-latest
bundle exec kitchen verify ssh-ubuntu1804-ansible-latest

# 清理
bundle exec kitchen destroy ssh-ubuntu1804-ansible-latest

使用 Virtualbox 测试

root@kitploit:~
# 在单台机器上快速测试
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test ssh-ubuntu-1804

# 在所有机器上测试
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen test

# 用于开发
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen create ssh-ubuntu-1804
KITCHEN_YAML=".kitchen.vagrant.yml" bundle exec kitchen converge ssh-ubuntu-1804

更多信息请参阅 test-kitchen

常见问题 / 陷阱

我无法登录我的账户。我已经注册了客户端密钥,但它仍然不允许我登录。

如果您已经排除了所有典型问题(防火墙、网络、密钥缺失、密钥错误、账户禁用等),可能是您的账户被锁定了。最快的排查方法是查看您的用户的密码哈希:

root@kitploit:~
sudo grep myuser /etc/shadow

如果哈希中包含 !,则您的账户已被锁定:

root@kitploit:~
myuser:!:16280:7:60:7:::

正确的解决方法是解锁账户(passwd -u myuser)。如果用户没有密码,您可以通过以下方式解锁:

root@kitploit:~
usermod -p "*" myuser

或者,如果您打算使用 PAM,您已通过 ssh_use_pam: true 启用了它。PAM 将允许被锁定的用户使用密钥登录。

为什么我的应用程序无法再通过 SSH 连接?

始终先查看日志文件,如果可能,查看连接时客户端和服务器之间完成的协商。

我们见过一些应用程序(基于 python 和 ruby)的问题,这是由于它们使用了过时的加密套件。这与本加固模块冲突,该模块将加密算法、消息认证码(MAC)和密钥交换(KEX)算法的列表缩减为更安全的选择。

使用此角色后,Ansible 的 template/copy/file 模块不再工作!

此角色默认禁用 SFTP。Ansible 默认使用 SFTP 将文件传输到远程主机。您必须在 ansible.cfg 中设置 scp_if_ssh = True。这样 Ansible 将使用 SCP 复制文件。或者,您可以通过将 sftp_enabled 设置为 true 重新启用 SFTP。

由于权限不足,无法重启 sshd 服务

如果在运行处理程序 "restart sshd" 时收到以下错误

root@kitploit:~
Unable to restart service ssh: Failed to restart ssh.service: Access denied

或

root@kitploit:~
failure 1 running systemctl show for 'ssh': Failed to connect to bus: No such file or directory

请以 root 身份运行 playbook(不要在 playbook 级别使用 become: yes),或者在处理程序中添加 become: yes。

这是 Ansible 的一个 bug:请参阅此处和此处了解更多信息。

贡献

请参阅贡献者指南。

许可证和作者

  • 作者:Sebastian Gumprich
  • 作者:Christoph Hartmann [email protected]

根据 Apache 许可证 2.0 版("许可证")授权; 除非遵守许可证,否则您不得使用此文件。 您可以在以下位置获取许可证副本:

root@kitploit:~
http://www.apache.org/licenses/LICENSE-2.0

除非适用法律要求或书面同意,否则按许可证分发的软件按"原样"分发, 不附带任何明示或暗示的保证或条件。 请参阅许可证了解特定语言下的权限和限制。

下载工具