十个步骤确保 SSH 服务器安全

admin 2024年9月18日11:51:00评论16 views字数 9480阅读31分36秒阅读模式

·简介
· 1. 使用基于 SSH 密钥的身份验证
· 2. 更改 SSH 端口号
· 3. 禁用 SSH 根登录
· 4. 删除旧的不安全 SSH 协议
· 5. 启用 SSH 日志记录和监控
· 6. 实施 Fail2ban (*)
· 7. 使用 LogWatch 监控 SSH 日志
· 8. 使用防火墙通过 IP 地址限制 SSH 访问
· 9. 使用双因素身份验证 (2FA)
· 10. 将 SSH 登录限制为特定用户/IP 地址

介绍

年代确保服务器的 SSH 访问权限安全至关重要。安全 Shell (SSH)是 Linux 服务器远程管理的网关,如果存在漏洞,则意味着向攻击者开放。

默认设置可能会有效,但它们也会使您的服务器暴露。

服务器的安全性取决于您对 SSH 的保护程度。如果没有适当的措施,您将面临未经授权的访问和数据泄露的风险。这就是为什么超越默认设置至关重要。

在本文中,我们将介绍使用各种控制(例如基于密钥的身份验证、暴力破解保护、IP 限制和双因素身份验证)保护 SSH 服务器的关键步骤。

让我们深入研究并使您的 SSH 设置尽可能安全。

1. 使用基于 SSH 密钥的身份验证

创建强 SSH 密钥并使用基于 SSH 密钥的身份验证建立安全的身份验证方法是加强 SSH 安全性的最有效方法之一。

虽然我们不会在这里深入探讨这个问题,但请参阅我的文章“使用 SSH 密钥保护远程访问的指南”以获取更详细的说明。

使用强 SSH 密钥而不是密码是抵御未经授权访问的第一道防线,并可降低暴力攻击和密码猜测的风险。

步骤 1:创建 SSH 密钥对。

使用 RSA 创建 SSH 密钥

ssh-keygen -t rsa -b 4096 -C "Comment or <[email protected]>"

为了获得更强的安全性,请考虑使用255 位或 456 位的EdDSA(爱德华曲线数字签名算法)密钥。

ssh-keygen -t ed25519 -C "Comment or [email protected]"
ssh-keygen -t ed448 -C "Comment or [email protected]"

此模式使用 456 位密钥,称为Ed448 。与Ed25519相比,它提供了更高的安全性,但性能略有下降。

或者,如果您使用 Windows 主机和 PuTTY 连接到您的 Linux 服务器,则可以使用puttygen.exe实用程序创建 SSH 密钥并将您的公钥传输到您的 Linux 服务器。

十个步骤确保 SSH 服务器安全

第 2 步:创建“ .ssh ”目录和“ authorized_keys ”文件并设置适当的权限。

如果它们尚不存在,请~./ssh在主文件夹的根目录中创建一个名为的隐藏目录,然后在该目录下创建一个名为的文件authorized_keys

mkdir ~/.ssh touch ~/.ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

将您的公钥复制到目标服务器的 ~/.ssh/authorized_keys。这是它应有的样子的示例。

$ cat .ssh/authorized_keys ssh-ed25519 AAA<<...REDATCTED......>>1uEqXysh [email protected]

步骤3:修改SSH服务器配置文件以启用基于SSH密钥的身份验证。

取消注释以下选项“ PubkeyAuthentication ”和“ AuthorizedKeysFile ”,并将值从“ no ”更改为“ yes ”。

sudo nano /etc/ssh/sshd_config
PubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

十个步骤确保 SSH 服务器安全

步骤 4:重新启动 SSH 服务器并应用所做的更改。

sudo systemctl restart ssh

2.更改 SSH 端口号

将 SSH 保留在默认端口 22 上使其成为互联网范围扫描和试图暴力破解 SSH 的机器人的常见目标。

更改端口有助于减少噪音并阻止大多数以标准端口为目标的攻击者。即使像 2222 这样的端口很常见,也可能成为攻击目标。

