Linux基础:文件权限
用户与用户组
Linux是一个多用户、多任务的操作系统,为了让各个用户具有较保密的文件数据,因此未见的权限管理就比较重要了。Linux的文件所有权和访问授权是与用户id和组密切相关的。Linux 一般将文件可存取访问的身份分为3个类别,分别是owner, group, others,且3中身份各有 read, write, execute等权限。
当用户登录系统时,就会进行身份验证。成功登录系统后的用户,都携带用户身份(User ID, UID)以及组身份(Group ID, GID),当需要访问文件或者执行程序时,需要检查用户是否拥有访问的权限。
一般来说,Linux的用户信息保存在/etc/passwd中,组信息保存在/etc/group中,文件的每一行代表一个用户/组。早期的Linux将密码以明文的形式保存在/etc/passwd中,而现在则多以暗码(也就是加密之后的形式)的形式保存在/etc/shadow中。将密码存储在/etc/shadow中提高了密码的安全性,因为/etc/passwd允许所有人查看,而/etc/shadow只允许root用户查看。
使用 id
命令,您可以找出用户和组信息。类似的,您可以使用 groups
命令找出您在什么组中。
[root@localhost ~]# id uid=0(root) gid=0(root) groups=0(root) [root@localhost ~]# groups root [root@localhost ~]#
Linux文件属性
要了解Linux权限控制,就必须学习Linux的文件权限和属性。Linux 权限模型每个文件系统对象有 3 种类型。这些权限就是读(r),写(w)和执行(x)。写权限包括修改和删除对象的能力。此外,这些权限被分别指定给文件所有者、文件组成员和其他人。
可以使用 # ls -l 命令查看
我们来解释一下上面7列的意思。
第一列代表这个文件的类型和权限(permission)
它由十个字符组成,第一个字母描述了对象的类型(- 在这个例子中表示普通文件),剩下的 9 个字母每三个字母为一组,分别对应属主(owner),属组(group)和其他人(other)的权限。第一组表示文件所有者的读、写和执行权限。- 表示相应的权限没有被授予。
第一个字符表示文件的类型:
[d] 目录(directory)
[-] 文件(file, f)
[l] 符号链接文件(Symbolic links file)
[b] 块设备文件(block)
[c] 字符设备文件(character)
[p] 命名管道(pipe)
[s] 套接字(socket)
接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。
其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
第二列代表有多少文件名连接到此节点(inode)。
每个文件都将它的权限和属性记录到文件系统的 inode 中,不过Linux使用的倒置目录树结构的组织中,文件名却是存放在目录文件中的,因此每个文件名就会连接到一个inode。这个属性记录的就是有多少不同的文件名连接到相同的一个inode号。因此会存在有多个文件名连接到一个 inode 的情况,这就是硬链接,而该列就是指的硬链接数。
第三列表示这个文件(或目录)的所有者(属主)。
第四列表示这个文件(或目录)的所属组。
第五列表示这个文件的大小,单位为字节(byte)。
其中链接文件(上面的 b.txt 文件)的大小正好是指向的目标文件名的字符数。
第六列表示文件的最近修改时间(mtime)。其实文件属性中还包括创建时间和最近读取时间,只是并未显示出来。
第七列为该文件的文件名。
目录权限的意义
目录和常规文件一样使用相同的权限标识,但是它们的翻译不同。目录的读权限允许用户使用该权限列出目录内容。写权限意味着用户使用该权限能够在目录中创建或者删除文件。执行权限允许用户输入目录并访问任意子目录。没有执行权限,目录下的文件系统对象就是不可访问的。没有读权限,目录下的文件系统对象在目录清单下就是不可见的,但是如果知道磁盘上对象的完整路径,这些对象仍是可访问的。
对于普通文件的权限:
r(read):允许读权限,比如可以使用
cat <file name>
之类的命令来读取某个文件的内容w(write):允许写权限,表示你可以编辑和修改某个文件的内容
x(execute):允许执行权限,通常指可以运行的二进制程序文件或者脚本文件。Linux上不是通过文件后缀名来区分文件的类型。 不过拥有可以执行的能力, 与能否执行成功,是两码子事儿。
对于目录文件的权限:
但是对于目录的权限位则很容易混淆,这里要注意区分:
r (read contents in directory):读取目录里面的内容。
所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件。
w (modify contents of directory):编辑目录里面的内容。拥有更改该目录结构列表的权限:
主要包括
1、创建新的文件与目录
2、删除目录下面的文件与目录(无论该文件的权限是什么,这一点很重要)
3、对目录里面的文件与目录重命名
4、移动目录里面的文件与目录的位置
x (access directory):代表的是用户能否进入该目录成为工作目录。(相当重要的概念)
注意:目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息
要编辑文件内容,那么必须对该文件拥有 rw 权限。
要编辑目录内容,那么必须对该目录拥有 wx 权限。
如何修改文件属性与权限
我们已经知道文件权限对于一个系统的重要性了,但如何对文件的属性和权限进行修改呢?这里主要用到三个命令:chgrp, chown, chmod,分别对应修改用户组、拥有者和文件权限。
改变所属组: chgrp
改变所有者: chown
改变文件权限: chmod
## chgrp/chown/chmod [-R] dirname/filename -R : 进行递归 recursive ## 改变属组 # chgrp users a.txt ## 改变属主 # chown users a.txt # chown root:root a.txt # chown :users a.txt # chown -R root:root ./tmp # 递归,其子目录下的所有文件都会更改
符号方式改变文件权限:
[root@localhost ~]# chmod --help Usage: chmod [OPTION]... MODE[,MODE]... FILE... or: chmod [OPTION]... OCTAL-MODE FILE... or: chmod [OPTION]... --reference=RFILE FILE... Change the mode of each FILE to MODE.
Mode可以分成如下3块: [who] operator [permission]
[ugoa]*([-+=]([rwxXst]*|[ugo]))+
who的含义是:
u 文件属主权限
g 同组用户权限
o 其它用户权限
a 所有用户(all 设置所有用户的权限,这就相当于忽略它)
operator的含义:
+ 增加权限
- 取消权限
= 设定权限
permission的含义:
r 读权限
w 写权限
x 执行权限
X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
s 文件属主和组id
l 给文件加锁,使其它用户无法访问
示例:
# chmod u=rwx,go=rx a.txt # 注意: u=rwx,go=rx 之间没有任何空格 # chmod u=rwx,g=rx,o=rx a.txt # chmod o=- a.txt # chmod a+x a.sh # chmod +x a.sh
八进制方式改变文件权限:
r=4,w=2,x=1, 每种身份(owner, group, others)各自的三个权限(r, w, x)分数是需要累加的。这三个数字中的每一个都通过添加所需的权限设置来构建:读(4),写(2)和执行(1)。
owner = rwx = 4 + 2 + 1 = 7
group = r-x = 4 + 0 + 1 = 5
other = r-x = 4 + 0 + 1 = 5
suid 和 sgid
Linux 权限模型有两个特殊的访问模式,名为 suid(设置用户 id)和 sgid(设置组 id)。当可执行的程序设置为 suid 访问模式,它就会开始运行,好像是由文件所有者启动而不是由真正启动它的用户启动。类似的,设置为 sgid 访问模式,程序就会运行,好像启动用户属于文件组,而不属于他所有的组。可以单独或者同时设置两个访问模式。
suid 和 sgid 位与长目录清单中用户和组的 x 占据相同的空间。如果文件是可执行的,suid 或 sgid 位如果已设置,将会显示为小写的 s,否则就显示为大写的 S。
虽然 suid 和 sgid 很便利,甚至在很多环境下是必需的,但是这些访问模式不适当的使用会造成系统安全上的漏洞。您要尽量少地使用 suid 程序。passwd 命令是少数 必须 为 suid 的命令之一。
设置 suid 和 sgid
suid 和 sgid 位使用字母 s 在符号上进行设置和重设;例如,u+s 设置 suid 访问模式,g-s 删除 sgid 模式。在八进制格式中,suid 在第一位(高阶)为值 4,而 sgid 是值 2。
# chmod u+s aaa # chmod 4755 aaa
SUID的目的:
SUID权限仅对二进制程序(binaryprogram)有效,不能够用在shell script上面。
执行者对于该程序需要具有x的可执行权限
本权限仅在执行该程序的过程中(run-time)有效
执行者将暂时具有该程序所有者(owner)的权限
对目录无效
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。在Linux/Unix下,可执行文件可以被setUid,这使得任意使用者在执行该文件时,都绑定了文件拥有者的权限。就好像文件带了一把尚方宝剑一样,默认情况下,用户执行一个指令,会以该用户的身份来运行进程。指令文件上的强制位,可以让用户执行的指令,以指令文件的拥有者或所属组的身份运行进程。注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。setUid文件通常用来提升使用者的权限.最有代表性的su命令.普通用户可以可以执行该命令,使自己升级为root。
SET GID 强制位的作用:
默认情况下,用户建立的文件属于用户所在的组。但是目录设置了setgid,表示在此目录中,任何人建立的文件,都会属于当前目录所属的组。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。
对于目录来说:
用户若对于此目录具有r与x的权限时,该用户能够进入此目录
用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
若用户在此目录下具有w的权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同。
对于文件来说:
SGID对二进制程序有用
程序执行者对于该程序来说,需具备x的权限
执行者在执行的过程中将会获得该程序用户组的支持。
Sticky Bit 只针对目录有效。其作用是:
当用户对于此目录有w,x权限时,建立的文件或目录仅有自己与root才有权力删除。
换句话说:当甲用户对于A目录来说具有群组或其他人的身份,并且拥有该目录的w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除、更名、移动”等操作。不过,如果将A目录加上了 Sticky Bit 权限位时,则甲只能够针对自己建立的文件或目录进行“删除、更名、移动”等操作,而无法改动其他人的。最具代表性的就是 /tmp 目录。
文件预设权限: umask
默认的情况下:
若用户创建“文件“则默认没有可执行(x)权限,即只有r、w这两个选项,也就是最大为666,默认权限如下:-rw-rw-rw-
若用户新建“目录“,则由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即为777,默认权限如下:drwxrwxrwx
怎么查看缺省的umask:
[root@localhost ~]# umask 0022 [root@localhost ~]# umask -S u=rwx,g=rx,o=rx
umask的分数指的是“该默认值需要减掉的权限“; 假设umask为022
新建文件时:(-rw-rw-rw-) - (-----w--w-) = (-rw-r--r--)
新建目录时:(drwxrwxrwx) - (-----w--w-) = (drw-r-xr-x)
umask的配置文件为:/etc/profile 或 ~/.profile 或 ~/.bash_profile,可通过修改这些文件里的umask值,改变其默认的 umask。
本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1620167
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。