首页 帮助中心 常见问题 给你的CentOS 7服务器加把锁:关root远程登录和改SSH端口
给你的CentOS 7服务器加把锁:关root远程登录和改SSH端口
时间 : 2026-01-08 16:25:04 编辑 : 华纳云 阅读量 : 22

当你把CentOS 7服务器放到公网上,需要考虑安全问题。默认设置往往为了方便而牺牲了安全性,比如允许root用户直接远程登录和使用众所周知的22SSH端口。这两个配置组合在一起,相当于给潜在的攻击者开了半扇门。每天都有无数自动化脚本在互联网上扫描这些默认设置,尝试用常见密码暴力破解。要提升服务器的第一道防线,调整这两个设置是个扎实的起点。

开始之前,有个至关重要的提醒:千万不要直接断开当前的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-passwordwithout-password)、或允许但限制(yes)。对于安全加固,建议先设为no。修改后保存文件,但先不要重启SSH服务。

接着来修改默认的SSH端口。继续在同一个配置文件中操作,找到“#Port 22”这行,去掉井号,把22改为你选择的其他端口号,比如“Port 2222”。端口号的选择有点讲究:理论上可以是165535之间,但要避开01023这些知名端口,也最好避开常用服务端口如804433306等。选一个102449151之间的注册端口比较合适,但要注意有些端口可能被特定软件占用。修改后保存文件。

现在到了容易出问题的环节:配置防火墙。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安全已经有了显著提升。攻击者现在需要猜测你的用户名和密码组合,还要知道非标准端口,这大大降低了自动攻击脚本的成功率。记住,安全措施是层层叠加的,每多一层,攻击成本就增加一分。

华纳云 推荐文章
Ubuntu系统root密码重置完整攻略 CentOS 7屏蔽国外IP访问的方法合集 服务器Linux系统中如何使用Chroot环境进行镜像维护 怎么给docker容器配置root权限?几个常见方法 Linux重置mysql root密码的常用方法 Ubuntu配置单root用户登录方法 防止root用户删除文件和目录的策略 Linux系统中禁用root帐户常用方法 忘记了RHEL系统中的root密码如何重置密码 CentOS 7云主机中如何自制ISO镜像文件
活动
客服咨询
7*24小时技术支持
技术支持
渠道支持