Linux文件权限;ACL;Setuid、Setgid、Stick bit特殊权限;sudo提权

相关学习资料

http://blog.sina.com.cn/s/blog_4e2e6d6a0100g47o.html
http://blog.csdn.net/aegoose/article/details/25439649
http://www.linuxeden.com/html/unix/20071031/36892.html
http://keren.blog.51cto.com/720558/144908
http://blog.csdn.net/scutth/article/details/6980758
http://blog.csdn.net/trochiluses/article/details/8810010
http://www.cnblogs.com/lcnewstart/archive/2013/03/06/2945638.html

目录

1. Linux文件系统权限
2. Linux文件系统的特殊权限
3. Linux中sudo的作用
4. Linux目录文件权限的安全配置

 

 

1. Linux文件系统权限

文件与(或)目录是文件系统的具体表现形式,在Linux系统管理部分,文件与目录管理映射了Linux文件系统管理策略的重要方面

0x1: 文件系统的默认权限(umask)

当我们在系统中新建一个文件或目录时,系统会自动赋予该文件或目录一个初始访问权限(Value),我们称为默认权限,默认权限与文件系统的umask值有关。可以在终端下直接输入umask来查看当前系统的umask值。例如:

umask
0022

linux会在默认文件系统策略的基础上,将默认权限减去umask得到最终的权限

/*
假设默认的情况下,umask是0022
*/
1. 新建"文件"的权属是-rw-rw-rw-,权限值是666
则新建文件最终的默认权限是-rw-r--r--

2. 新建"目录"的权属是drwxrwxrwx,权限值是777
则新建目录最总的默认权限但是drwxr-xr-x

0x2: Linux系统权限的表示方法及文件与目录的约定权限

文件和目录的权限

[-dcbps][u:rwx][g:rwx][a:rwx]   
1. 类型
    1) d: dir
    2) -: file
    3) l: symbolic link
    4) p: pipe
    5) c: character device
    6) b=block device
    7) s: socket
2. u(属主owner)
    1) r: 4
    2) w: 2
    3) x: 1
3. g(所在组group)
    1) r: 4
    2) w: 2
    3) x: 1
4. o(其他人ohters)
    1) r: 4
    2) w: 2
    3) x: 1
5. a(所有人all)
    1) r: 4
    2) w: 2
    3) x: 1

文件系统的权限表示方法有两种

1. 直接用r、w、x来代表文件的所有者(u owner)、用户组(g group)、其他用户(o other)、所有用户(a all)对某一文件或目录的读、写、执行(x)权限,称为字符表示法,例如
ll
-rw-rw-rw-
2. 用一组(三位)八进制数来间接表示文件或目录的权属,称为数字表示法,例如
chmod 777 test 
注:所谓数字表示法是指将读取(r),写入 (w) 和执行(x) 分別以4(读)、2(写)、l(执行)来代表,沒有授予的部份就表示值为0,然后再把所授予的权限相加而成

0x:3 文件系统属性的修改

chmod的命令可以用下面的正则来表示
chmod [ugoa]*([-+=]([rwxXst]*|[ugo]))+
example

1. chmod 777 /dir/file 设置文件为读写执行(x)  
2. chmod -x /dir/file 删除文件u(owner)g(group)a(all)的可执行(x)  
3. chmod ga-w /dir/file 删除文件g(group)a(all)的可写权限(w)
4. chmod u=rx /dir/file 重设置文件u(owner)为读(r)和执行(x)  
5. chmod +x /dir/file 增加文件u(owner)g(group)a(all)为可执行(x) 

 

 

2. Linux下的身份标识问题

在理解suid、sgid等知识之前,我们必须要先理解一下linux下的身份标识问题

0x1: 标识和有效标识的关系

在linux系统中,存在着标识和有效标识的概念,即

我们知道,uid、euid、gid、egid这些概念属于身份标识,是进行ACL访问控制的基础,所以,我们要明白它们是被用来进行"判断"的,即在判断ACL权限的时候会用到它们,所以,理解它们的概念其实就是在理解linux上不同场景的身份判断的场上了

1. 标识: uid、gid
用于在进程创建时标识并验证用户身份,也就是说,用户只有符合相应的ACL限制才能执行某条命令(启动进程)或者查看某个资源

2. 有效标识: euid、egid
用于在进程运行时,当希望访问其他资源时表示并验证用户身份,也就是说,进程在运行的时候要去访问别的资源或者启动别的程序,这个时候,进程的身份是euid、egid

