Linux分类笔记(一) 权限管理
普通权限
文件的普通权限
对一个普通的文件使用ls -ll命令后,看到下面的输出内容
而对于文件权限中的每一位,又分别代表了以下的意思
文件类型又有以下几类:
- [d]:目录
- [-]:文件
- [l]:连接文件
- [b]:可供存储的接口设备
- [c]:串行端口设备,如键盘和鼠标
权限的定义:
- r:可读,普通文件的r代表可以读取该文件的实际内容;目录的r代表可以读取该目录结构列表的权限
- w:可写,普通文件的w代表可以编辑,新增或者修改文件内容,但不能删除该文件;目录的w代表可以更改该目录结构列表的权限如新建,删除,重命名,转移该目录下的文件或目录
- x:可执行,普通文件的x代表该文件可以被系统执行;目录的x代表该目录能否成为工作目录,即能否cd进该目录
普通权限变更命令
注意:各种权限的设置对root无效
- chgrp:改变文件所属用户组
- chgrp [-R] groupname filename/dirname:-R是递归更改目录下的文件
- chown:改变文件所有者(也可以实现chgrp的功能)
- chown [-R] username filename/dirname:只修改所有者
- chown [-R] username:groupname filename/dirname:同时修改所有者和用户组
- chown [-R] .groupname filename/dirname:只修改用户组
- chmod:改变文件的权限
- 数字表达 chmod [-R] num filename/dirname
- r:4
- w:2
- x:1
- 将一个文件的权限设置为-rwxr-xr-x: chmod 7555 file
符号表达
将一个文件的权限设置为-rwxr-xr-x: chmod u=rwx,g=rx,o=rx file
特殊权限
文件的特殊权限
在前面的图中,只有rwx这三个普通权限,但是通过浏览tmp目录和/usr/bin/passwd文件的权限,可以发现多了一些特殊权限
当s出现在文件的所有者标记上,代替了x权限,就称为Set UID,简称为SUID的特殊权限,该权限具有以下功能:
SUID仅对二进制程序有效
执行者对于该程序需要具有x的可执行权限
本权限仅限于在执行该程序的过程中有效
执行者将具有该程序所有者的权限
举例说明:一个普通用户要修改自己的密码,该密码是要写入到文件/etc/shadow中的,而/etc/shadow的权限为
-r-------- 1 root root 1249 Nov 9 15:53 /etc/shadow
可见,只有root用户才具有强制修改的能力,而普通用户是可以通过命令passwd来修改自己的密码,这是因为/usr/bin/passwd文件的SUID让所有的用户在执行这个命令时具有root的权限。
当s出现在用户所有组标记上,代替了x权限,就称为Set GID,简称为SGID。该权限具有以下功能:
SGID应用在文件上:
SGID对二进制程序有用
程序执行者对于该程序来说,需具备x的权限
执行者在执行过程中将会获得该程序用户组的支持
SGID应用在目录上:
用户若对于此目录具有r和x的权限时,该用户能够进入此目录
用户在此目录下的有效用户组将会变成该目录的用户组
若用户在此目录下具有w的权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同
SGID对于项目开发来说非常重要
举例说明:A和B两个开发者分别属于不同的用户组,现在需要使用一个共同的目录(/test),在这个目录里的任何文件都可以被双方任意修改内容和属性,但不允许其他人修改。如果只是简单地把A和B放到同一个用户组(developer)中,并且把该/test目录的用户组设置为developer,那么A在test目录下创建的文件的属性为:-rw-r--r-- 1 A A 0 Nov 9 18:02 file
可见,此时A新创建的文件的用户组仍只属于A,所以B是不能做任何修改的,但只要给test目录设置SGID:chmod 2770 /test,此时不管是A还是B,在这个目录下新建的文件都属于develper用户组,并且A和B都在这个目录下新建文件前都设置umask 为002,,那么双方在这个目录下创建的文件都可以被对方任意的修改,而阻止其他人修改
注意上图中的/tmp目录有一个t标记,这个称为SBIT,只针对目录有效,该权限具有以下功能:
当用户对于此目录具有w,x权限,即具有写入的权限
当用户在该目录下创建文件或目录时,仅有自己与root才有权利删除该文件
举例说明:任何用户都能在/tmp目录下创建文件和目录,但是每一个用户只能在/tmp目录下删除自己的文件和目录,而不能删除其他用户的文件和目录。但是root账户可以删除所有
特殊权限变更命令
同样通过chmod命令来修改特殊权限,通过使用数字表达即可:
SUID:4
SGID:2
SBIT:1
只要在普通权限的前面加上一位即可,例如,要设置一个普通权限为755,并且是SUID,就使用命令:chmod 4755 filename即可
文件默认权限
在新建一个文件或者目录时,会根据umask来生成默认权限,直接输入命令umask或者umask -S可以查看当前设置,注意,umask的分数指的是“该默认值需要减掉的权限”。
默认的情况下:
若用户创建文件,该文件是没有执行权限的,所以最大值为666,即-rw-rw-rw-
若用户创建目录,该目录具有所有的权限,所以最大值为777,即drwxrwxrwx
umask的默认值为0022,第一个0代表的是特殊权限,后面三位代表普通权限
那么:
用户新建文件时:(-rw-rw-rw-) - (-----w--w-) = -rw-r--r--(644)
用户新建目录时:(drwxrwxrwx) - (d----w--w-) = drwxr-xr-x(755)
如果要让新建的文件的默认权限变为664,使用命令umask 002即可,注意:在计算默认权限时不要用数字的减法进行运算,假如umask设置为003,此时666-003=663,会平白多出了一个根本不存在的x权限,所以最好使用符号表达式运算
ACL
ACL是Access Control List的缩写,主要提供更加细粒度的权限设置,ACL可以针对单一用户,单一文件或目录进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有用。
ACL必须要有文件系统的支持才行,目前绝大部分的文件系统都支持ACL功能,尤其是CentOS在默认情况下就加入了acl的支持。
getfacl命令:取得某个文件/目录的ACL设置项目
上图中的有效权限的意思是用户或组所设置的权限必须要存在于mask的权限设置范围内才会有效,即不能超出mask规定的权限
setfacl命令:设置某个目录/文件的ACL规定
用法:setfacl [-bkRd] [{-m | -x}] acl参数 filename
参数:
-m:设置后续的acl参数给文件使用,不可与-x合用
-x:删除后续的acl参数,不可与-m合用
-b:删除所有的acl参数
-k:删除默认的acl参数
-R:递归设置acl,子目录也会被设置acl
-d:设置默认的acl参数,只对目录有效,在该目录新建的数据都会引用该值
举例说明:几个程序员对同一个目录(/home/project)具有完全的权限,但是只允许项目经理(manager)进入到该目录里查看(不允许任何的其他人进入该目录,同时项目经理也不能修改任何的东西)。此时就要使用到acl:
setfacl -m u:manager:rx /home/project
此时的/home/project的状态为:
drwxrws---+ 2 root develop 6 Nov 10 11:41 project
SELinux
SELinux是Security Enhanced Linux的缩写,字面上的意思就是安全强化的Linux,是用来防止资源误用的。
传统的文件系统是使用DAC(自主访问控制)来进行访问控制的,就是根据进程的所有者与文件资源的rwx权限来决定该进程有没有访问能力,DAC有几个要害:
1.root具有最高权限,不受任何限制;
2.如果不小心将目录全设置为777,会让任何人随意访问并更改该目录
而SELinux使用MAC(强制访问控制)来进行访问控制,可以针对特定的进程与特定的文件资源来进行权限的控制!也就是说,即使你是root,那么在使用不同的进程时,你所能取得的权限不一定是root,而要看当时该进程的设置而定。如此一来,我们针对控制的主体变成了进程而不是用户,此外,这个主体进程也不能任意使用系统文件资源,因为每个文件资源也有针对该主体进程设置可取用的权限,SELinux提供了一些默认的策略,并在策略内提供多个规则,让你选择是否启用该控制规则。
举例说明:www服务器软件的实现程序为httpd这个进程,默认情况下,httpd仅能在/var/www这个目录下访问文件,如果httpd这个进程要到其他目录去访问数据,除了规则设置要开放外,目标目录也得设置成httpd可读取的模式才行,所以,即使httpd不小心被黑客取得了控制权,他也无权访问/etc/shadows等重要的配置文件
SELinux的启动和关闭
SELinux支持三种模式:
enforcing:强制模式,代表SELinux正在运行中,且强制限制资源访问
permissive:宽容模式,代表SELinux正在运行中,不过仅会有警告信息并不会实际限制资源的访问,用来调试所用
disabled:关闭
使用命令getenforce可以获取当前的模式,一旦更改了模式,就要重启,有两种切换方式:
如果已经处于enforcing模式,但是由于一些设置导致SELinux让某些服务无法运行,就通过命令setenforce 0 来切换到permissive之间的模式,这样只会让SELinux警告无法顺利连接的信息,而不是直接抵挡主体进程的读取权限,通过setenforce 1从permissive切换到enforcing模式
如果要从disabled切换到启动模式,则要修改配置文件/etc/selinux/config,将SELINUX=disabled修改为SELINUX=enforcing,相反,要关闭SELinux就将SELINUX=enforcing修改为SELINUX=disabled,并重启。
注意,从disabled抓换为enforcing时,开机过程会变得漫长,因为要重新写入SELinux安全上下文
SELinux的决策过程
进程能否通过SELinux取得权限就依靠上图的决策过程,由上图可知,主体程序必须要通过SELinux策略内的规则放行后,就可以与目标资源进行安全上下文(值的是上图中的“安全性本文比对”)的比较,若比较失败则无法访问目标,若比较成功就可以开始访问目标,问题是,最终能否访问目标还是要与文件系统的rwx权限设置有关,如此一来,当出现了权限不符合的问题后,就要根据上图一步一步地分析问题。
那么安全上下文究竟是什么?
使用命令ls -Z就可以查看,如下图所示,主要由三个部分组成这个安全上下文
那么在上图中的/usr/sbin/httpd进程又是如何通过SELinux决策访问到/var/www/html/目录下的文件?
首先,/usr/sbin/httpd这个文件具有httpd_exec_t这个类型,在执行这个文件的时候,会让这个文件的主体进程具有httpd这个域,而SELinux的策略中已经针对这个域制定了很多的规则,其中的一条规则就是允许这个域能够读取httpd_sys_content_t这个类型的目标文件,因此,只要把网页放置在/var/www/html目录下,就能被httpd进程读取
但是最终读取文件的限制,就是因为普通权限中含有rx
关于SELinux的策略和规则管理,更详细的内容参考这里:
http://vbird.dic.ksu.edu.tw/linux_basic/0440processcontrol.php
SElinux的运行例子
成功
在/var/www/html目录下新建一个文件并写入内容:
echo “First page” > /var/www/html/index.html
然后在浏览器输入网址http://192.168.1.112,就能看到页面显示First page
这是因为在/var/www/html目录下新建的index.html文件的权限如下:
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
失败
删除刚才在/var/www/html目录下新建的index.html文件
rm -f /var/www/html/index.html
然后在/tmp目录下新建一个文件并写入内容:
echo “Second page” > /var/www/html/index.html
mv index.html /var/www/html
然后在浏览器输入网址http://192.168.1.112/index.html(记得指定index.html否则会变成欢迎页面),弹出了错误提示:“You don't have permission to access /index1.html on this server.”
因为此时的index1.html的权限如下:
-rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 index1.html
留意与上面index.html文件不同的地方(灰色字体),因为httpd进程不能读取user_tmp_t类型的目标文件。这就是SELinux的强大之处
安装setroubleshoot
其实你可以不使用工具就分析SELinux的问题,你可以打开日志文件/var/log/audit/audit.log来直接查找,但是这个日志文件的记录形式让你几乎不能解读,所以使用setroubleshoot来处理Selinux所带来的问题,直接使用yum安装即可:
yum install setroubleshoot setools -y
在安装完成后,就可以使用一个名为sealert的命令来分析日志,这个命令会扫描整个日志文件并识别出SELinux的部分,运行命令:
sealert -a /var/log/audit/audit.log
在前面的例子中已经产生了一个SELinux的问题,所以在我这里可以扫描出内容:
运行在结果中提示的解决方法就可解决SELinux的问题