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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。