一般情况下,当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的(即euid=uid egid=gid),但是某些情况下会出现2个ID不同的情况

为了更好的理解这个概念,我们来一起通过几个case的实验帮助我们理解

以root身份编译下面的代码:

/*
su root
gcc test.c -o test
*/
#include <stdio.h>
main()
{
        printf("getuid(): %d\ngeteuid(): %d\ngetgid(): %d\ngetegid(): %d\n", getuid(), geteuid(), getgid(), getegid());
}

以root直接运行一次

因为默认情况下,group用户和other用户也有执行-x权限(注意看上图),所以,即使我们使用非root并且非root组的用户也可以执行

主要到现在的uid=euid、gid=egid(而uid和gid都等于1000则是可以不相等的,但相等也可以,这个不影响)

我么现在去掉other的执行-x权限看看

很容易理解,没有执行权限了嘛,当然不能执行

那现在我们如果对test加上-s特权标识位会怎么样呢?是不是说我们加了-s标识位,所以其他用户就有了临时权限了嘛,就可以去执行test了嘛?是这样吗?

结果还是permission denied!不允许执行!为什么?这里我们就要理解一下了,我们在启动一个进程的时候,系统判断的依据"一定"是uid、gid,不会有别的东西,而且正常情况下,uid=euid、gid=egid。然后在进程运行的时候,进程的身份权限就要看euid、egid了,如果这个时候进程再要去访问别的资源,系统就会去判断euid、egid。这是两个独立的概念,一定要区分开来。

那回到我们的实验上来,我们必须得给test的other添加-x权限,zhenghan这个other帐号才能执行对吧,然后因为test拥有-s标志位,所以到了进程运行中,euid、egid会临时变成root

结果和我们的理论分析是一样的,我们的uid还是1000,但是euid却临时变成了0(root),对于gid和egid也是同理

最后一个实验,我们需要重点关注一下"suid"、"sgid"的概念

"-s"表示当请求执行包含SUID特殊权限的程序时,能够"临时"拥有该程序所有者(属主)对该文件的存取权限,注意,这里说的是属主,并不一定是root(虽然我们上面的例子都是root),这点是容易和sudo混淆的地方

用zhenghan身份进行编译并运行同样的代码

#include <stdio.h>
main()
{
        printf("getuid(): %d\ngeteuid(): %d\ngetgid(): %d\ngetegid(): %d\n", getuid(), geteuid(), getgid(), getegid());
}
/*
su zhenghan
gcc test.c -o test
chmod ug+s test
su root
./test
*/

可以看到,实际结果和理论依然相同,euid临时改成了1000(zhenghan)

0x2: 和身份标识相关的API函数

1. uid_t getuid(void);    
获取uid
2. uid_t geteuid(void);
获取euid(进程运行中的实际uid)
 
3. gid_t getgid (void);
获取gid
4. gid_t getegid (void);
获取eid(进程运行中的实际gid) 

7. int setruid (uid_t RUID);
8. int setreuid (uid_t RUID,uid_t EUID);
 
9. int setgid (gid_t GID);
10. int setrgid (gid_t RGID);
 
11. int setegid (git_t EGID);
12. int setregid (gid_t RGID, gid_t EGID);

5. int setuid (uid_t UID);
在代码中使用setuid是有一定限制的,并不是说我们可以伪装成任意的用户
    1) 如果原来的euid==0(root),则该函数将会设置所有的id都等于新的id(root用户当然可以有权利降级为任何用户)
    2) 如果原来的euid!=0
        2.1) 但是新的id等于原来ruid和suid中的一个,那么也是可以执行的
        2.2) 否则就不能执行
    比如原来的三个id为:ruid=100,euid=200,suid=300
        1) 则setuid(300)可以执行,执行结束以后ruid=100,euid=300,suid=300(也就是说只改变了euid)
        2) setuid(0)就不能执行,即你不能随便从一个低权限用户直接跳到root 

6. int seteuid (uid_t EUID);
无论什么情况,它只改变进程euid,而不改变ruid和suid。
    1) 如果原来的euid==0,则新的euid随意设,都可以成功改变(即root可以随便转换为任意用户)
    2) 如果原来的euid!=0,不同的系统的处理方式是不一样的
        2.1) 但是新的id等于原来ruid和suid中的一个,那么也是可以执行的
        2.2) 否则就不能执行

 

 

2. Linux文件系统的特殊权限

