20个OpenSSH服务器最佳安全实践

【.com独家翻译】OpenSSH是SSH协议的一种实现,它是远程登录,通过scp或sftp实现备份和远程文件传输等的推荐安全协议,SSH保证两个网络或两个系统之间数据交互的机密性和完整性,它的主要优点是通过公钥加密技术实现服务器身份验证。但时有OpenSSH零日漏洞爆出,因此OpenSSH服务器本身也需要调整才能提高整体安全性。

默认配置文件和SSH端口

/etc/ssh/sshd_config:OpenSSH服务器配置文件;

/etc/ssh/ssh_config:OpenSSH客户端配置文件;

~/.ssh/:用户SSH配置目录;

~/.ssh/authorized_keys:用户公钥(RSA或DSA);

/etc/nologin:如果存在这个文件,sshd会拒绝除root用户外的其它用户登录;

/etc/hosts.allow和/etc/hosts.deny:定义tcp-wrapper执行的访问控制列表;

SSH默认端口:22  

图 1 SSH会话窗口

1、禁用OpenSSH服务器

工作站和笔记本电脑可以不用OpenSSH服务器,如果你不需要提供SSH远程登录和文件传输功能,可以禁用并删除SSHD服务器,CentOS / RHEL / Fedora Linux用户可以使用下面的yum命令禁用和删除openssh-server:

# chkconfig sshd off

# yum erase openssh-server

Debian / Ubuntu Linux用户可以使用下面的apt-get命令禁用和删除openssh-server:

# apt-get remove openssh-server

你可能需要更新你的iptables脚本,移除ssh例外规则,在CentOS / RHEL / Fedora下,打开etc/sysconfig/iptables和/etc/sysconfig/ip6tables文件,删掉与ssh相关的例外规则,然后使用下面的命令重启iptables:

# service iptables restart

# service ip6tables restart

2、只使用SSH v2

SSH协议的第一个版本(SSH v1或SSH-1)存在中间人攻击问题和安全漏洞,它已经被作废,应该不惜一切代价避免使用SSH v1。打开sshd_config配置文件,如果没有就增加下面这一行设置:

Protocol 2

这样启动sshd后就只会使用SSH协议的第二个版本(SSH v2或SSH-2)了。

3、限制用户的SSH访问

默认情况下,所有系统用户都可以用他们的密码或公钥通过SSH实现远程登录,但有时你创建的UNIX/Linux用户是用于ftp或email目的,如果不加限制,这些用户也可以使用ssh登录到系统,并且可以使用编译器,脚本语言,如Perl或Python,这些工具已经足够利害,可以打开任意网络端口,执行任意操作。我的一个客户端上有过时的PHP脚本,攻击者可以通过PHP脚本在系统上创建一个新账号,但攻击者不能通过该账号ssh登录,因为它没有在允许的用户列表范围内(AllowUsers)。

假设我们只要root,vivek和jerry用户能通过SSH使用系统,向sshd_config配置文件中添加:

AllowUsers root vivek jerry

另外,你还可以允许所有用户通过SSH登录,但拒绝一部分用户,这时就需要向sshd_config配置文件中添加:

DenyUsers saroj anjali foo

你也可以配置Linux PAM允许或拒绝通过sshd服务器登录,你也可以指定一列用户组有权访问或拒绝他们访问ssh。

4、配置空闲超时退出时间间隔

用户可以通过ssh登录到服务器,你可以设置一个空闲超时时间间隔避免出现孤儿ssh会话,打开sshd_config配置文件,确保有如下的配置项:

ClientAliveInterval 300

ClientAliveCountMax 0

上面的例子设置的空闲超时时间间隔是300秒,即5分钟,过了这个时间后,空闲用户将被自动踢出出去(可以理解为退出登录/注销)。

5、禁用.rhosts文件

不要读取用户的~/.rhosts和~/.shosts文件,使用下面的设置更新sshd_config配置文件:

IgnoreRhosts yes

SSH可以模拟过时的rsh命令的行为,rsh被公认为是不安全的远程访问协议,因此必须得禁用掉。 #p#

6、禁用基于主机的身份验证

为了禁用基于主机的身份验证,使用下面的选项更新sshd_config配置文件:

HostbasedAuthentication no

7、禁用root通过SSH登录