因此,建议选择一个非常高的端口号。这会迫使攻击者扫描所有 65,000 多个端口来找到您的 SSH 服务,从而降低被攻击的可能性。

默认情况下,SSH 服务器在端口 22 上运行,“端口”参数通常在配置文件中被注释掉。

要检查端口是否已设置或保留为默认端口,请使用:

grep -E '^#Port|^Port' /etc/ssh/sshd_config

将端口更改为非标准高端口(例如 62022)

sudo sed -i 's/^#Port 22/Port 62022/' /etc/ssh/sshd_config sudo sed -i 's/^Port 22/Port 62022/' /etc/ssh/sshd_config

重新启动 SSH 服务器(Debian/Ubuntu/Kali)

sudo systemctl restart ssh

重启 SSH 服务器(RHEL/CentOS)

sudo systemctl restart sshd

十个步骤确保 SSH 服务器安全

3.禁用 SSH Root 登录

禁用 root 登录可增加一层额外的安全性,因为要求用户以普通用户身份登录,然后在需要时升级权限。

由于根帐户具有最高级别的权限,因此这降低了对根帐户进行暴力攻击的风险。

步骤 1:如果您尚未创建用户帐户,请创建一个

adduser <your_username>

步骤 2:编辑/etc/ssh/sshd_config文件,将以下设置更改为“否”

PermitRootLogin no

十个步骤确保 SSH 服务器安全

步骤3:重新启动SSH服务器

sudo systemctl restart ssh

5.启用 SSH 日志记录和监控

SSH 日志记录对于跟踪连接尝试和识别可疑活动至关重要。定期检查日志以查找未经授权的访问或暴力攻击。

通过验证 上的 SSH 配置文件来确保日志记录已启用/etc/ssh/sshd_config。它通常默认启用。

步骤 1:在 SSH 服务配置文件中启用 SSH 日志记录

取消注释并将SyslogFacility设置为“ AUTH ”,将LogLevel 设置为“ INFO ”。

SyslogFacility AUTHLogLevel INFO

十个步骤确保 SSH 服务器安全

步骤 2:配置日志存储

Debian/Ubuntu (rsyslog)

chmod 640 /var/log/auth.log

RHEL/CentOS (rsyslog)

chmod 640 /var/log/secure

十个步骤确保 SSH 服务器安全

查看 Kali(或任何基于 systemd 的发行版)上的所有 SSH 日志:

sudo journalctl-u ssh

十个步骤确保 SSH 服务器安全

过滤“已接受”会话的 SSH 输出:

sudo journalctl -u ssh | grep 'Accepted'

十个步骤确保 SSH 服务器安全

步骤 3:重新启动 SSH 服务器以应用对sshd_config 文件的任何修改

sudo systemctl restart ssh

实施 Fail2ban

Fail2ban 是一款安全工具,可监控日志文件中的可疑活动并自动阻止表现出恶意行为的 IP 地址。它通过检测和阻止多次失败的登录尝试来保护 SSH,从而防止暴力攻击,因此特别有用。

步骤1:安装fail2ban

sudo apt updatesudo apt install fail2ban

第 2 步:配置 fail2ban

创建本地配置文件,避免直接修改默认文件,并编辑它以保护您的 SSH 服务。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local

我们首先调整以下全局设置以满足我们的要求。

# "bantime" is the number of seconds that a host is banned.bantime  = 10m# A host is banned if it has generated "maxretry" during the last "findtime"# seconds.findtime  = 10m# "maxretry" is the number of failures before a host get banned.maxretry = 5

如果我们进一步向下滚动直到找到该[sshd]部分,那就是主要部分所在,也是轮胎与道路接触的地方。

[sshd]请参阅文件中的默认配置示例jail.local

十个步骤确保 SSH 服务器安全

修改文件中的以下行jail.local以配置 SSH。

[sshd]enabled = trueport = sshlogpath = %(sshd_log)smaxretry = 5

