一、命令介绍:
1、chmod 命令用来修改文件、目录的权限,系通都会设置umask,所以创建了目录、文件后我们都要按需修改目录、文件的权限。命令属性格式如下:
1)、使用字符的格式来修改:
参数意义:
(1)、u: (user)目录、文件的属主(拥有者) g: (group)目录、文件的属组(目录、文件所属的同组用户) o:(other)其他用户
(2)、a: (all)在权限中没有a 这个 但在命令中 a 就代表了这三个
(3)、+ 就是给指定的属性(ugoa) 添加 rwx 权限中的一个或两个或全部,- 就刚好相反了,从指定的属性中去掉某些权限,= 就是直接给指定的属性赋值权限。
(4)、rwx 权限: r 可读 权限,如果某个目录只有可读权限,则我们只能查看目录下的文件,而不能再这个目录下创建文件。如果木有rw (可读,可写) 权限则不仅可以查看文件而且可以在这个目录下常见文件。
(5)、新创建的目录、文件默认的权限会因用户的不同而不同,一般root 用户的 umask值为 022(0022) 而普通用户的umask 值为002(0002) umaks 代表的意思之后再说。
2)、使用八进制数来修改修改目录、文件的权限。
(1)、 rwx 分别对应的数据值为: 4、2、1
(2)、如果某个属性有 可读可写可执行的权限(rwx) 则用数字表示就是: 7 所以可以按照下面的格式来修改目录、文件的权限
chmod 777 文件、目录 (rwx 421 ,777是这样来的) , chmod 755 文件、目录(rwx,rx,rx),有没有感觉这种方式很方便啊哈哈……
2、当你建立了一个文档,但将要不这个文档给别人,你就要修改这个文档的属主,那就是chown 命令来修改指定文档的属主
1)、命令格式:chown [选项]... [所有者][:[组]] 文件
2)、命令功能:通过chown改变文件的拥有者和群组。在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。
3)、实例:
chown user user.Java 将user.java这个文件的属主修改为user
chown -R user users 将users 目录及其在目录的属主都改为user (-R 关键字)
chown user: user.java 将user.java 的属主和属组都改成了user (注意: user: 是连着的中间没有空格)
3、chgrp 命令和chown 是一样的,chown 是修改属主,而chgrp 是修改属组
1)、命令格式:chgrp [选项] [组] [文件]
2)、命令功能:chgrp命令可采用群组名称或群组识别码的方式改变文件或目录的所属群组。使用权限是超级用户。
3)、命令参数:
必要参数:
-c 当发生改变时输出调试信息
-f 不显示错误信息
-R 处理指定目录以及其子目录下的所有文件
-v 运行时显示详细的处理信息
--dereference 作用于符号链接的指向,而不是符号链接本身
--no-dereference 作用于符号链接本身
4)、实例:
[root@localhost test]# chgrp -R bin test6 // 这种方式按照组名来修改
[root@localhost test]# chgrp -R 100 tes // 按照群组识别码也就是 gid 来修改
4、umask 一个不经常操作的命令
umask 这个命令其实我们在平时中操作的不多,因为他的值是在etc/profile 中设置,umask 和chomd 刚好相反 chmod 就是给这个目录、文档添加什么权限而umask就是从这个文档 ,目录中去掉什么样的权限。
1)umask 值的计算,对于文件来说umask最大的值允许为6 而对目录来说最大的值为7 (rwx 421),为什么文本文件中umask的最大值为6 也就是文件中默认没有’x‘权限,系统规定你创建一个文本文件不能直接给他赋予‘x’的权限只能通过chmod 来修改权限添加权限。
2)通过umask 这个命令我们就可以查看umask 的值是多少,也可以直接到 /etc/profile 中查看umask的值是多少。一般umask的值都是 0002 或0022 (002、022)四位的有sudi和sgid 的值如果是三位的话就是rwx 。
3)我们知道了umask的值 那我们怎么知道 新创建的文本文档和目录有什么样的权限那:
如果是文本文档则他的最大值为666,最大为666 是因为系统对新建的文本文档不会赋予‘x’ 可执行权限所以只有rw 的权限所以最大为6 而如果查询到的umask的值为002 则新文件的权限值为: 666-002=664 (rw rw r)
目录的最大值为777 如果查询到的umask 为002 则新建的目录拥有 777-002= 775(rwx rwx rx)的权限
小结: umask 的值一般在 /etc/profile 中设置 而且umask的值是从这个目录文档中去掉的值。 系统新建的文本文件权限最大值为666 对于文本文件系统默认去掉了可执行权限(“X”)所以新建的文本文件的权限是 666-umask的值获得的值。而如果是目录则最大值为777 所以新建的目录的权限就是 777-umask之后的值就是新建目录的权限。
可以使用umask 查看umask 的值,是按照数值来展示的而 umask -S 是按照 u g o 字符来展示的。
5、uid 、gid 、suid、sgid
1)、这两个值可以通过id 命令查找到,也就是你的实际id,每个用户登录都会有一个实际id ,也就是标记你是谁 。但同样还有连个值就是euid 和egid 即用户的有效id 来判断这个用户对访问的文档 目录的权限 ,在不设置sudi sgid(set uid set gid )的情况下euid=uid, egid=gid.,有效id等于实际id
2)、在之前的umask 中提到过如果用umask命令查看,就会看到有四位数字,所以第四位就是设置的uid gid的值。
3)、suid 设置使文件在执行阶段具有文件所有者权限,典型的文件是 /etc/password ,如果一般用户执行该文件,则在执行过程中,该文件可以获得root权限,从而可以更改用户的密码。
4)、sgid 的设置,该权限的设置只对目录有效,目录被设置该位后任何用户在此目录下创建的文件都具有和该目录所属组相同的组。
5)、在设置suid和sgid的时候我们的目录文档要有可执行权限,不然的话即使是设置了也不起作用,这时候你看到的是S 而不是小写的s。
二、SUID SGID命令格式以及设置
SUID 是 Set User ID, SGID 是 Set Group ID的意思。
UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
第9位表示文件类型,可以为p、d、l、s、c、b和-:
p表示命名管道文件
d表示目录文件
l表示符号连接文件
-表示普通文件
s表示socket文件
c表示字符设备文件
b表示块设备文件
第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:
r表示可读,可以读出文件的内容
w表示可写,可以修改文件的内容
x表示可执行,可运行这个程序
没有权限的位置用-表示
例子:
ls -l myfile显示为:
-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile
表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。
所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。
如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:
1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置
2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置
3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置
4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被社
其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是
1,表示有相应的权限:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。
11 10 9 8 7 6 5 4 3 2 1 0
上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0
给文件加SUID和SUID的命令如下:
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
chmod g+s filename 设置SGID位
chmod g-s filename 去掉SGID设置
chmod o+t filename设置sticky bit 位
chmod o-t filename 去掉sticky bit位
另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也很简单。
chmod 7755 (设置了 suid ,sgid ,sticky)
chmod6755(设置了suid ,sgid)
chmod 5755 (设置了 suid 和sticky)
chmod 3755(设置了sgid 和sticky)
三、SUID和SGID的详细解析
由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。
首先讲普通文件的SUID和SGID的作用。例子:
如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。
除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。
一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。
如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。
SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。
SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。
下面讨论一个例子:
UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:cr--r----- 1 root system 2, 1 May 25 1998 kmem
但ps等程序要读这个文件,而ps的权限设置如下:
-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps
这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置SUID来访问kmem,但大家注意了,bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话。下面来说明一下SGID对目录的影响。SUID对目录没有影响。如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。
四、sticky bit设置,其实这个位的设置在前面提到过,现在我们来简单的说说sticky bit的作用
1、sticky bit 可以理解为删除位,一个文件是否可以被某个用户删除取决于文件所属组是否对该用户具有写权限,如果没有写权限则这个目录下的所有文件都不能被删除,也不能添加新文件。如果用户希望能够添加文件,但同时不能删除文件,则可以对文件的sticky bit位进行设置,设置该位后,就算用户对目录具有写权限,也不能删除该文件。
总结:通过以上的学习发现suid sgid sticky bit 就是权限管理的一种补充,使得权限管理更加灵活,当同事suid sgid 的设置带来了一定的安全风险。
(责任编辑:IT) |