Linux权限管理.md

Linux 文件的权限

Linux文件权限简介

Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。具体情况如下:

# ls -lhi
总用量 21M
267246 drwxr-xr-x. 3 root root 4.0K 3月 12 18:12 aaa
267243 drwxr-xr-x. 2 root root 4.0K 3月 12 17:05 abc
267245 lrwxrwxrwx. 1 root root 13 3月 12 15:43 bbb -> /tmp/test/abc
267259 drwxr-xr-x. 2 root root 21M 3月 12 18:04 ddd

在上面的第二列文件属性drwxr-xr-x中第一个是说明文件的类型,关于Linux的文件类型这里不做过多介绍。下面就关于文件类型之后的rwxr-xr-x这九个字符的意义以及在Linux 系统中如何进行设置和使用。

文件权限说明

在文件权限的九个字符的意义如下:

  • 左三位:定义user(owner)的权限

  • 中三位:定义group的权限;

  • 右三位:定义other的权限

关于这九个的文件权限中rwx的意义如下:

  • r:readable, 读

  • w:writable, 写

  • x:excutable,执行

在文件中rwx的意义:

  • r:可获取文件的数据;

  • w: 可修改文件的数据;

  • x:可将此文件运行为进程;

在目录中rwx的意义:

  • r:可使用ls命令获取其下的所有文件列表;

  • w: 可修改此目录下的文件列表;即创建或删除文件;

  • x: 可cd至此目录中,且可使用ls -l来获取所有文件的详细属性信息;

权限组合机制

默认显示文件权限 二进制显示 八进制显示
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7

Linux 文件权限命令

chmod

chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。

命令格式

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

命令参数

  • -c 当发生改变时,报告处理信息

  • -f 错误信息不输出

  • -R 处理指定目录以及其子目录下的所有文件

  • -v 运行时显示详细处理信息

选择参数

  • --reference=<目录或者文件> 设置成具有指定目录或者文件具有相同的权限

  • --version 显示版本信息

  • <权限范围>+<权限设置> 使权限范围内的目录或者文件具有指定的权限

  • <权限范围>-<权限设置> 删除权限范围的目录或者文件的指定权限

  • <权限范围>=<权限设置> 设置权限范围内的目录或者文件的权限为指定的值

权限范围:

  • u :目录或者文件的当前的用户

  • g :目录或者文件的当前的群组

  • o :除了目录或者文件的当前用户或群组之外的用户或者群组

  • a :所有的用户及群组

权限代号

  • r :读权限,用数字4表示

  • w :写权限,用数字2表示

  • x :执行权限,用数字1表示

  • - :删除权限,用数字0表示

  • s :特殊权限

命令使用

命令有两种用法,一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

文字设定法

chmod [who] [+ | - | =] [mode] 文件名

数字设定法

我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:

chmod [mode] 文件名

数字与字符对应关系如下:
r=4,w=2,x=1
若要rwx属性则4+2+1=7
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。

chown

chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。通过chown改变文件的拥有者和群组。在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。

命令格式

chown [选项]... [所有者][:[组]] 文件...

命令参数

  • -c 显示更改的部分的信息

  • -f 忽略错误信息

  • -h 修复符号链接

  • -R 处理指定目录以及其子目录下的所有文件

  • -v 显示详细的处理信息

  • -deference 作用于符号链接的指向,而不是链接文件本身

  • --reference=<目录或文件> 把指定的目录/文件作为参考,把操作的文件/目录设置成参考文件/目录相同拥有者和群组

  • --from=<当前用户:当前群组> 只有当前用户和群组跟指定的用户和群组相同时才进行改变

思考题:
用户对目录有写权限,但对目录下的文件没有写权限时,能否修改此文件内容?能否删除此文件?
不能修改文件中的内容,但是可以删除和复制文件。

umask

umask是用来设置文件的权限反向掩码,遮罩码。在文件的设置为666-umask,在目录中的设置为777-umask。之所以文件用666去减,表示文件默认不能拥有执行权限;如果减得的结果中有执行权限,则需要将其加1;当umask = 023,则文件的属性为666-023=644,目录的属性为777-023=754

SUID、SGID、SBIT权限说明

