在服务器运维领域,安全始终是重中之重,SSH(Secure Shell)作为Linux系统远程管理的标准协议,其安全性直接关系到整个服务器的安危,CentOS作为企业级应用最广泛的发行版之一,其SSH服务的默认配置虽然稳健,但在面对日益复杂的网络攻击时,仍需进行精细化的加固,限制SSH登录是降低攻击面、防止未授权访问的有效手段,本文将系统性地介绍在CentOS系统中限制SSH登录的多种实用方法,从基础配置到高级策略,旨在构建一个多层次、纵深化的SSH安全防护体系。
核心配置文件:sshd_config
的精细调控
SSH服务的所有核心行为都由其主配置文件 /etc/ssh/sshd_config
定义,通过修改此文件,我们可以实现最直接、最根本的登录限制,在修改任何配置后,都需要使用 systemctl restart sshd
或 service sshd restart
命令重启SSH服务以使更改生效。
禁止root用户直接登录
这是安全加固的第一步,也是最基本的一步,root用户拥有系统的最高权限,一旦其账户被暴力破解,攻击者将获得完全的控制权,禁止root直接登录,可以迫使攻击者必须先破解一个普通用户,再通过su
或sudo
提权,增加了攻击的难度和步骤。
修改 /etc/ssh/sshd_config
文件,找到以下行:
#PermitRootLogin yes
将其修改为:
PermitRootLogin no
保存并退出后,root用户将无法再通过SSH直接登录,管理员应使用一个普通账户登录,然后根据需要执行 su -
切换到root环境,或使用 sudo
执行特定命令。
使用 AllowUsers
限制特定用户
AllowUsers
指令提供了一个白名单机制,只有明确列出的用户才能通过SSH登录,这是一种非常精确的控制方式。
我们只允许 admin
和 developer
这两个用户登录,可以在配置文件末尾添加:
AllowUsers admin developer
更进一步,我们还可以限制用户只能从特定的IP地址登录,这在多IP管理或需要固定办公地点访问的场景下非常有用,格式为 用户名@IP地址
。
AllowUsers admin@192.168.1.100 developer@10.0.0.*
此配置表示:
admin
用户只能从168.1.100
这个IP地址登录。developer
用户可以从0.0.0/24
网段内的任何IP地址登录。
使用 AllowGroups
限制特定用户组
当需要管理的用户数量较多时,逐个添加 AllowUsers
会变得繁琐且容易出错,使用用户组进行管理是更优雅、更具扩展性的方案。
创建一个专门用于SSH登录的用户组,sshusers
:
sudo groupadd sshusers
将需要允许登录的用户添加到这个组中:
sudo usermod -aG sshusers user1 sudo usermod -aG sshusers user2
-aG
参数表示将用户追加到指定的附加组中,而不会影响其原有的组成员身份。
在 /etc/ssh/sshd_config
文件中配置 AllowGroups
:
AllowGroups sshusers
这样,只有 sshusers
组内的成员才能登录SSH,未来有新用户需要授权时,只需将其加入该组即可,无需修改SSH配置文件。
网络层面的访问控制:TCP Wrappers
TCP Wrappers 是一个基于主机的网络访问控制列表系统,它可以在应用层(如SSH)之前,对TCP/IP连接进行过滤,在CentOS 7及之前版本中,SSH服务默认支持TCP Wrappers,它通过两个配置文件来工作:/etc/hosts.allow
和 /etc/hosts.deny
。
其规则遵循“先允许,后拒绝”的原则:系统会先检查 /etc/hosts.allow
,如果匹配到允许规则,则放行;如果未匹配,则继续检查 /etc/hosts.deny
,如果匹配到拒绝规则,则拒绝连接;如果两个文件中都没有匹配的规则,则默认允许连接。
为了实现“默认拒绝,仅允许特定IP”的严格策略,推荐如下配置:
在 /etc/hosts.allow
中,明确允许受信任的IP或网段:
sshd: 192.168.1.0/24, 10.0.0.50
这表示允许来自 168.1.0/24
网段和 0.0.50
这个IP的SSH连接。
在 /etc/hosts.deny
中,拒绝所有其他来源的SSH连接:
sshd: ALL
ALL
是一个通配符,代表所有主机,这样配置后,只有 hosts.allow
中列出的地址能够成功连接SSH服务。
动态防御:使用 fail2ban
自动封禁恶意IP
静态的IP白名单在应对动态变化的攻击源时显得力不从心。fail2ban
是一款入侵防御软件,它可以监控日志文件(如SSH的认证日志),并根据预设的规则自动封禁那些行为异常(如多次密码错误)的IP地址。
安装EPEL仓库,然后安装 fail2ban
:
sudo yum install epel-release sudo yum install fail2ban
fail2ban
的配置文件位于 /etc/fail2ban/jail.conf
,但建议不要直接修改此文件,因为它可能在软件更新时被覆盖,最佳实践是创建一个 jail.local
文件来覆盖默认设置。
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 /etc/fail2ban/jail.local
,找到 [sshd]
部分,确保其已启用并配置合适的参数:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
maxretry = 3
findtime = 300
bantime = 3600
enabled = true
: 启用对SSH的监控。maxretry = 3
: 在findtime
时间段内,最多允许3次失败尝试。findtime = 300
: 时间窗口为300秒(5分钟)。bantime = 3600
: 封禁时长为3600秒(1小时)。
配置完成后,启动并设置 fail2ban
开机自启:
sudo systemctl start fail2ban sudo systemctl enable fail2ban
fail2ban
将在后台默默守护你的SSH服务,任何尝试暴力破解的IP都会被自动封禁。
终极安全:基于密钥的认证并禁用密码认证
密码认证虽然方便,但永远存在被暴力破解或猜测的风险,基于SSH密钥对的认证方式则要安全得多,它使用非对称加密技术,私钥保留在客户端,公钥放置在服务器上,只有持有匹配私钥的客户端才能完成认证。
在客户端生成密钥对(如果尚未生成):
ssh-keygen -t rsa -b 4096
按提示操作,可以为私钥设置一个更强的密码短语。
将公钥复制到CentOS服务器:
ssh-copy-id user@your_server_ip
此命令会自动将公钥追加到服务器上对应用户家目录下的
~/.ssh/authorized_keys
文件中,并设置正确的权限。在服务器上禁用密码认证:
在确认密钥登录正常工作后,编辑/etc/ssh/sshd_config
,找到并修改以下行:PasswordAuthentication no
重启SSH服务后,所有通过密码的登录尝试都将被拒绝,只能使用密钥对进行认证,这几乎可以杜绝所有类型的暴力破解攻击。
方法对比与小编总结
为了更直观地理解各种方法的特点,下表对它们进行了小编总结:
方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
sshd_config (用户/组) | 精确控制,配置简单直接 | 无法动态封禁,需手动维护列表 | 基础安全,固定用户和IP的管理 |
TCP Wrappers | 基于IP的快速过滤,与SSH服务解耦 | 功能相对单一,部分新系统默认不启用 | 作为第一道网络防线,配合其他策略使用 |
fail2ban | 动态智能防御,自动封禁恶意IP | 需要额外安装和配置,依赖日志系统 | 应对暴力破解和扫描攻击,提升主动防御能力 |
密钥认证 | 安全性极高,几乎无法破解 | 配置相对复杂,私钥管理需要谨慎 | 对安全要求极高的生产环境,替代密码认证 |
在实际应用中,最佳实践是组合使用上述多种方法,构建一个纵深防御体系,可以采用“禁止root登录 + AllowGroups
限制用户组 + fail2ban
动态防御 + 密钥认证”的组合策略,从而在多个层面上极大地提升CentOS服务器的SSH安全性。
相关问答FAQs
Q1: 我在修改了SSH配置并重启服务后,无法登录了,把自己锁在了服务器外面,该怎么办?
A1: 这是一个在远程配置SSH时可能遇到的严重问题,不要慌张,解决方法取决于您是否有其他访问服务器的途径:
- 通过控制台访问:如果您的服务器是托管在云服务商(如阿里云、腾讯云、AWS)或物理机房,通常都会提供Web VNC或KVM控制台,通过这个控制台,您可以直接获得服务器的命令行访问权限,就像在本地操作一样,登录后,检查
/etc/ssh/sshd_config
文件,找出配置错误(AllowUsers
写错了用户名,或PasswordAuthentication
被意外设为no
但您又没有配置密钥),修正后重启SSH服务即可。 - 物理访问:如果这是一台您可以物理接触的机器,直接连接键盘和显示器,以root身份登录,然后进行上述修复操作。
预防措施:在进行SSH配置更改时,最佳实践是永远保持一个现有的、已成功登录的SSH会话处于活动状态,在新的会话中测试配置,如果测试失败,您还可以用原来的会话进行修复,只有在确认新配置完全正常工作后,才关闭旧的会话。
Q2: AllowUsers
和 TCP Wrappers (hosts.allow
) 都可以限制IP,它们有什么区别?我应该用哪个?
A2: 它们的主要区别在于工作的层面和控制的粒度不同,可以协同工作,并不冲突。
- 工作层面:TCP Wrappers 工作在网络层和应用层之间,它在SSH进程接收到连接请求之前就进行IP过滤,而
AllowUsers
是SSH服务(应用层)内部的功能,它在TCP连接已经建立、SSH进程开始进行用户认证时才生效。 - 控制粒度:TCP Wrappers 只能基于“服务名(如sshd)”和“客户端IP地址”进行控制,而
AllowUsers
的粒度更细,它可以精确到“哪个用户”从“哪个IP”登录,user1@1.1.1.1
。 - 协同工作:当一个SSH连接请求到达时,系统首先会检查TCP Wrappers的规则,如果IP被
hosts.deny
拒绝,连接会直接被切断,SSH进程甚至都不会收到请求,如果IP通过了TCP Wrappers的检查,连接才会被转交给SSH进程,然后SSH进程会根据sshd_config
中的AllowUsers
、AllowGroups
等规则进行下一步的用户认证检查。
建议两者结合使用,使用TCP Wrappers作为第一道防线,快速拒绝来自已知恶意IP或非信任网段的连接,减轻SSH服务的压力,然后使用 sshd_config
中的 AllowUsers
或 AllowGroups
进行更精细化的用户和权限控制。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复