【Linux】Linux权限管理详解

【Linux】Linux权限管理详解 前言Linux 是一个多用户操作系统。同一台机器上可以同时存在很多用户每个用户又可能属于不同的用户组。如果所有人都能随意读取、修改和删除彼此的文件系统中的数据就很难得到保护。因此当一个进程准备访问文件或目录时Linux 会结合当前进程的身份、目标文件的所有者和所属组以及对应的权限位判断这次操作是否允许。本文主要介绍root与普通用户的区别以及su、sudo的基本使用文件所有者、所属组和其他用户三种访问者身份ls -l中的文件类型与九个权限位r、w、x对普通文件和目录的不同含义使用字符方式和八进制方式理解权限使用chmod、chown、chgrp修改权限与归属umask如何影响新建文件和目录共享可写目录为什么需要粘滞位。Linux 权限并不只是记住几个命令更重要的是弄清楚谁以什么身份对什么对象准备进行什么操作。一、Linux 中的用户身份1. root 与普通用户Linux 中常见的用户可以先分成两类超级用户root拥有最高级别的系统管理权限通常能够绕过普通的自主访问控制普通用户只能在系统授予的范围内进行操作。在很多终端环境中root的命令提示符通常以#结尾普通用户通常以$结尾[roothost ~]#[alicehost ~]$不过提示符可以被修改所以不能只靠#或$判断当前身份。更可靠的方式是使用whoamiidgroups它们分别可以查看当前用户名、用户与组 ID以及当前用户加入的用户组。root权限很高但并不意味着任何时候都应该使用root。错误地执行删除、覆盖或权限修改命令时高权限反而会让误操作造成更大影响。平时优先使用普通用户在确实需要管理权限时再进行提权更加安全。2. 使用 su 切换用户su用于切换当前用户身份su用户名例如切换到用户alicesualice如果希望同时切换到目标用户的登录环境一般使用su- alice两种写法的区别可以简单理解为su alice主要切换用户身份当前目录和部分环境可能继续保留su - alice按照一次完整登录来切换进入目标用户的家目录并加载其登录环境。普通用户切换到其他用户时通常需要输入目标用户的密码root切换到普通用户时通常不需要。操作完成后可以使用exit返回原来的 shellexit二、文件访问者的三种分类一个文件或目录的九个基本权限位会按照三个字符一组分成三组简写英文含义uuser / owner文件或目录的所有者ggroup文件或目录所属组中的用户oothers既不是所有者也不属于匹配所属组的其他用户aall在修改权限时表示u、g、o全部用户这里要区分两个容易混淆的概念用户是谁由用户 ID 表示文件属于哪个用户、哪个组由文件的所有者和所属组记录。在只考虑传统u/g/o权限位暂时不考虑 POSIX ACL、SELinux 等附加机制时系统会按照下面的顺序匹配权限类别如果进程的有效用户 ID 与文件所有者相同就使用u权限否则如果文件的组 ID 与进程的有效组 ID 或任一附加组 ID 匹配就使用g权限前两项都不满足时才使用o权限。需要注意三组权限并不会相加。例如某文件权限为----rwx---假设文件所有者正是当前用户那么系统会直接选择所有者的第一组---不会因为当前用户同时属于文件所属组就再把组权限rwx加过来。三、使用 ls -l 查看文件属性使用ls -l可以查看文件和目录的详细信息ls-l可能得到-rwxr-xr-x 1 root root 8360 Jul 16 15:44 hello -rw-r--r-- 1 root root 75 Jul 16 15:43 hello.c以第一行为例-rwxr-xr-x 1 root root 8360 Jul 16 15:44 hello │└─┬─┘└─┬─┘└─┬─┘ │ │ │ │ │ │ │ │ │ │ │ │ │ └── 文件名 │ │ │ │ │ │ │ └────────── 时间信息 │ │ │ │ │ │ └─────────────── 文件大小 │ │ │ │ │ └──────────────────── 所属组 │ │ │ │ └─────────────────────── 所有者 │ │ │ └─────────────────────────── 其他用户权限 │ │ └──────────────────────────────── 所属组权限 │ └───────────────────────────────────── 所有者权限 └──────────────────────────────────────── 文件类型最前面的十个字符最值得关注- rwx r-x r-x │ │ │ └── other │ │ └────── group │ └────────── owner └───────────── 文件类型1. 第一个字符表示文件类型Linux 中常见的文件类型标志如下字符文件类型-普通文件d目录l符号链接b块设备文件例如磁盘设备c字符设备文件例如终端设备p管道文件s套接字文件所以权限字符串开头的-并不是“没有权限”它表示这是一个普通文件。2. 后九个字符表示基本权限后九位按照owner、group、other分成三组每组都按照rwx的固定顺序排列rwx rwx rwx u g o如果某个位置显示-表示没有对应权限。例如rw-r-----可以拆成rw- r-- --- u g o含义是所有者可读可写所属组只读其他用户没有权限。四、r、w、x 的真正含义r、w、x分别来自read、write、execute。但是同一个权限作用在普通文件和目录上时含义并不相同。1. 普通文件的 rwx对于普通文件r允许读取文件内容w允许修改文件内容x允许把文件作为程序执行。需要注意拥有x权限只代表系统允许尝试执行。文件本身还必须是有效的可执行程序或者是带有正确解释器声明的脚本否则仍然不能正常运行。2. 目录的 rwx对于目录r允许读取目录项也就是列出目录中保存了哪些名字w允许修改目录项例如创建、删除和重命名文件x允许搜索、进入和穿过目录并访问已知名称的目录项。目录的x权限非常重要。没有x时即使具有r也可能只能看到目录项名称却无法正常取得其中对象的详细信息更不能顺利进入目录。可以将几种常见组合简单理解为目录权限常见表现r-x可以列出目录内容也可以进入并访问其中的对象--x不能列出所有名字但知道准确路径时可能访问对应对象r--可以读取目录项名称但无法正常进入、搜索目录-wx不能列出全部名字但可能创建、删除或重命名已知目录项实际访问还会受到父目录权限、目标文件自身权限以及其他安全机制的共同影响。3. 为什么没有文件写权限也可能删除文件删除文件本质上是在父目录中删除一个目录项。因此能否删除某个文件主要检查父目录是否允许修改而不是只看文件自身有没有w。假设用户对目录拥有w和x那么即使某个文件本身是只读的该用户仍可能删除这个文件。文件自身的w主要决定能否修改文件内容并不直接决定能否从父目录中移除它的名字。这也是后面共享目录需要引入粘滞位的重要原因。五、字符权限与八进制权限1. rwx 对应的数字每个权限字符都可以使用一个数字表示r 4 w 2 x 1同一组中具有什么权限就把相应数字相加字符权限计算数字rwx4 2 17rw-4 26r-x4 15r--44---00例如rwxr-xr--分组计算为rwx r-x r-- 7 5 4因此它可以写成八进制权限754。2. 常见权限值权限值字符形式常见含义600rw-------只有所有者可读写640rw-r-----所有者可读写所属组只读644rw-r--r--所有者可读写其他人只读700rwx------只有所有者拥有全部权限755rwxr-xr-x所有者全部权限其他人可读可执行777rwxrwxrwx所有人都拥有全部基本权限777虽然看起来最省事但它往往把权限开放得过大。遇到“Permission denied”时不应该直接把所有对象都改成777而是先判断真正缺少的是哪一类用户的哪一项权限。六、使用 chmod 修改权限chmod用于修改文件或目录的权限chmod权限 文件或目录只有文件所有者或具有相应特权的进程才能修改权限。1. 使用字符方式修改字符方式的一般结构为用户类别 操作符 权限字符 u/g/o/a /-/ r/w/x其中增加指定权限-移除指定权限把该类别直接设置为给出的权限未写出的权限会被清除。常见例子# 给所有者增加执行权限chmodux script.sh# 移除所属组的写权限chmodg-w data.txt# 让其他用户只拥有读权限chmodor data.txt# 给所有用户增加读权限chmodar readme.txt与不同。例如chmodaxfile它不是“给所有人增加执行权限”而是把所有人的权限都设置成只有x原有的r和w会被清除。如果只是增加执行权限应写成chmodaxfile2. 使用八进制方式修改chmod664data.txtchmod640secret.txtchmod755script.shchmod700private_dir三位数字从左到右依次对应owner、group、other。执行后可以使用ls -l验证ls-ldata.txt3. 递归修改chmod -R可以递归修改目录以及其中对象的权限chmod-R755some_dir不过递归修改要格外谨慎。普通文件和目录对x的需求并不相同直接把整个目录树统一改成755可能让原本不应该执行的普通文件全部得到执行位。修改前应先确认范围和目标权限。七、修改所有者和所属组权限位决定“能做什么”所有者和所属组决定“使用哪一组权限”。它们是两个不同层面的问题。1. chown 修改所有者chown新所有者 文件名例如chownalice report.txt也可以同时修改所有者与所属组chownalice:developers report.txt递归修改目录树时使用-Rchown-Ralice:developers project_dir在 Linux 中把文件所有权转交给另一个用户通常需要管理员权限。2. chgrp 修改所属组chgrp新组名 文件名例如chgrpdevelopers report.txt递归修改chgrp-Rdevelopers project_dir普通用户作为文件所有者时通常只能把文件所属组改为自己所属的组如果要改成任意其他组就需要相应特权。具体结果还可能受到文件系统和安全策略限制。修改后可以再次使用ls -l查看所有者和所属组字段。3. 不要混淆 chmod、chown 和 chgrp命令修改内容chmodrwx权限位chown文件或目录的所有者也可同时修改所属组chgrp文件或目录的所属组如果问题是用户被分到了other类别只修改rwx不一定是最合理的办法有时真正应该调整的是文件所属组或者把用户加入合适的用户组。八、umask新建对象的权限掩码1. umask 的作用umask用于查看或设置当前 shell 的文件创建掩码umask常见输出为0022创建普通文件和目录时程序会先提出一个基础权限请求再由umask屏蔽其中的部分权限位。常见情况下普通文件的基础权限0666 目录的基础权限 0777最终权限按照位运算理解为实际权限 基础权限 ~umask当umask为0022时普通文件0666 ~0022 0644 - rw-r--r-- 目录 0777 ~0022 0755 - rwxr-xr-x普通文件的基础权限通常不带x是为了避免一个刚创建的普通文件默认就能被执行。需要执行脚本或程序时再通过chmod明确添加执行权限。2. umask 不是简单减法有时基础权限 - umask恰好能得到相同结果但这不是正确的一般规则。umask的本质是屏蔽对应的权限位应按照mode ~umask来理解。3. 设置 umask# 当前 shell 中设置为 0027umask0027此时常见结果为新建普通文件0640 - rw-r----- 新建目录 0750 - rwxr-x---umask只影响之后新创建的文件和目录不会自动修改已经存在的对象。它是进程的文件创建掩码属性当前 shell 启动的子进程通常会继承这个值。不同系统、发行版、用户配置和具体程序可能使用不同的初始掩码或基础模式所以不要假设所有环境的默认值都完全相同。如果目录配置了默认 ACL最终权限还可能受到 ACL 影响本文的公式针对传统权限模型。九、目录权限为什么尤其重要1. 路径中的每一级目录都要能够穿过访问下面的文件/home/alice/project/data.txt系统不仅要检查data.txt还要逐级搜索/home、alice和project。如果路径中某一级目录缺少x权限即使最终文件本身是可读的也可能无法访问。因此遇到权限问题时不能只查看目标文件ls-ldata.txt还应该检查路径中的目录权限例如ls-ld/home /home/alice /home/alice/project2. ls -l 与 ls -ld 的区别ls-lsome_dir这会尝试列出some_dir中的内容。ls-ldsome_dir这会查看目录对象本身的详细属性而不是展开其内容。排查目录权限时ls -ld经常更加合适。3. 文件删除由父目录管理假设共享目录允许所有用户写入那么不同用户就可能删除彼此创建的文件。即使某个文件是-rw-------只要另一个用户对父目录拥有足够的w和x仍然可能移除这个目录项。对于真正需要多人写入的公共目录简单地把权限设置成777并不能阻止互相删除这时就需要粘滞位。十、共享目录与粘滞位1. 粘滞位解决什么问题粘滞位不会主动授予目录写权限。在调用者本来就拥有目录所需w和x权限的前提下它会进一步限制目录项的删除与重命名具有相应特权的用户目录所有者被删除或改名对象的所有者。其他普通用户即使能够在目录中创建自己的文件也不能随意删除别人的文件。2. 设置与查看粘滞位给目录增加粘滞位chmodt shared_dir也可以使用数字形式chmod1777shared_dir查看ls-ldshared_dir可能得到drwxrwxrwt 2 root root 4096 Jul 18 10:00 shared_dir最后一组执行位显示为小写t表示其他用户具有x同时目录设置了粘滞位。如果显示为大写T则表示设置了粘滞位但该位置原本没有x权限。系统中的/tmp就是常见例子ls-ld/tmp通常能够看到类似drwxrwxrwt的权限。需要注意粘滞位主要限制目录项的删除与重命名并不自动改变文件内容的读写权限。如果别人本来就对文件拥有w粘滞位不会因此禁止他修改文件内容。十一、su 与 sudo 的区别su和sudo都与身份和授权有关但用途不同命令主要作用su切换到另一个用户并继续使用新的 shellsudo按授权规则以指定用户身份执行某一条命令使用sudo执行管理命令sudocommand默认通常以root身份执行也可以指定用户sudo-ualicecommand是否能够使用sudo由系统的授权配置决定并不是所有普通用户都天然拥有该能力。如果确实需要管理sudoers应该使用visudo进行编辑和语法检查不建议直接使用普通编辑器随意修改该文件。错误的配置可能导致管理权限不可用。还要注意sudo是让某条命令以被授权的身份运行它本身不会永久改变目标文件的rwx权限。文件权限仍然由chmod等命令管理。十二、常见错误总结1. 认为三组权限会叠加系统会在owner、group、other中匹配一组使用而不是把三组权限合并。2. 认为目录有 r 就一定能进入目录的r主要用于读取目录项名称能否进入和穿过目录主要取决于x。3. 认为文件不可写就不能删除删除文件主要修改的是父目录。父目录的w、x以及粘滞位规则更加关键。4. 把权限全部开放成 777解决权限问题时直接使用chmod -R 777风险很高。应该先判断缺少的是哪个用户类别、哪一项权限并只开放实际需要的范围。5. 把 umask 理解成普通减法正确思路是屏蔽权限位实际权限 请求权限 ~umask6. 混淆 chmod 与 chownchmod修改权限位chown修改所有者chgrp修改所属组。权限位正确但归属不合理时应先检查所有者和所属组。十三、总结本文整理了 Linux 权限管理中的核心内容。Linux 会根据进程身份把访问者匹配为文件所有者、所属组用户或其他用户并只使用对应的一组rwx权限。使用ls -l时第一个字符表示文件类型后九位按照owner、group、other分成三组。对于普通文件r、w、x分别表示读取、修改和执行对于目录它们分别表示列出目录项、修改目录项和搜索穿过目录。目录权限直接影响路径访问、文件创建以及删除操作所以排查问题时不能只盯着目标文件。chmod可以使用字符方式或八进制方式修改权限chown和chgrp分别调整所有者和所属组。umask通过屏蔽权限位影响新创建的文件和目录但不会追溯修改已有对象。最后在多人可写的共享目录中单纯使用777会让用户可能删除彼此的文件。粘滞位可以在保留公共写入能力的同时限制目录项的删除和重命名。理解这些规则后再遇到Permission denied时就能从用户身份、权限类别、文件权限、目录权限和所有权几个方向逐步定位问题。完