最小权限原则:别什么都用root跑
拿到 VPS 就用 root 跑一切?一个命令敲错,整个系统陪葬。小够教你最小权限原则:建普通用户、用 sudo、密钥登录、管好权限。
我是小够。
很多新手拿到 VPS,SSH 登录就是 root,装软件用 root,跑网站用 root,甚至把 root 密码设成 123456。图一时方便,埋一颗大雷:root 权限下,一个命令敲错,整个系统陪葬;一个漏洞被利用,整台机器沦陷。
今天讲最小权限原则:给每个任务刚好够用的权限,不多给。这是服务器安全的第一课。
为什么别用 root
root 是 Linux 的"上帝账号",能做任何事,包括删库:
# 手滑多打了个空格,家就没了
rm -rf / tmp/backup
用 root 跑网站服务更危险:网站程序有个漏洞,攻击者拿到的就是 root 权限,整台机器任人摆布。权限越大,爆炸半径越大。
最小权限原则的核心就一句话:默认给最小的权限,需要时再临时提权,用完就放下。
三步落地最小权限
第一步:建一个普通用户
# 新建用户 xiaogou
adduser xiaogou
# 把它加入 sudo 组,需要提权时用 sudo
usermod -aG sudo xiaogou
日常操作都用这个用户登录,只有需要管理员权限时才 sudo。多输一次密码,多一道保险——这道保险拦住的,可能是你手滑的那个回车。
第二步:用密钥登录,禁密码
# 本地生成密钥(只做一次)
ssh-keygen -t ed25519
# 把公钥传到服务器
ssh-copy-id xiaogou@你的服务器IP
配好后,在 /etc/ssh/sshd_config 里把 PasswordAuthentication 设为 no,重启 SSH:
sudo systemctl restart sshd
从此告别密码爆破——密钥的长度,暴力破解基本没戏。改之前务必确认密钥登录已生效,别把自己锁在外面。
第三步:能不用 root 跑的服务,都不用
- 网站服务(Nginx、PHP)用专用低权限用户跑,别用 root 启动
- Docker 容器里也别用 root 用户(Dockerfile 里加
USER指令) - 定时任务按需分配用户,别全塞 root 的 crontab
- 数据库给应用建专用账号,只给必要的库的权限,别直接给 root 账号
SSH 安全的顺手五件事
最小权限之外,SSH 加固顺手做了:
1. 改默认端口
22 改成高位随机端口(如 22222),挡掉 99% 的自动化扫描。改 /etc/ssh/sshd_config 的 Port,防火墙放行新端口,重启 SSH。改完先开新窗口测试,别关掉当前连接,确认能连上再退出。
2. 禁止 root 直接登录
PermitRootLogin no
root 只能先登普通用户再 sudo,攻击面小一截。这是等保都要求的基础项。
3. 装 fail2ban
自动封禁暴力破解的 IP:
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
默认配置就能用,几分钟配好,长期受益。
4. 配置防火墙
只放行必要的端口:
sudo ufw allow 22222/tcp # 你的 SSH 端口
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
默认拒绝一切,按需放行。防火墙是最后一道门,别嫌麻烦。
5. 定期看登录日志
# 看最近的登录记录
last | head -20
# 看 SSH 爆破尝试
sudo grep "Failed password" /var/log/auth.log | tail -20
偶尔看一眼,心里有数。发现陌生 IP 登录成功,立刻改密码、查后门。
sudo 的正确用法
sudo 不是摆设,用法也有讲究:
# 临时提权执行一条命令
sudo apt update
# 切换到 root shell(少用,用完 exit)
sudo -i
# 以指定用户身份执行
sudo -u www-data php script.php
别图省事 sudo su 常驻 root——那和直接用 root 登录没区别,最小权限就白做了。
还可以精细化控制 /etc/sudoers:比如只允许某个用户执行特定的几个命令,连 sudo 的范围都限死。多用户协作的机器,建议这么配。
密钥管理
密钥比密码安全,但丢了更麻烦:
- 私钥加密存储:生成时设 passphrase,电脑丢了也不怕
- 多处备份:私钥至少备份两处(加密 U 盘 + 密码管理器),别只放一台电脑
- 一机一密钥:不同服务器用不同密钥,一个泄露不连累其他
- 离职/换电脑及时删公钥:
~/.ssh/authorized_keys里的人走了,公钥要删
真丢了密钥也别慌:商家面板都有 VNC / 网页控制台,用面板登录重配。这是你买 VPS 时就该确认好的逃生通道。
常见误区
“我就一台小机器,没人黑”
错。扫描器不挑食,全网扫 22 端口的机器每天都有。小机器被拿去当矿机、发垃圾邮件的案例一抓一大把——不是你重要,是自动化攻击不挑。
“sudo 好麻烦,直接 root 省事”
省这几秒钟,赌的是整台机器。真出一次事,恢复的时间够你输一万次 sudo。
“密钥弄丢了怎么办”
上面说了:面板控制台是逃生通道。平时把私钥备份好(加密存),别只放一台电脑。
“改了端口就安全了?”
改端口只是减少扫描噪音,不是安全本身。密钥登录 + 禁 root + fail2ban + 防火墙,这一套做全了才叫基本安全。别指望一招鲜。
多用户协作:权限怎么分
一个人用和团队用,权限策略不一样:
- 每个人独立账号:别共用一个账号,谁干了什么,日志里分得清
- 按角色给 sudo:运维给全权限,开发只给重启服务的权限,用
/etc/sudoers精细控制 - 示例:只允许 dev 用户重启 nginx
dev ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx - 人走 key 删:成员离开,立刻从
authorized_keys删公钥,别拖
审计:谁动了我的机器
权限分好了,还得能审计:
# 看 sudo 都执行过什么
sudo grep sudo /var/log/auth.log | tail -20
# 看最近登录
last | head -20
# 看文件被谁改过(需提前装 auditd)
sudo ausearch -f /etc/passwd | tail -10
个人小站,偶尔看一眼 last 和 auth.log 就够了。团队机器,建议把日志集中收集,出事能追溯。
Docker 容器的最小权限
跑 Docker 的,容器权限也要管:
- 别用 root 跑容器内的应用:Dockerfile 里加
USER指令,用低权限用户启动应用 - 别挂载 docker.sock:把宿主机的 Docker 套接字挂进容器,等于把宿主机 root 送人,除非你知道自己在干嘛
- 用 –read-only:不需要写文件的容器,加只读模式,多一层保护
- 定期更新镜像:有漏洞的旧镜像,权限做得再好也白搭
容器逃逸是真实存在的攻击面,权限做细一点,睡得安稳一点。
应急:疑似被入侵怎么办
最小权限做得再好,也可能中招。发现异常(陌生登录、陌生进程、流量暴涨),按这个顺序处理:
- 断网:先把机器从公网隔离,阻止损失扩大。商家面板一般有关机/断网按钮。
- 快照:先做快照再动手,保留现场,万一误操作还能回滚。
- 查日志:
last看登录记录,auth.log看爆破痕迹,htop看可疑进程。 - 改所有密码:root、数据库、应用后台,全改。密钥重新生成。
- 重装:拿不准有没有后门,最稳的是备份数据后重装系统。别在被入侵的系统上"杀毒",后门可能比你想象的深。
记住:安全是持续的过程,不是一次配置。定期看日志、及时更新系统,比任何一次性加固都管用。
小够的结论
最小权限原则一句话:默认不用 root,必须用时才 sudo,用完就放下。
安全没有银碟,但把 root 关进笼子,能挡掉绝大多数麻烦。 checklist 再贴一遍,建站也好、折腾也好,拿到新机器先做这几件:
- 新建普通用户,加 sudo
- 密钥登录,禁密码登录
- 禁 root 直接登录
- 改 SSH 端口
- 装 fail2ban
- 配防火墙,只放行必要端口
先把这六步做了,再谈别的——这是对自己数据的负责。