文件权限管理
文件系统上的权限是指文件和目录的权限,权限主要针对三类对象(访问者)定义
owner group other
属主 属组 其它
每个文件对每类访问者都定义了三种权限
read write execute
r w x
文件权限
r 可以使用内容查看类的命令来显示其相关内容
w 可以使用编辑器修改其内容(不能删除文件本身,能否删除取决于所在文件夹的权限)
x 可以将文件运行为进程(针对二进制程序或脚本文件)
目录权限
r 可以使用ls命令查看目录内容的文件信息
w 可以创建、删除文件
x 可以使用ls -l命令来查看目录内容的文件信息,并且可以使用cd命令切换此目录为工作目录
安全上下文
前提:进程有属主和属组;文件有属主和属组
任何一个可执行程序文件能不能启动为进程取决发起者对程序文件是否拥有执行权限
启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组(包括基本组和附加组)
进程访问文件时的权限,取决于进程的发起者
权限应用模型:
进程的属主与文件的属主是否相同,如果相同进程则以文件属主的权限来访问文件;否则判断
进程的属主所属的组(属主可能属于多个组)当中是否有组与文件的属组相同,如果相同进程则以文件属组的权限来访问文件;否则
进程则以文件的其它用户的权限来访问文件
权限表示方法:用户不拥有某位权限,则使用-占位
权限 二进制 八进制
--- 000 0
--x 001 1
-w- 010 2
-wx 011 3
r-- 100 4
r-x 101 5
rw- 110 6
rwx 111 7
chmod 文件权限修改
chmod [OPTION]... MODE[,MODE]... FILE... (模式法)
chmod [OPTION]... OCTAL-MODE FILE... (八进制模式)
chmod [OPTION]... --reference=RFILE FILE... (参考其他文件文件权限修改文件权限)
三类用户:
u:属主
g:属组
o:其它
a:所有
chmod [OPTION]... MODE[,MODE]... FILE... (模式法)
赋权表示法:直接操作一类用户的所有权限位rwx
u=
g=
o=
a=
授权表示法:直接操作一类用户的一个权限位r,w,x
u+,u-
g+,g-
o+,o-
a+,a-
chmod [OPTION]... OCTAL-MODE FILE... (八进制模式)
如:640表示rw-r----- 664表示rw-rw-r-- 755表示rwxr-xr-x
chmod [OPTION]... --reference=RFILE FILE...(参考其他文件文件权限修改文件权限)
参考RFILE文件的权限,将FILE修改为同RFILE的权限
-R 递归修改权限
注意:使用-R递归修改权限时,建议使用赋权表示法和授权表示法,不建议用八进制表示法,因为八进制表示法不清楚目录下的文件权限,可能会带来危险操作
umask
默认命令没参数查看当前umask,也可以直接修改umask 022
创建文件:666-umask
文件默认决不允许出现执行权限,如果umask为023,666-023=643但创建文件的时候权限为644,创建文件出现执行权限默认权限加1
创建目录:777-umask
root用户默认umask为022;普通用户如果用户名和基本组名一致umask为002,否则为022
配置文件:
全局设置:/etc/bashrc
用户设置:~/.bashrc 或者 ~/.bash_profile
chown、chgrp 修改文件的属主和属组,仅管理员可执行
-R 改变目录及目录下所有文件的属主和属组
chgrp Group FileName 改变属组
chown [options] UserName[{:|.}GroupName] FILE...
chown User FileName 改变属主
chown Owne:Group FileName 同时改属主和属组
chown :Group FileName 只改变属组
chown Owne: FileName 只改变属主
特殊权限:
特殊权限包含三个:suid、sgid、sticky
普通权限下可执行程序文件能不能启动为进程取决发起者对程序文件是否拥有执行权限;启动为进程之后,其进程的属主为发起者
suid:作用是控制用户执行的文件,以文件属主的身份执行,而不是执行文件的用户本身,对文件夹无相关控制;suid仅对二进制程序(binary program)有效,不能够用在shell script上面,这是因为shell script只是将多个二进制程序执行,所以suid的权限部分,还是得要看shell script应用的二进制程序的设定,而不是shell script本身
执行者对于该程序需要具有x的可执行权限时设置suid才有效
本权限仅在执行该程序的过程中有效(run-time)
执行者将具有该程序文件属主(owner)的权限
sgid:对文件的控制时,以文件所属组的身份运行;对文件夹来说,在文件夹中创建的任何文件的属组都和文件夹的属组一样;sgid对二进制程序有用
执行者对于该程序需要具有x的可执行权限时设置sgid才有效
执行者在执行的过程中将会获得该程序文件属组的权限
普通权限下用户创建文件时,其属组为此用户所属的基本组
文件夹设定了sgid
用户若对于此文件夹具有r与x的权限时,该用户能够进入此文件夹
用户对此文件夹有效属组(effective group)将会变成该文件夹属组
若用户对此文件夹具有w的权限(可以新建删除文件),在此目录下新建的文件和文件夹的属组与此文件夹的属组相同
普通权限下具有写权限的文件夹通常用户可以删除该文件夹中的任何文件,无论是否拥有对该文件的权限
sticky:对文件无控制,如果文件夹设置了sticky位,用户对该文件夹也有写入权限,此时只可以删除文件夹中自己的文件,无法修改删除别人的文件
当用户对于此文件夹具有w、x权限,即具有写入的权限
当用户在该文件夹下建立文件或文件夹时,仅有自己与root才有权力删除该文件
例如,我们的/tmp本身的权限是[drwxrwxrwt]在这样的权限下,任何人都可以在/tmp下创建、修改,但/tmp下的文件或文件夹只有其属主和root能够删除这些文件或文件夹
拥有特殊权限的文件或文件夹
suid -rws rwx rwx
sgid -rwx rws rwx
sticky -rwx rwx rwt
如果红色标识的位为大写的S或T,表示没有x权限的情况下添加了suid、sgid、stickty位,是没法执行的,文件的属主、属组、other都没有x权限,那就不能以这些身份去执行文件了
如何设置特殊权限:
UGO模式:
设置suid : chmod u+s [FileName]
设置sgid : chmod g+s [FileName]
设置sticky:chmod o+t [DirNmae]
数字模式:
suid:4
sgid:2
sticky:1
例:chmod 6755 a 设置a这个文件的suid与sgid权限
演示:
配置文件和文件夹的隐藏属性
chattr [+-=][ASacdistu][文件名]
+ 增加某一个特殊参数,其他原本存在参数则不变
- 移除某一个特殊参数,其他原本存在参数则不变
= 设定某些参数,覆盖原有的参数
A 当设定了A这个属性时,在存取此文件(或文件夹)时,他的访问时间atime将不会被改变,可避免I/O较慢的机器过度的存取磁盘。这对速度较慢的计算机有帮助
S 一般档案是异步写入磁盘的(可以通过sync命令同步到硬盘),如果加上S这个属性时,当你进行任何文件的修改,该修改会同步写入磁盘中
a 当设定 a属性后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设定这个属性(一般用于日志文件)
c 当设定c属性后,将会自自动将此文件压缩,在读取的时候将会自动解压缩, 但是在储存的时候,将会先进行压缩后再储存(对于大文件比较好用)
d 当dump程序被执行的时候,设定d属性将可使该文件(或文件夹)不会被dump备份
i 可以让一个文件不能被删除、改名、设定链接也无法写入或新增资料,对于系统安全性有帮助,只有root能设定此属性
s 当文件定了s属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘 空间,所以如果误删,完全无法救回
u 与s相反,当文件定了u属性时,如果该文件被删除了,则数据内容还存在磁盘中,可以恢复该文件
注意:属性设定常见的是a与i的设定值,而且属性必须要root才能设定
lsattr [-adR] [文件名或文件夹名]
-a 将隐藏文件的属性也显示出来
-d 如果查看的是文件夹,仅列出文件夹本身的属性而非文件夹下文件的属性
-R 连同子文件夹的数据也一并列出
ACL(Access Control List)访问控制列表
传统的权限模型缺点:传统的UGO权限模型无法应对复杂的权限设置需求,如对于一个文件只能设置一个组,并且对该组进行权限控制,但是如果该文件有多个组会对其进行访问,并且都要进行权限限制,传统的UGO模型是无法满足需求了。
ACL除了给文件的属主、属组、其它设置权限外,可以对任意的用户或组单独分配权限
xfs和ext4文件系统支持ACL功能,开启ACL功能的方法:
tune2fs -o acl /dev/sdb1
mount -o remount,acl /dev/sdb1 /mnt
ACL权限判断顺序:属主—>自定义用户—>属组—>自定义组—>其它人
ACL权限配置
setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
-m 设置后续的acl参数给文件使用,不可以与-x合用
-x 删除后续的acl参数,不可与-m合用
-b 删除所有的acl设置参数
-k 删除默认的acl参数
-R 递归设置acl
-d 设置默认的acl参数,对目录无效。只对在该目录下新建的文件有效,会引用其默认权限
针对一个用户对文件设置ACL权限
setfacl -m u:UserName:rwx FileName
针对一个组对文件设置ACL权限
setfacl -m g:GroupName:r-x FileName
属组对文件设置ACL权限(当给文件设置ACL权限后,UGO模型的G位不再是属组权限位,chmod不能修改属组权限了)
setfacl -m g::r-x FileName
递归设置ACL权限
setfacl -m u:UserName:rw- -R FileName
默认ACL权限:仅对目录有效,如果对一个目录设置了默认ACL权限,则该目录下新建的所有文件都继承此父目录的ACL权限
setfacl -m d:u:UserName:rw- DirectoryName
删除指定用户的ACL权限
setfacl -x u:UserName FileName
删除指定组的ACL权限
setfacl -x g:GroupName FileName
删除文件的所有ACl权限
setfacl -b FileName
最大有效权限mask
当文件设置了ACL权限后,我们给自定义用户、属组、自定义组设置ACL权限并不是真正的有效权限,设置的权限与mask权限"相与"之后的权限才是自定义用户、属组、自定义组真正有效权限,一般默认mask权限都是rwx(属主和其它位的权限不需要与mask相与,设置的是什么权限就是什么权限)
当给文件设置ACL权限后,UGO模型的G位不再是属组权限位,而是ACL权限的mask;所以当ls看到权限位后面有"+"号时,应该使用getfacl查看文件属组的权限(此时通过chmod去修改属组权限也是修改的mask的值,只能通过setfacl去修改)
mask演示:
#查看文件的原始UGO权限
[root@localhost tmp]# ls -l
-rwxrwxrwx. 1 root root 0 Sep 13 17:50 test
#设置自定义用户、自定义组的ACL权限
[root@localhost tmp]# setfacl -m u:king:rwx test
[root@localhost tmp]# setfacl -m g:king:rwx test
[root@localhost tmp]# getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:king:rwx
group::rwx
group:king:rwx
mask::rwx
other::rwx
#修改mask权限
[root@localhost tmp]# setfacl -m m:r test
#自定义用户、属组、自定义组的有效权限发生变化(同mask相与后都只有只读权限了)
[root@localhost tmp]# getfacl test
# file: test
# owner: root
# group: root
user::rwx
user:king:rwx #effective:r--
group::rwx #effective:r--
group:king:rwx #effective:r--
mask::r--
other::rwx
目录的默认权限演示:
#初始文件状态
[root@centos7 ~]# ll -d /testdir/
drwxr-xr-x 2 root root 15 2月 11 15:39 /testdir/
[root@centos7 ~]# ll /testdir/
总用量 4
-rw-r--r-- 1 root root 21 2月 11 12:24 f1
#设置目录/testdir默认权限为对centos用户有rwx权限,
[root@centos7 ~]# setfacl -m d:u:centos:rwx /testdir/
[root@centos7 ~]# ll -d /testdir/
drwxr-xr-x+ 2 root root 15 2月 11 15:39 /testdir/
[root@centos7 ~]# getfacl /testdir/
getfacl: Removing leading '/' from absolute path names
# file: testdir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:centos:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
#root用户创建f2文件,可以看到继承了默认权限,但没有执行权限x
[root@centos7 ~]# touch /testdir/f2
[root@centos7 ~]# getfacl /testdir/f2
getfacl: Removing leading '/' from absolute path names
# file: testdir/f2
# owner: root
# group: root
user::rw-
user:centos:rwx #effective:rw- #继承默认权限
group::r-x #effective:r--
mask::rw-
other::r--
#切换到centos用户
[root@centos7 ~]# su - centos
#创建文件,提示权限不够,说明acl权限不对目录生效,因为目录/testdir对普通用户没有写权限
[centos@centos7 ~]$ touch /testdir/f3
touch: 无法创建"/testdir/f3": 权限不够
#但是root新建的子文件却继承了默认权限,对centos用户可读,可写(原来对其他用户不可写)
[centos@centos7 ~]$ ll /testdir/f2
-rw-rw-r--+ 1 root root 7 2月 11 15:50 /testdir/f2
[centos@centos7 ~]$ echo "ssssss" > /testdir/f2
# 删除默认的acl权限
[root@centos7 ~]# setfacl -k /testdir/
[root@centos7 ~]# getfacl /testdir/
getfacl: Removing leading '/' from absolute path names
# file: testdir/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@centos7 ~]# ll -d /testdir/
drwxr-xr-x 2 root root 24 2月 11 15:45 /testdir/
备份和恢复ACL权限
文件操作命令cp和mv都支持ACL,只是cp命令需要加上-a或-p参数保证复制文件时保留ACL权限。但是tar等常见的备份工具是不会保留目录和文件的ACL权限信息
方法:
将目录下的所有文件的acl权限保存为文件
getfacl -R /tmp/dir1 > acl.txt
删除目录下所有文件的acl权限
setfacl -R -b /tmp/dir1
将备份的acl权限文件应用到对应目录
setfacl -R --set-file=acl.txt /tmp/dir1
查看权限是否恢复成功
getfacl -R /tmp/dir1