Top20的OpenSSH服务器最佳安全实践--SSHD_CONFIG配置文件详细解读

OpenSSH是SSH协议的实现。建议使用OpenSSH进行远程登录,备份,通过scp或sftp进行远程文件传输等等。SSH非常适合保持两个网络和系统之间交换的数据的机密性和完整性。但是,主要优点是服务器身份验证,通过使用公钥加密。有时会有关于OpenSSH零日攻击的传闻。此页面显示如何保护在Linux或类Unix系统上运行的OpenSSH服务器,以提高sshd安全性

 

OpenSSH默认值

  • TCP端口 - 22
  • OpenSSH服务器配置文件 - sshd_config(位于/ etc / ssh /中)

1.使用基于SSH公钥的登录

OpenSSH服务器支持各种身份验证。建议您使用基于公钥的身份验证。首先,在本地桌面/笔记本电脑上使用以下ssh-keygen命令创建密钥对:

DSA和RSA 1024位或更低的ssh密钥被认为是弱的。避免他们。当向后兼容性与ssh客户端有关时,RSA密钥是通过ECDSA密钥选择的。所有ssh密钥都是ED25519或RSA。不要使用任何其他类型。

$ ssh-keygen -t key_type -b bits -C "comment"
$ ssh-keygen -t ed25519 -C "Login to production cluster at xyz corp"
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_aws_$(date +%Y-%m-%d) -C "AWS key for abc corp clients"


接下来,使用ssh-copy-id命令安装公钥:当提升提供用户密码时。验证基于ssh密钥的登录是否适合您:有关ssh公钥身份验证的详细信息,请参阅:


$ ssh-copy-id -i /path/to/public-key-file user@host
$ ssh-copy-id user@remote-server-ip-or-dns-name
$ ssh-copy-id vivek@rhel7-aws-server

 


$ ssh vivek@rhel7-aws-server


OpenSSH服务器安全最佳实践

2.禁用root用户登录

在禁用root用户登录之前,请确保普通用户可以root身份登录。例如,允许vivek用户使用sudo命令以root用户身份登录。

 

如何在Debian / Ubuntu上将vivek用户添加到sudo组

允许组sudo的成员执行任何命令。将用户vivek添加到sudo组


$ sudo adduser vivek sudo


使用id命令验证组成员身份


$ id vivek

 

如何在CentOS / RHEL服务器上将vivek用户添加到sudo组

允许组轮中的人员在CentOS / RHEL和Fedora Linux服务器上运行所有命令。使用usermod命令将名为vivek的用户添加到wheel组:


$ sudo usermod -aG wheel vivek
$ id vivek

 

测试sudo访问权限并禁用ssh的root登录

测试它并确保用户vivek可以root身份登录或以root身份运行命令:确认后通过将以下行添加到sshd_config来禁用root登录:有关详细信息,请参阅“ 如何禁用Linux上的ssh密码登录以提高安全性 ”。


$ sudo -i
$ sudo /etc/init.d/sshd status
$ sudo systemctl status httpd


PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

 

3.禁用基于密码的登录

必须禁用所有基于密码的登录。仅允许基于公钥的登录。在sshd_config文件中添加以下内容:CentOS 6.x / RHEL 6.x用户上的旧版SSHD应使用以下设置:


AuthenticationMethods publickey
PubkeyAuthentication yes

PubkeyAuthentication yes

 

4.限制用户的ssh访问权限

默认情况下,所有系统用户都可以使用其密码或公钥通过SSH登录。有时您会为FTP或电子邮件目的创建UNIX / Linux用户帐户。但是,这些用户可以使用ssh登录系统。他们可以完全访问系统工具,包括编译器和脚本语言,如Perl,Python,可以打开网络端口,并做许多其他奇特的事情。只允许root,vivek和jerry用户通过SSH使用系统,将以下内容添加到sshd_config:


AllowUsers vivek jerry


或者,您可以允许所有用户通过SSH登录但只拒绝少数用户,sshd_config中包含以下行:


DenyUsers root saroj anjali foo


您还可以配置Linux PAM允许或拒绝通过sshd服务器登录。您可以允许组名列表访问或拒绝访问ssh。

 

5.禁用空密码

您需要明确禁止从密码为空的帐户进行远程登录,使用以下行更新sshd_config:


PermitEmptyPasswords no

 

6.对ssh用户/密钥使用强密码和密码

对于您的密钥使用强大的用户密码和密码来说,这一点非常重要。暴力攻击有效,因为用户使用基于字典的密码。您可以强制用户避免使用字典攻击密码,并使用john the ripper工具查找现有的弱密码。这是一个随机密码生成器示例(放在〜/ .bashrc中):

