第一部分:Linux权限管理
一、基本权限
linux权限机制采用UGO模式。其中 u(user)表示所属用户、g(group)表示所属组、o(other)表示除了所属用户、所属组之外的情况。
u、g、o 都有读(read)、写(write)、执行(excute) 三个权限,所以UGO模式是三类九种基本权限。
用命令 ls -l 可列出文件的权限,第一列输出明确了后面的输出(后面一列代表 ugo权限)。第一个字母对应的关系:
“-” 普通文件
“d” 目录
”l“ 符号链接
”c“ 字符设备
"b" 块设备
"s" 套接字
"p" 管道
修改文件或目录的所属用户: chown 文件名 | 目录名 用户
-R 该参数以递归的方式修改目录下所有文件的所属用户,参数可以敲 chown --help 查看。
修改文件或目录的所属组: chgrp 文件名 | 目录名 组名
-R 该参数以递归的方式修改目录下的所有文件的所属组。
命令chmod 用来修改文件或目录的权限: chmod -参数 模式 文件 | 目录
例子: 修改目录 log下所有文件的权限为700
chmod -R 700 log
注:700的来历是 u g o
rwx rwx rwx
111 000 000
关于 chmod 命令的权限模式除了数字表示,还可以是 u、g、o 、a 加 +、- 来表示。格式如下:u、g、o分别代表用户、属组和其他,a 就是
all ,可以代替ugo。 +、- 代表增加或删除对应的权限,r、w、x 代表三种权限,分别是读、写、执行。
例子:对于目录 log下的所有文件(已有权限是700)增加所属组(g)的读(r)、执行(x)权限。
chmod -R g+rx log
类似的命令可能还有很多,这里只是举几个最基本且常用的例子。很多命令用到时,再去查也可以。还可参考《鸟哥的Linux私房菜》。
二、特殊权限
Linux的3个特殊的权限,分别是setuid、setgid和stick bit。
setuid权限(S):只有用户可拥有,出现在执行权限(x)的位置。
setuid权限允许用户以其拥有者的权限来执行可执行文件,即使这个可执行文件是由其他用户运行的。
setgid权限(S):对应于用户组,出现在执行权限(x)的位置。
setgid权限允许以同该目录拥有者所在组相同的有效组权限来允许可执行文件。但是这个组和实际发起命令的用户组
不一定相同。
stick bit (t /T):又名粘滞位,只有目录才有的权限,出现在其他用户权限(o)中的执行位置(x)。当一个目录设置了粘滞位,只有
创建了该目录的用户才能删除目录中的文件,但是其他用户组和其他用户也有写权限。使用 t 或 T来表示。若没有设置
执行权限,但是设置了粘滞位,使用 t;若同时设置了执行权限和粘滞位使用 T。典型的粘滞位使用是 /tmp 目录,
粘滞位属于一种写保护。
设置特殊权限:
setuid: chmod u+s filename
setgid: chmod g+s directoryname
stick bit: chmod o+t directoryname
用数字表示特殊权限,是在基本权限之上的。浊嘴笨腮说不清楚,看例子:
例子:将上面例子中的log日志目录(已有权限 700)权限设置为755。特殊权限是类似 /tmp目录的 stick bit有效。
特殊权限 基本权限
setuid setgid stick bit user group other
0 0 1 rwx rwx rwx
111 000 000
所以,设置特殊权限(stick bit)的命令应该是:chmod 1755 log
设置特殊权限后,ls -dl 查看该目录:drwxr-xr-t 2 gg gg 4096 5月 11 19:05 log ( 注意 other 的 x 位是代表特殊权限的字母 t )
取消该特殊权限的命令:chmod 755 log 。如此 stick bit的权限就没有了。
再次 ls -dl 查看该目录: drwxr-xr-x 2 gg gg 4096 5月 11 19:15 log ( 注意最后一位已经变为代表普通权限的字母x )
需要注意的是,最前面一位 ”1“ 就是特殊权限位。其他两个特殊权限的设置也类似。setuid使用不是无限制的。出于安全目的,只能应用在
Linux ELF格式二进制文件上,而不能用于脚本文件。
三、高级权限
ACL(Access Control List),访问控制列表是Linux下的的高级权限机制,可实现对文件、目录的灵活权限控制。ACL 允许针对不同用户、
不同组对同一个目标文件、目录进行权限设置,而不受UGO限制。
在一个文件系统上使用ACL需要在挂载文件系统的时候打开ACL功能。而根分区(ROOT)默认挂载的时候支持ACL。
命令:mount -o acl /挂载路径
例子:mount -o acl /dev/sdb1 /mnt
查看一个文件的ACL设置的命令: getfacl file
(针对一个用户)为一个文件设置指定用户的权限的命令: setfacl -m u:username:rwx filename
(针对一个组)为一个文件设置指定组的权限的命令: setfacl -m g:groupname:r-x filename
删除一个ACL设置的命令: setfacl -x u:username filename
第二部分:用户与用户组
---- 涉及用户及用户组的几个配置文件( 参照Ubuntu 12.04 )
/etc/passwd:保存用户信息,默认权限是644。
/etc/group:保存用户组信息,默认权限是644。
/etc/shadow:保存用户信息(与/etc/passwd一起保存用户全部信息,/etc/shadow中包含加密后的用户密码),默认权限是640。
/etc/gshadow:保存用户组信息,默认权限是640。
格式及各个字段的含义:
1. /etc/passwd
例子:通过grep woo /etc/passwd 命令得到的 woo用户信息: woo:x:1000:1000:woo.User,,,,:/home/woo:/bin/bash
格式及含义:
登陆名(woo):密码(x):用户的uid(1000):用户的gid(1000):全名(woo.User):家目录(/home/woo):使用的shell(/bin/bash)
注:系统ROOT用户的uid、gid都是0。当修改了/etc/passwd后,可以用 pwconv 命令从/etc/passwd 同步用户至 /etc/shadow。
2. /etc/group
例子:dcmtk用户组信息:dcmtk:x:125:gg
格式及含义:
组名(dcmtk):组密码(x):gid(125):该组的用户列表(gg)
注:系统会预留一些uid。在Ubuntu中,新建用户组的gid是从1000开始的。uid也是从1000开始。
预留的uid、gid资源分配给系统的伪用户、伪用户组。这些伪用户是不能登陆的,而只是为了
用他们完成或执行某些系统任务(这种设计和windows是类似的)。
当修改了/etc/group后,可以用grpconv命令从/etc/group同步用户至/etc/gshadow。
3. /etc/shadow
例子:gg:$1$0KWXx:14765:0:99999:7:::
格式及含义:
用户名(gg):密码($1$0KWXx):上次修改口令的时间(14765):两次修改口令间隔最多的天数(0):两次修改口令间隔的天数(99999):
提前多少天警告用户口令将过期(7):在口令过期后多少天禁用此用户():用户过期日期():保留字段()
4. /etc/gshadow
例子:MySQL组的信息:mysql:!::gg
格式及含义:
用户组名称(mysql):用户组密码(!):用户组管理者列表():组成员列表(gg)
补充:可以通过chattr命令设置/etc/passwd 、 /etc/group文件的属性。具体如下:
chattr 命令语法:chattr [-RV] [-v version] [mode] file|directory
最重要的mode部分: +-=[ASacDdIijsTtu]
其中,最常用的参数是:i (设置文件不可修改)、a(设置文件只能以追加方式修改)
但是,chattr命令不能设置/、/dev、/tmp、/var目录。
修订:
1. 2014年4月6日 修正了关于特殊权限的部分知识及相关理解。
2. 错误修正:chmod -R g+r log chmod -R g+rx log 红色标注的命令针对权限为700的log目录来说是无效的。对于目录来说读权限(r)
是与执行权限(x)一起设置的。即:目录的执行权限是指用户是否可以进入目录。而目录的读权限(r)是指浏览目录的权限(查看目录的内容)。
参考:
注:
写博客的好处:一方面是对知识做梳理。文章写完,对这部分知识的理解也清晰很多。另一方面,集思广益,多多讨论。通过讨论,保证自己对于知识的
理解是正确的、深刻的,同时也可以参考别人好的学习方法,不断提升自己。