相关学习资料
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 */ #includemain() { 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身份进行编译并运行同样的代码
#includemain() { 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