前面我们学习了Linux的文件常用权限可写(w)、可读(r)、可执行(x)、同时通过chmod命令可以管理文件的权限,而在日常的操作中还有三种权限及SUID、SGID、sticky-bit,而这三种权限也是通过chmod命令来进行管理。下面就对这三种权限进行介绍。

SUID

当s出现在文件拥有者的x权限位置上时,如我们上面看到的/usr/bin/passwd这个文件的权限时-rwsr-xr-x,此时就被称为SET UID简称SUID。SUID对于一个文件有什么限制和功能呢?

  • SUID权限仅对二进制可执行文件有效

  • 执行者对于该文件具有x的权限

  • 本权限仅在执行该文件的过程中有效

  • 执行者将具有该文件拥有者的权限

说明:例如普通用户用passwd修改自己的命令,实际上最终更改的是/etc/passwd文件。此文件时用户管理配置文件,只有root权限才能更改。

SGID

当s出现在目录或文件所属组的x权限位置上时,此时就称为SET GID简称SGID,那SGID对文件和目录分部有哪些功能呢?

SGID对目录:

  • 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录

  • 使用者在此目录下的群组将会变成该目录的群组

  • 若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同

SGID对文件:

  • SGID 对二进制可执行文件有效

  • 程式执行者对于该文件来说,需具备 x 的权限

  • 执行者在执行的过程中将会获得该文件群组的支援(用于改文件群组的权限)

SBIT

当t出现在目录其他用户的x权限位置上时,此时就称为Sticky Bit简称SBIT,那SBIT有哪些限制和作用呢?

  • 仅对目录有效,对文件无效

  • 当使用者在该目录下建立文件或目录时(有权限的情况下),仅自己与 root 才有权力删除新建的目录或文件

设置SUID、SBID、SBIT属性

操作这些标志与操作文件权限的命令是一样的,都是 chmod。有两种方法来操作:

符号类型改变权限

  • chmod u+s testbin-- 为testbin文件加上setuid标志.

  • chmod g+s testdir-- 为testdir目录加上setgid标志

  • chmod o+t testdir-- 为testdir目录加上sticky标志

数字类型改变档案权限

采用八进制方式. 对一般文件通过三组八进制数字来置标志, 如 666, 777, 644等. 如果设置这些特殊标志, 则在这组数字之外外加一组八进制数字. 如 4666, 2777等. 这一组八进制数字三位的意义如下:
abc

  • a - setuid位, 如果该位为1, 则表示设置setuid 4---

  • b - setgid位, 如果该位为1, 则表示设置setgid 2---

  • c - sticky位, 如果该位为1, 则表示设置sticky 1---

设置完这些标志后, 可以用 ls -l 来查看. 如果有这些标志, 则会在原来的执行标志位置上显示. 如:

  • rwsrw-r-- 表示有setuid标志

  • rwxrwsrw- 表示有setgid标志

  • rwxrw-rwt 表示有sticky标志

那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)

lsattr、chattr

有时候你发现用root权限都不能修改某个文件,大部分原因是曾经用chattr命令锁定该文件了。chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的,不过现在生产绝大部分跑的linux系统都是2.6以上内核了。通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。chattr命令不能保护/、/dev、/tmp、/var目录。lsattr命令是显示chattr命令设置的文件属性。如果要查看被chattr改变的文件属性,需用lsattr命令。

这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下模式:

  • A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。

  • a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。

  • c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。

  • d:即no dump,设定文件不能成为dump程序的备份目标。

  • i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件系统的安全设置有很大帮助。

  • j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。

  • S:硬盘I/O同步选项,功能类似sync。

  • s:保密性地删除文件或目录,即硬盘空间被全部收回。

  • u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。

chattr命令参数说明

  • -R 递归处理,将指定目录下的所有文件及子目录一并处理。

  • -v<版本编号> 设置文件或目录版本。

  • -V 显示指令执行过程。

  • +<属性> 开启文件或目录的该项属性。

  • -<属性> 关闭文件或目录的该项属性。

  • =<属性> 指定文件或目录的该项属性。
    ‘’

