文件权限存在的意义
文件的权限是系统最底层的安全设定方法之一,它可以保证文件可以被可用的用户做相应的操作。
文件用户及用户组
Linux 是个多用户多任务的系统 ,常常会有多人同时使用同一主机来进行工作,为了考虑每个人的隐私权以及每个人喜好的工作环境 , 对用户进行分类。
分为以下三大类:
文件拥有者 (user)
文件所属组 (group)
其他人 (other)
文件权限的查看
文件属性的查看命令1: ls -l filename
命令2: ll filename
这些属性从前到后的含义分别如下表所示:
属性 | 含义 |
---|---|
- | 文件的类型 |
rw-r–r--. | 文件的权限 |
1 | 文件硬连接个数(文件内容被记录的次数) |
root | 文件所有人 |
root | 文件所有组 |
0 | 文件大小 |
Oct 10 02:48 | 最后一次被修改的时间 |
file | 文件名称 |
目录属性的查看
命令1: ls -ld directory
命令2: ll -d directory
这些属性从前到后的含义分别如下表所示:
属性 | 含义 |
---|---|
d | 文件的类型(d表示目录) |
rwxr-xr-x. | 目录的权限 |
2 | 子目录的个数 |
root | 目录所有人 |
root | 目录所有组 |
6 | 子文件属性大小 |
Oct 10 03:03 | 目录中内容变化的时间 |
dir | 目录名称 |
文件的类型
常见的文件类型有以下几种:
’ - ’ 空文件或者文本
’ d ’ 目录
’ l ’ 软连接
’ s ’ socket 套接字
’ b ’ block 块设备
’ c ’ 字符设备
文件的权限
第 2~4 个字符代表文件所有人的权限 ;
第 5~7 个字符代表文件所属组的权限 ;
第 8~11 个字符代表其他人的权限
例如: rwx|r-x|r-x
前三位的rwx代表文件所有人( u )的权限
中间三位的 r-x 代表文件所属组( g )的权限
最后三位的 r-x 代表其他人( o )的权限
权限的种类
权限种类有三种: r w x
(1). r
r权限针对文件,表示可以查看文件内容
r权限针对目录,表示可以ls 查看目录中存在的文件名称
(2). w
w权限针对文件,表示可以更改文件的内容
w权限针对目录,表示是否可以删除目录中的子文件或者子目录
(3). x
x权限对于文件,表示是否可以开启文件当中记录的程序
x权限对于目录,表示是否可以进入目录中
更改文件用户及用户组
命令格式:- chown 用户名称 文件 更改文件所有人
- chgrp 组名称 文件 更改文件所有组
- chown -R 用户 目录 更改目录本身以及目录中的子文件的所有人
- chgrp -R 组名 目录 更改目录本身以及目录中的子文件的所有组
示例操作:
首先在/mnt目录下建立5个文件,再在/mnt目录下建立一个新目录test,然后再在test目录下建立3个文件,操作如下:
用下面命令实时监控文件属性的变化:
watch -n 1 ls -lR /mnt/
下面对这些新建的文件和目录进行修改用户和用户组的操作:
可以看到修改目录时如果不加 -R 参数时,目录里面的文件属性是不会发生改变的,那么加上 -R 参数后,就会对目录及目录里面的内容属性进行修改了:
文件权限的更改
对于文件权限的修改有两种方式:方法一:通过字符方式修改
格式: chmod <u|g|o><+|-|=><r|w|x> 目标文件
方法二: 通过数字方式修改
格式: chmod 数字 目标
将三位权限 rwx 的有无视为二进制,有该权限时,该位为1,无该权限时即该位为 " - ",该位为0。再将这三位数字转换为八进制数字,那么得到的每一个数字就对应一个权限方式。
最终总结得到 r 为 4,w 为 2,x 为 1
下表为权限转换为二进制再转换为八进制的对应:
权限 | 二进制 | 八进制 |
---|---|---|
- - - | 000 | 0 |
- - x | 001 | 1 |
- w - | 010 | 2 |
- w x | 011 | 3 |
r - - | 100 | 4 |
r - x | 101 | 5 |
r w - | 110 | 6 |
r w x | 111 | 7 |
操作示例:
首先在/mnt下新建6个文件,文件最初的权限属性如下:
通过字符的方式对它们的权限进行修改:
通过数字的方式对它们的权限进行修改:
系统的默认权限及默认权限修改
当你创建一个新的文件或目录时 ,该文件或目录有默认权限。umask 的分数指的是 该默认值需要减掉的权限。
在默认权限的属性上,目录与文件是不一样的,文件的最大权限为 666,目录的最大权限为 777。
查看umask值的命令: umask 显示系统预留权限值
所以对于文件而言,系统默认权限是644;对于目录而言,系统默认权限是755。
修改系统默认权限
临时修改系统预留权限umask值的方法:
直接在 umask 命令后面加上要预留的权限数,如下:
这种方法只是临时修改当前shell中的umask值,当退出shell,重新打开后,umask值还会变会回到原来的022。
永久修改系统预留权限umask值的方法:
在shell配置文件/etc/bashrc 中和系统配置文件/etc/profile 中记录有系统的默认umask值,只要把这两个文件中的 umask值修改之后就可以永久修改umask值了。
/etc/bashrc 文件中的71行是普通用户的umask值,73行是超级用户的umask值:
/etc/profile 文件中的60行是普通用户的umask值,62行是超级用户的umask值:
下面我们修改这两个文件中超级用户的umask值:
然后wq退出保存。
注意:想要永久性的修改 umask 值,一定要重新读取两个配置文件后 ,才能生效,需要执行下面这两条命令
source /etc/bashrc ##刷新bash配置
source /etc/profile ##刷新系统配置
完成上面操作之后,再查看umask值,umask值就被永久修改了:
特殊权限
(1). stickyid 粘制位效果:只针对于目录,当目录上有 o+t 的权限时 ,所有用户在该目录下均可创建文件 , 但只有文件所有人和 root 用户可以删除该目录下的文件。
设定方式 :
chmod o+t directory
chmod 1777 directory
(2). sgid 强制位
效果:
针对目录时:在目录中创建的文件都自动归属到目录所在组;
针对二进制文件时:文件内记录的程序在执行时和执行者的组身份没有关系,而是以二进制文件的所有组的身份执行的。
设定方式:
chmod g+s file | directory
chmod 2777 file | directory
(3). suid 冒险位
效果:只针对于二进制可执行文件,该命令发起的程序是以该命令所有人的身份去执行。
设定方式:
chmod u+s 二进制可执行文件
chmod 4755 二进制可执行文件
示例操作:
在操作特殊权限前,先根据下面的要求创建用户、用户组和目录,要求如下:
- 新建用户组:shengchan,caiwu,jishu
- 新建用户要求如下:
1)tom是shengchan组的附加用户
2)harry是caiwu组的附加用户
3)leo是jishu组的附加用户
3)新建admin用户,此用户不属于以上提到的三个部门 - 新建目录要求如下:
1)/pub目录为公共存储目录对所有用户可以读、写、执行
2)/sc目录为生产部存储目录只能对生产部人员可以写入
3)/cw目录为财务部存储目录只能对财务部人员可以写入
通过以上命令就完成了上面的所有要求。
(1). 粘制位示例
下面修改/pub目录权限为粘制位o+t,所有用户都可以在该目录下新建文件,但是只能删除自己创建的文件却不能删除其他用户创建的文件:
tom用户和harry用户分别在/pub下新建文件:
然后tom用户尝试删除harry用户建立的文件:
harry用户尝试删除tom用户建立的文件:
可以发现都没有权限删除,只有自己可以删除自己建立的文件:
(2). 强制位示例
针对目录操作:
由于tom是属于生产组的,在tom用户下在/sc目录中创建文件:
可以看到新建的文件所属组是tom的,然后修改/sc目录权限为强制位:
这时tom再次在/sc目录中新建文件:
可以发现再次新建的文件所属组自动变成和目录相同的组了。
针对文件操作:
首先在tom用户下执行命令watch:
watch -n 1 date
然后另外打开一个shell用下面的命令查看watch进程的所有人和所属组:
ps ax -o user,group,comm | grep watch
改变 /bin/watch 文件的权限为强制位:
然后再次在tom用户下执行watch命令,并查看watch进程:
可以看到watch进程的所属组成了root组。
(3). 冒险位示例
还是对/bin/watch 文件进行权限修改,修改为冒险位:
再在tom用户下执行watch命令,然后查看watch进程:
可以看到watch进程的所有人从tom变成了root。
文件访问控制列表 ACL
传统的权限仅有三种身份 (owner,group,others) 搭配三种权限 (r,w,x), 并没有办法单纯的针对某一个使用者或某一个群组来设置特定的权限需求 , 此时就得要使用 ACL( 文件访问控制列表,Access Control List) 这个机制。作用:让特定的用户对特定的文件拥有特定权限。
设置文件或目录的 acl 权限
命令: setfacl
常用参数及格式:
- setfacl -m u:username:rwx file
设定username对file拥有rwx权限 - setfacl -m g:group:rwx file
设定group组成员对file拥有rwx权限 - setfacl -x u:username file
从acl列表中删除username - setfacl -b file
关闭file上的acl列表
如何查看文件是否有 acl 权限
方法一:
文件属性的第 11 位为 . 时代表没有 acl 权限 ;为 + 时代表有 acl 权限。所以上面的文件是没有acl权限的。
方法二:
getfacl file 查看acl开启的文件的权限
操作示例:
在/mnt目录下新建文件,然后设置文件的acl权限,并查看权限,如下:
可以看到file文件属性的第11位是 + ,说明file文件有acl权限。通过getfacl查看acl权限时,有多条信息,它们的含义分别如下:
#file 文件名称
#owner 文件拥有者
#group 文件拥有组
user: : 文件拥有人的权限
user: tom : 指定用户的权限
group: : 文件拥有组的权限
mask: : 能赋予用户的最大权限阈值
other: : 其他人的权限
使用-x参数把指定用户去掉之后,可以发现文件还是有acl权限,用-b 参数关闭之后,文件就没有了acl权限。
mask值
在权限列表中mask表示能生效的权限值,当用chmod减小开启acl的文件权限时mask会发生改变。
如果要恢复mask值,则用命令 setfacl -m m:rwx file
操作示例:
先新建文件,对其设置acl权限,然后用chmod减小acl文件权限:
然后恢复mask值,如下:
acl的默认权限设定
acl的默认权限设定只针对目录设定
注:acl权限值针对设定完成之后新建立的文件或目录生效,而已经存在的文件是不会继承默认权限的
设定方式:
setfacl -m d:u:用户:rwx 目录 acl默认权限的设定
setfacl -k 目录 acl权限的关闭
操作示例:
新建目录并设定acl权限,如下:
在此acl权限目录下新建文件并查看其acl权限:
关闭acl默认权限,如下:
权限匹配优先级
文件用户 > 指定特定用户(acl) > 指定特定的组(acl) > 文件所属组 > 其他用户(other)
权限开放权力变小的特殊情况
一般来说,权限的开放意味着权力的变大,但是有一种特殊情况:权限开放反而权力会变小。命令: chattr 针对目录设定特殊权限的命令
一般可设定的权限有:
i 目录只能读,不能新建和删除
a 目录可以读和新建,但不能删除
chattr +i|a dir 给目录增加 i或a 权限
chattr -i|a dir 给目录去掉 i或a 权限
chattr =i|a dir 给目录设定 i或a 权限
命令: lsattr
lsattr 后面加目录,作用是查看目录的特殊权限
操作示例:
新建目录并给目录增加 i 权限:
可以查看该目录,但是不可以在该目录下新建:
给目录设定 a 权限:
可以查看该目录并且可以新建文件,但是不可以删除文件: