linux之权限管理及访问控制列表
进程对文件的访问权限应用模型:
- 首先检查进程的属主与文件的属主是否相同,如果相同,则应用属主权限;如果不同就查看
suid
权限,如果相同就使用suid
权限; - 其次,则检查进程的属组是否属于文件的数组,如果是,则应用属组的权限;如果不同就查看
sgid
权限,如果相同就是用sgid
权限 - 最后只能应用
other
权限。
同用权限
权限说明
类型 | r | w | x |
---|---|---|---|
文件 | 可读 | 可写 | 可将此文件运行为进程 |
目录 | 可以使用ls命令获取其下的所有文件列表 | 可以修改此目录下的文件列表,即创建和删除文件 | 可以 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 |
同
ls -l
可以发现符号链接类型的文件权限都是777
,但实际上通过符号链接访问其指向的文件的时候,权限由其指向的文件权限决定的。
chmod
-
chmod [OPTION]... MODE[,MODE]... FILE...
MODE
表示法:- 赋权表示法:直接操作一类用户的所有权限位。
u=,g=,o=
可以一起使用,也可以单独用其中一个,u=
时表示属主没有权限,如果属组属主相同权限,可以ug=rx
。a=
表示操作所有权限位 - 授权表示法:操作一类用户的一个权限位。用法一般为
u+r,g+x,o+w 或者u-r,g-x,o-w
,a+
或者a-
表示操作所有用户的权限位。
- 赋权表示法:直接操作一类用户的所有权限位。
-
chmod [OPTION]... OCTAL-MODE FILE...
八进制权限表示法
## 修改前 ls -l first.sh # -rw-rw-r--. 1 vagrant vagrant 176 11月 18 14:58 first.sh ## 修改 chmod 770 first.sh ## 修改后 ls -l first.sh #-rwxrwx---. 1 vagrant vagrant 176 11月 18 14:58 first.sh
-
chmod [OPTION]... --reference=RFILE FILE...
引用参考目标文件的权限
## 参考目标文件 ls -l /var/log/messages #-rw-------. 1 root root 70721 11月 18 15:16 /var/log/messages ## 将要被修改文件权限 ls -l first.sh #-rwxrwx---. 1 vagrant vagrant 176 11月 18 14:58 first.sh ## 修改文件权限为参考目标文件 chmod --reference=/var/log/messages first.sh ## 参考修改后的情况 ls -l first.sh #-rw-------. 1 vagrant vagrant 176 11月 18 14:58 first.sh
选项:
-R,--recursive
递归修改,只对目录才有意义,可能会对没有执行权限的文件分配可执行权限,有风险,慎用
chown命令
chown
命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。
具体用法看这里
特殊权限
-
SUID
:setuid,用户在运行二进制程序时,若此程序拥有SUID
权限,则此程序会根据程序文件本身的属主身份运行,而不是调用此程序的用户.需要特别说明的
suid
仅对二进制命令程序有效,不能作用在shell
等脚本文件上,而且suid
权限仅在命令执行过程中有效。# 命令格式 chmod u{+|-}s file...
SUID
的权限位在属主的可以执行权限x
的位置,如果发起调用的用户原来有执行权限,则显示为s
,否则显示为S
给文件设置SUID,意思在于没权限不要紧,你只要来调用我就将我的属主权限借给你
示例
# 输出当前用户 whoami # vagrant # 使用 cat 查看 /etc/shadow cat /etc/shadow # cat: /etc/shadow: permission denied # 查看 /etc/shadow 权限位情况,只有 root 用户才有权限 ll /etc/shadow # ----------. 1 root root 919 6月 13 17:33 /etc/shadow
root 是超级用户,对所有文件具有最大权限,给
/etc/cat
添加SUID
,使其在被调用的时候,使用root
权限,而不是调用者的权限。# 查看当前用户 whoami # root # 查看 /bin/cat 的权限位 ll /bin/cat # -rwxr-xr-x. 1 root root 54160 10月 30 2018 /bin/cat # 添加 SUID 权限 chmod u+s /bin/cat ll /bin/cat # -rwsr-xr-x. 1 root root 54160 10月 30 2018 /bin/cat # 切换用户 su - vagrant whoami # vagrant cat /etc/shadow # root:$1$GcxvZm4N$67SLqTRkOUb2z5dNFck6P1:18407:0:99999:7::: # bin:*:17834:0:99999:7::: # daemon:*:17834:0:99999:7::: # adm:*:17834:0:99999:7::: # lp:*:17834:0:99999:7::: # ...
-
SGID
sgid
既可以针对文件也可以针对目录。对于文件来说,
sgid
仅对二进制命令程序有效,执行命令的用户可以获得该程序执行期间所属组的权限,这一点和suid
基本类似。对于目录来说,意义就非常重大了。**当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。**若该目录的组拥有写权限,则可以互相修改彼此文件。
# 命令格式 chmod g{+|-}s file...
SGID
的权限位在属组的可以执行权限x
的位置,如果发起调用的用户本身有执行权限,则显示为s
,否则显示为S
演示准备:
# 准备两个两个用户 user1 user2 , 一个用户组 group1 , 并将 group1 设置为 user1 和 user2 的附加组 useradd user1 useradd user2 groupadd group1 usermod -aG group1 user1 usermod -aG group1 user2 # 查看命令执行情况 id user1 #uid=1006(user1) gid=1007(user1) groups=1007(user1),1009(group1) id user2 #uid=1007(user2) gid=1008(user2) groups=1008(user2),1009(group1) # 给 user1 、user2 设置密码 passwd user1 # ... passwd user2 # ... # 创建操作目录 cd /tmp mkdir testsgid ll -d testsgid # drwxrwxr-x. 2 root root 6 Jun 14 03:42 testsgid chown :group1 testsgid chmod g+w testsgid ll -d testsgid # drwxrwxr-x. 2 root group1 6 Jun 14 03:52 /tmp/testsgid
演示
su - user1 cd /tmp/testsgid touch user1.test ll user1.test # -rw-rw-r--. 1 user1 user1 0 Jun 14 03:44 user1.test ## 这里 user1.test 的属主和数组都是user1 su - user2 cd /tmp/testsgid touch user2.test ll user2.test # -rw-rw-r--. 1 user2 user2 0 Jun 14 03:57 user2.test ## 这里 user2.test 的属主和数组都是user2 # 对 testsgid 添加 sgid 修饰 chmod g+s /tmp/testsgid ll -d /tmp/testsgid # drwxrwsr-x. 2 root group1 42 Jun 14 03:57 /tmp/testsgid su - user2 cd /tmp/testsgid touch user2.sgid.test ll user2.sgid.test # -rw-rw-r--. 1 user2 group1 0 Jun 14 04:03 user2.sgid.test ## 这时新创建文件的属主就变成 testsgid 文件夹的属主了 ### ... 同样使用 user1 在 testsgid 中创建文件,属主也都变成 group1 了
-
sticky
一般情况下,对于属组/全局可写的目录,组内的所有用户/全局用户都可以在该目录创建文件或者删除文件,无论是否属主是否是自己。
若是对目录使用了
sticky
权限,则每个用户都可以创建新文件/目录,但是只能删除属主是自己的部分。root
用户除外,root
依然可以删除所有。# 命令格式 chmod o{+|-}t file...
sticky
的权限位在其他用户的可以执行权限x
的位置,如果发起调用的用户本身有执行权限,则显示为s
,否则显示为T
sticky
权限目前只对目录有效,用来阻止非文件的所有者删除文件。系统中的/tmp
和/var/tmp
两个目录默认就是具有sticky
权限的。ll -d /tmp # drwxrwxrwt. 17 root root 4096 Jun 14 04:05 /tmp
权限信息中最后一位
t
表明该目录被设置了 sticky 权限。
还有一种为特殊权限位设置权限的方式,在基于通用权限八进制授权机制的基础上,在左侧再增加一位八进制数字,用以表示特殊权限位。如 chmod 7777 file
facl 访问控制列表
file access control lists
这个功能主要是提供在传统的ugo
和suid/sgid/sticky
之外的另一种更灵活、更精细的权限控制方式,通过facl
可以针对单一的用户或者组设置特定的权限。
facl
允许你给任何的用户或用户组设置任何文件/目录的访问权限。
-
getfacl
用来获取指定文件/目录的facl
信息格式
getfacl file_path
-
setfacl
用来设置文件/目录的facl
权限
参数 | 示例 | 说明 |
---|---|---|
-m | setfacl -m u:username:rwx filepath setfacl -m g:groupname:rwx filepath |
配置后面的 acl 参数给文件/目录使用,不可与 -x 合用; |
-x | setfacl -x u:username filepath setfacl -x g:username filepath |
删除指定用户/组的所有 facl 参数,不可与 -m 同用 |
-R | setfacl -R -m g:groupname:rwx filepath | 递归执行 |
-d | 配置“默认 acl 参数”,只对目录有效,在该目录新建的数据会引用此默认值; | |
-b | 移除所有的 ACL 配置参数; |
$ getfacl user2.sgid.test
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
group::rw-
other::r--
$ setfacl -m u:user1:rwx user2.sgid.test
$ getfacl user2.sgid.test
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
user:user1:rwx
group::rw-
mask::rwx
other::r--
$ setfacl -m g:basher:rwx user2.sgid.test
$ getfacl user2.sgid.test
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
user:user1:rwx
group::rw-
group:basher:rwx
mask::rwx
other::r--
$ ll user2.sgid.test
# 看到权限的后面多了个 + 号
-rw-rwxr--+ 1 user2 group1 0 Jun 14 04:03 user2.sgid.test
umask命令
umask
设置了用户创建文件的默认权限,它与 chmod
的效果刚好相反,umask
设置的是权限“补码”,而chmod
设置的是文件权限码。一般在/etc/profile
、$ [HOME]/.bash_profile
或$[HOME]/.profile
中设置umask
值。
一般来说,umask
命令是在/etc/profile
文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的umask
,可以在该文件中加入相应的条目。如果希望永久 性地设置自己的umask
值,那么就把它放在自己$HOME
目录下的.profile
或.bash_profile
文件中。
-
对于文件来说,这一数字的最大值分别是
6
。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod
命令增加这一权限。 -
目录则允许设置执行权限,这样针对目录来说
umask
中各个数字最大可以到7
。
若没有文件掩码时,文件的默认权限为0666,文件夹的默认权限为0777。但是系统为了保护用户创建文件和文件夹的权限,此时系统会有一个默认的用户掩码(
umask
),大多数的Linux
系统的默认掩码为0022
。用户掩码的作用是用户在创建文件时从文件的默认权限中减去掩码的结果为文件的权限。
创建文件的权限=默认权限(文件0666,文件夹0777)-umask
在用户不修改umask
的情况下,创建文件的权限为:0666-0022=0644。创建文件夹的权限为:0777-0022=0755