lsattr命令参数

  • -a  显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。

  • -d  显示,目录名称,而非其内容。

  • -l  此参数目前没有任何作用。

  • -R  递归处理,将指定目录下的所有文件及子目录一并处理。

  • -v  显示文件或目录版本。

  • -V  显示版本信息。

文件ACL权限设置

ACL即Access Control List 主要的目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置,ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。如,某一个文件,不让单一的某个用户访问。
控制命令:

  • getfacl:取得某个文件/目录的ACL设置项目

  • setfacl:设置某个文件/目录的ACL设置项目

setfacl 参数

  • -m:设置后续acl参数

  • -x:删除后续acl参数

  • -b:删除全部的acl参数

  • -k:删除默认的acl参数

  • -R:递归设置acl,包括子目录

  • -d:设置默认acl

使用举例:
在linux系统中我们在用普通用户(cangls)编辑文本文件时,可能要编辑别的普通用户(bols)的文件,通常情况下我们会想到下面两个解决方法:1、用root用户把普通用户(cangls)添加到要编辑文件的所属组(bols)中,然后可以更加属组的写权限就可以编辑文件。2、若我们不想用root用户更改权限则可以让被编辑文件所属主(bols)在文本的other权限中添加写权限。上面的两个解决方法虽然都能可以解决问题但是root权限在生产服务器上一般不会随便登录的,而第二种虽然能解决问题但由于其他用户也有写权限,若被有心人利用就得不偿失了,今天就向大家介绍个能同时避免上面两个问题的解决方法即使用setfacl命令。
使用setfacl命令赋予的属主的权限进行更改文件:

[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
other::r--
[bols@hpf-linux test]$ setfacl -m u:cangls:rw- /tmp/test/bols.txt
Try `getfacl --help' for more information.
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
user:cangls:rw-
group::rw-
mask::rw-
other::r--
[bols@hpf-linux test]$ ls -l bols.txt
-rw-rw-r--+ 1 bols bols 12 7月 9 08:33 bols.txt
[cangls@hpf-linux test]$ echo "cangls" > bols.txt
[cangls@hpf-linux test]$ cat bols.txt
cangls
[bols@hpf-linux test]$ setfacl -x u:cangls bols.txt //取消权限
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
mask::rw-
other::r--
[cangls@hpf-linux test]$ echo "bols" > bols.txt
-bash: bols.txt: 权限不够

使用setfacl命令赋予的属组的权限进行更改文件:

[bols@hpf-linux test]$ setfacl -m g:cangls:rwx bols.txt
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
group:cangls:rwx
mask::rwx
other::r--
[bols@hpf-linux test]$ ls -l bols.txt
-rw-rwxr--+ 1 bols bols 12 7月 9 08:33 bols.txt
[cangls@hpf-linux test]$ echo "bols" >> bols.txt
[cangls@hpf-linux test]$ cat bols.txt
cangls
bols
[bols@hpf-linux test]$ setfacl -x g:cangls bols.txt
[bols@hpf-linux test]$ getfacl bols.txt
# file: bols.txt
# owner: bols
# group: bols
user::rw-
group::rw-
mask::rw-
other::r--
[cangls@hpf-linux test]$ echo "bols" > bols.txt
-bash: bols.txt: 权限不够

-R递归目录用法举例:

[bols@hpf-linux tmp]$ setfacl -R -m  u:cangls:rwx /tmp/test/
[bols@hpf-linux tmp]$ getfacl /tmp/test/bols.txt
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/bols.txt
# owner: bols
# group: bols
user::rw-
user:cangls:rwx
group::rw-
mask::rwx
other::r--
[bols@hpf-linux tmp]$ getfacl /tmp/test/
getfacl: Removing leading '/' from absolute path names
# file: tmp/test/
# owner: bols
# group: bols
user::rwx
user:cangls:rwx
group::rwx
mask::rwx
other::r-x [bols@hpf-linux tmp]$ ls -ld test/
drwxrwxr-x+ 2 bols bols 4096 7月 9 08:00 test/
[cangls@hpf-linux test]$ echo "cangls" >> bols.txt
[cangls@hpf-linux test]$ cat bols.txt
cangls
bols
cangls
上一篇:【原创】Sliding Window Maximum 解法分析


下一篇:Android Studio tips1