从概念上来说,这一部分的所谓"特殊权限"也应该属于第一部分的文件系统权限,但是因为这类权限比较特殊,我们平时使用ls、ll指令也都看不到,同时这类特殊权限如果配置不当,可能还会引发某些安全风险,所以单独分出来学习

0x1: 文件系统的隐藏权限

除了设置文件或目录的读(r)、写(w)、执行(x)权限外,对于某些有特殊要求的档案(如服务器日志)还可以追加隐藏权限的设定。大部分属性在文件系统的安全管理方面起很重要的作用

lsattr: 显示文件/目录的全部隐藏属性
chattr: 修改文件/目录的隐藏属性
Usage: chattr [-RVf] [-+=AacDdeijsSu] [-v version] files..

1. A
文件或目录的atime(access time)不可被修改(modified), 可以有效防御黑客为了隐藏webshell或者隐藏入侵过程中擦去对敏感文件的访问痕迹
2. a
即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性
3. c
即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作
4. d
即no dump,设定文件不能成为dump程序的备份目标
5. i
设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助
6. j
即journal,设定此参数使得当通过mount参数: data=ordered或者data=writeback挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效
7. s
保密性地删除文件或目录,即硬盘空间被全部收回
8. S
硬盘I/O同步选项,功能类似sync
9. u
与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.
//值得注意的是:
只有superuser(root)或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加这些隐藏选项

0x2: 和提权相关的特殊权限

接下来,我们来谈谈Linux文件系统中的特殊的权限规范,这些权限包括SUID/SGID/Sticky Bit

1. Set UID

SUID是文件属性中的一个特殊的标志位"-s","-s"表示当请求执行包含SUID特殊权限的程序时,能够"临时"拥有该程序所有者(属主)对该文件的存取权限。

set uid之后,权限组合中的-x位被-s所取代
假设普通用户A通过passwd命令更新自己的密码,而/usr/bin/passwd的所有者是root(root,root),也就是说,当A请求执行passwd命令时,实际上是暂时获得root对/usr/bin/passwd的执行权限,并进一步更新/etc/shadow的内容
归纳一下流程是这样的

1. root用户对指定的文件file设置-s位权限
chmod u+s file

2. 意味着其他用户在运行file的时候可以"临时"地获取root的身份
./file
其他用户在运行file的时候,它的临时身份是root

3. file程序再去请求别的资源resource
这个时候,其他用户是以root的临时身份去请求resource的

2. Set GID

SGID在概念上和SUID很类似,当所有者所在的用户组(group)的权限组合中可执行位(x)被s所取代时(例如---rws---),便构成Set GID的权限设置。请求执行者所在的用户组将暂时获得该程序所属的用户组ID(group ID)的存取权限

chmod g+s dir

3. Sticky Bit

当文件系统"其他(others)"的权限组合中可执行位(x)被t所取代时(例如------rwt),便构成Sticky Bit的权限设置
SBIT顾名思义可以起到限制访问的作用,是容易理解而好用的设置,它只对目录有效。当对一个目录A施加了SBIT设定以后,并且使用者对A目录有w和x权限时,则使用者在A目录下所创建的个人文档(含目录)只有使用者本身或root可以执行删除、更名、移动等操作(是否可读依实际权限r而定)

chmod o+t dir 
rm -r dir: error  

 

 

3. Linux中sudo的作用

对于sodu这个命令,我们一定要注意和-s文件属性标志位进行区分,"-s"标签只能让进程在运行时临时拥有属主权限,而使用sudo命名之后,当前进程则直接以root身份运行,前提是当前在sudoers中有配置

1. sudo能够限制"用户"只在某台主机上运行"某些命令"

2. sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。
3. sudo使用时间戳文件来执行类似的"检票"系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。也就是说,我刚刚输入了sudocat /etc/issue 然后可以再次只需要输
入cat/etc/issue即可,不需要再次输入sudo
4. sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0411

 

 

4. Linux目录文件权限的安全配置

0x1: 建议umask安全配置

umask命令用来设置进程所创建的文件的读写权限,最保险的值是0077,即关闭创建文件的进程(owner 拥有者)以外的所有进程的读写权限,表示为-rw-------
在~/.bash_profile中,加上一行命令umask 0077可以保证每次启动Shell后, 进程的 umask权限都可以被正确设定

0x2: sudo

sudo扮演的角色注定了它要在安全方面格外谨慎,否则就会导致非法用户攫取root权限

 

Copyright (c) 2014 LittleHann All rights reserved

 

posted @ 2014-07-23 15:38  郑瀚Andrew  阅读(3041)  评论(0编辑  收藏  举报