genpasswd () { 
	local  l = $ 1 
       	[  “ $ l ” == “”  ]  &&  l = 20 
      	tr  -dc A-Za-z0- 9 _ <  / dev / urandom |  head  -c  $ {l}  |  xargs 
}

运行它:
genpasswd 16


输出:

uw8CnDVMwC6vOKgW

 

7.防火墙SSH TCP端口#22

您需要通过更新iptables / ufw / firewall-cmd或pf防火墙配置来防火墙ssh TCP端口#22。通常,OpenSSH服务器只能接受来自LAN或其他远程WAN站点的连接。

 

Netfilter(Iptables)配置

更新/ etc / sysconfig / iptables(Redhat和朋友特定文件)接受来自192.168.1.0/24和202.54.1.5/29的连接,输入:

-A RH-Firewall- 1 -INPUT -s 192.168.1.0 / 24  -m state --state NEW -p tcp --dport  22  -j ACCEPT
 -A RH-Firewall- 1 -INPUT -s 202.54.1.5 / 29  - m state --state NEW -p tcp --dport  22  -j ACCEPT

如果您使用IPv6双重堆叠sshd,请编辑/ etc / sysconfig / ip6tables(Redhat和朋友特定文件),输入:

-A RH-Firewall- 1 -INPUT -s ipv6network :: / ipv6mask -m tcp -p tcp --dport  22  -j ACCEPT

将ipv6network :: / ipv6mask替换为实际的IPv6范围。

 

UFW for Debian / Ubuntu Linux

UFW是简单防火墙的首字母缩写。它用于管理Linux防火墙,旨在为用户提供易于使用的界面。使用以下命令接受来自202.54.1.5/29的端口22

$ sudo ufw allow from 202.54.1.5/29 to any port 22

有关详细信息,请阅读“ Linux:25个Iptables Netfilter防火墙新SysAdmins 示例 ”。

 

* BSD PF防火墙配置

如果您使用PF防火墙更新/etc/pf.conf,如下所示:

将$ ext_if inet proto tcp从{192.168.1.0/24,202.54.1.5/29}传入$ ssh_server_ip端口ssh标志S / SA synproxy状态

8.更改SSH端口并限制IP绑定

