文件权限_系统/运维

文件的权限针对:u (user),g (group),o (other)

文件权限:r,w,x

1.文件属性操作

1.1.修改属主/属组:chown

chown [option][owner][:[group]] file...

[-cfhvR]
c #显示更改的部分的信息
-f #忽略错误信息
-h #修复符号链接
-v #显示详细的处理信息
-R #处理指定目录以及其子目录下的所有文件
--help #显示辅助说明
--version #显示版本
owner
owner:group
:group (冒号也可用.替换)

chown [option]... --reference=Rfile file...

#修改所有者
chown wang f1

#修改所在者和属组
chown bin.g4 f1

#修改组
chown :g2 f1
chown .g3 f1

1.2.修改属组:chgrp

chgrp [option]... group file...

chgrp [option]... --reference=Rfile file...
-R
#修改组
chgrp g1 f1

#用户加入到组
gpasswd -a wang g3

2.设置权限 

chmod   change mod

chmod [option]... OCTAL-MODE FILE...
-R
chmod [option]... MODE[,MODE]... FILE...
MODE:
u= g= o= ug= a= u=,g=
u+ u- g+ g- o+ o- a+ a-

chmod [option]... --reference=Rfile file...
参考Rfile文件的权限,将file的修改为同Rfile

2.1.模式法

chmod who opt per file

who:u ,g ,o ,a
opt:+ - =
per:r w x

所有者>所属组>其他,权限只要其中一个生效,就不看其他的了
没有执行权限,即使是root用户也无法执行

把目录及其子目录内容都设置

chown -R wang /data/
chmod -R a=rwx /data

参考文件设置权限

chmod --reference /etc/shadow  /data/f1

2.2.数字法

r     4
w 2
x 1

文件:

r 查看内容
w 修改内容
x 启动为一个进程

目录:

r 可使用ls查看目录中文件列表(前提知道目录中的内容)
w 可创建/删除文件
x 可进入目录,要想查看内容需结合r权限
X 只给目录x权限,不给文件x权限

目录中文件能不删,是看目录的权限是否有w权限

chmod -R a+X /data/  #只加文件夹的x权限,文件件内容不加权限

3.特殊权限:suid ,sgid ,sticky

安全上下文

前提:进程有属主和属组;文件有属主和属组

