共计 3678 个字符,预计需要花费 10 分钟才能阅读完成。
Linux 文件权限
文件的属性和权限的设置对于 Linux 系统来说是相当重要的,如果对这一块的知识没有一个深入的了解,你的系统就有可能有很大的危险。那么首先我们来看一看文件的属性所对应的都是什么意思吧。
上图第一个字符是 d,他代表了文件的类型,d 的意思就是目录文件,那么除了目录文件还有什么文件呢?
d:目录 -:文件 l:链接文件 b:可以存储的接口设备 c:串行端口设备(键盘,鼠标)
接下来的九个字符以三个为一组分别是
rwx:属主的权限。r-x:属组的权限。r-x: 其他人的权限。
r(read):可读取 w(write):可写入 x(execute):可执行
所以上面这个文件的属主是 root。他对文件可读取可写入可执行。文件的属组是 root,root 组内成员可读取可执行,除了属主属组之外的其他人对该文件可读取可执行。
更改属主属组权限命令
chown:改变文件所属的用户组。
chgrp:改变文件的所有者。
chmod:改变文件的权限。
修改文件的属主:chown
chown [OPTION]… [OWNER][:[GROUP]] FILE…
用法:OWNER
OWNER:GROUP
:GROUP 命令中的冒号可用. 替换;
-R: 递归
chown [OPTION]… –reference=RFILE FILE…
修改文件的属组:chgrp
chgrp [OPTION]… GROUP FILE…
chgrp [OPTION]… –reference=RFILE FILE…
-R 递归
修改文件的权限:chmod
文件权限的改变可以使用 chmod 这个命令,但是权限的设置方法有两种,分别可以使用数字或者是符号来进行更改。
命令使用格式
chmod [OPTION]… OCTAL-MODE FILE…
-R: 递归修改权限
chmod [OPTION]… MODE[,MODE]… FILE… MODE:
chmod [OPTION]… –reference=RFILE FILE… 参考 RFILE 文件的权限,将 FILE 的修改为同 RFILE;
数字改变文件权限
Linux 系统的基本权限有 9 个,每三个一组,每一组分别对应了 owner、group、others 三种身份。我们可以使用数字来代表各个权限分别是
r:4 w:2 x:1
当要设置 xx 文件权限为[-rwxr-xr-x]
owner=rwx=4+2+1=7
group=r-x=4+1=5
others=r-x=4+1=5
所以在设置权限时,该文件权限的设置数字就是 755. 执行 chmod 755 xx 就可以了。
符号改变文件权限
三种身份用 user=u;group=g;others= o 来表示,读写执行权限用 rwx 来表示
当 xx 文件权限为 [-rwxr-xr-x] 我们要给它加入所有权限时执行
1、chmod a=rwx
2、chmod g=rwx,u=rwx,a=rwx
3、chmod g+w,o+w
目录 / 文件的权限意义
权限对文件的意义
r(read):可读取此文件的内容,比如读取文本文件里的内容。
w(write):可以编辑、新增或者是修改该文件的内容。
x(execute):该文件可以被系统执行。
权限对目录的重要性
r:表示具有读取目录结构列表的权限。可以查询该目录结构下的文件列表。
w:表示你具有更改该目录结构列表的权限
如:新建新的文件与目录。
删除已存在的文件与目录(不管该文件的权限如何)。
将已存在的文件或目录进行重命名。
转移该目录内的文件、目录位置。
x:代表的是用户能否进入该目录成为工作目录。
新建文件和目录的默认权限
umask 值 可以用来保留在创建文件权限
新建 FILE 权限: 666-umask 如果所得结果某位存在执行(奇数)权限,则将其权限 +1
新建 DIR 权限: 777-umask
非特权用户 umask 是 002 root 的 umask 是 022
umask: 查看
umask #: 设定
umask 002
umask –S 模式方式显示
umask –p 输出可被调用
全局设置:/etc/bashrc 用户设置:~/.bashrc
这里加入我们新建一个文件默认让它没有权限,根据规则,命令为:
umask 777
666-777=-1-1-1
每一项加 1 得 000
Linux 系统中三种特殊权限
SUID, 表现为 s 数字为 4(作用在二进制程序)
SGID, 表现为 s 数字为 2(作用在二进制程序)
Sticky 表现为 t 数字为 1(作用在目录上)
安全上下文
SUID
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程:取决发起者 对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者;进程的属组为 发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
SGID
任何一个可执行程序文件能不能启动为进程:取决发起者对 程序文件是否拥有执行权限
启动为进程之后,其进程的属主为原程序文件的属主
SUID 只对二进制可执行程序有效
SUID 设置在目录上无意义
当一个目录有 S 权限时在该目录下创建的所有新文件子目录文件自动继承该目录的属组
Sticky(粘滞位:可以让其他人不能删除文件。)
具有写权限的目录通常用户可以删除该目录中的任何 文件,无论该文件的权限或拥有权
在目录设置 Sticky 位,只有文件的所有者或 root 可 以删除该文件
sticky 设置在文件上无意义
权限设定:chmod o+t DIR… chmod o-t DIR…
例如:
ls -ld /tmp drwxrwxrwt 12 root root 4096 Nov 2 15:44 /tmp
注意:对文件夹来说其他权限必须配合 x 权限。
设定文件的特殊属性
chattr +i 不能删除,改名,更改
chattr +a 只能增加 \ 读取。
chattr +A 锁定文件访问时将。
lsattr 显示特定属性
访问控制列表(ACL:Access Control List)
ACL:Access Control List,实现灵活的权限管理
除了文件的所有者,所属组和其它人,可以对更多的用户设 置权限
CentOS7.0 默认创建的 xfs 和 ext4 文件系统有 ACL 功能。
CentOS7.X 之前版本,默认手工创建的 ext4 文件系统无 ACL 功能。需手动增加: tune2fs –o acl /dev/sdb1 mount –o acl /dev/sdb1 /mnt
ACL 生效顺序:所有者,自定义用户,自定义组,其他人
FAT 分区不支持权限。
有关 acl 的命令例
为多用户或者组的文件和目录赋予访问权限 rwx
mount -o acl /directory
getfacl file |directory 查看目录的具体 acl 权限
setfacl -m u:user:rwx file|directory
setfacl -Rm g:user:rwX directory 对于
setfacl -M file.acl file|directory 读取文件内容设置目标目录权限
setfacl -m g:user:rw file| directory
setfacl -m d:u:user:rx directory
setfacl -m m::r directory 更改所有目录的有效权限
setfacl -x u:user file |directory 删除用户权限
setfacl -X file.acl directory 读取文件内容删除目标目录权限
setfacl -b directory 彻底清空文件 acl 权限
添加 acl 时目录所属组的权限更新为 mask 权限。但是 mask 权限只影响添加进 acl 的用户权限与用户组的权限
acl 访问控制列表
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
备份和恢复 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
#getfacl -R /tmp/dir1