默认情况下,SSH会侦听系统上的所有可用接口和IP地址。限制ssh端口绑定并更改ssh端口(许多野兽强制脚本只尝试连接到TCP端口#22)。要绑定到192.168.1.5和202.54.1.5 IP和端口300,请在sshd_config中添加或更正以下行:

Port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5

当您想要接受来自动态WAN IP地址的连接时,使用主动方法脚本(如fail2ban或denyhosts)的更好方法。

 

9.使用TCP包装器(可选)

TCP Wrapper是基于主机的网络ACL系统,用于过滤网络对Internet的访问。OpenSSH确实支持TCP包装器。只需更新您的/etc/hosts.allow文件,如下所示,仅允许来自192.168.1.2和172.16.23.12的SSH地址:

sshd:192.168.1.2 172.16.23.12 

请参阅此常见问题解答,了解如何在Linux / Mac OS X和UNIX操作系统下设置和使用TCP包装器

 

10.阻止SSH破解者/蛮力攻击

蛮力是一种通过使用单个或分布式计算机网络尝试大量可能性(用户和密码的组合)来破坏加密方案的方法。要防止对SSH进行暴力攻击,请使用以下软件:

 

  • DenyHosts是一个基于Python的SSH服务器安全工具。它旨在通过监视身份验证日志中的无效登录尝试并阻止原始IP地址来防止对SSH服务器的暴力攻击。
  • 解释如何在RHEL / Fedora和CentOS Linux下设置DenyHosts
  • Fail2ban是一个类似的程序,可以防止对SSH的暴力攻击。
  • sshguard使用pf保护主机免受对ssh和其他服务的暴力攻击。
  • security / sshblock阻止滥用SSH登录尝试。
  • IPQ BDB过滤器可以被视为fail2ban lite。

11.速率限制TCP端口#22的传入流量(可选)

netfilter和pf都提供速率限制选项,对端口#22上的传入连接执行简单限制。

 

Iptables示例

以下示例将丢弃在60秒内在端口22上进行超过5次连接尝试的传入连接:

#!/bin/bash
inet_if=eth1
ssh_port=22
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent  --set
$IPT -I INPUT -p tcp --dport ${ssh_port} -i ${inet_if} -m state --state NEW -m recent  --update --seconds 60 --hitcount 5 -j DROP

从iptables脚本调用上面的脚本。另一个配置选项:

$IPT -A INPUT  -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state NEW -m limit --limit 3/min --limit-burst 3 -j ACCEPT
$IPT -A INPUT  -i ${inet_if} -p tcp --dport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o ${inet_if} -p tcp --sport ${ssh_port} -m state --state ESTABLISHED -j ACCEPT
# another one line example
# $IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT

有关更多详细信息,请参阅iptables手册页。

 

* BSD PF示例

以下内容将每个源的最大连接数限制为20,并将连接数限制为5秒范围内的15。如果有人违反我们的规则,请将它们添加到我们的abusive_ips表中并阻止它们进行任何进一步的连接。最后,flush关键字会杀死由匹配规则创建的所有状态,这些状态源自超出这些限制的主机。

sshd_server_ip="202.54.1.5"
table <abusive_ips> persist
block in quick from <abusive_ips>
pass in on $ext_if proto tcp to $sshd_server_ip port ssh flags S/SA keep state (max-src-conn 20, max-src-conn-rate 15/5, overload <abusive_ips> flush)

12.使用端口敲击(可选)

端口敲门是一种通过在一组预先指定的关闭端口上生成连接尝试来外部打开防火墙上的端口的方法。一旦收到正确的连接尝试序列,就会动态修改防火墙规则,以允许发送连接的主机尝试连接到特定端口。一个示例端口使用iptables敲击ssh的示例:

$IPT -N stage1
$IPT -A stage1 -m recent --remove --name knock
$IPT -A stage1 -p tcp --dport 3456 -m recent --set --name knock2
 
$IPT -N stage2
$IPT -A stage2 -m recent --remove --name knock2
$IPT -A stage2 -p tcp --dport 2345 -m recent --set --name heaven
 
$IPT -N door
$IPT -A door -m recent --rcheck --seconds 5 --name knock2 -j stage2
$IPT -A door -m recent --rcheck --seconds 5 --name knock -j stage1
$IPT -A door -p tcp --dport 1234 -m recent --set --name knock
 
$IPT -A INPUT -m --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 5 --name heaven -j ACCEPT
$IPT -A INPUT -p tcp --syn -j door

有关详情,请参阅:

13.配置空闲注销超时间隔

用户可以通过ssh登录服务器,可以设置空闲超时时间间隔,以避免无人值守的ssh会话。打开sshd_config并确保配置了以下值:您正在设置空闲超时间隔(以秒为单位)(300秒== 5分钟)。在此间隔过去之后,空闲用户将被自动踢出(读取为已注销)。了解更多详细信息,了解如何在一段时间不活动后自动将BASH / TCSH / SSH用户注销。
 

ClientAliveInterval 300
ClientAliveCountMax 0

 

14.为ssh用户启用警告标题

通过使用以下行更新sshd_config来设置警告标题:


Banner /etc/issue
示例/ etc / issue文件:

----------------------------------------------------------------------------------------------
You are accessing a XYZ Government (XYZG) Information System (IS) that is provided for authorized use only.
By using this IS (which includes any device attached to this IS), you consent to the following conditions:

+ The XYZG routinely intercepts and monitors communications on this IS for purposes including, but not limited to,
penetration testing, COMSEC monitoring, network operations and defense, personnel misconduct (PM),
law enforcement (LE), and counterintelligence (CI) investigations.

+ At any time, the XYZG may inspect and seize data stored on this IS.

+ Communications using, or data stored on, this IS are not private, are subject to routine monitoring,
interception, and search, and may be disclosed or used for any XYZG authorized purpose.

+ This IS includes security measures (e.g., authentication and access controls) to protect XYZG interests--not
for your personal benefit or privacy.

+ Notwithstanding the above, using this IS does not constitute consent to PM, LE or CI investigative searching
or monitoring of the content of privileged communications, or work product, related to personal representation
or services by attorneys, psychotherapists, or clergy, and their assistants. Such communications and work
product are private and confidential. See User Agreement for details.
----------------------------------------------------------------------------------------------issue
issue翻译:
-------------------------------------------------- --------------------------------------------
您正在访问仅供授权使用的XYZ政府(XYZG)信息系统(IS)。
使用此IS(包括本IS附带的任何设备),即表示您同意以下条件:

+ XYZG定期拦截和监控此IS上的通信,目的包括但不限于:
渗透测试,COMSEC监控,网络运营和防御,人员不端行为(PM),
执法(LE)和反间谍(CI)调查。

+任何时候,XYZG都可以检查和获取存储在该IS上的数据。

+本IS的通信使用或存储的数据不是私有的,需要进行例行监控,
拦截和搜索,可以被公开或用于任何XYZG授权目的。

+此IS包括保护XYZG利益的安全措施(例如,身份验证和访问控制),而不是
为了您的个人利益或隐私。

+尽管如此,使用此IS并不构成对PM,LE或CI调查搜索的同意
或监控与个人代表相关的特权通信或工作产品的内容
或由律师,心理治疗师或神职人员及其助手提供的服务。这样的沟通和工作
产品是私密和保密的。有关详情,请参阅用户协议
-------------------------------------------------- --------------------------------------------

以上是标准样本,请咨询您的法律团队,了解具体的用户协议和法律声明详情。

 

15.禁用.rhosts文件(验证)

不要读取用户的〜/ .rhosts和〜/ .shosts文件。使用以下设置更新sshd_config:


IgnoreRhosts yes


SSH可以模拟过时的rsh命令的行为,只需通过RSH禁用不安全的访问。

 

16.禁用基于主机的身份验证(验证)

要禁用基于主机的身份验证,请使用以下选项更新sshd_config:


HostbasedAuthentication no

 

17.补丁OpenSSH和操作系统

建议您使用yumapt-getfreebsd-update等工具,使系统与最新的安全补丁保持同步:

 

18. Chroot OpenSSH(将用户锁定到他们的主目录)

默认情况下,允许用户浏览服务器目录,例如/ etc /,/ bin等。您可以使用基于操作系统的chroot或使用特殊工具(如rssh)来保护ssh 。随着OpenSSH 4.8p1或4.9p1的发布,您不再需要依赖第三方hacks(如rssh或复杂的chroot(1)设置)来锁定用户到其主目录。请参阅此博客文章,了解有关将用户锁定到其主目录的新ChrootDirectory指令。

 

19.在客户端计算机上禁用OpenSSH服务器

工作站和笔记本电脑可以在没有OpenSSH服务器的情况下工作 如果您不提供SSH的远程登录和文件传输功能,请禁用和删除SSHD服务器。CentOS / RHEL用户可以使用yum命令禁用和删除openssh-server :


$ sudo yum erase openssh-server


Debian / Ubuntu Linux用户可以使用apt命令 / apt-get命令禁用和删除它:


$ sudo apt-get remove openssh-server


您可能需要更新iptables脚本以删除ssh异常规则。在CentOS / RHEL / Fedora下编辑文件/ etc / sysconfig / iptables和/ etc / sysconfig / ip6tables。一旦完成重启iptables服务:


# service iptables restart
# service ip6tables restart

 

20.来自Mozilla的奖金提示

如果您使用的是OpenSSH 6.7+或更高版本,请尝试以下设置:

:

#################[ WARNING ]########################
# Do not use any setting blindly. Read sshd_config #
# man page. You must understand cryptography to    #
# tweak following settings. Otherwise use defaults #
####################################################
 
# Supported HostKey algorithms by order of preference.
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
 
# Specifies the available KEX (Key Exchange) algorithms.
KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
 
# Specifies the ciphers allowed
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
 
#Specifies the available MAC (message authentication code) algorithms
MACs [email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
 
# LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
LogLevel VERBOSE
 
# Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
Subsystem sftp  /usr/lib/ssh/sftp-server -f AUTHPRIV -l INFO

您可以使用以下命令获取OpenSSH服务器支持的密码和alog列表:


$ ssh -Q cipher
$ ssh -Q cipher-auth
$ ssh -Q mac
$ ssh -Q kex
$ ssh -Q key


OpenSSH安全教程查询密码和算法选择

 

如何测试sshd_config文件并重新启动/重新加载我的SSH服务器?

要在重新启动sshd之前检查配置文件的有效性和任何错误的密钥的完整性,请运行:
$ sudo sshd -t
扩展测试模式:
$ sudo sshd -T
最后根据您的发行版版本在Linux或Unix类系统上重新启动sshd
sudo systemctl start ssh ## Debian/Ubunt Linux##
sudo systemctl restart sshd.service ## CentOS/RHEL/Fedora Linux##
$ doas /etc/rc.d/sshd restart ## OpenBSD##
$ sudo service sshd restart ## FreeBSD##

 

其他的建议:

  1. 使用2FA实现更严格的SSH安全性 - 可以使用OATH ToolkitDuoSecurity启用多重身份验证。
  2. 使用基于keychain的身份验证 - keychain是一种特殊的bash脚本,旨在使基于密钥的身份验证非常方便和灵活。与无密码密钥相比,它提供了各种安全优势

也可以看看:

  • 官方的OpenSSH项目。
  • 手册页:sshd(8),ssh(1),ssh-add(1),ssh-agent(1)

如果您有这里没有提到的技术或方便的软件,请分享以下评论,以帮助您的读者保持其基于OpenSSH的服务器的安全。

 

转载来源:https://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html

猜你喜欢

转载自blog.csdn.net/Aria_Miazzy/article/details/84789649
今日推荐