这些设置为 SSH 服务启用 Fail2ban,设置日志路径并指定在禁止 IP 之前最多 5 次失败尝试。

注意:此设置假定 SSH 在默认端口22上运行。如果您按照我的提示更改了默认端口,请确保指定正确的端口号,例如port = 2222

假设 SSH 在端口 22 上运行,我的修改如下:

十个步骤确保 SSH 服务器安全

步骤3:启动并启用fail2ban

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

步骤 4:验证 fail2ban 是否正在运行

sudo systemctl status fail2ban

十个步骤确保 SSH 服务器安全

在开始之前,让我们iptables 以可读的格式列出所有当前规则:

$ sudo iptables -S-P INPUT ACCEPT-P FORWARD ACCEPT-P OUTPUT ACCEPT

iptables防火墙规则确认fail2Ban成功将有问题的 IP 地址添加到f2b-sshd链中,从而有效地阻止了它。

十个步骤确保 SSH 服务器安全

7.使用 LogWatch 监控 SSH 日志

继续上一条提示 #5“启用 SSH 日志记录和监控”,确保启用 SSH 日志记录至关重要。但是,使用 syslog/rsyslog 或日志手动筛选日志可能很繁琐。

为什么不选择更有效的解决方案?Logwatch 会自动分析系统和 SSH 日志,并将任何异常事件通知管理员。

步骤 1:安装 LogWatch

sudo apt updatesudo apt install logwatch

步骤 2:安装过程中接受默认配置

根据您现有的设置,您可能会在安装过程中被提示配置 Postfix。提供的默认设置应该足以满足大多数情况。

General type of mail configuration: Internet SiteSystem mail name: <hostname>

步骤3:配置Logwatch

要自定义 Logwatch,请将默认配置文件复制logwatch.conf/etc/logwatch/conf目录

sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/logwatch.conf

创建供Logwatch使用的缓存文件夹:

sudo mkdir -p /var/cache/logwatch

让我们使用您最喜欢的文本编辑器编辑该文件:

sudo nano /etc/logwatch/conf/logwatch.conf

修改以下内容以匹配您想要的邮件通知设置。如果您有一个正常工作的 SMTP 服务器并且能够向外部发送电子邮件,则这是一个示例。请参阅下面的示例 1

MailTo = [email protected]MailFrom = [email protected]Output = mailFormat = textDetail = LowService = All

对于本地用户邮件通知,我建议使用以下方法,这对于我们的单个服务器来说已经足够了。电子邮件本地发送给用户“root”。

在下面的第二个示例中,我们确保相应地修改以下设置。

MailTo = rootMailFrom = LogwatchOutput = mailFormat = textDetail = MedService = All

详细信息”级别定义报告中包含的信息量。可能的值包括:Low、、MediumHigh

服务”参数定义了 Logwatch 应该监控哪些服务。

对大多数用户推荐的默认值是All。如果您只对监控特定服务(如 SSH)感兴趣,可以调整此值,例如将此值设置为ssh

-servicename或者,您可以默认监控所有服务,但排除您不感兴趣的服务,并通过在服务前加上“ ”或“ ”来产生大量噪音-zz-servicename

步骤 4:排除不需要的警报和服务以减少噪音

Service = "-dpkg"Service = "-postfix"Service = "-zz-disk_space"

您可以在此处找到用于在文件中指定范围内和范围外的服务的部分logwatch.conf

十个步骤确保 SSH 服务器安全

设置 logwatch.conf 中包含和排除的服务范围

上述选项排除了来自 Debian 软件包系统 (dpkg)、Postfix 日志和磁盘空间统计信息的变化的警报。

我们的完整logwatch.conf文件应该是这样的:

grep -v "^#" /etc/logwatch/conf/logwatch.conf
TmpDir = /var/cache/logwatchOutput = stdoutFormat = textEncode = noneMailTo = rootMailFrom = LogwatchRange = yesterdayDetail = MedService = AllService = "-dpkg"Service = "-postfix"Service = "-zz-disk_space"Service = "-zz-network"Service = "-zz-sys"Service = "-eximstats"mailer = "/usr/sbin/sendmail -t"

