ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux权限管理详解:从UGO模型到ACL与sudo安全实践

Linux权限管理详解:从UGO模型到ACL与sudo安全实践 Linux系统中的权限管理聊到Linux权限管理很多人第一反应是chmod 777一条命令走天下反正跑不通就提权。但真实生产环境里权限配置不当造成的安全事故、服务无法启动、文件被误删等等问题远比想象中常见。我自己接手过的服务器故障里有相当一部分的根因都指向权限。这一篇我会从最基础的UGO模型讲起一路覆盖数字权限计算、特殊权限位、目录权限特性、用户与组的管理、sudo策略、ACL高级权限这些内容同时穿插实际运维中踩过的坑和排查思路希望能给正在学Linux的朋友或者刚入门运维的同行一些参考。1. 权限模型真正在管什么从一次半夜的故障说起先从一个真实案例聊起。有次半夜接到告警某台业务服务器上的Web服务突然无法写入日志文件接口报错一片。远程上去查看发现运行Web服务的用户对日志目录没有写权限而前一天刚好有同事做系统清理时把目录属主和权限顺手改掉了。这种问题在开发环境几乎不会暴露因为很多人习惯用root跑服务但生产环境一般会用专用用户运行权限一旦不对服务立刻抽风。这个案例说明一个核心问题Linux的权限管理本质上是对系统中每个文件和目录明确“谁能访问、能做什么”的一套规则。它不像Windows那样弹个对话框点几下鼠标而是通过一组紧凑的权限位来控制。Linux的权限模型通常称为UGO模型也就是User属主、Group属组、Other其他人三类主体分别对应文件的所有者、所有者所在的组、以及系统里其他所有用户。每一类主体又对应三种权限r读、w写、x执行。这套设计非常简洁但恰恰是这种简洁让初学者经常混淆。三种权限的含义需要区分文件和目录来看。对普通文件来说读权限意味着可以查看内容写权限意味着可以修改内容执行权限意味着文件可以作为程序运行。对目录来说读权限代表可以列出目录里有哪些文件名写权限代表可以在目录里新建、删除、重命名文件执行权限则代表能否进入这个目录——这个“进入目录”的概念很多人会忽略导致权限配置出现莫名其妙的问题。很多Linux运维专家会刻意强调一句话目录的写权限比文件的写权限更加危险。原因是文件本身是否可写只影响文件内容能不能被修改但如果一个目录对某个用户开放了写权限那该用户就能在目录里删除任何文件——即使这些文件本身并不属于他文件本身也没有写权限。这个细节如果不理解后面配置共享目录、Web上传目录的时候很容易出事。理解这套模型之后再去看系统的权限位展示就轻松了。用ls -l查看文件第一列类似-rw-r--r--总共10个字符第一个字符表示文件类型-普通文件、d目录、l软链接等后面9个字符每3个一组分别对应属主、属组、其他用户的权限组合。这一串字符就是Linux权限管理最直观的载体之后所有权限操作都是对这串字符或对应数值的修改。2. 用户和组的关系新建用户时最容易被忽略的细节权限的主体是用户和组所以谈权限管理之前先把用户体系理清楚。Linux用户信息存放在/etc/passwd、/etc/shadow、/etc/group这几个文件里我建议每个运维新手都手动打开这几个文件看一下比背一百遍概念都管用。/etc/passwd里每一行代表一个用户字段用冒号分隔依次是用户名、密码占位符、UID、GID、注释信息、家目录、登录Shell。需要注意用户密码本身存放在/etc/shadow中/etc/passwd里的x只是占位符这也是Linux安全设计的一部分——/etc/passwd需要被所有用户读取而加密后的密码哈希不能对所有用户开放。新建用户的命令是useradd最基础用法是useradd username。但实际生产环境里我几乎不会裸用而是会带上一堆参数比如useradd -m -d /home/deploy -s /bin/bash -U deploy-m表示创建家目录-d指定家目录路径-s设置登录Shell-U同时创建同名用户组。很多新手用默认参数创建用户之后发现没有家目录、登录Shell指向/bin/sh就是因为没理解这些选项的作用。顺便说一句在Debian系系统中useradd和adduser是两个不同的东西adduser是更友好的交互式前端会自动创建家目录并设置密码适合对命令不熟的人但在自动化脚本里我会坚持用useradd因为行为更可预期。新建用户后还有一个高频操作是加入附加组。比如想让deploy用户有权限访问www-data组的文件用usermod -aG www-data deploy这里的-aG非常关键-a表示append追加不加的话会把这个用户从其他附加组里移除导致他失去原有的部分访问权限。这个坑我在自动化脚本里踩过不止一次建议想清楚再执行。用户和组配合使用的场景最典型的就是多人协作的服务器。比如一个项目组有5个人都放在dev组里项目目录属组设为dev权限设置成rwxrwxr-x这样组内成员可以互相读写项目文件而外部用户只能读不能改。相比给每个用户单独授权用组统一管理要清爽得多。再补充一个和密码相关的细节创建用户时如果不想立即设置密码可以用passwd -d username清空密码但清空密码的账户通常无法通过SSH正常登录取决于SSH配置。在安全加固时我们经常会把不需要登录的服务账户Shell改成/sbin/nologin或/bin/false这样一个细微改动就能禁止该用户直接登录系统但对服务本身没有影响。比如mysql、nginx这类服务账户系统安装时会自动处理好这些但自己手动创建服务账户时很容易忽略。3. 文件权限的查看与修改从符号到数字的一步步拆解权限管理的核心操作无非三件事改属主、改属组、改权限位。三个命令对应分别是chown、chgrp、chmod这是每个Linux用户绕不开的组合拳。先看怎么查看权限。ls -l的输出除了前面那串权限字符后面还会显示属主和属组比如-rw-r----- 1 deploy dev 1024 Feb 18 10:30 config.yaml这表示config.yaml的属主是deploy属组是dev权限是rw-r-----属主可读可写属组成员可读其他用户没有任何权限。养成习惯用ls -l检查权限归属很多诡异问题一眼就能看出来。修改属主用chown。需要注意一条执行习惯绝大多数情况下修改属主要连属组一起指定因为分开执行会让文件在一段时间内处于“属主已变、属组未变”的中间状态chown deploy:dev config.yaml冒号前是新的属主冒号后是新的属组一条命令搞定。如果只想改属组用chgrp dev config.yaml或者chown :dev config.yaml效果一样。改权限位是重头戏有两种写法。符号模式直观好记数字模式简洁高效。先说符号模式u表示属主g表示属组o表示其他用户a表示所有人添加权限-移除权限设定精确权限r、w、x分别对应读、写、执行实际例子chmod ux script.sh # 给属主添加执行权限 chmod g-w,o-rwx config.yaml # 属组移除写权限其他人移除所有权限 chmod ar document.txt # 所有人权限设为只读数字模式是3位八进制数每一位分别代表属主、属组、其他用户的权限读权限值4、写权限值2、执行权限值1三种权限相加得到这个用户的权限值。所以chmod 750的含义是属主rwx4217、属组r-x4015、其他人无权限0。关于数字权限计算我建议不要死记硬背直接心算即可看到644拆成642即rw-4即r--4即r--所以-rw-r--r--。看到755拆出7421即rwx541即r-x同样r-x这是可执行文件的典型权限。熟练之后一眼就能把符号和数字互转。这里要给出一份我常用的生产环境权限对照表方便直接套用使用场景属主属组其他数字权限普通文件配置、文档rw-r--r--644可执行脚本/程序rwxr-xr-x755私密配置文件rw-r--------640极度敏感文件rw-------600共享项目目录rwxrwxr-x775Web目录只读rwxr-xr-x755Web目录需要写rwxrwx---770这张表的关键点在于默认情况下绝不轻易给“其他用户”写权限能不给就不给。chmod 777这种荒野大镖客式授权在面试题里可以出现在生产环境则是事故温床。我曾经遇到一台测试服务器被人上传了恶意脚本就是某个上传目录当年图省事直接777事后排查成本相当高。在修改权限时还有一个容易忽略的命令参数chown和chmod都支持-R递归选项对目录及其内部所有内容生效。递归处理后一定要复查比如chown -R deploy:dev /data/project会把这个目录下所有文件的属主和属组全部改为deploy和dev。但-R配合通配符或路径末尾的斜杠使用时容易误伤比如chmod -R 755 /data/app/和chmod -R 755 /data/app看似相同实际上如果路径后面多写一个空格加个斜杠再指向错误路径操作范围可能天差地别。我在脚本里会刻意避免模糊路径统一使用明确的目录路径并加上--分隔符防止以-开头的文件名干扰。另外修改权限前务必备份和确认当前权限特别是批量处理时。正规操作是先跑ls -l查看当前状态再用chmod命令最后再用ls -l确认结果。这三步养成习惯能少踩很多坑。4. 目录权限的执行位为什么明明可读却进不去目录文件权限相对好理解目录权限则是大多数初学者卡壳的地方。这里我单独拎出来详细讲因为目录权限的行为模式和文件权限不完全一样。目录的读权限决定你能不能列出目录下的内容目录的写权限决定你能不能在里面创建或删除文件注意这里说的是“在目录里”创建删除而不是修改文件本身目录的执行权限决定你能不能进入这个目录。三个权限相互独立但实际使用时经常是连锁反应。最常见的困惑场景是用户对某个目录有读权限r--但用cd进去时被拒绝提示Permission denied。这就是因为目录缺少执行权限。cd命令本质上不是“读”目录而是“进入”目录必须要有执行权限。即使你有读权限能列出文件名没有执行权限也不能把当前工作目录切换进去更不能访问目录里任何文件的具体内容。打个比方目录的读权限相当于你能看到一栋楼的门牌清单执行权限则相当于获得进入这栋楼的钥匙。光看清单不让你进门什么事都干不了。所以对目录来说执行权限的地位非常高。依赖这个原理常见的目录权限配置有几种典型组合我列出来目录权限含义典型用途700只有属主能进入、列出并修改用户家目录750属主完全控制属组可进入可读项目共享目录755所有人可进入可读仅属主可写Web根目录、公开资源770属主和属组可进入可读写团队协作目录1777所有人可进入可读写粘滞位保护/tmp目录有一种情况需要特别留意目录的写权限同时包含“可删除任何文件”的能力即使这些文件属于另一个用户而且这个用户对文件本身没有任何权限。很多人不理解为什么自己明明不能修改某个文件却能把它删掉原因就在这里——删除操作看的是文件和父目录的关系而不是文件自己的权限。我自己在配置上传目录时几乎从不把目录权限设成777而是使用带粘滞位的权限或者ACL做精准授权。如果只是临时共享设置chmod 1730 dir末尾的0表示其他人完全没有权限最前面的1是后面要讲的粘滞位确保只有属主和属组能操作比777安全得多。还有个细节是路径上每一级目录的执行权限都会影响最终访问。就算目标文件/data/app/config.yaml自身权限是600如果中间任一级目录/data或/data/app不允许某个用户进入那这个用户照样访问不了底层文件。排查“我这个用户打不开文件”的问题时一定要用namei -l /data/app/config.yaml看全路径权限而不是只盯着最后那个文件。这个命令我几乎每次排查权限问题都会用效率很高。5. 特殊权限位setuid、setgid和粘滞位的作用与风险基础权限只是第一层Linux还有三个特殊权限位在实际系统中扮演重要角色分别是SUIDSet User ID、SGIDSet Group ID和Sticky Bit粘滞位。它们附着在可执行文件或目录上对权限行为产生额外影响同时也是面试和运维中的高频考点。5.1 SUID临时借用属主身份SUID作用于可执行文件用符号表示是属主执行位上的S或s。当一个文件设置了SUID后其他用户执行这个文件时进程的有效用户ID会临时变成文件属主的ID而不是执行者自己的ID。最典型的例子就是passwd命令。普通用户修改自己的密码时需要写/etc/shadow但这个文件默认只有root能读写。如果passwd命令没有SUID权限普通用户根本无法完成修改密码操作。查看/usr/bin/passwd它的权限通常是-rwsr-xr-x那个s就是SUID位让普通用户在执行passwd时临时获得root权限去写shadow文件。SUID的配置命令是chmod us /path/to/program chmod 4755 /path/to/program # 数字模式4表示SUIDSUID虽然方便却是攻击者最喜欢的目标之一。如果系统里某个可执行文件设置了SUID但自身有漏洞普通用户可以利用它实现提权直接威胁整个系统。安全基线核查时有一条必查项是“找出系统中所有SUID文件”用命令find / -perm -4000 -type f 2/dev/null如果发现没来由的SUID文件基本可以判定有异常。降低风险的办法是定期审计这份列表尽量减少带有SUID位的程序数量能用sudo替代的就不用SUID。另外绝对不要对脚本文件设置SUID。脚本的SUID依赖解释器绝大多数系统的脚本解释器不会继承SUID权限而且这还可能引入未知的提权风险。可执行文件的SUID是否生效还要看文件所在分区的挂载选项比如nosuid挂载参数会直接禁用SUID位这一点在加固时很管用。5.2 SGID目录权限的继承机制SGID作用于文件和目录时行为不同。在可执行文件上SGID会让进程临时获得文件属组的身份类似SUID但作用在组上。在目录上设置SGID则有更实用的效果目录下新建的文件会自动继承该目录的属组而不是创建者自己的默认组。这个特性在团队协作里特别有用。比如团队共享目录/data/shared属组设为devteam并设置SGID位数字权限的2chgrp devteam /data/shared chmod 2770 /data/shared今后不管哪个组成员在这个目录下新建文件文件的属组都自动是devteam其他组员就能按组权限访问。没有SGID时新建文件的属组是创建者自己的默认组当团队成员默认组不一致时共享协作会迅速变得混乱。查看SGID位在属组执行位显示为s或S。用find / -perm -2000 -type d可以找出所有设置了SGID的目录。给目录设置SGID后注意配合目录的属组和权限统一规划否则可能出现文件属组正确但权限过宽或过窄的问题。5.3 Sticky Bit/tmp目录的保护神粘滞位主要用在目录上。设置了粘滞位的目录里即使用户对该目录有写权限也只能删除属于自己的文件不能删除其他用户的文件。最典型的案例是/tmp目录权限是drwxrwxrwt。所有人都能在/tmp里创建文件但普通用户不能删除别人的临时文件。那个t来自粘滞位数字模式的最前面记作1即chmod 1777 /tmp。粘滞位的配置chmod t /tmp/shared chmod 1777 /tmp/shared这个机制对共享目录的安全性提升是决定性的。假设某台机器上多个服务共用/data/tmp没有粘滞位时A服务可以顺手删掉B服务创建的临时文件导致B服务各种神秘崩溃。加上粘滞位后这种误删风险一下子消失。查看粘滞位在目录的“其他用户执行位”上显示为t或T。顺手说一个小技巧当你看到一个目录权限最后一位是t就能立刻想到它带着粘滞位保护这比查ls -l的完整输出快得多。6. sudo权限委派、限制与审计前面讲的都是文件和目录的权限但Linux系统管理的另一个核心权限维度是“谁能以谁的身份执行什么命令”这就是sudo要解决的问题。6.1 为什么sudo比直接切换root更合理很多刚入门的朋友习惯用su root切换到root用户这种做法的最大问题是权限过大且无法审计——一旦切到root所有操作都是root身份出了问题很难追溯到具体是哪个管理员执行的什么命令。sudo的设计思路不同普通用户保留自己的身份只是在执行特定命令时临时提升权限。管理员可以在/etc/sudoers里精细控制每个用户能执行哪些命令而且所有sudo操作都会记入日志通常是/var/log/auth.log或/var/log/secure出问题时有据可查。日常使用中sudo还有一层额外的好处执行sudo时系统会验证当前用户的密码而不是root密码。这意味着即便某个用户被委派了sudo权限也不需要知道root密码安全性明显提升。6.2 sudoers文件编写实战sudo的配置集中在/etc/sudoers不建议直接编辑这个文件而是用visudo命令因为它自带语法检查改错还能救回来。先看几个常见配置# 允许wheel组所有成员执行任何命令 %wheel ALL(ALL) ALL # 允许deploy用户以root身份执行systemctl管理服务 deploy ALL(root) /usr/bin/systemctl # 允许ops组执行systemctl且不需要密码 %ops ALL(ALL) NOPASSWD: /usr/bin/systemctl # 限制某用户只能执行特定命令 demo ALL(ALL) /usr/bin/less, /usr/bin/catsudoers每条配置有四个基本要素谁用户或组、在哪台主机上通常写ALL、以什么身份括号里的部分、能执行什么命令。%开头代表用户组NOPASSWD表示免密多个命令间用逗号分隔。在生产环境中我不建议给普通用户配置ALL(ALL) ALL这种完全放开的权限除非他确实是运维负责人。更合理的做法是按需最小授权比如重启Web服务就给systemctl restart nginx、查看日志就给tail和grep这样即使账号失陷攻击者的操作面也是有限的。6.3 踩坑sudo配置要注意的细节sudo看似简单实际坑不少我列出几个高频问题。坑一环境变量被清空。执行sudo后当前用户的环境变量大部分会丢失换成目标用户的基本环境。有时候会出现“我普通用户能跑通的命令sudo后反而找不到”的情况多半是PATH差异导致的。解决办法是用sudo visudo修改Defaults secure_path把常用的/usr/local/bin、/opt/bin等目录加进去。坑二特定程序的sudo参数解析。生产环境常有“这个服务只能用root启动我用sudo启动它”。如果程序启动时依赖环境变量或相对路径sudo会改变用户和路径程序可能找不到配置。我惯用的排查方式是先确认这个程序用root用户手动启动时能不能正常跑如果能那sudo环境就是引起问题的变量。坑三sudo命令中的通配符陷阱。在sudoers里写/usr/bin/vim *想限制vim编辑任何文件实际这种写法很危险因为vim可以打开shell来执行任意命令。运维圈有一句话“允许sudo vim等价于允许sudo所有命令”因为vim内:!command就能调用任意命令。同理sudo python、sudo perl也是变相全开权限。安全设计时要明白能直接执行shell解释器就等于完全放权。sudo的日志审计是不可省略的一环。在堡垒机或跳板机上我更依赖集中日志平台收集sudo日志辅助审计每个管理员在服务器上执行了哪些提权操作。没有日志权限管理就是黑箱。7. ACL访问控制突破UGO模型限制的单用户授权UGO模型虽然简洁但也有硬伤它只能设定三类主体的权限属主、属组、其他人。如果“其他人”里有Alice和Bob你只想让Alice能读一个文件Bob不能读那UGO模型就抓瞎了——要么把Alice加进文件的属组要么就只能给其他用户开权限Bob也跟着能读了。ACLAccess Control List访问控制列表就是为了解决这个场景而出现的。它可以在UGO之外单独为某个用户或某个组设置权限而不影响文件原本的属主和属组模型。7.1 ACL的查看与设置文件系统通常默认支持ACL但某些挂载选项可能关闭了它可以先确认挂载输出里没有noacl字样。查看ACL用getfacl设置ACL用setfacl。实际用法# 给alice用户单独授予读权限 setfacl -m u:alice:r /data/project/config.yaml # 给dev组单独授予读写权限 setfacl -m g:dev:rw /data/project/config.yaml # 移除alice的ACL setfacl -x u:alice /data/project/config.yaml # 递归设置ACL到目录下所有内容 setfacl -R -m u:alice:rX /data/project/设置ACL之后用ls -l查看文件权限位后面会多出一个号比如-rw-r-----。这就是该文件带有ACL的标记。要查看详细ACL规则必须用getfacl。setfacl的-m选项后面用u:用户名:权限或g:组名:权限的格式。权限位同样支持r、w、x以及数字。7.2 maskACL的“总阀门”机制ACL里有个概念叫mask很多人第一次接触会被绕晕。简单理解mask是“命名用户、命名组和属组”这三类ACL条目权限的上限。举例文件原本权限是rw-r-----属组权限是r--。给alice设置u:alice:rw的ACL后getfacl会显示一行user:alice:rw- mask::rw-此时alice的权限是rw-。但如果后续运行chmod gw file或者某条命令把有效权限组调成r--mask就会降为r--alice的有效权限也会变成r--即使ACL记录里写的还是rw-。这就是ACL里“记录权限”和“有效权限”的差异。解决这个坑的办法是设置完ACL后用setfacl -m m::rwx /path显式控制mask避免它被其他操作意外收窄。面试时如果被问到“为什么ACL设置了rw用户实际只有r”十有八九就是mask在作怪。7.3 默认ACL让新文件自动继承授权ACL还有一个很强的功能默认ACL。给目录设置默认ACL后目录里新建的文件会自动继承一组预设的ACL规则无需每次单独设置。# 给目录设置默认ACL让新建文件自动给dev组rw权限 setfacl -m d:g:dev:rw /data/project/这个机制在共享工作区特别实用。比如一个数据目录所有组员都能在里面新建文件且文件自动对组内可读写不再依赖每个文件创建时手动chmod。多团队成员协作时能省下大量重复操作也减少了权限遗漏。但默认ACL也需要谨慎配置因为它会影响所有新建文件一旦给了过宽的默认权限新文件可能自动带上了不该有的授权。我的习惯是先设置好目录的属组和基本权限再叠加精确的默认ACL之后定期用getfacl轮询检查现有文件的ACL状态。8. 提权是怎么发生的管理员视角的权限风险排查“Linux提权”这个词经常出现在安全领域但它并不是某个神秘的黑客技术而是一系列权限管理疏漏被利用的过程。站在管理员的角度反向理解提权路径能让我们更清楚应该如何防御。8.1 常见权限配置弱点我梳理了几类提权攻击最常用的入口以及对应的防御思路提权路径风险原理防御建议SUID滥用带SUID的可执行文件存在漏洞或可被利用执行命令定期审计SUID文件删除不需要的SUID位分区使用nosuidsudo配置过宽用户被授权执行解释器、编辑器等可逃逸命令最小化授权限制危险命令用白名单而非黑名单目录写权限不当用户可往PATH目录或Web目录写入恶意脚本去除不必要写权限写目录用专用用户配合ACL属组配置错误用户被加入过宽组如docker组/root组复查附加组删除不必要组成员全局可写文件配置文件或被定时执行的脚本对所有人可写扫描全局可写文件收紧权限打个比方提权往往不是“一把钥匙开了所有锁”而是“有一个房间的钥匙但是忘了换锁”。防御的核心并不是禁止使用sudo和SUID而是把权限拆解到最小够用同时保证日志可见让异常行为无处遁形。8.2 实战排查命令集面对权限类问题或安全事件排查我常用下面这组命令这里整理出来供参考查找全局可写的目录去掉/proc、/sys这类虚拟文件系统的影响find / -xdev -type d -perm -0002 -print 2/dev/null查找所有带SUID/SGID的文件find / -xdev -type f -perm /6000 -print 2/dev/null查找属主或属组异常的文件find / -xdev -nouser -o -nogroup -print 2/dev/null检查当前用户能通过sudo执行什么命令sudo -l检查用户及其附加组id username groups username检查某个文件在路径上每一级的权限namei -l /data/app/config.yaml这几条命令我建议保存起来遇到权限疑问时挨个跑一遍绝大多数问题都能定位。8.3 权限管理的“最小够用”原则“最小权限原则”是权限管理的总纲翻译成人话就是每个用户、每个服务、每个进程只拥有完成任务所必需的最小权限不多给一分。落实到操作层面可以提炼成几条经验服务进程不要跑在root下创建专用用户并只给业务目录和控制端口的权限。SSH登录尽量使用普通用户sudo禁止root直接登录/etc/ssh/sshd_config里设置PermitRootLogin no。部门共享目录使用SGIDACL精细控制避免简单粗暴的777。Web程序的上传目录独立分区或独立目录去掉执行权限比如挂载noexec防止上传脚本直接运行。定期审计SUID文件、全局可写文件、异常属主文件这些审计可以作为巡检脚本的一部分每周执行一次。这个过程有点像整理家里的钥匙串能不配的钥匙就不配配了钥匙的房间要贴上标签谁进过哪个房间留下记录。真出了问题翻记录就知道从哪把钥匙开始查。9. 权限管理常用命令速查与避坑清单最后把这一篇涉及到的命令整理成速查表方便日常查阅也顺便补充几个文中没单独展开的小技巧。用途命令示例创建用户并指定家目录、Shell、用户组useradd -m -d /home/deploy -s /bin/bash -U deploy修改用户的附加组usermod -aG dev deploy查看用户的UID/GID和组信息id deploy修改文件属主和属组chown deploy:dev file修改权限符号模式chmod ux,g-w,o-rwx file修改权限数字模式chmod 750 file递归修改目录权限chmod -R 750 /data/projectSUID/SGID/粘滞位chmod 4755 file/chmod 2770 dir/chmod 1777 dir设置ACL单用户授权setfacl -m u:alice:rw file查看文件完整ACLgetfacl file查看sudo可用命令sudo -l编辑sudoers配置sudo visudo检查路径各级权限namei -l /full/path/to/file排错的时候按照“先看用户和组、再看文件和目录权限、再看父目录权限、最后看ACL和特殊权限位”这个顺序来查定位效率会高很多。再补充几个容易被忽略的小经验用umask控制新文件默认权限。系统默认umask通常是022所以新建文件是644、目录是755。如果希望新文件默认对组可写可以设置umask 002但要注意这也会影响你创建的所有文件。脚本执行前设置umask能在源头避免不少权限隐患。tar备份时保留权限。打包和解包都加-p参数即tar czpf可以在还原时保留原始权限和属主。不加-p还原出来的文件权限会受当前umask影响可能导致服务启动或读取失败。不要在/home下的家目录里挂载服务数据。家目录权限默认700服务账户如果被配置到这里很容易因为交叉访问受限而出现启动异常。生产数据统一放/data或/var/lib下权限规划和维护都更清晰。权限管理这个东西看起来命令就那几个真正拉开差距的是对“为什么这么设计”的理解以及在真实场景里踩过坑之后的警觉。像chmod 777、随手chown -R、sudo给全量权限这些操作短期内都会觉得“省事”长期看都是在为故障和安全事件埋单。希望这篇能帮你建立起一套相对系统的权限管理视图在面试、运维排障或者给同事配置环境的时候少走一些弯路。
返回列表