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

  • keychain:为备份脚本设置安全无密码SSH访问
  • sshpass:使用Shell脚本登录SSH服务器/提供SSH密码
  • 如何在Linux / Unix系统上设置SSH密钥
  • 如何使用Ansible DevOPS工具将ssh公钥上载为authorized_key

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

  • 使用mkpasswd / makepasswd / pwgen生成随机密码
  • Linux / UNIX:生成密码
  • Linux随机密码生成器命令

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

有关详情,请参阅:

  • Debian / Ubuntu:使用Knockd和Iptables设置端口敲击

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和操作系统

建议您使用yum,apt-get,freebsd-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 curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256# Specifies the ciphers allowed
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr#Specifies the available MAC (message authentication code) algorithms
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com# 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

如何测试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 Toolkit或DuoSecurity启用多重身份验证。
  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

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

  1. 20个Nginx Web服务器最佳安全实践

    0个Nginx Web服务器最佳安全实践 20个Nginx Web服务器最佳安全实践  Nginx 是一个轻量级,高性能的Web服务器/反向代理和电子邮件代理(IMAP/POP3),它可以运行在UNI ...

  2. OpenSSH 服务器的 20 个最佳实践

    2019独角兽企业重金招聘Python工程师标准>>> OpenSSH 是 SSH 协议的开源实现. OpenSSH 可进行远程登录.备份.通过 scp 或 sftp 进行远程文件传 ...

  3. 云服务器最佳实践-Linux云服务器SSH登录的安全加固

    Linux云服务器常用的登录方式是SSH,对于密码登录方式创建的云服务器,如何保证登录安全性呢?本文以CentOS 7.6为例,对SSH登录进行安全加固. 修改默认端口 1.通过SSH密码方式远程登录 ...

  4. linux中openssh服务搭建,配置OPenSSH服务器

    一.安装机配置OPenSSH服务器 1.安装与启动OpenSSH 首先查询系统是否安装了与OpenSSH相关的软件包: #rpm -qa| grep openssh 安装完成后,可以使用下述命令启动: ...

  5. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一3.3.3 供应实验室...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第3章 ,第3.3.3节,[美] 克里斯托弗·库塞克(Christopher K ...

  6. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第1章 ,第1.2.2节,[美] 克里斯托弗·库塞克(Christopher K ...

  7. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.1.1 确定参数...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第1章 ,第1.1节,[美] 克里斯托弗·库塞克(Christopher Kus ...

  8. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一3.2.2 建立实验室...

    本节书摘来华章计算机<vSphere性能设计:性能密集场景下CPU.内存.存储及网络的最佳设计实践>一书中的第3章 ,第3.2.2节,[美] 克里斯托弗·库塞克(Christopher K ...

  9. 网易视频云分享:最佳日志实践

    网易视频云是网易倾力打造的一款基于云计算的分布式多媒体处理集群和专业音视频技术,提供稳定流畅.低时延.高并发的视频直播.录制.存储.转码及点播等音视频的PAAS服务,在线教育.远程医疗.娱乐秀场.在线 ...

最新文章

  1. 34补1-2_3 HA Cluster基础及heartbeat实现HA
  2. 分页打印 PAGE-BREAK-AFTER: always
  3. MFC中制作一个似命令行的输入框
  4. 宽字符集(unicode)说明以及转换函数
  5. Pattern-No.03 设计模式之策略模式
  6. poj 2531(dfs)
  7. table 多行 宽度不一致_layui table 中固定列的行高和table行高不一致
  8. linux下centeros7 关于mysql的下载与安装过程
  9. node Koa框架+nunjucks模版开发简易的后台
  10. Tests for normality正态分布检验(python代码实现)
  11. 保研之路——中山大学数据科学与计算机学院直硕夏令营
  12. 最小二乘法求线性回归方程
  13. 我为什么选择Hexo建站
  14. Oracle DBA 路途遥远
  15. html整体框架的大小,html如何动态改变框架的大小
  16. 云渲染哪个平台好?哪个网渲平台比较便宜?
  17. 335x系列平台-ADC接口配置和最大采样速率
  18. CEC2019:麻雀搜索算法(提供Matlab代码)
  19. 出走的门徒之七—驭势 吴甘沙:一步十年
  20. Heap size 80869K exceeds notification threshold (51200K)

热门文章

  1. SVG 教程 (七)SVG 实例,SVG 参考手册
  2. 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
  3. 如何给网站制作一个favicon.ico图标
  4. VS2017——50G超豪华IDE套餐酸爽体验!
  5. C/C++——输入输出特别注意点
  6. 03 掌握C#控制台程序的结构组成 1214
  7. css3 3D动画 200303
  8. 07-mysql基本查询,阶段二,条件查询
  9. 爬虫-视频资源的爬取
  10. git-比对不同-diff