步骤 5:手动验证 Logwatch 设置是否正常运行

sudo logwatch --detail Med --range today
################### Logwatch 7.7 (07/22/22) ####################        Processing Initiated: Thu Aug 22 13:38:17 2024        Date Range Processed: today                              ( 2024-Aug-22 )                              Period is day.        Detail Level of Output: 5        Type of Output/Format: stdout / text        Logfiles for Host: xena##################################################################--------------------- fail2ban-messages Begin ------------------------ Banned services with Fail2Ban:                        Bans:Unbans  ReBans:Flush    sshd:                                              [  1:1  ]      [  0:0  ]90.196.11.22                                    1:1            0:0---------------------- fail2ban-messages End ---------------------------------------------- pam_unix Begin ------------------------<TRUNCATED>.....---------------------- pam_unix End ---------------------------------------------- Connections (secure-log) Begin ------------------------<TRUNCATED>.....---------------------- Connections (secure-log) End ---------------------------------------------- SSHD Begin ------------------------ Disconnecting after too many authentication failures for user:    cybersecmav : 1 TimeFailed logins from:90.196.11.22: 1 Time       cybersecmav/password: 1 Time Illegal users from:90.196.11.22: 2 Times       test4: 2 Times Login attempted when not in AllowUsers list:    test4 : 1 TimeUsers logging in through sshd:    cybersecmav:90.196.11.22: 1 Time Could not get shadow information for:    NOUSER : 1 Time **Unmatched Entries** message repeated 4 times: [ Failed password for cybersecmav from 90.196.11.22 port 46955 ssh2] : 1 Time---------------------- SSHD End ---------------------------------------------- Sudo (secure-log) Begin ------------------------<TRUNCATED>.....---------------------- Sudo (secure-log) End -------------------------###################### Logwatch End #########################

Logwatch 的默认设置应该已经创建了一个 cron 作业来/etc/cron.daily/001logwatch每天运行,并且您将通过电子邮件将报告本地发送给用户root

#!/bin/bash#Check if removed-but-not-purgedtest -x /usr/share/logwatch/scripts/logwatch.pl || exit 0#execute/usr/sbin/logwatch --output mail#Note: It's possible to force the recipient in above command#Just pass --mailto [email protected] instead of --output mail

如果您还没有基于 Web 或基于控制台的电子邮件客户端,我建议您使用“ mutt ”或“ alpine ”来阅读每日 Logwatch 报告。请参阅以下来自我的基于文本的客户端“mutt”的屏幕截图。

十个步骤确保 SSH 服务器安全

使用基于控制台的客户端“mutt”检查 Logwatch 电子邮件报告

十个步骤确保 SSH 服务器安全

以文本格式通过电子邮件发送给 root 用户的 Logwatch 报告示例

虽然 Logwatch 可以配置为仅监控 SSH 日志,但监控所有安全日志以全面捕获问题(而不仅仅是 SSH)至关重要。

如果您没有关注警报并在必要时采取行动,那么监控就毫无意义。

8. 使用防火墙通过 IP 地址限制 SSH 访问

使用防火墙通过 IP 限制 SSH 访问是控制谁可以连接到您的服务器的另一种可靠的安全措施。

它仅允许受信任的 IP 并阻止未经授权的用户和机器人,从而减少了攻击面。

注意:当您从固定 IP(如公司网络)连接时,此方法最合适。如果您需要从不断变化的位置(如动态家庭路由器 IP)进行访问,则这种方法并不理想。

虽然通常首选外围防火墙,但我们将保持简单并在服务器的基于主机的 Linux 防火墙(如 UFW)上设置规则。

UFW(简单防火墙)是一个用户友好的工具,用于管理防火墙规则,而不是直接使用iptables命令。

⚠️注意:在进行此更改之前,请确认您的公共 IP 或内部网络 IP,并在您将自己锁定的情况下准备其他方式访问服务器。

