Linux用户管理,你真的懂吗?从原理到实战,一篇打通关
用户管理看起来简单——无非就是useradd、passwd、userdel三板斧。但真正遇到问题的时候,才发现自己对底层原理一知半解。
今天,我就把自己这些年在Linux用户管理上踩过的坑、总结的经验,一次性分享给你。不管你是刚入门的新手,还是已经工作了三四年的运维,相信这篇文章都能给你一些新的启发。
一、用户管理到底在管什么?
很多人用Linux几年了,却从来没想过一个问题:操作系统是怎么知道“我是谁”的?
当你输入whoami,系统返回root或者zhangsan。这个看起来简单的过程,背后其实有一套完整的机制在支撑。
Linux是一个多用户、多任务的操作系统。所谓多用户,不是说一台电脑插好几个键盘同时用,而是指系统可以同时为多个用户提供服务,用户之间互不干扰——文件是分开的,进程是分开的,权限也是分开的。
为了实现这种隔离,Linux引入了两个核心概念:UID和GID。
UID:用户的身份证号
内核其实不认识“root”也不认识“zhangsan”,它只认数字。这个数字就是UID(User ID)。每个用户都有一个唯一的UID,系统内核通过UID来判断这个进程属于哪个用户,应该拥有哪些权限。
这里有个很重要的点:root用户的UID是0。这意味着什么?意味着不管你这个用户名是叫root还是叫admin,只要UID是0,它就是超级管理员。反过来,即使你用户名是root,但如果UID被改成了1000,那它就是一个普通用户。权限看的是数字,不是名字。
GID:用户的户口本
GID(Group ID)是用户组的编号。用户组的概念很好理解——就是一群用户的集合。为什么需要用户组?为了简化权限管理。
举个例子,公司有三个部门:研发、测试、运维。如果每个部门的文件都要分别授权给部门里的每个人,那管理员得累死。有了用户组就不一样了:把研发部的人都加到developers组,然后直接给developers组授权,组里的所有人都自动拥有了权限。
每个用户有一个主组(Primary Group),同时可以属于多个附加组(Supplementary Groups)。主组的概念后面还会讲到,这里先记住。
二、三个你必须懂的核心配置文件
学习Linux用户管理,最忌讳的就是只知道命令不知道原理。命令会忘,但原理掌握了,任何时候都能自己推导出来。
用户管理的所有配置,都存储在三个关键文件中。作为运维人员,这三个文件的结构你必须烂熟于心。
1. /etc/passwd:用户账户的通讯录
执行cat /etc/passwd,你会看到类似这样的内容:
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinzhangsan:x:1000:1000:Zhang San,,,:/home/zhangsan:/bin/bash
每行代表一个用户,用冒号分隔成7个字段。我解释一下每个字段的含义:
- 字段2(密码占位符):早期这里直接存加密后的密码,但后来出于安全考虑,改成了只存一个
x,真正的密码移到另一个文件里了 - 字段3(UID):用户ID,0是root,1-999一般是系统用户,1000以上是普通用户
- 字段5(GECOS):注释信息,一般是用户全名或联系方式
- 字段7(登录Shell):用户登录后启动的程序,如果是
/sbin/nologin,说明这是个系统账户,不允许登录
2. /etc/shadow:真正的保险柜
这个文件权限是-rw-r-----,也就是只有root用户可以读取。它的作用只有一个:保存密码相关的信息。
zhangsan:$6$p7w8N9qL$...:18765:0:99999:7:2:19000:
又是冒号分隔的9个字段,我们只关注前几个最重要的:
- 字段2(加密密码):真正的密码哈希值,
$6$表示使用SHA-512加密。如果这里是*或!!,说明用户被锁定 - 字段3(最后修改时间):从1970年1月1日到最近一次修改密码的天数
3. /etc/group:用户组的档案
developers:x:1001:zhangsan,lisi,wangwudocker:x:999:zhangsan
格式比passwd简单:
- 字段4(组成员):属于这个组的附加用户,注意是附加用户,主用户不显示在这里
看到这里你应该明白了:为什么有时候把用户加到docker组,他就能运行docker命令了?因为docker守护进程检查的是进程的GID是否在docker组里。
三、实战:这些命令你真的会用吗?
理论知识说完了,咱们来点实在的。下面这些命令,每个运维都会用,但很多人用得不规范,留下了安全隐患。
用户组操作
创建组:
groupadd -g 1500 developers
-g指定GID,如果不加,系统会自动分配一个1000以上的空闲GID。
修改组:
groupmod -n devs developers
把developers改名为devs。
删除组:
groupdel devs
注意:如果有用户的主组是这个组,就不能删除,需要先把用户删了或改了主组。
用户操作
创建用户(这才是重点):
很多新手创建用户是这样干的:
useradd zhangsanpasswd zhangsan
这样做没问题,但不够专业。看看标准的做法:
useradd -m -u 1501 -g developers -G docker,admin -s /bin/bash zhangsan
解释一下每个参数:
-m:创建家目录(必须加,不然连home目录都没有)-G docker,admin:指定附加组,多个组用逗号隔开
修改用户属性:
usermod -aG docker zhangsan
把zhangsan加到docker组。注意一定要加-a参数,-aG是追加,如果不加-a,会把用户从其他组踢掉,只保留docker组。
锁定/解锁用户:
usermod -L zhangsan # 锁定usermod -U zhangsan # 解锁
删除用户:
userdel -r zhangsan
-r参数会同时删除家目录和邮件池。不加-r的话,用户删了,但home目录还在,时间长了会留下一堆垃圾。
四、高级技巧:让管理事半功倍
掌握了基础,咱们来点进阶的。
1. 批量创建用户,用脚本解决重复劳动
新入职5个开发,每个都要建账号、设密码、加组。手工会累死,而且容易出错。
写个简单的脚本:
#!/bin/bashfor user in dev1 dev2 dev3 dev4 dev5; do useradd -m -G developers,docker -s /bin/bash $userecho"$user:初始密码123" | chpasswd passwd -e $user# 强制首次登录修改密码done
一行命令,5个用户全部建好,密码统一设置,还强制他们第一次登录必须改密码。这才是高效运维的样子。
2. 组管理员:把权限下放
公司大了,人员变动频繁,每次都找你加人?烦不胜烦。
Linux提供了组管理员机制:
gpasswd -A zhangsan developers
现在,zhangsan就可以自己管理developers组了:
gpasswd -a lisi developers # 加人gpasswd -d wangwu developers # 踢人
根本不用麻烦你。这才是管理的艺术——把操作下放,把控制权收紧。
3. 诡异的“user is currently used by process”
回到开头那个问题:明明用户已经退出了,为什么删除时报错?
执行这个命令看看:
ps aux | grep ^username
八成是那个用户跑了个后台进程,比如用nohup启动的服务,或者crontab里的定时任务。用户虽然退出了,但进程还在以他的身份运行,系统当然不允许删。
解决方法:先kill掉相关进程,再执行userdel。
五、安全加固:用户管理的红线
技术说到底是为了业务服务的,而业务最怕的就是安全问题。下面这几条红线,踩了任何一条都可能出大事。
1. 绝对不要共享账号
我知道很多公司图省事,几个人共用一个root密码。这是最危险的做法——出了问题根本查不到是谁干的。谁用了root?什么时候用的?执行了什么命令?全都没有日志。
正确的做法:每个人都有自己的账号,需要用root权限时通过sudo临时提权。所有操作都会记录在/var/log/secure里,出了问题好追溯。
2. 禁用root远程登录
云服务器上,一定要修改/etc/ssh/sshd_config:
PermitRootLogin no
然后重启sshd。为什么要禁?因为root是系统的最高权限,也是黑客暴力破解的首要目标。所有人都用普通用户登录,有需要再su或sudo,既安全又可控。
3. 最小权限原则
这是安全领域的黄金法则:给用户的权限,刚好够用就行,绝对不多给一分。
比如部署用户只需要重启nginx,那就别给他修改系统的权限。在/etc/sudoers里精确限制:
deploy ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload nginx
这样deploy用户除了重启nginx,什么都干不了。
4. 定期清理僵尸账户
离职员工的账号删了吗?测试用的临时账号还留着吗?这些“僵尸账户”是安全漏洞的重灾区。
写个脚本,每个月自动检查:
lastlog -b 90 # 90天没登录的用户
超过3个月没登录的,先锁定,再发邮件确认,确认离职的直接删。
Linux用户管理,说起来不难,但要做到专业、安全、高效,需要理解的不只是几个命令,而是背后的设计思想和安全理念。
我从刚入行时只会useradd,到现在能够根据业务场景设计完整的权限体系,中间走了不少弯路。希望这篇文章能帮你少踩一些坑,更快地成长为一名合格的Linux运维。
如果你在用户管理上遇到过什么奇葩问题,或者有自己的独门技巧,欢迎在评论区分享出来,我们一起讨论,一起进步。
对了,如果你觉得这篇文章对你有帮助,可以点个赞支持一下,也欢迎关注我,后续还会有更多Linux实战干货分享。转发给身边做运维的朋友,也许能帮他解决困扰已久的问题。