Linux用户管理与权限控制
Linux 用户管理与权限控制从入门到我悟了 学完今天的内容我终于理解了 Linux 权限系统的精妙之处——它不是一堆枯燥的命令,而是一套设计优雅的门禁系统。下面我从零开始把它们串成一个好懂的故事。一、用户和组Linux 世界的身份证在 Linux 的世界里一切皆文件一切操作皆有身份。你是谁用户、属于哪个部门组直接决定了你能做什么。1.1 手动创建一个用户——拆解背后的四件套用useradd创建用户很简单但你猜猜系统偷偷做了什么# 自动挡一条命令搞定useraddzhangsan# 手动挡拆开来看其实是四步步骤文件做了什么① 添加账户/etc/passwd登记身份信息用户名、UID、家目录、Shell② 添加组/etc/group创建同名组把用户拉进去③ 添加密码/etc/shadow存入加密后的密码不是明文④ 准备家目录/home/zhangsan从/etc/skel复制一套初始家具# 手动添加用户实操# 1. 在 /etc/passwd 末尾加一行zhangsan:x:1002:1002::/home/zhangsan:/bin/bash# 2. 在 /etc/group 末尾加一行zhangsan:x:1002:# 3. 在 /etc/shadow 末尾加密码加密后的zhangsan:$6$...密文...::0:99999:7:::# 4. 复制家目录骨架并改权限cp-r/etc/skel/ /home/zhangsanchownzhangsan:zhangsan /home/zhangsan类比理解/etc/passwd是户口本/etc/shadow是保险柜存密码/etc/skel是样板间每个新家都照着装修。1.2 三个常见故障——学会了能装大神故障一提示符变成bash-4.2$这不是系统坏了只是/etc/bashrc丢了——bash 找不到它的化妆包# 模拟mv/etc/bashrc{,.ori}# 把 bashrc 藏起来bash# 开个新 shell# bash-4.2# ← 丑吧# 恢复mv/etc/bashrc{.ori,}# 放回去bash# 重新打开# [rootcentos7 ~]# ← 变美了故障二Could not chdir to home directory——家被删了# 家目录被误删用户登录就懵了rm-fr/home/zhangsan# 抢救方法重新摆一套家具cp-r/etc/skel/ /home/zhangsanchownzhangsan:zhangsan /home/zhangsan故障三Permission denied——有家门钥匙但打不开家目录权限被人改成 000 了连主人自己都进不去# 修复chown-Rzhangsan:zhangsan /home/zhangsanchmodurwx /home/zhangsan1.3 组管理批量发门禁卡一个部门的人需要同样的权限挨个设置太累用组# 创建组groupaddadmingroupaddsysadmin-g2000# 指定 GID# 成员管理groupmemsgroupmems-gadmins-alaoma# 加人groupmems-gadmins-dlaoma# 踢人groupmems-gadmins-l# 查看成员groupmems-gadmins-p# 一键清空# 修改组信息groupmod--new-name admins admin# 改名groupmod-g2002admins# 改 GID# 删除组groupdelsysadmin二、密码管理比你想象的更讲究2.1/etc/shadow文件——密码的九宫格greplaoma /etc/shadow# laoma:$6$...密文...:19300:0:99999:7:::# └─加密密码─┘ └最后改┘└最短┘└最长┘└警告┘└不活跃┘└过期┘└保留┘九个字段各有妙用字段含义技巧最后修改日期距 1970-1-1 的天数设为0→ 下次登录强制改密码最短密码寿命几天内不能改设为 0 → 随时能改最长密码寿命几天后必须改安全策略的核心警告期过期前 N 天提醒友好提醒用户非活跃天数过期后还能用几天给人缓冲时间账户过期到那天直接锁死离职员工的定时炸弹2.2chage命令——密码策略的遥控器# 查看密码信息chage-llaoma# 设置 100 天后密码过期chage-M100laoma# 最少 10 天才能改密码防止来回改回旧密码chage-m10laoma# 下次登录必须改密码chage-d0laoma# 让账户穿越到过去——直接过期锁定chage-E1970-1-1 laoma2.3usermod花式管理用户# 复制别人的密码不用 passwd 命令设密码usermod-p$6$dQcDSqtz$...密文...laoma# 删掉密码登录不用输密码直接回车进usermod-plaoma# 锁定/解锁用户usermod-Llaowang# 锁定输正确密码也登不上usermod-Ulaowang# 解锁# 禁止登录把 shell 改成 /sbin/nologinusermod-s/sbin/nologin laowang# 账户设过期日usermod-e2024-7-18 laowang⚠️黑魔法警告把普通用户的 UID 改成 0他就拥有了 root 的权限。两个不同的用户名同一把万能钥匙。useradd-o-u0laoma# -o 允许 UID 重复idlaoma# uid0(root) gid0(root) ← 和 root 平起平坐三、su 和 sudo两种变身姿势3.1 su——换个身份生活suusername# 非登录 shell换衣服不换环境su-lusername# 登录 shell彻底变身推荐su-l# 不写用户名默认变 root关键区别非登录 shell (su)登录 shell (su -)环境变量保留上一个用户的加载目标用户的全部环境当前目录还在老地方跳到目标用户的家目录推荐场景临时执行一个命令需要完整用户环境# 以特定用户执行一条命令就跑su-llaowang-ccat /etc/hosts# 给 nologin 用户临时开个 bashsu-ladm-s/bin/bash-cid3.2 sudo——借权限不借身份su的痛点你得分到 root 密码而且你干了啥没人知道。sudo的优雅输自己的密码不是 root 的每一条命令都记在/var/log/secure里有据可查管理员可以精确控制谁能执行什么命令sudoid# 用自己的密码获得 root 的权利sudo-ulaowangid# 以 laowang 的身份执行3.3 sudoers 配置——权限的艺术visudo# 千万别直接改 /etc/sudoers用这个配置格式谁 在哪台机器(以谁的身份) 能执行啥# 赋予全部权限laowangALL(ALL)ALL# 全部权限且免密码laowangALL(ALL)NOPASSWD:ALL# 只能执行用户管理相关命令laowangALL(ALL)/sbin/useradd,/sbin/usermod,/sbin/userdel血泪教训给用户vim权限给了 root 权限因为sudo vim可以在 vim 里执行:!bash直接提权。所以只给特定功能的命令不要给通用工具。推荐做法配置写到从配置文件里不污染主文件echolaowang ALL(ALL) NOPASSWD:ALL/etc/sudoers.d/laowang3.4 提权最佳实践能用 sudo 就别用 su临时提权用完自动退回用sudo -i代替su -同样获得 root shell但会记日志sudoers 里写绝对路径防止环境变量被篡改定期翻看/var/log/secure谁干了什么一目了然别在脚本里硬编码 sudo 密码配置 NOPASSWD 或换个方案四、文件权限Linux 的精髓所在4.1 一句话理解rwx-rwxr-xr--1laoma wheel2262Dec2308:47 myfile# └类型 └─user──┘──group─┘──other─┘权限对文件对目录r(读)能看文件内容 (cat)能列出目录里有什么 (ls)w(写)能修改文件内容能在目录里创建/删除文件x(执行)能运行这个程序能cd进去目录的门票巧记文件存放内容目录存放文件。读文件看内容读目录看文件列表执行文件运行执行目录进入。4.2 鸡生蛋还是蛋生鸡——权限优先级如果laoma用户属于wheel组文件权限是-rwxr----- laoma wheel用户权限 组权限。laoma 作为文件所有者拿到的是 user 位的rwx而不是 group 位的r--。文件拥有者是 laoma → 用 user 权限位 文件组是 wheel → laoma 也在 wheel 里不管user 优先4.3 chmod——两种语法一个灵魂符号法直观chmoduxpasswd# 主人加执行chmodg-w,o-passwd# 组减写其他人清空chmodarwxpasswd# 所有人满权限chmod-Rurwx dir01# 递归设置数字法高效r4 w2 x1 --- 0 r-- 4 rw- 6 rwx 7chmod755passwd# rwxr-xr-x → 目录标配chmod644passwd# rw-r--r-- → 文件标配chmod777passwd# rwxrwxrwx → 别用除非你知道在干嘛4.4 rwx 实战验证——眼见为实文件权限实验# 只有 w 没有 r → 能写但不能读vim 打开一片空白但能覆盖保存chmodow hosts# 只有 x 没有 r → 脚本执行不了解释器得读脚本内容啊chmodox mycommand# Permission deniedchmodorx mycommand# 读写一起给才行目录权限实验# 只有 r 没有 x → ls 看到文件名但看不到详细信息全是 ?????chmodor dir01/ls-ldir01/# -????????? ? ? ? ? ? hosts# 只有 x 没有 r → 能 cd 进去访问具体文件但 ls 不了chmodox dir01/cddir01/cathosts# 成功ls# Permission denied核心洞察目录的r 能看菜单x 能进餐厅。有 x 没 r你进得去但不知道有什么有 r 没 x你趴窗户能看到菜名但吃不到。4.5 一个实用经验法则场景推荐权限说明普通文件644(rw-r–r–)主人能写别人只能看私密文件600(rw-------)只有自己能看能改可执行程序755(rwxr-xr-x)主人全能别人能执行共享目录775(rwxrwxr-x)同组能写别人只能进来看Web 目录755(rwxr-xr-x)别人能读不能改五、umask新文件默认权限的秘密你有没有想过为什么新创建的文件默认是644不是666目录是755不是777?答案就是umask——一个默认减去的掩码。文件的原始权限 666 目录的原始权限 777 umask 要扣掉的权限 最终权限 原始权限 - umaskumask# 查看当前值默认 0022umask0# 不扣任何权限touchf1# 得到 -rw-rw-rw- (666)mkdird1# 得到 drwxrwxrwx (777)umask077# 扣掉 group 和 other 的所有权限touchf2# 得到 -rw------- (600)mkdird2# 得到 drwx------ (700)常用 umask022标准让组和其他人只读077严格只让自己访问002协作让同组也能改。持久化生效echoumask 077~/.bashrc# 单用户echoumask 077/etc/bashrc# 全系统六、特殊权限SUID、SGID、Sticky Bit6.1 SUID——借刀杀人褒义普通用户执行passwd为什么能改/etc/shadowshadow 明明是----------谁都没权限ls-l$(whichpasswd)# -rwsr-xr-x. 1 root root 27856 Apr 1 2020 /usr/bin/passwd# ↑ 这个 s 就是 SUIDSUID 的含义执行这个程序时你的有效身份暂时变成程序的所有者通常是 root程序结束就还原。# 给 vim 加 SUID危险操作仅演示chmodus /usr/bin/vim# 现在普通用户 sudo vim /etc/passwd 就能改密码文件了chmodu-s /usr/bin/vim# 赶紧去掉6.2 SGID——团队协作神器场景dev1 和 dev2 都在 devops 组需要在webapp/目录里协作写文件。普通做法下每个人创建的文件只归自己所有队友改不了。SGID 解决这个问题chmodgs webapp# 目录设 SGID# 之后在 webapp/ 下新建的文件组所有者自动继承为 devops# 而不是创建者的默认组# 设了 SGID 效果对比# 没设 SGIDdev1 创建的文件 → 属于 dev1:dev1dev2 改不了# 设了 SGIDdev1 创建的文件 → 属于 dev1:devopsdev2 也能改6.3 Sticky Bit——公共空间的隔离墙/tmp目录大家都可写但为什么你删不掉别人的文件ls-ld/tmp# drwxrwxrwt. 20 root root 4096 /tmp# ↑ 这个 t 就是 Sticky Bitstat-c%a /tmp# 1777Sticky Bit 规则在这个目录下你只能删除你自己创建的文件。就像公共储物柜——每个人都有钥匙进去放东西但只能取走自己的。6.4 数字表示速查特殊权限字母数字示例含义SUIDs (user位)4chmod 4755 file以文件所有者身份运行SGIDs (group位)2chmod 2755 dir继承目录的组Stickyt (other位)1chmod 1777 dir只能删自己的文件七、扩展属性chattr——连 root 都删不掉的文件有一种需求我要保护一个重要的日志文件连 root 都不能删、不能覆盖。常规权限做不到root 无视一切权限但chattr可以# i不可变immutable——删不掉、改不了、重命名也不行chattr ipasswdrm-fpasswd# 不允许的操作echoxxxpasswd# 不允许的操作chattr-ipasswd# 改完记得加回来# a只能追加append only——不能覆盖只能往后加chattr a /opt/operator.logecho覆盖/opt/operator.log# 不允许echo追加/opt/operator.log# 允许rm-f/opt/operator.log# 不允许️安全提示关键配置文件如/etc/passwd、/etc/shadow在生产环境可以加i保护防止误操作或恶意篡改。修改前chattr -i改完再chattr i加回去。八、ACL突破传统 rwx 的局限传统的user-group-other三级权限有一个致命缺陷不能给两个不同用户设置不同的权限。比如文件只允许laoma有rwtom只有r传统权限做不到。ACL访问控制列表出场8.1 针对用户# 基础权限owner root 有 rwgroup root 有 rother 无chmodo-passwd# 给 laoma 单独开个后门rw 权限setfacl-mu:laoma:rwpasswd# 文件权限从 -rw-r----- 变成 -rw-rw---- 注意多了个 getfaclpasswd# 查看 ACL# user:laoma:rw- ← laoma 拿到 rw 了# 验证laoma 真的能读了su- laoma-ccat /lab/passwd# OK8.2 针对组 mask# 给 wheel 组也开权限setfacl-mg:wheel:rwxpasswd# mask所有 ACL 权限的上限setfacl-mm:-passwd# 现在 laoma 和 wheel 的 ACL 权限全部被 mask 卡掉了effective:---mask是一个安全阀——即使 ACL 写了rwxmask 如果是---实际生效也是---user:laoma:rw- #effective:--- ← 被 mask 卡了 group:wheel:rwx #effective:--- ← 也被卡了 mask::---8.3 目录默认 ACL# 设置默认 ACL目录下新建的文件自动继承setfacl-md:u:laoma:rw test/touchtest/f2 getfacl test/f2# 自动带上了 laoma 的 ACL一句话总结基础权限是大众套餐ACL 是个性化定制。有了 ACL你可以精细到给每个用户、每个组分配不同的权限而 mask 确保一切在掌控之中。️ 知识地图Linux 用户管理与权限控制 │ ├── 用户管理 │ ├── /etc/passwd /etc/shadow /etc/group 三剑客 │ ├── 手动创建用户理解底层机制 │ └── 常见故障排查bash-4.2$、家目录丢失、权限不足 │ ├── 组管理 │ ├── groupadd / groupmod / groupdel │ └── groupmems组成员管理 │ ├── 密码策略 │ ├── chage密码生命周期管理 │ ├── usermod -p/-L/-U/-s密码操作 │ └── passwd -d/-l/-u │ ├── 提权机制 │ ├── su切换用户推荐用 su -l │ └── sudo借权限记日志用 visudo 配置 │ ├── 基础权限 │ ├── rwx 三件套文件 vs 目录 │ ├── chmod符号法 数字法 4755 │ ├── chown / chgrp │ └── umask默认权限掩码 │ ├── 特殊权限 │ ├── SUID以文件 owner 身份执行 │ ├── SGID目录下文件继承组 │ └── Sticky Bit/tmp 只能删自己的 │ ├── 扩展属性 │ ├── chattr i不可变 │ └── chattr a只能追加 │ └── ACL ├── setfacl -m u:user:权限 ├── setfacl -m g:group:权限 ├── mask权限上限 └── 默认 ACL目录继承✍️ 写在最后今天的内容从用户创建一路讲到 ACL覆盖了 Linux 权限管理的完整链路。核心思想其实就一条Linux 的安全模型是你是谁决定了你能做什么。用户身份 → 组身份 → 文件权限 → 特殊权限 → ACL层层递进环环相扣。把每一条命令亲手敲一遍比看十遍笔记都管用。尤其是手动编辑/etc/passwd/etc/group/etc/shadow创建一个用户用chmod分别测试文件 rwx 和目录 rwx 的实际效果配置一条 sudoers 规则感受权限的精确控制这三个实验做完你对 Linux 权限的理解会上一个台阶。本文基于 2024年7月18日课堂笔记整理实验环境CentOS 7