警告已经足够了,让我们继续使用该ufw工具。

步骤 1:查看 UFW 防火墙的当前状态和任何现有规则

$ sudo ufw status verbose

状态:不活动

步骤 2(可选):重置 UFW 并从头开始

sudo ufw重置

步骤 3:允许从受信任的 IP 对 SSH 端口进行 SSH 访问


sudo ufw允许 192.168.1.0/24任意端口ssh

允许其他必要的服务,例如 HTTP:

sudo ufw 允许从 192.168.1.0/24 到任何端口 http

步骤 4:设置默认策略

允许所有传出流量(可选,根据您的需要):

sudo ufw默认允许传出

默认拒绝所有传入流量:

sudo ufw default 拒绝传入

步骤5:启用UFW防火墙

sudo ufw 启用

步骤 6:验证 UFW 防火墙状态和规则

sudo ufw状态详细

十个步骤确保 SSH 服务器安全

显示当前 UFW 防火墙状态和规则

此示例允许192.168.1.x子网上的任何计算机连接到 SSH。为了进行更严格的控制,请使用CIDR 表示法中带有/32的确切 IP 地址将访问限制到特定 IP(例如,您的家庭路由器)。

9. 使用双因素身份验证(2FA)

在您的 SSH 服务器中添加双因素身份验证 (2FA) 可以提供额外的安全层,使得未经授权的用户更难以访问,即使他们有您的密码。

如果您使用密码验证进行 SSH,则 2FA 必不可少,因为它可以增加额外的安全层。对于 SSH 密钥验证,它是可选的,但如果您的密钥被盗用,它可以提供额外的保护。

⚠️ 注意:如果 2FA 设置失败,请准备一个备份用户帐户或其他方式访问服务器,例如控制台访问。

步骤 1:备份 SSH 配置文件

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

第 2 步:安装所需的软件包

sudo apt更新
sudo apt 安装 libpam - google - authenticator

步骤 3:为您的用户配置身份验证器

google-authenticator

在安装“ google-authenticator”包期间,您将看到一个二维码、密钥刮刮码(备份码),您应该安全存储它们。

10. 将 SSH 登录限制为特定用户/IP 地址

在 SSH 配置文件中限制用户或 IP 的 SSH 访问,通过仅允许来自受信任位置的授权用户连接,增加了一层额外的安全性。

当您希望实现更严格的控制而不单纯依赖防火墙时,这尤其有用。

步骤 1:打开 SSH 配置文件

sudo nano /etc/ssh/sshd_config

如果该指令AllowUsers尚不存在,您可以将其添加到文件末尾或添加到用于用户访问控制的相应部分。

步骤 2:限制特定用户的 SSH 访问

AllowUsers cybersecmav

当您在 SSH 配置中使用该AllowUsers指令时,它充当“白名单”,隐式拒绝所有未列出的其他用户的访问。

步骤 3:限制特定 IP 上的特定用户的 SSH 访问

允许用户cybersecmav@ 90.196 .11 .22

注意:如果您使用AllowUsers [email protected],它将覆盖常规设置AllowUsers cybersecmav并限制仅限该用户和 IP 组合的访问。

如果要将多个用户和 IP 列入白名单,请使用以下格式:

允许用户用户1 @IP1用户2 @IP2

步骤4:保存文件,退出并重新启动SSH

sudo systemctl 重新启动 ssh

步骤 5:使用有效的允许用户和有效的拒绝用户进行测试

十个步骤确保 SSH 服务器安全

使用有效的允许和拒绝用户进行 SSH 登录测试

希望这些信息对您有所帮助!如果觉得这篇文章有价值,欢迎点赞、分享、再看、转载,如果您有网络安全的疑问,联系我随时为您解答,感谢您的支持!

原文始发于微信公众号(星空网络安全):十个步骤确保 SSH 服务器安全

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月18日11:51:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   十个步骤确保 SSH 服务器安全https://cn-sec.com/archives/3170742.html

发表评论

匿名网友 填写信息