linux权限:Linux的权限和所有权模型




  个用户、个组
  
  我们来看看 Linux 权限和所有权模型我们已经看到每个文件属于个用户和个组这正是 Linux 中权限模型核心您可以在 ls -l 清单中查看用户和组:
  
  $ ls -l /bin/bash
  
  -rwxr-xr-x  1 root   wheel   430540 Dec 23 18:27 /bin/bash在这个特殊举例中/bin/bash 可执行文件属于 root 用户并且在 wheel 组中Linux 权限模型通过允许给每个文件系统对象设置 3种独立权限级别来工作 — 它们为文件所有者、文件组以及所有其他用户
  
  理解“ls -l”
  
  我们来看看我们 ls -l 输出检查下这个清单栏:
  
  $ ls -l /bin/bash-rwxr-xr-x  1 root   wheel   430540 Dec 23 18:27 /bin/bash第个字段 -rwxr-xr-x 包含该特殊文件权限符号表示该字段中(-)指定该文件类型本例中它是个常规文件其它可能还有:
  
  “d”目录“l”符号链接“c”专门设备文件“b”块专门设备文件“p”先进先出“s”套接字 3个 3元组$ ls -l /bin/bash-rwxr-xr-x  1 root   wheel   430540 Dec 23 18:27 /bin/bash该字段其余部分由 3个 3元组组成个 3元组代表文件所有者权限第 2个代表文件权限第 3个代表所有其他用户权限:
  
  "rwx""r-x""r-x"上面r 表示允许读(查看文件中数据)w 表示允许写(修改文件以及删除)x 表示允许“执行”(运行)将所有这些信息放在我们可以发现每个人都能够读该文件内容和执行该文件但是只允许文件所有者(root 用户)可以以任何方式修改该文件因此虽然般用户可以复制该文件但是只允许 root 用户更新或删除它
  
  我是谁?在我们看怎样改变文件用户所有权和组所有权的前我们首先来看看怎样得知您当前用户标识和组成员资格除非最近您使用过 su 命令否则您当前用户标识是您用来登录系统用户标识但是如果您经常使用 su您可能不记得您当前有效用户标识要查看用户标识输入 whoami:# whoamiroot# su drobbins$ whoamidrobbins我在哪组?要看看您属于哪使用 group 命令:$ groupsdrobbins wheel audio在上面举例中我是 drobbins、wheel 和 audio 组成员如果您想看看其他用户在什么组指定他们用户名作为参数:
  
  $ groups root daemonroot : root bin daemon sys adm disk wheel floppy dialout tape videodaemon : daemon bin adm改变用户和组所有权为了改变文件或其它文件系统对象所有者或组分别使用 chown 或 chgrp这两个命令都要个用户名或组名作参数后面跟上个或多个文件名
  
  # chown root /etc/passwd# chgrp wheel /etc/passwd您还可以用 chown 命令种形式同时设置所有者和组:
  
  # chown root.wheel /etc/passwd除非您是超级用户否则您不可以使用 chown然而任何人都可以使用 chgrp 来将文件组所有权改为他们所属
  
  递归所有权改变chown 和 chgrp 都有个 -R 选项该选项可以用来告诉它们递归地将所属权和组改变应用到整个目录树中例如:# chown -R drobbins /home/drobbins介绍 chmodchown 和 chgrp 可以用来改变文件系统对象所有者和组而另 — 叫做 chmod — 用来改变我们可以在 ls -l 清单中看到 rwx 权限chmod 带有两个或多个参数:“mode”描述怎样改变权限后面跟将会受到影响文件或文件列表:$ chmod +x scriptfile.sh在上面举例中我们“mode”是 +x您可能会猜到+x 模式告诉 chmod使该特殊文件对于用户、组以及其它任何人都是可执行如果我们想要除去个文件所有执行权限我们应该这样做: $ chmod -x scriptfile.sh用户/组/其他粒度到此我们 chmod 举例已经影响到了所有 3个 3元组 — 用户、组和所有其他用户通常次只修改个或两个 3元组很方便要这样做只需要在 + 或 - 符号的前给您想要修改特定 3元组指定符号对于“用户” 3元组使用 u对于“组” 3元组使用 g对于“其他/每个人”使用 o:$ chmod go-w scriptfile.sh我们刚除去了组和所有其他用户写权限而保留“所有者”权限不动 重新设置权限除了交替打开和关闭权限位以外我们还可以起重新设置它们通过使用 = 操作符我们可以告诉 chmod 我们要指定权限和取消别权限:$ chmod =rx scriptfile.sh上面我们只设置了所有“read”和“execute”位没有设置所有“write”位如果您仅仅想重新设置特定 3元组您可以像下面这样在 = 的前指定该 3元组符号名:
  
  $ chmod u=rx scriptfile.sh
  
  数字模式
  
  直到现在为止我们使用了叫做“符号”模式来用 chmod 指定权限改变然而指定权限还有种普遍使用思路方法 — 使用 4 位 8进制数使用叫做数字权限语法语法位代表个权限 3元组例如在 1777 中777 设置本章我们所讨论“owner”、“group”和“other”标志1 用来设置专门权限位我们将在本章结束部分讲到这个图表介绍说明了怎样解释第 2到 4位(777):
  
  模式 数字
  rwx 7
  rw- 6
  r-x 5
  r-- 4
  -wx 3
  -w- 2
  --x 1
  --- 0
  
  数字权限语法
  
  当您需要给个文件指定所有权限时数字权限语法特别有用比如在下面举例中:
  
  $ chmod 0755 scriptfile.sh
  
  $ ls -l scriptfile.sh
  
  -rwxr-xr-x  1 drobbins drobbins    0 Jan 9 17:44 scriptfile.sh
  
  在该举例中我们使用了 0755 模式它展开为个完整权限设置“-rwxr-xr-x”
  
  Umask
  
  当进程创建了新文件时它指定新文件应该具有权限通常所请求模式是 0666(每个人可读和可写)它比我们希望具有更多权限幸运不管什么时候创建了新文件Linux 将参考叫做“umask”东西系统用 umask 值来将指定权限降低为更合理、更权限您可以通过在命令行中输入 umask 来查看您当前 umask 设置:
  
  $ umask
  
  0022
  
  Linux 系统上umask 缺省值般为 0022它允许其他人读您新文件(如果他们可以得到它们)但是不能进行修改为了在缺省情况下使新文件更您可以改变 umask 设置: $ umask 0077umask 将确保组和其他用户对于新创建文件绝对没有任何权限那么umask 怎样工作呢?和文件“常规”权限区别umask 指定应该关闭哪个权限我们来参阅下我们“模式到数字”映射表从而使我们可以理解 0077 umask 意思是什么: 模式 数字 rwx 7 rw- 6 r-x 5 r-- 4 -wx 3 -w- 2 --x 1 --- 0 使用该表0077 最后 3位扩展为 ---rwxrwx现在请记住 umask 告诉系统禁用哪个权限根据推断我们可以看到将关闭所有“组”和“其他”权限而“用户”权限将保留不动
  
  介绍 suid 和 sgid
  
  当您最初登录时将启动个新 shell 进程您已经知道但是您可能还不知道这个新 shell进程(通常是 bash)使用您用户标识运行照这样bash 可以访问所有属于您文件和目录事实上作为用户我们完全依靠其它来代表我们执行操作您启动继承了您用户标识因此它们不能访问任何不允许您访问文件系统对象
  
  例如般用户不能直接修改 passwd 文件“write”标志已经对除“root 用户”以外每个用户关闭:
  
  $ ls -l /etc/passwd
  
  -rw-r--r--  1 root   wheel    1355 Nov 1 21:16 /etc/passwd
  
  但是般用户确实需要在他们需要改变其密码任何时候能够修改 /etc/passwd(至少间接地)但是如果用户不能修改该文件究竟怎样完成这个工作呢?
  
  Suid
  
  幸好Linux 权限模型有两个专门叫做“suid”和“sgid”当设置了个可执行“suid”这位时它将代表可执行文件所有者运行而不是代表启动人运行现在回到 /etc/passwd 问题如果看看 passwd 可执行文件我们可以看到它属于 root 用户:
  
  $ ls -l /usr/bin/passwd
  
  -rwsr-xr-x  1 root   wheel    17588 Sep 24 00:53 /usr/bin/passwd
  
  您还将注意到这里有个 s 取替了用户权限 3元组中个 x这表明对于这个特殊设置了 suid 和可执行位由于这个原因当 passwd 运行时它将代表 root 用户执行(具有完全超级用户访问权)而不是代表运行它用户运行 passwd 以 root 用户访问权运行所以能够修改 /etc/passwd 文件而没有什么问题
  
  suid/sgid 告诫介绍说明
  
  我们看到了 suid 怎样工作sgid 以同样方式工作它允许继承组所有权而不是当前用户所有权这里有些有关 suid 和 sgid 其它但是很重要信息首先suid 和 sgid 占据和 ls -l 清单中 x 位相同空间如果还设置了 x 位则相应位表示为 s(小写)但是如果没有设置 x 位它将表示为 S(大写)个很重要提示:在许多环境中suid 和 suid 很管用但是不恰当地使用这些位可能使系统安全遭到破坏最好尽可能地少用“suid”passwd 命令是为数不多必须使用“suid”命令的
  
  改变 suid 和 sgid
  
  设置和除去 suid 和 sgid 位相当简单这里我们设置 suid 位:
  
  # chmod u+s /usr/bin/myapp
  
  此处我们从个目录除去 sgid 位我们将看到 sgid 位怎样影响下面几屏中目录:
  
  # chmod g-s /home/drobbins
  
  权限和目到此为止我们从常规文件角度来看权限当从目录角度看权限时情况有点区别目录使用同样权限标志但是它们被解释为表示略微区别含义 对于个目录如果设置了“read”标志您可以列出目录内容;“write”表示您可以在目录中创建文件“execute”表示您可以进入该目录并访问内部任何子目录没有“execute”标志目录内文件系统对象是不可访问没有“read”标志目录内文件系统对象是不可查看但是只要有人知道磁盘上对象完整路径就仍然可以访问目录内对象目录和 sgid如果启用了目录“sgid”标志在目录内创建任何文件系统对象将继承目录当您需要创建个属于同组人使用目录树时这种特殊功能很管用只需要这样做:
  
  # mkdir /home/groupspace
  
  # chgrp mygroup /home/groupspace
  
  # chmod g+s /home/groupspace
  
  现在mygroup 组中所有用户都可以在 /home/groupspace 内创建文件或目录同样他们也将自动地分配到 mygroup 组所有权根据用户 umask 设置新文件系统对象对于 mygroup 组其他成员来说可以或不可以是可读、可写或可执行目录和删除缺省情况下Linux 目录以种不是在所有情况下都很理想方式表现般来说只要对个目录有写访问权任何人都可以重命名或删除该目录中文件对于个别用户使用目录这种行为是很合理但是对于很多用户使用目录来说尤其是 /tmp 和 /var/tmp这种行为可能会产生麻烦任何人都可以写这些目录任何人都可以删除或重命名任何其他人文件 — 即使是不属于他们!显然当任何其他用户在任何时候都可以输入“rm -rf /tmp/*”并损坏每个人文件时很难把 /tmp 用于任何有意义文件所幸Linux 有叫做“粘滞位”(sticky bit)东西当给 /tmp 设置了粘滞位(用 chmod +t)能够删除或重命名 /tmp 中文件是该目录所有者(通常是 root 用户)、文件所有者或 root 用户事实上所有 Linux 分发包都缺省地启用了 /tmp 粘滞位而您还可以发现粘滞位在其它情况下也很管用难以理解位整理总结本章我们最后来看看数字模式难以理解位数您可以看到这个第位数用来设置 sticky、suid 和 sgid 位:
  
  suid sgid sticky 模式数字 on on on 7 on on off 6 on off on 5 on off off 4 off on on 3 off on off 2 off off on 1 off off off 0
  
  这里有个怎样用 4 位数字模式来设置个目录权限举例该目录将由个工作组使用: # chmod 1775 /home/groupfiles请想想 1755 数字模式权限设置含义
Tags:  linux用户权限 linux修改文件权限 linux文件权限 linux权限

延伸阅读

最新评论

发表评论