当你把CentOS 7服务器放到公网上,需要考虑安全问题。默认设置往往为了方便而牺牲了安全性,比如允许root用户直接远程登录和使用众所周知的22号SSH端口。这两个配置组合在一起,相当于给潜在的攻击者开了半扇门。每天都有无数自动化脚本在互联网上扫描这些默认设置,尝试用常见密码暴力破解。要提升服务器的第一道防线,调整这两个设置是个扎实的起点。
开始之前,有个至关重要的提醒:千万不要直接断开当前的SSH连接。整个操作过程都应在现有的连接会话中完成,或者确保有备用登录方式。因为一旦配置出错,比如新端口没开或者配置文件有语法错误,你可能就被关在服务器外面了。如果条件允许,建议在虚拟机或非生产环境先练习一遍。另外,修改任何重要配置文件前,做个备份是好习惯,用`cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak`这样的命令就能快速备份SSH配置文件。
先来看看怎么禁止root用户直接远程登录。这基于“最小权限原则”——即使需要执行管理员任务,也应先用普通用户登录,再通过sudo提权。这样做的好处是增加了攻击门槛,因为攻击者需要破解两个账户:普通用户和root密码。首先,你需要一个可用的普通用户账户,如果还没有,用
adduser yourusername
创建一个,然后用
passwd yourusername
设置密码。关键是给这个用户sudo权限,这样他才能在需要时执行管理任务。运行`visudo`命令编辑sudoers文件,找到“root ALL=(ALL) ALL”这行,在下面添加一行
yourusername ALL=(ALL) ALL
保存退出。现在这个普通用户就能使用sudo了。
接下来是关键步骤:修改SSH守护进程的配置文件。用文本编辑器打开`/etc/ssh/sshd_config`,找到“#PermitRootLogin yes”这一行。开头的井号表示这是注释,所以你可能需要寻找已经取消注释的类似行,或者直接添加新行。将其改为“PermitRootLogin no”。这个设置有几个选项:完全禁止(no)、只允许密钥登录(prohibit-password或without-password)、或允许但限制(yes)。对于安全加固,建议先设为no。修改后保存文件,但先不要重启SSH服务。
接着来修改默认的SSH端口。继续在同一个配置文件中操作,找到“#Port 22”这行,去掉井号,把22改为你选择的其他端口号,比如“Port 2222”。端口号的选择有点讲究:理论上可以是1到65535之间,但要避开0到1023这些“知名端口”,也最好避开常用服务端口如80、443、3306等。选一个1024到49151之间的“注册端口”比较合适,但要注意有些端口可能被特定软件占用。修改后保存文件。
现在到了容易出问题的环节:配置防火墙。CentOS 7默认使用firewalld,它可能默认不允许新端口。如果你没开防火墙,这步可跳过,但出于安全考虑不建议。检查防火墙状态用
systemctl status firewalld
如果正在运行,需要放行新端口。假设新端口是2222,执行
firewall-cmd --permanent --add-port=2222/tcp
然后
firewall-cmd --reload
使更改生效。`--permanent`参数确保规则在重启后依然有效。如果你在用iptables而不是firewalld,命令会有所不同,需要执行`iptables -I INPUT -p tcp --dport 2222 -j ACCEPT`,然后保存规则。
还有一个可能“坑人”的是SELinux,它是CentOS的安全增强组件。SELinux默认只知道SSH监听22端口,换了新端口它可能会阻止连接。你需要告诉SELinux新端口是合法的SSH端口。先检查SELinux状态,用`getenforce`,如果返回Enforcing,就需要执行
semanage port -a -t ssh_port_t -p tcp 2222
如果提示命令找不到,可能是policycoreutils-python包没安装,用`yum install policycoreutils-python`安装后再试。
完成所有这些配置后,可以测试了。但千万不要重启当前的SSH连接,而是新开一个终端窗口尝试连接。因为如果新配置有问题,旧连接还能让你补救。测试新端口连接的命令是
ssh -p 2222 yourusername@服务器IP
注意,这里用的是你创建的普通用户名,不是root。如果连接成功,登录后尝试`sudo -i`切换到root,验证sudo权限是否正常。这很重要,因为如果sudo配置有问题,你可能就完全没法执行管理任务了。
如果新连接测试成功,就可以安全地重启SSH服务了。在原来的连接会话中执行`systemctl restart sshd`。重启后,最好再次验证服务状态,用
systemctl status sshd
看看是否正常运行,没有报错。也可以检查新端口是否在监听,用
ss -tnlp | grep 2222`或`netstat -tlnp | grep 2222
现在该彻底禁用root的远程登录了。其实前面已经改过配置,但为了确保生效,可以再做个测试:尝试用root和新端口连接,命令是`ssh -p 2222 root@服务器IP`。这应该会失败,提示权限被拒绝。如果这个测试通过了,说明配置没生效,需要回头检查。
整个配置过程中,有些细节值得注意。修改配置文件时,注意行尾空格和格式,SSH配置对格式比较敏感。每次修改后,可以用`sshd -t`测试配置文件语法,这个命令会检查语法错误但不实际重启服务。如果你管理的服务器很多,考虑用配置管理工具如Ansible批量修改,提高效率和一致性。
端口修改后,登录时需要显式指定端口号,这可能会有点麻烦。可以在本地SSH客户端的配置文件中添加设置,避免每次输入端口。在客户端的`~/.ssh/config`文件中添加类似内容:
Host myserver
HostName 服务器IP
Port 2222
User yourusername
这样以后只需要`ssh myserver`就能连接了。
如果操作过程中不小心把自己锁在外面怎么办?如果有控制台访问权限(比如云服务商提供的网页控制台),可以通过控制台登录修复。如果没有,可能就需要联系服务商寻求帮助了。这就是为什么强调要在测试时保持原有连接。
最后,这些安全措施只是基础。更完整的安全策略还应包括:配置SSH密钥认证(比密码更安全)、设置fail2ban防止暴力破解、定期更新系统、配置入侵检测系统等。安全是一个持续的过程,不是一劳永逸的设置。即使做了这些加固,也应定期检查日志,查看是否有异常登录尝试。命令`lastb`可以查看最近的失败登录尝试,`journalctl -u sshd`可以查看SSH服务的详细日志。
当你完成这些步骤,服务器的SSH安全已经有了显著提升。攻击者现在需要猜测你的用户名和密码组合,还要知道非标准端口,这大大降低了自动攻击脚本的成功率。记住,安全措施是层层叠加的,每多一层,攻击成本就增加一分。
推荐文章
