服务器如何防止未授权访问

liulian
liulian 初级会员超兽战士
发布于 2026-10-08 15:25 ·1 浏览 ·0 回复

照着做完这一套,你就能把一台默认开放的 Linux 服务器收成只有你和授权用户能进的机器,并且能看清谁在尝试撬门。

第一步:先摸清服务器上有哪些对外开放的入口

这一步的目标是拿到一份「当前所有监听端口」的清单,后面所有加固都围绕它做减法。用 SSH 登录服务器(以 Ubuntu 22.04 为例),执行:

sudo ss -tulnp

输出里 LISTEN 行就是正在监听的端口,Local Address:Port 那一列如果是 0.0.0.0:3306 或 :::6379,说明它对全网开放;如果是 127.0.0.1:3306,说明只允许本机访问,相对安全。

再确认 SSH 端口和版本:

sudo sshd -T | grep -E 'port|permitrootlogin|passwordauthentication'

这会打印出实际生效的配置,而不是配置文件里写了但被覆盖的值。

注意:ss 需要 root 权限才能看到进程名,普通用户执行 ss -tulnp 进程列会是空的,别以为是没程序在监听。

第二步:把 SSH 换成密钥登录

这一步做完,登录方式从「知道密码就能进」变成「持有私钥文件才能进」。在你自己的电脑(不是服务器)上执行:

ssh-keygen -t ed25519 -C "yourname-2024"

一路回车,默认生成 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。把公钥传到服务器:

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@服务器IP

如果你的 ssh-copy-id 不可用(Windows 的 OpenSSH 客户端就没有这个命令),手动追加:

cat ~/.ssh/id_ed25519.pub | ssh user@服务器IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

然后新开一个终端窗口测试免密登录。确认能进之后,再动第三步的配置。

注意:不要关掉当前这个已登录的 SSH 会话再改配置。一定要另开一个窗口验证新配置能登录,留着旧会话做保险,否则改错一个字符你就被锁在门外了。

第三步:关掉 root 直连和密码登录

这一步把暴力破解的主要目标(root 账号 + 密码认证)直接封死。编辑 /etc/ssh/sshd_config(Ubuntu 22.04 上还有 /etc/ssh/sshd_config.d/ 目录里的片段文件,优先级更高,改之前先 ls 一下):

sudo nano /etc/ssh/sshd_config

找到并改成:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3

保存后先做语法检查,再重启:

sudo sshd -t
sudo systemctl restart ssh

sshd -t 没输出就是语法正确。有输出就根据报错行号改回去,别急着重启。

第四步:用防火墙只放行必要端口

这一步把第一步清单里不需要对外暴露的端口全部关掉。Ubuntu/Debian 用 ufw(0.36.1 及以上):

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

CentOS / Rocky Linux 9 用 firewalld:

sudo firewall-cmd --permanent --remove-service=dhcpv6-client
sudo firewall-cmd --permanent --add-port=22/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

如果你改过 SSH 端口,记得把 22/tcp 换成你实际用的端口。另外,阿里云、腾讯云、AWS 这类云主机在系统防火墙之外还有一层「安全组」,控制台路径通常是:云服务器 ECS → 实例 → 安全组 → 配置规则 → 入方向。两层都要放行,缺一层照样连不上。

注意:ufw 的 default deny incoming 会立即生效。如果 SSH 端口没提前放行,ufw enable 一敲下去当前会话可能还活着,但断开后就连不上了。所以放行规则一定要写在 enable 之前。

第五步:让 fail2ban 自动封禁破解 IP

这一步解决「端口必须开着,但有人一直在猜」的问题。安装(Ubuntu 22.04 上版本为 0.11.2):

sudo apt update && sudo apt install -y fail2ban

新建 /etc/fail2ban/jail.local(不要直接改 jail.conf,升级时会被覆盖):

[sshd]
enabled = true
port = 22
maxretry = 3
findtime = 10m
bantime = 1h

启用并查看状态:

sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Currently banned 后面出现数字,说明它已经在干活了。

第六步:把数据库、缓存这类服务绑回本机

MySQL、Redis、MongoDB 被拖库最常见的原因就是监听在 0.0.0.0 且没有密码。Redis 改 /etc/redis/redis.conf:

bind 127.0.0.1
protected-mode yes
requirepass 一个长随机密码

MySQL 8.0 改 /etc/mysql/mysql.conf.d/mysqld.cnf:

bind-address = 127.0.0.1

改完 sudo systemctl restart redis-server mysql。如果应用和数据库不在同一台机器上,确实需要远程访问,那就别用 0.0.0.0 全开,改在云安全组里只放行应用服务器的固定 IP。

注意:protected-mode yes 只在没有设置密码且没有 bind 时才拦截连接,它不是万能开关。该设密码还是要设。

第七步:补丁和账号权限收口

这一步保证漏洞不是你留的。更新系统补丁:

sudo apt update && sudo apt upgrade -y

Ubuntu 上建议开启自动安全更新:

sudo dpkg-reconfigure --priority=low unattended-upgrades

弹窗里选 <Yes>。然后检查有没有多余的高权限账号:

awk -F: '$3==0 {print $1}' /etc/passwd

正常只应该有 root 一行。再确认 sudo 组里都是熟人:

getent group sudo

第八步:留日志,定期回看

这一步让你在出事时能查到人。SSH 登录记录看:

sudo lastb | head -20
sudo grep 'Failed password' /var/log/auth.log | tail -20

CentOS / Rocky 上路径是 /var/log/secure。如果有条件,把 auth.log 和 nginx 访问日志定期同步到另一台机器或对象存储,本地日志被清掉也还有备份。

小结

  • 先用 ss -tulnp 摸清所有监听端口,加固的本质是做减法。
  • SSH 密钥登录 + PermitRootLogin no + PasswordAuthentication no 是最有效的一刀,改完必须先另开会话验证再退出。
  • 系统防火墙(ufw / firewalld)和云安全组是两层,两层都要配。
  • fail2ban 解决「端口必须开放」时的暴力破解,maxretry=3 是比较合适的值。
  • 数据库和 Redis 一律 bind 127.0.0.1,需要远程就连同密码一起配。
  • 补丁、uid==0 账号清单、登录日志,这三件事定期做一遍,比装任何安全软件都实在。
版权声明:本文来自 GJ站长论坛《服务器如何防止未授权访问》
原文链接:https://www.gj0.com/thread-1026.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~