没有必要使用root用户通过SSH远程登录,普通用户可以通过su或sudo(推荐)获得root级别的访问权,这样你可以得到完整的审计信息,谁通过sudo在系统上执行特权命令就会一清二楚。为了禁止root用户通过SSH登录,使用下面的选项更新sshd_config配置文件:

PermitRootLogin no

但也有人认为root用户通过SSH登录没什么不妥,之所以人们一直有“不要用root用户登录”的想法,都是不安全的Telnet协议惹的祸。

8、启用警告横幅

使用下面的设置更新sshd_config配置文件,设置一个警告横幅:

Banner /etc/issue

在/etc/issue文件中,可以和你的法律顾问商讨一下,列出用户使用ssh应该遵守的法律法规和注意事项。

8、防火墙SSH端口:22

你需要为ssh端口22更新iptables或pf防火墙配置,通常,OpenSSH服务器应该只接受来自局域网或受信任的远程客户端的连接。

Netfilter(iptables)配置

更新/etc/sysconfig/iptables(Red Hat及基于Red Hat的系统)文件,只接受来自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

如果你还准备让sshd通过IP V6,那还需要更新/etc/sysconfig/ip6tables(Red Hat或基于Red Hat的系统)文件,配置如下:

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

你在实际操作时,请用真实的IP V6地址范围替换ipv6network::/ipv6mask。

◆BSD PF防火墙配置

如果你使用的是PF防火墙,请更新/etc/pf.conf文件:

pass in on $ext_if inet proto tcp from {192.168.1.0/24, 202.54.1.5/29} to $ssh_server_ip port 
ssh flags S/SA synproxy state

默认情况下,ssh会监听系统上所有网卡和IP地址,限制ssh端口绑定,改变ssh端口(暴力攻击通常是针对端口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

更好的办法是使用主动式脚本,如后面会谈到的fail2ban或denyhosts。

10、使用强SSH密码和密语

为你的密钥使用强用户密码和密语有多重要我就不说了,暴力破解攻击之所以能够得逞,都是因为你使用了基于字典的密码,你可以强制用户避免使用字典中能直接找到的词作密码,另外可以借助john the ripper tool工具找出现有系统中存在的弱密码。下面是一个随机密码生成器(放到你的~/.bashrc文件中):

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

}

运行它:

genpasswd 16

输出:

uw8CnDVMwC6vOKgW

#p#

11、使用基于公钥的身份验证

使用公/私密钥对和密码对私钥实施保护,如何使用基于RSA和DSA的身份验证,请参考http://www.cyberciti.biz/tips/ssh-public-key-based-authentication-how-to.html和http://www.cyberciti.biz/faq/ssh-password-less-login-with-dsa-publickey-authentication/,永远不要使用无密钥密码登录。

12、使用基于密钥链的身份验证

密钥链是一个经过设计的特殊的bash脚本,它让基于密钥的身份验证变得难以置信的方便和灵活,与无密钥密码相比,它的优势太多了。关于如何安装和使用密钥链软件,请访问http://www.cyberciti.biz/faq/ssh-passwordless-login-with-keychain-for-scripts/。

13、Chroot SSHD(将用户锁定在他们自己的home目录)

默认情况下,用户可以浏览服务器目录,如/etc,/bin等,你可以使用基于操作系统的chroot或使用特殊的工具,如rssh,来保护ssh,在OpenSSH 4.8p1和4.9p1中,你不再需要第三方hack工具,如rssh,或是复杂的chroot配置,来将用户限制在他们自己的home目录中,新版本中增加了一个ChrootDirectory命令,它可以直接将用户限制在自己的home目录中。更多信息请访问http://www.debian-administration.org/articles/590。

14、使用TCP Wrapper

TCP Wrapper是一个基于主机的网络ACL系统,用于过滤到互联网的网络访问,OpenSSH支持TCP Wrapper,只需要更新你的/etc/hosts.allow文件,下面的例子表示仅允许来自192.168.1.2 和172.16.23.12的ssh访问:

192.168.1.2 172.16.23.12

关于如何在Linux / Mac OS X 和UNIX类操作系统上安装和配置TCP Wrapper,请访问http://www.cyberciti.biz/faq/tcp-wrappers-hosts-allow-deny-tutorial/。

15、禁用空密码

