登录后的第一件事不是装软件
你花100块买了一年的云服务器,SSH连上去,密码是商家发给你的那串随机字符。
你的第一反应可能是:装Nginx、搭博客、部署代码。
停。先把下面几件事做完。这些步骤花不了半小时,但能决定你这台服务器未来是被人随便闯进来,还是固若金汤。
创建普通用户,别用root裸奔
root是超级管理员账户,在Linux里等同于"你拥有这台机器的全部权限"。一个命令敲错,整台服务器数据清零。更重要的是:如果别人拿到root密码,整台服务器就是他的了。
第一步:创建一个普通用户。
adduser admin
usermod -aG sudo admin
这条命令做了两件事:创建了一个叫admin的用户,并把它加入sudo组——sudo组的成员可以用sudo命令临时获得管理员权限。
第二步:配置SSH密钥登录,禁用密码。
在本地电脑上生成SSH密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"
把你的公钥传到服务器上:
ssh-copy-id admin@你的服务器IP
然后编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config
修改以下几行:
PermitRootLogin no # 禁止root登录
PasswordAuthentication no # 禁止密码登录
PubkeyAuthentication yes # 允许公钥登录
Port 2222 # 把SSH端口从22改成其他端口
改完之后重启SSH服务:
sudo systemctl restart sshd
现在你用root密码已经登录不进去了,只能用admin用户的密钥登录,而且攻击者扫描22端口也扫不到你了——他把端口改成2222了。
这套配置做完,你的服务器在 credential stuffing 攻击面前相当于隐形了。credential stuffing是什么?黑客用从其他网站泄露的用户名密码组合,批量尝试登录所有暴露22端口的服务器——2025年平均每台暴露的服务器每天被尝试登录超过3000次。
防火墙:只打开你需要的门
服务器就像一栋大楼,每个端口是一扇门。你不需要把每扇门都开着。
ufw(Uncomplicated Firewall)是Ubuntu默认的防火墙工具,简单到不需要学iptables。
先看当前哪些端口是开的:
sudo ufw status verbose
默认全部拒绝,只允许你需要的服务:
sudo ufw allow 2222/tcp # SSH(改成非标准端口后)
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw default deny incoming
sudo ufw enable
现在你的服务器只开了四个门:SSH、HTTP、HTTPS,其他端口的流量一律丢弃。
如果你的服务需要3306端口(MySQL),永远不要直接暴露给外网——MySQL端口只允许从应用服务器的IP访问:
sudo ufw allow from 10.0.0.5 to any port 3306
永远不要让数据库的端口暴露在公网上。
装软件之前,先更新系统
新服务器第一步永远是更新系统补丁。漏洞天天有,系统越新越安全。
sudo apt update && sudo apt upgrade -y
如果买的是CentOS或Rocky Linux,用这个:
sudo dnf update -y
这一步花不了5分钟,但能补上过去几个月累积的系统漏洞。
装完更新之后,安装一个自动安全更新工具:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
它会在后台自动安装安全更新,不需要你手动操作。
装Nginx:三个坑必须避开
假设你要用这台服务器跑一个Web服务。Nginx是最常用的选择,但有三个地方新手机器必踩:
坑一:nginx -t
每次改完Nginx配置,必须先测试再重载。配置文件写错一个字,nginx会拒绝加载——有时候甚至会导致服务直接崩溃:
sudo nginx -t
sudo systemctl reload nginx
nginx -t会告诉你配置文件有没有语法错误。这个命令养成习惯,踩过nginx配置写错然后重载把服务搞挂的坑之后,你就知道这个习惯值多少钱了。
坑二:用户权限
Nginx默认用nginx用户运行。如果你的Web应用要读写某个目录,而这个目录是root所有的,Nginx没有权限:
grep "user " /etc/nginx/nginx.conf
sudo chown -R nginx:nginx /var/www/your_site
坑三:最大连接数
默认的Nginx配置允许的并发连接数有限。高流量时Nginx报502或504 Gateway Timeout,问题往往出在这里。调高worker_processes和worker_connections:
worker_processes auto; # 自动等于CPU核心数
worker_connections 65535; # 每个worker最大连接数
nginx nofile 65535
自动备份:数据丢了你扛得住吗
服务器跑了一个月,数据比刚买的时候值钱多了。这时候你最该问自己的问题是:如果硬盘突然坏了,我能恢复到什么程度?
如果没有备份,答案就是:什么都没了。
最基础的备份方案:用cron定时把数据打包上传到对象存储。
先安装腾讯云COS命令行工具(其他云厂商类似):
curl https://cos.cloud.tencent.com/document/cosfs/cosfs-v1.0.21-linux_x86_64.tar.gz | tar -xz
写一个备份脚本:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup"
DB_FILE="/backup/db_$DATE.sql"
mysqldump -u root -p'你的密码' --all-databases > $DB_FILE
tar -czf /backup/site_$DATE.tar.gz /var/www/your_site
cos-cli cp $DB_FILE cos://your-bucket/backup/
cos-cli cp /backup/site_$DATE.tar.gz cos://your-bucket/backup/
find $BACKUP_DIR -name "*.sql" -mtime +7 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
把脚本加入cron,每天凌晨3点自动执行:
sudo crontab -e
0 3 * * * /bin/bash /backup/auto_backup.sh >> /var/log/backup.log 2>&1
每周凌晨3点自动备份,7天前的自动清理。如果服务器硬盘坏了,从COS下载最近的备份,在新服务器上解压,5分钟恢复服务。
没有这套备份方案的时候,硬盘挂了就是灾难。有了它,硬盘挂了就是5分钟的下载加解压。
监控:出了问题你要比用户先知道
服务器出问题了,你是希望用户告诉你,还是自己先知道?
用户告诉你:你发现问题时,可能已经持续半小时了,一堆用户在群里吐槽。
自己先知道:出了问题5分钟内收到告警,立刻处理,用户可能完全没感觉到。
基础监控用Netdata,安装只需要一行命令:
wget -O /tmp/netdata-kickstart.sh https://my-netdata.io/kickstart.sh
sh /tmp/netdata-kickstart.sh
安装完访问 http://你的IP:19999,CPU、内存、磁盘、网络流量一目了然。
但Netdata是给自己看的。真正有用的监控是:收到告警。
最简单的方式是用服务器监控服务(如UptimeRobot或阿里云监控),配置URL监控和端口监控。你的服务挂了,5分钟内收到短信或邮件。
更专业一点,用Prometheus + Grafana:
sudo apt install prometheus -y
sudo apt install grafana -y
sudo systemctl enable --now prometheus grafana-server
Prometheus负责采集指标,Grafana负责展示和告警。Grafana有大量现成的仪表盘模板,导入就能用,不需要自己画。
一个真实案例:一次矿机入侵是怎么发生的
2024年,一家创业公司的CTO发现服务器CPU占用率莫名其妙跑到100%。他登录服务器查进程,发现一个叫kworkerds的进程占用全部CPU。
这不是系统进程。这是一个挖矿程序。
攻击是怎么发生的?他后来查日志发现:SSH端口是默认的22,密码是一个常见的弱密码,防火墙没有配置,开放了所有端口。
黑客用credential stuffing攻击,用一个常见弱密码成功登录了root。然后下载了一个Linux门罗币挖矿程序,命名为kworkerds伪装成系统进程。
他删掉进程、改密码、加防火墙之后,系统恢复了。但服务器的SSH密码、可能的数据泄露已经发生了。他花了三天做完整的数据审计和服务重建。
这个案例里,做好三件事就可以完全避免:创建普通用户、禁用密码登录、只开放必要端口。总耗时不超过30分钟。
最后:安全是一个过程,不是一次配置
你做完上面的所有步骤,服务器安全了吗?比刚买的时候安全多了。但不代表永远安全。
你需要建立的日常习惯:
每周。登录服务器查一遍:有没有异常IP登录?有没有不认识的进程?磁盘使用率有没有异常增长?
每月。检查一次系统更新,确保安全补丁及时安装。检查一次防火墙规则,确保没有误开端口。
每季度。换一次SSH密钥。检查一次备份是否真的能恢复(很多人做了备份,从来没验证过能不能恢复)。
每年。重审一次用户权限——有没有离职员工的账号还在?有没有临时开放的端口忘了关?
服务器安全不是一个"配置清单",做完就打勾。它是一个持续的过程。你的服务器比别人的安全,不是因为你配置得多好,而是因为你维护得多勤快。