最小权限原则:别什么都用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 的范围都限死。多用户协作的机器,建议这么配。

密钥管理

密钥比密码安全,但丢了更麻烦:

  1. 私钥加密存储:生成时设 passphrase,电脑丢了也不怕
  2. 多处备份:私钥至少备份两处(加密 U 盘 + 密码管理器),别只放一台电脑
  3. 一机一密钥:不同服务器用不同密钥,一个泄露不连累其他
  4. 离职/换电脑及时删公钥:~/.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 的,容器权限也要管:

  1. 别用 root 跑容器内的应用:Dockerfile 里加 USER 指令,用低权限用户启动应用
  2. 别挂载 docker.sock:把宿主机的 Docker 套接字挂进容器,等于把宿主机 root 送人,除非你知道自己在干嘛
  3. 用 –read-only:不需要写文件的容器,加只读模式,多一层保护
  4. 定期更新镜像:有漏洞的旧镜像,权限做得再好也白搭

容器逃逸是真实存在的攻击面,权限做细一点,睡得安稳一点。

应急:疑似被入侵怎么办

最小权限做得再好,也可能中招。发现异常(陌生登录、陌生进程、流量暴涨),按这个顺序处理:

  1. 断网:先把机器从公网隔离,阻止损失扩大。商家面板一般有关机/断网按钮。
  2. 快照:先做快照再动手,保留现场,万一误操作还能回滚。
  3. 查日志:last 看登录记录,auth.log 看爆破痕迹,htop 看可疑进程。
  4. 改所有密码:root、数据库、应用后台,全改。密钥重新生成。
  5. 重装:拿不准有没有后门,最稳的是备份数据后重装系统。别在被入侵的系统上"杀毒",后门可能比你想象的深。

记住:安全是持续的过程,不是一次配置。定期看日志、及时更新系统,比任何一次性加固都管用。

小够的结论

最小权限原则一句话:默认不用 root,必须用时才 sudo,用完就放下。

安全没有银碟,但把 root 关进笼子,能挡掉绝大多数麻烦。 checklist 再贴一遍,建站也好、折腾也好,拿到新机器先做这几件:

  • 新建普通用户,加 sudo
  • 密钥登录,禁密码登录
  • 禁 root 直接登录
  • 改 SSH 端口
  • 装 fail2ban
  • 配防火墙,只放行必要端口

先把这六步做了,再谈别的——这是对自己数据的负责。