(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件"其它"权限

3.1.suid

只作用于可执行的二进制程序,用户执行此程序时,将继承此程序所有者权限  [4]

SUID: user,占据属主的执行权限位

            s:属主拥有x权限

            S:属主没有x权限

chmod u+s FILE...
chmod u-s FILE...

chmod 4755 /usr/bin/vim
chmod u+s /usr/bin/vim

3.2.sgid

作用于可执行的二进制程序,用户执行此程序时,将继承此程序属组权限 [2]

SGID: group,占据属组的执行权限位

            s: group拥有x权限

           S:group没有x权限

chmod g+s /usr/bin/cat  
chmod 2755 /usr/bin/vim

作用在目录上:新建的文件,自动继承目录所属组权限

chmod g+s DIR...
chmod g-s DIR...

3.3.sticky

作用于目录[1]

在目录设置Sticky 位,只有文件的所有者或root可以删除该文件

Sticky: other,占据other的执行权限位

            t:other拥有x权限

           T:other没有x权限

chmod o+t DIR...
chmod o-t DIR...

chmod 777 dir2
chmod 1777 dir2

4.创建一个目录,让两个用户都能在里面新建文件,并且能修改对方建立的文件,其他用户是不能访问该目录的

1.创建目录及修改权限和属组
[root@CentOS7 data]# mkdir tao
[root@CentOS7 data]# ll
total 0
drwxr-xr-x 2 root root 6 Aug 24 16:14 tao
[root@CentOS7 data]# chmod g+s,g+w tao/
[root@CentOS7 data]# chgrp grp1 tao/
[root@CentOS7 data]# ll
total 0
drwxrwsr-x 2 root grp1 6 Aug 24 16:14 tao

2.用户添加到组
[root@CentOS7 data]# groupmems -a test1 -g grp1
[root@CentOS7 data]# groupmems -a test2 -g grp1
[root@CentOS7 data]# groupmems -l -g grp1
test1 test2

3.创建各自的文件,所属组继承了父文件的属组
[test1@CentOS7 tao]$ echo test1 > test1.txt
[test1@CentOS7 tao]$ ll
total 4
-rw-rw-r-- 1 test1 grp1 6 Aug 24 16:21 test1.txt
[test2@CentOS7 tao]$ echo test2 > test2.txt
[test2@CentOS7 tao]$ ll
total 8
-rw-rw-r-- 1 test1 grp1 6 Aug 24 16:21 test1.txt
-rw-rw-r-- 1 test2 grp1 6 Aug 24 16:22 test2.txt

4.能够互相修改对方创建的文件
[test2@CentOS7 tao]$ echo test2 >> test1.txt
[test2@CentOS7 tao]$ cat test1.txt
test1
test2
[test1@CentOS7 tao]$ echo test1 >> test2.txt
[test1@CentOS7 tao]$ cat test2.txt
test2
test1

5.其他用户不能写入:
[centos7.6@CentOS7 ~]$ ll /data/
total 0
drwxrwsr-x 2 root grp1 40 Aug 24 16:22 tao
[centos7.6@CentOS7 ~]$ echo tt >> /data/tao/test1.txt
-bash: /data/tao/test1.txt: Permission denied
[centos7.6@CentOS7 ~]$ echo tt >> /data/tao/test2.txt
-bash: /data/tao/test2.txt: Permission denied

5.umask

默认权限umask值 可以用来设置,创建文件时的默认权限

非特权用户umask是 002

root的umask 是 022

umask: 查看

umask # 设定

umask –S 模式方式显示

umask –p 输出可被调用 (umask -p >> .bashrc)

全局设置: /etc/bashrc 用户设置:~/.bashrc

[test1@CentOS7 tao]$ umask
0002
[root@CentOS7 data]# umask
0022

临时设置
[root@CentOS7 data]# umask 002
[root@CentOS7 data]# umask
0002
[root@CentOS7 ~]# umask u=rw,g=r,o=
[root@CentOS7 ~]# umask
0137

[root@CentOS7 ~]# umask -S
u=rwx,g=rx,o=rx
[root@CentOS7 ~]# umask -p
umask 0022

umask权限计算方式

umask 将777|666中对应的权限去掉,得到默认权限

目录:
777 111 111 111
022 000 010 010
--------------
111 101 101 755权限

文件:
666 110 110 110
022 000 010 010
--------------
110 100 100 644权限

666 110 110 110
123 001 010 011
-------------------
110 100 100 644权限 #这种方式就不能用666-umask方式计算权限
文件一般不加执行权限

新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1
新建目录的默认权限: 777-umask

6.ACL

ACL:Access Control List,实现灵活的权限管理

除了文件的所有者,所属组和其它人,可以对更多的用户设置权限

CentOS7 默认创建的xfs和ext4文件系统具有ACL功能

CentOS7 之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加

tune2fs –o acl /dev/sdb1

mount –o acl /dev/sdb1 /mnt/test

ACL生效顺序:所有者,自定义用户,自定义组,其他人

为多用户或者组的文件和目录赋予访问权限rwx

mount -o acl /directory
getfacl file |directory
setfacl -m u:wang:rwx file|directory
setfacl -Rm g:sales:rwX directory
setfacl -M file.acl file|directory
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory
setfacl -x u:wang file |directory
setfacl -X file.acl directory

ACL文件上的group权限是mask 值(自定义用户,自定义组,拥有组的最大权限),而非传统的组权限getfacl 可看到特殊权限:flags

通过ACL赋予目录默认x权限,目录内文件也不会继承x权限

base ACL 不能删除

setfacl -k dir 删除默认ACL权限

setfacl –b file1清除所有ACL权限

getfacl file1 | setfacl --set-file=- file2 复制file1的acl权限给file2

mask只影响除所有者和other的之外的人和组的最大权限

Mask需要与用户的权限进行逻辑与运算后,才能变成有限的权限(Effective Permission)

用户或组的设置必须存在于mask权限设定范围内才会生效 setfacl -m mask::rx file

--set选项会把原有的ACL项都删除,用新的替代,需要注意的是一定要包含UGO的设置,不能象-m一样只是添加ACL就可以

示例:

setfacl --set u::rw,u:wang:rw,g::r,o::- file1

什么权限都不设置
setfacl -m u:wang:0 f1

设置权限
setfacl -m u:mage:rw f1
setfacl -m g:g1:rw f1

删除权限
setfacl -x u:wang f1

清除所有的acl权限
setfacl -b f1
递归删
setfacl -R -b dir #dir 目录

setfacl 设定文件访问控制列表

用法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
-m, --modify=acl 更改文件的访问控制列表
-M, --modify-file=file 从文件读取访问控制列表条目更改
-x, --remove=acl 根据文件中访问控制列表移除条目
-X, --remove-file=file 从文件读取访问控制列表条目并删除
-b, --remove-all 删除所有扩展访问控制列表条目
-k, --remove-default 移除默认访问控制列表
--set=acl 设定替换当前的文件访问控制列表
--set-file=file 从文件中读取访问控制列表条目设定
--mask 重新计算有效权限掩码
-n, --no-mask 不重新计算有效权限掩码
-d, --default 应用到默认访问控制列表的操作
-R, --recursive 递归操作子目录
-L, --logical 依照系统逻辑,跟随符号链接
-P, --physical 依照自然逻辑,不跟随符号链接
--restore=file 恢复访问控制列表,和“getfacl -R”作用相反
--test 测试模式,并不真正修改访问控制列表属性
-v, --version 显示版本并退出
-h, --help 显示本帮助信息

getfacl常见命令参数

getfacl 2.2.49 -- get file access control lists
Usage: getfacl [-aceEsRLPtpndvh] file ...
-a, --access display the file access control list only
-d, --default display the default access control list only
-c, --omit-header do not display the comment header
-e, --all-effective print all effective rights
-E, --no-effective print no effective rights
-s, --skip-base skip files that only have the base entries
-R, --recursive recurse into subdirectories
-L, --logical logical walk, follow symbolic links
-P, --physical physical walk, do not follow symbolic links
-t, --tabular use tabular output format
-n, --numeric print numeric user/group identifiers
-p, --absolute-names don't strip leading '/' in pathnames
-v, --version print version and exit
-h, --help this help text

备份和恢复ACL

主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息

getfacl -R /tmp/dir1 > acl.txt
setfacl -R -b /tmp/dir1
setfacl -R --set-file=acl.txt /tmp/dir1 或 setfacl --restore acl.txt
getfacl -R /tmp/dir1

7.误删除家目录,怎么恢复目录及其文件权限

cd /home

cp /etc/skel /home/mage

chown -R mage.mage mage

chmod 700 mage

家目录中数据被清除了,但是家目录还在

cp -r /etc/skel/.[^.]* /home/mage

cp -r /etc/skel/. /home/mage  #拷贝.开头文件及不是以.开头的文件

8.cp  /etc/fstab /data/dir/  普通用户需要什么最少权限1)命令能执行,只需要x权限就可以

