Linux系统上文件的特殊权限及文件acl
欢迎来到 来到大浪涛天的博客 !
一、Linux系统上文件的特殊权限及文件acl
在Linux操作系统中所有文件都是有权限匹配的,当某一用户执行某一程序开打开对应的文件的时候,放慢动作其实是这样的:
- 系统匹配程序文件的权限,该用户是否具有该程序的执行权限,当然包括匹配属主,属组和other,如果该用户具有该程序的执行权限,那由shell(权限为当前启动shell用户的权限)代理启动该进程。
- 当进程被启动后,进程的权限其实是被映射了当前用户的权限,系统进行匹配需要读写的文件的权限,该用户是否具有该程序的执行权限,当然包括匹配属主,属组和other。
- 当用户的权限满足需要被读写的文件的权限时,该文件可以被正常读取或者写入,否则提示权限不足,这其实就是安全上下文的概念,特殊权限除外。
1. 特殊权限分类
- SUID
- SGID
- STICKY
2. 安全上下文的概念
- 进程以某用户的身份运行;进程是发起此进程进程用户的代理,因此以此用户的身份和权限来完成所有操作;
例如我们执行任何一个程序都是由shell进程来帮忙完成的,如果最开始为root用户,则shell是以root的身份来发起的,当执行了su - hadoop切换到hadoop用户来执行
命令,则shell是以hadoop用户的身份来完成的。
[root@test01 ~]# pstree |grep bash
|-sshd---sshd---bash-+-grep
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ pstree |grep bash
|-sshd---sshd---bash---su---bash-+-grep
- 权限匹配模型:
- 进程的属主是否为被访问的文件的属主;如果是,则应用属主的权限;否则进入第二步,注意这里的属主是指进程的发起者。
- 进程的属主是否为被访问的文件的属组;如果是,则应用属组的权限;否则进入第三步;
- 应用other的权限;
3. 特殊权限SUID的介绍
- 默认的情况下,用户执行程序是程序文件,当程序文件起来成为进程后,是以用户的身份读写文件的:
[root@test01 ~]# cp /bin/cat /tmp/cat
[root@test01 ~]# ls -l /tmp/cat
-rwxr-xr-x 1 root root 54080 5月 30 22:10 /tmp/cat
[hadoop@test01 ~]$ ps -aux |grep bash
hadoop 11450 0.0 1.7 116688 3260 pts/0 S 22:12 0:00 -bash
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ /tmp/cat /etc/shadow
/tmp/cat: /etc/shadow: 权限不够
- 当程序文件里含有SUID的权限后,用户执行程序文件来读写某文件时,当程序文件起来成为进程后,是以程序文件本身的身份来读写文件的,非常有风险不建议使用
[root@test01 ~]# chmod u+s /tmp/cat
[root@test01 ~]# ls -l /tmp/cat
-rwsr-xr-x 1 root root 54080 5月 30 22:10 /tmp/cat
[hadoop@test01 ~]$ /tmp/cat /etc/shadow
root:$6$4ec6LVk0R48G1cGN$rqhHG7nRA/SJM8
- 管理文件的SUID权限:
chmod u+/- s FILE
展示位置:属主的执行权限位
如果属主原本有执行权限,则显示为小写的s
如果属主原本没有执行权限,则显示为大写的S
4. 特殊权限SGID的介绍
默认的情况下,如果在同一个开发组或者应用团队在自己组内有一个公用目录,可以方便自己组内用户都自由读写,我们只能改这个公用目录的权限,把other位开放写的权限,
那这种情况得出来的影响是每个人都对这个目录进行增删改查,为了达到一个小的目的对安全造成了极大的影响,因此产生了SGID这样一个权限。
- 默认情况下用户对某一个目录有执行写入权限,那用户创建的文件的属组为用户的主组或者基本组
[root@test01 ~]# useradd -G mygrp hadoop1
[root@test01 ~]# id hadoop1
uid=1002(hadoop1) gid=1003(hadoop1) 组=1003(hadoop1),1002(mygrp)
[root@test01 ~]# usermod -G mygrp hadoop
[root@test01 ~]# id hadoop
uid=1001(hadoop) gid=1001(hadoop) 组=1001(hadoop),1002(mygrp)
[root@test01 ~]# mkdir -p /tmp/test/hadoop
[root@test01 ~]# chown :mygrp !$
chown :mygrp /tmp/test/hadoop
[root@test01 ~]# chmod g+w /tmp/test/hadoop/
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ cd /tmp/test/hadoop/
[hadoop@test01 hadoop]$ touch hadoop.a
[hadoop@test01 hadoop]$ ls -l
-rw-rw-r-- 1 hadoop hadoop 0 5月 30 22:58 hadoop.a
[root@test01 ~]# su - hadoop1
[hadoop1@test01 ~]$ cd /tmp/test/hadoop
[hadoop1@test01 hadoop]$ touch hadoop1.b
[hadoop1@test01 hadoop]$ ls -l
-rw-rw-r-- 1 hadoop1 hadoop1 0 5月 30 22:59 hadoop1.b
- 当对该目录设置了SGID的权限后,用户在该用户创建的文件的属组为该目录的组,而不是用户的主组或者基本组
[root@test01 ~]# chmod g+s /tmp/test/hadoop/
[root@test01 ~]# ls -ld /tmp/test/hadoop/
drwxrwsr-x 2 root mygrp 39 5月 30 22:59 /tmp/test/hadoop/
[root@test01 ~]# rm -rf /tmp/test/hadoop/*
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ cd /tmp/test/hadoop/
[hadoop@test01 hadoop]$ touch hadoop.a
[hadoop@test01 hadoop]$ ls -l hadoop.1
[hadoop@test01 hadoop]$ ls -l hadoop.a
-rw-rw-r-- 1 hadoop mygrp 0 5月 30 23:03 hadoop.a
[root@test01 ~]# su - hadoop1
[hadoop1@test01 ~]$ cd /tmp/test/hadoop/
[hadoop1@test01 hadoop]$ touch hadoop1.b
[hadoop1@test01 hadoop]$ ls -l hadoop1.b
-rw-rw-r-- 1 hadoop1 mygrp 0 5月 30 23:04 hadoop1.b
- 当把目录的权限设置为某个组,然后把该组添加SGID的权限,最后把一个需要公用的团队的用户都增加该组为附加组,这样属于该附加组的用户都可以自由读取和写入该目录的权限
- 管理文件的SUID权限:
chmod u+/- s DIR
展示位置:属组的执行权限位
如果属组原本有执行权限,则显示为小写的s
如果属组原本没有执行权限,则显示为大写的S
5. 特殊权限Sticky的介绍
- 默认情况下对于属组或全局可写的目录,组内的用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的已有的文件;如果为此目录设置为Sticky权限,则每个用户能创建新文件,且只能删除自己的文件。
- 类似于tmp及/var/tmp目录,如果某系统用于所有用户都可以在一个公共目录上读写删除自己的文件的话,别人不能删除自己的文件,可以将该公共目录权限设置为Sticky位
- 如果上一个问题,hadoop的公用目录上,设置了SGID的权限,只要是mygrp组的用户都可以任意更改删除任意用户的文件,那如果需要限制的话可以在该目录上设置一个Sticky权限,再把该目录的other去除rx权限,防止普通用户进去
[root@test01 ~]# chmod o+t /tmp/test/hadoop/
[root@test01 ~]# chmod o-rx !$
chmod o-rx /tmp/test/hadoop
[root@test01 ~]# ls -ld /tmp/test/hadoop
drwxrws--T 2 root mygrp 39 5月 30 23:04 /tmp/test/hadoop
[root@test01 ~]# su - hadoop
[hadoop@test01 ~]$ cd /tmp/test/hadoop/
[hadoop@test01 hadoop]$ echo "hello hadoop" >hadoop.1
[root@test01 ~]# su - test
[test@test01 ~]$ cat /tmp/test/hadoop/hadoop.1
cat: /tmp/test/hadoop/hadoop.1: 权限不够
[test@test01 ~]$ /tmp/cat /tmp/test/hadoop/hadoop.1
hello hadoop
[root@test01 ~]# su - hadoop1
[hadoop1@test01 ~]$ cd /tmp/test/hadoop/
[hadoop1@test01 hadoop]$ rm -rf hadoop.1
rm: 无法删除"hadoop.1": 不允许的操作
- 管理文件的SUID权限:
chmod u+/- t DIR
展示位置:属组的执行权限位
如果属主原本有执行权限,则显示为小写的t
如果属主原本没有执行权限,则显示为大写的T
6. facl: file access control lists
- 文件的额外赋权机制,在原来的u,g,o权限外,另一层让普通用户能控制赋权给另外用户的用户或组的赋权机制。
- 查看文件的facl的权限,getfacl File.
- 设置facl:
- 赋权给用户:
setfacl -m u:test:rw- File
. - 赋权给组:
setfacl -m g:mygrp:rw- File
.
[root@test01 tmp]# su - test
[test@test01 ~]$ echo "test" >/tmp/test.1
[root@test01 tmp]# su - hadoop
[hadoop@test01 ~]$ echo "hadoop" >/tmp/test.1
-bash: /tmp/test.1: 权限不够
[root@test01 tmp]# setfacl -m u:hadoop:rw- /tmp/test.1
[root@test01 tmp]# su - hadoop
[hadoop@test01 ~]$ echo "hadoop" >/tmp/test.1
[hadoop@test01 ~]$ getfacl /tmp/test.1
getfacl: Removing leading '/' from absolute path names
# file: tmp/test.1
# owner: test
# group: test
user::rw-
user:test:rw-
user:hadoop:rw-
group::rw-
mask::rw-
other::r--
- 撤销赋权facl:
- 针对用户:
setfacl -x u:test File
. - 针对组:
setfacl -x g:mygrp- File
.
- 可以针对某个文件限制不让某个用户访问,如:
[test@test01 ~]$ cat /tmp/1.hadoop
hello hadoop
[root@test01 tmp]# setfacl -m u:test:--- 1.hadoop
[test@test01 ~]$ cat /tmp/1.hadoop
cat: /tmp/1.hadoop: 权限不够
[test@test01 ~]$ getfacl /tmp/1.hadoop
getfacl: Removing leading '/' from absolute path names
# file: tmp/1.hadoop
# owner: hadoop
# group: hadoop
user::rw-
user:test:---
group::rw-
mask::rw-
other::r--