该 cookbook 提供安全的 ssh-client 和 ssh-server 配置。此 cookbook 不提供用户和/或 SSH 密钥的管理功能,请使用其他 cookbook 来实现。
下面您可以找到属性文档及其默认值。
注意:此 cookbook 的部分属性默认值在 recipes 中设置。您应使用更高的属性优先级级别来覆盖此类属性。此类属性在下面的列表中标记为 #override attribute#。覆盖此类属性的示例:
override['ssh-hardening']['ssh']['server']['listen_to'] = node['ipaddress']
['ssh-hardening']['network']['ipv6']['enable'] - false。如果需要 IPv6,请设置为 true['ssh-hardening']['ssh']['ports'] - 22。ssh-server 应监听的端口以及 ssh-client 应连接的端口['ssh-hardening']['ssh'][{'client', 'server'}]['kex'] - nil 以根据服务器版本计算最佳密钥交换(KEX),否则指定一个 Kex 值字符串['ssh-hardening']['ssh'][{'client', 'server'}]['mac'] - nil 以根据服务器版本计算最佳消息认证码(MACs),否则指定一个 Mac 值字符串['ssh-hardening']['ssh'][{'client', 'server'}]['cipher'] - nil 以根据服务器版本计算最佳密码套件,否则指定一个 Cipher 值字符串['ssh-hardening']['ssh'][{'client', 'server'}]['cbc_required'] - false。如果密码套件需要 CBC,请设置为 。这通常仅在较旧的 M2M 机制需要与 SSH 通信时才必要,这些机制未启用任何已配置的安全密码套件。CBC 是一种较弱的替代方案。任何更弱的方案都应避免,因此不可用。将 recipes 添加到 run_list:
"recipe[ssh-hardening]"
这将安装 ssh-server 和 ssh-client。您也可以仅选择其中一个:
"recipe[ssh-hardening::server]"
"recipe[ssh-hardening::client]"
配置属性:
"ssh-hardening": {
"ssh" : {
"server" : {
"listen_to" : "10.2.3.4"
}
}
}
listen_to 的默认值为 0.0.0.0。强烈建议更改该值。
要启用 SFTP 配置,请将以下 recipes 之一添加到 run_list:
"recipe[ssh-hardening]"
或
"recipe[ssh-hardening::server]"
配置属性:
"ssh-hardening": {
"ssh" : {
"server": {
"sftp" : {
"enable" : true,
"chroot" : "/home/sftp/%u",
"group" : "sftusers"
}
}
}
}
这将启用 SFTP 服务器,并将 sftpusers 组中的每个用户 chroot 到 /home/sftp/%u 目录。
可以将额外的配置选项附加到客户端或服务器配置文件中。这可用于覆盖静态设置的值,或添加通过属性无法获得的配置选项。
语法如下:
# => 额外服务器配置
default['ssh-hardening']['ssh']['server']['extras'].tap do |extra|
extra['#Some Comment'] = 'Heres the Comment'
extra['AuthenticationMethods'] = 'publickey,keyboard-interactive'
end
# => 额外客户端配置
default['ssh-hardening']['ssh']['client']['extras'].tap do |extra|
extra['PermitLocalCommand'] = 'no'
extra['Tunnel'] = 'no'
end
Match 块必须放置在 sshd_config 的末尾。这可以通过使用 match_blocks 属性树来实现:
default['ssh-hardening']['ssh']['server']['match_blocks'].tap do |match|
match['User root'] = <<~ROOT
AuthorizedKeysFile .ssh/authorized_keys
ROOT
match['User git'] = <<~GIT
Banner none
AuthorizedKeysCommand /bin/false
AuthorizedKeysFile .ssh/authorized_keys
GSSAPIAuthentication no
PasswordAuthentication no
GIT
end
请安装 chef-dk、VirtualBox 或 VMware Workstation 以及 Vagrant。
使用 rubocop 和 foodcritic 检查代码风格:
$ chef exec rake lint
.....
单元/规范测试使用 chefspec 完成:
$ chef exec rake spec
.....
集成测试使用 test-kitchen 和 inspec 完成:
$ chef exec rake kitchen
.....
# 或者您可以直接使用 kitchen
$ kitchen test
我无法登录我的账户。我已经注册了客户端密钥,但仍然无法登录。
如果您已经排查了所有典型问题(防火墙、网络、密钥缺失、密钥错误、账户禁用等),可能是您的账户被锁定了。最快的排查方法是查看您用户的密码哈希:
sudo grep myuser /etc/shadow
如果哈希中包含 !,则您的账户已被锁定:
myuser:!:16280:7:60:7:::
正确的解决方法是解锁账户(passwd -u myuser)。如果该用户没有密码,您可以通过以下方式解锁:
usermod -p "*" myuser
或者,如果您打算使用 PAM,您可以通过 ['ssh-hardening']['ssh']['use_pam'] = true 启用它。PAM 将允许被锁定的用户使用密钥登录。
为什么我的应用程序无法再通过 SSH 连接?
始终先查看日志文件,如果可能,查看连接时客户端与服务器之间完成的协商过程。
我们遇到过一些应用程序(基于 python 和 ruby)的问题,这是由于它们使用了过时的加密套件。这与本加固模块相冲突,该模块将密码套件、消息认证码(MACs)和密钥交换(KEX)算法的列表缩减为更安全的选择。
如果您发现这还不够,请根据您希望支持的位置,在命名空间 ['ssh-hardening']['ssh']['client'] 或 ['ssh-hardening']['ssh']['server'] 中激活属性 cbc_requires(用于密码套件)、weak_hmac(用于 MACs)和 weak_kex(用于 KEX)。
为什么我将用户添加到我的 SFTP 组后无法登录 SFTP 服务器?
这是 ChrootDirectory 所有权问题。sshd 将拒绝为被设置为 chroot 到任何 sshd 认为所有权/权限不安全的目录的账户提供 SFTP 连接。sshd 严格的所有权/权限要求规定,chroot 路径中的每个目录都必须由 root 拥有,并且仅所有者可写。因此,例如,如果 chroot 环境是 /home,则 /home 必须由 root 拥有。
请参见 https://wiki.archlinux.org/index.php/SFTP_chroot
此 cookbook 主要基于以下指南:
感谢所有人!!
请参见贡献者指南。
根据 Apache License, Version 2.0("许可证")授权; 除非遵守许可证,否则您不得使用此文件。 您可以在以下位置获取许可证副本:
http://www.apache.org/licenses/LICENSE-2.0
除非适用法律要求或书面同意,否则根据许可证分发的软件按"原样"分发, 不附带任何明示或暗示的保证或条件。 请参阅许可证以了解管理权限和限制的具体语言。
true['ssh-hardening']['ssh'][{'client', 'server'}]['weak_hmac'] - false。如果需要较弱的 HMAC 机制,请设置为 true。这通常仅在较旧的 M2M 机制需要与 SSH 通信时才必要,这些机制未启用任何已配置的安全 HMAC。['ssh-hardening']['ssh'][{'client', 'server'}]['weak_kex'] - false。如果需要较弱的密钥交换(KEX)机制,请设置为 true。这通常仅在较旧的 M2M 机制需要与 SSH 通信时才必要,这些机制未启用任何已配置的安全 KEX。['ssh-hardening']['ssh']['client']['remote_hosts'] - [] - ssh-client 可以连接的一个或多个主机。['ssh-hardening']['ssh']['client']['password_authentication'] - false。如果应启用密码认证,请设置为 true。['ssh-hardening']['ssh']['client']['roaming'] - false。如果应启用实验性客户端漫游,请设置为 true。已知这可能导致机密信息泄露给恶意服务器的潜在问题,默认情况下处于禁用状态。['ssh-hardening']['ssh']['client']['extras'] - {}。添加额外的配置选项,详情请参见下文['ssh-hardening']['ssh']['server']['host_key_files'] - nil 以根据服务器版本计算最佳主机密钥配置,否则指定一个文件路径数组(例如 /etc/ssh/ssh_host_rsa_key)['ssh-hardening']['ssh']['server']['dh_min_prime_size'] - 2048 - /etc/ssh/moduli 中可接受的最小素数长度(以位为单位)。低于此数字的素数将被移除。(更多信息和背景请参见此处)['ssh-hardening']['ssh']['server']['dh_build_primes'] - false - 是否应构建自己的素数。此重建仅发生一次,且需要大量时间(在现代硬件上生成 4096 长度约需 1.5 - 2 小时)。['ssh-hardening']['ssh']['server']['dh_build_primes_size'] - 4096 - 应生成的素数长度。此选项仅在启用 dh_build_primes 时有效。['ssh-hardening']['ssh']['server']['listen_to'] #override attribute# - ssh-server 应监听的一个或多个 IP 地址。默认监听所有接口。出于安全原因,应进行配置!['ssh-hardening']['ssh']['server']['allow_root_with_key'] - false 以完全禁用 root 登录。设置为 true 以允许 root 通过基于密钥的机制登录['ssh-hardening']['ssh']['server']['allow_tcp_forwarding'] - false。设置为 true 以允许 TCP 转发['ssh-hardening']['ssh']['server']['allow_agent_forwarding'] - false。设置为 true 以允许代理转发['ssh-hardening']['ssh']['server']['allow_x11_forwarding'] - false。设置为 true 以允许 X11 转发['ssh-hardening']['ssh']['server']['permit_tunnel'] - false 以禁用 tun 设备转发。设置为 true 以允许 tun 设备转发。其他可接受的值:'yes'、'no'、'point-to-point'、'ethernet'。具体行为请参见 man sshd_config。注意:您还需要启用 allow_tcp_forwarding。['ssh-hardening']['ssh']['server']['use_pam'] - true。设置为 false 以禁用 sshd 的 pam 认证['ssh-hardening']['ssh']['server']['challenge_response_authentication'] - false。设置为 true 以启用质询响应认证。['ssh-hardening']['ssh']['server']['deny_users'] - [] 以配置 DenyUsers,如果指定,则与任一模式匹配的用户名将被禁止登录。['ssh-hardening']['ssh']['server']['allow_users'] - [] 以配置 AllowUsers,如果指定,则仅允许与任一模式匹配的用户名登录。['ssh-hardening']['ssh']['server']['deny_groups'] - [] 以配置 DenyGroups,如果指定,则主组或附加组列表与任一模式匹配的用户将被禁止登录。['ssh-hardening']['ssh']['server']['allow_groups'] - [] 以配置 AllowGroups,如果指定,则仅允许主组或附加组列表与任一模式匹配的用户登录。['ssh-hardening']['ssh']['server']['print_motd'] - false。设置为 true 以启用 MOTD 的打印['ssh-hardening']['ssh']['server']['print_last_log'] - false。设置为 true 以启用上次登录信息的打印['ssh-hardening']['ssh']['server']['banner'] - nil。设置类似 '/etc/issue.net' 的路径以启用横幅['ssh-hardening']['ssh']['server']['os_banner'] - false 以在协议握手期间禁用版本信息(仅限 Debian 系列)。设置为 true 以启用['ssh-hardening']['ssh']['server']['use_dns'] - nil 以使用 openssh 默认值。设置为 true 或 false 以启用/禁用远程主机的 DNS 查找和检查['ssh-hardening']['ssh']['server']['use_privilege_separation'] - nil 以根据服务器版本计算最佳值,否则设置为 true 或 false['ssh-hardening']['ssh']['server']['login_grace_time'] - 30s。登录应在该时间内成功,否则用户将被断开连接。['ssh-hardening']['ssh']['server']['max_auth_tries'] - 2。每次连接的认证尝试次数['ssh-hardening']['ssh']['server']['max_sessions'] - 10 每次连接的会话数['ssh-hardening']['ssh']['server']['password_authentication'] - false。如果应启用密码认证,请设置为 true['ssh-hardening']['ssh']['server']['log_level'] - verbose。sshd 的日志级别。可能的值请参见 man 5 sshd_config 中的 LogLevel。['ssh-hardening']['ssh']['server']['sftp']['enable'] - false。设置为 true 以启用 OpenSSH 守护进程的 SFTP 功能['ssh-hardening']['ssh']['server']['sftp']['group'] - sftponly。设置 SFTP 的 Match Group 选项,以仅允许专用用户使用 SFTP['ssh-hardening']['ssh']['server']['sftp']['chroot'] - /home/%u。设置 SFTP 用户应被 chroot 的目录['ssh-hardening']['ssh']['server']['sftp']['authorized_keys_path'] - nil。如果不为 nil,则为将设置在 Match Group 内用于仅 SFTP 访问的一个或多个空格分隔的 authorized keys 文件的完整路径['ssh-hardening']['ssh']['server']['sftp']['password_authentication'] - false。如果应启用密码认证,请设置为 true['ssh-hardening']['ssh']['server']['authorized_keys_path'] - nil。如果不为 nil,则期望一个或多个空格分隔的 authorized keys 文件的完整路径。['ssh-hardening']['ssh']['server']['extras'] - {}。添加额外的配置选项,详情请参见下文['ssh-hardening']['ssh']['server']['match_blocks'] - {}。匹配配置块,详情请参见下文