一、chmod
Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。
文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。
有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。
每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。
如:
[root@sparktech ~]# ls -l /etc/passwd -rw-r--r--. 1 root root 1671 Apr 15 08:08 /etc/passwd
横线代表空,r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。
常见的文件类型有:b 块设备;c 字符设备;d 目录; - 普通文件;l 链接文件;s 套接字;p 管道
eg. :- rw- r--r-- 普通文件 文件属主 文件属组 其他用户
rw- r--r-- 是文件passwd的访问权限,属主是root,属组是root,属主有读写权限,属组有读权限,其他用户只有读权限。
确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。
chown
chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
1. 文字设定法
命令中各选项的含义为:
操作对象who可是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置所表示的权限可用下述字母的任意组合:
r 可读
w 可写
x 可执行
在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example
使同组和其他用户对文件example 有读权限。
2. 数字设定法
我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。
例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:
例子:
(1)文字设定法:
例1:
[root@sparktech ~]# chmod +x /etc/passwd [root@sparktech ~]# ls -l /etc/passwd -rwxr-xr-x. 1 root root 1671 Apr 15 08:08 /etc/passwd
例2:
[root@sparktech ~]# touch text [root@sparktech ~]# ls -l text -rw-r--r--. 1 root root 0 Apr 16 23:41 text [root@sparktech ~]# chmod u+x,g+w,o-r text [root@sparktech ~]# ls -l text -rwxrw----. 1 root root 0 Apr 16 23:41 text
属主u增加了执行权限,属组增加了写权限,其他用户去掉了可读权限
(2)数字设定法:
例1:
[root@sparktech ~]# chmod 644 text [root@sparktech ~]# ls -l text -rw-r--r--. 1 root root 0 Apr 16 23:41 text
设定text的权限,属主可读可写,属组可读,其他用户可读
例2:
[root@sparktech ~]# chmod 755 text [root@sparktech ~]# ls -l text -rwxr-xr-x. 1 root root 0 Apr 16 23:41 text
设置text的权限,属主可读可写可执行,属组可读可执行,其他用户可读可执行
二、特殊权限
我们登陆到系统之后,创建一个普通文件或者目录的时候,会有一个默认的权限。普通文件是644,目录文件是755,想必大家都知道这个是由umask这个值决定的。我们可以直接执行umask命令查看,linux系统默认的umask值是0022。想改变创建文件默认的权限,我们直接修改umask就可以,但是一般的权限都是通过777-022得到的默认权限位。022前面的这个0是什么呢?第一个0就是特殊权限位,下边我们就来跟大家说一下setuid、setgid和sticky这个三个特殊权限位。
1.suid, set uid
在一个程序或命令上添加setuid以后(u+s),这样属主有了s权限,意味着任何用户在执行此程序时,其进程的属主不再是发起者本人,而是这个程序的属主。最典型的一个例子就是passwd这个命令。
普通用户运执行passwd命令来修改自己的密码,其实最终更改的是/etc/passwd这个文件。
我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改。
[root@sparktech ~]# ls -l /etc/passwd -rw-r--r--. 1 root root 1671 Apr 15 08:08 /etc/passwd
按照常规的逻辑思维,普通用户是修改不了/etc/passwd此文件的,但是在passwd这个命令上添加了setuid这个特殊权限位,普通账号临时变成root,就能间接修改自己账号的密码了。
[root@sparktest1 ~]# which passwd /usr/bin/passwd [root@sparktest1 ~]# ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 30768 Feb 22 2012 /usr/bin/passwd
s就是suid位,设置setuid的方法如下:
chmod u(+|-)s /path/somefile chmod 4664 /path/somefile 注意: s:表示属主原来有执行权限 S:表示属主原来没有执行权限
例如:
[root@sparktech ~]# useradd Danby #新增用户Danby [root@sparktech ~]# vim /tmp/test.txt #创建文件,并写入hello world [root@sparktech ~]# ls -l /tmp/test.txt #查看文件权限 -rw-r--r--. 1 root root 0 Apr 17 00:17 /tmp/test.txt [root@sparktech ~]# chmod o-r /tmp/test.txt #去掉其他用户可读权限 [root@sparktech ~]# su - Danby #切换用户到Danby [Danby@sparktech ~]$ cat /tmp/test.txt #查看文件,权限不足 cat: /tmp/test.txt: Permission denied #切换到root用户 [Danby@sparktech ~]$ su - root Password: [root@sparktech ~]# cp /bin/cat /tmp/ [root@sparktech ~]# ls -l /tmp/test.txt /tmp/cat -rwxr-xr-x. 1 root root 48568 Apr 17 00:20 /tmp/cat -rwSr-----. 1 root root 0 Apr 17 00:17 /tmp/test.txt [root@sparktech ~]# cd /tmp/ [root@sparktech tmp]# chmod u+s cat #cat命令添加s权限 [root@sparktech ~]# su - Danby #切换到Danby用户 [Danby@sparktech tmp]$ . /cat test.txt -bash: /cat: No such file or directory [Danby@sparktech tmp]$ ./cat test.txt [Danby@sparktech tmp]$ ./cat test.txt hello world #成功查看文件
2.Sgid,Set id,属组有s权限,意思就是执行此程序时,此进程的属组不再是运行者本人所属的基本组,而是此程序文件的属组。Set gid权限如果给文件设置,是让运行此文件的其它用户具有这个文件的属组特性;给目录设置Set gid权限,任何用户在该目录下创建的文件,则该文件属组都和目录的属组一致。
但是这个不但可以能成功写进去,还可以删除文件,我们只能自己删除自己的文件,不想让其他用户删除我们的文件,这时候怎么办呢?
3.stick bit (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。只有文件的拥有者和root才能对其进行修改和删除,其他用户则不行,避免了上面所说的问题产生。
如何设置以上特殊权限
setuid:chmod u+s xxx
setgid: chmod g+s xxx
stick bit : chmod o+t xxx
或者使用八进制方式,在原先的数字前加一个数字,三个权限所代表的进制数与一般权限的方式类似,如下:
suid guid stick bit
1 1 1
所以:suid的二进制串为:100,换算十进制为:4
guid的二进制串为:010,换算:2
stick bit 二进制串:001,换算:1
于是也可以这样设:setuid:chmod 4755 xxx
setgid:chmod 2755 xxx
stick bit:chmod 1755 xxx
最后,在一些文件设置了特殊权限后,字母不是小写的s或者t,而是大写的S和T,那代表此文件的特殊权限没有生效,是因为你尚未给它对应用户的x权限 。
三、chattr和lsattr
这两个命令是用来查看和改变文件、目录属性的,与chmod这个命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr来改变的。
+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
1、用chattr命令防止系统中某个关键文件被修改:
# chattr +i /etc/resolv.conf
然后用mv /etc/resolv.conf等命令操作于该文件,都是得到Operation not permitted 的结果。vim编辑该文件时会提示W10: Warning: Changing a readonly file错误。要想修改此文件就要把i属性去掉: chattr -i /etc/resolv.conf
# lsattr /etc/resolv.conf
会显示如下属性
----i-------- /etc/resolv.conf
2、让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件:
# chattr +a /var/log/messages
原文地址:http://magine356wj.blog.51cto.com/2664956/1636343