你需要明确禁止密码为空的用户远程登录,使用下面的设置更新sshd_config配置文件:

PermitEmptyPasswords no

#p#

16、给SSH攻击者设置障碍

暴力破解是击败加密机制的一种有效手段,暴力破解一般会利用大量的分布式计算机网络,为了阻止对ssh的暴力攻击,可以使用下面的软件:

◆DenyHosts:它是一款基于Python的安全工具,专为保护SSH服务器设计,通过监控身份验证日志中无效的登录尝试,阻止掉不怀好意的IP地址,实现对SSH服务器的保护。有关RHEL / Fedora和CentOS Linux下如何安装DenyHosts的信息,请访问http://www.cyberciti.biz/faq/rhel-linux-block-ssh-dictionary-brute-force-attacks/。

◆Fail2ban:它也是一个阻止暴力破解SSH的保护工具。

◆security/sshguard-pf:使用pf保护主机免受ssh暴力攻击。

◆security/sshguard-ipfw:使用ipfw保护主机免受ssh暴力攻击。

◆security/sshguard-ipfilter:使用ipfilter保护主机免受ssh暴力攻击。

◆security/sshblock:阻止频繁的ssh登录尝试。

◆security/sshit:检查SSH/FTP暴力攻击,阻止攻击源IP地址。

◆BlockHosts:自动阻止滥用ssh登录的IP主机。

◆Blacklist:处理暴力攻击尝试。

◆Brute Force Detection:它是一个模块化的shell脚本,解析应用程序日志,检查身份验证失败记录。

◆IPQ BDB filter:可以看作是一个轻量级的fail2ban。

17、限制端口22上的入站连接速率

netfilter和pf都提供了速率限制功能,因此可以对端口22实施速率限制。

iptables示例

下面的例子展示了60秒内,超过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

◆BSD PF例子

下面的设置将限制每个源的最大连接数为20,5秒内最大连接次数为15,如果有人违背该规则,它将会进入到我们的abusive_ips表中,以后的连接都会被阻止掉,最后,flush关键字取消了所有与该规则匹配的状态。

sshd_server_ip="202.54.1.5"

table persist

block in quick from

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 flush)

18、使用端口碰撞

端口碰撞(Port knocking)是一个从外部打开防火墙上端口的方法,它在一组预设的关闭端口上产生一个连接尝试,当连接尝试的顺序被接受,防火墙规则被动态修改,允许发送该连接尝试的主机连接到指定的端口,下面是ssh使用iptables进行端口碰撞的一个简单示例:

$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 doo

◆fwknop是一个集合了端口碰撞和被动操作系统指纹的实现。

◆多端口碰撞仅适合Netfilter/Iptables。

19、使用日志分析器

使用logwatch或logcheck读取你的日志,这些工具让你更容易阅读日志内容,它们可以遍历给定时间范围内的日志,并生成明了的报告,请确保sshd_config配置文件中将LogLevel设置为INFO或DEBUG了。

LogLevel INFO

20、给OpenSSH和操作系统及时打补丁

强烈建议大家使用yum,apt-get,freebsd-update和其它工具给系统打补丁,保持系统更新到最新状态。

其它措施

如果想隐藏OpenSSH的版本,你需要修改它的源代码,并重新编译,然后修改sshd_config文件,确保有下列配置项:

#  开启特权隔离

UsePrivilegeSeparation yes

# 防止使用不安全的home目录和密钥权限

StrictModes yes

# 开启反向名称检查

VerifyReverseMapping yes

# 设置是否需要端口转发

AllowTcpForwarding no

X11Forwarding no

#  指定是否允许密码验证,默认是yes

PasswordAuthentication no

最后警告大家,在重启或重新载入修改之前,先使用下面的命令验证一下sshd_config配置文件是否无误:

# /usr/sbin/sshd -t

如果你有文中尚未提及的技巧或软件,欢迎在评论中反馈,也欢迎你对本文涉及到的技巧和软件发表你的看法。

【.COM 独家翻译,转载请注明出处及作者!】

【编辑推荐】

  1. 编译安装openssh,使用RSA登陆
  2. 在windows下使用OpenSSH

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/146395.html<

(0)
运维的头像运维
上一篇2025-03-11 01:56
下一篇 2025-03-11 01:57

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注