2)/etc/fstab 需要读权限

   /etc 执行权限

3)/data  执行权限

   /data/dir/  写和执行权限

9.设置特殊的属性

chattr +i f1  不能删除,不能改名,也不能删包含该文件的目录

chattr +a  f2  能够追加 echo xxx > f2方式,不能用vim打开方式追加,不能删除

lsattr 显示特定属性

chattr命令用于改变文件属性

这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:
a:让文件或目录仅供附加用途。
b:不更新文件或目录的最后存取时间。
c:将文件或目录压缩后存放。
d:将文件或目录排除在倾倒操作之外。
i:不得任意更动文件或目录。
s:保密性删除文件或目录。
S:即时更新文件或目录。
u:预防意外删除。

chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]  

-R 递归处理,将指定目录下的所有文件及子目录一并处理。
-v<版本编号> 设置文件或目录版本。
-V 显示指令执行过程。
+<属性> 开启文件或目录的该项属性。
-<属性> 关闭文件或目录的该项属性。
=<属性> 指定文件或目录的该项属性。
用chattr执行改变文件或目录的属性
用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/resolv.conf
chattr -i /etc/resolv.conf
让某个文件只能往里面追加数据,但不能删除,适用于各种日志文件
chattr +a /var/log/messages

lsattr命令用于显示文件属性

lsattr [-adlRvV][文件或目录...]
-a  显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
-d  显示,目录名称,而非其内容。
-l  此参数目前没有任何作用。
-R  递归处理,将指定目录下的所有文件及子目录一并处理。
-v  显示文件或目录版本。
-V  显示版本信息。