经常接触电脑文件的人都会知道在电脑中存在的文件其实是有权限限制的,规定了什么用户拥有什么样的权限;这种设定在Windows和Linux上都可以看到,只是大家经常使用的是win的图像化界面可能感觉不是太明显,如果你经常操作过Linux的命令行界面或者架设网站,可能对文件权限有很深的理解。
接下来,就来说一下在Linux下的文件权限的设定以及原理,Linux下对于文件权限的控制主要是通过两个方面,一个是ACL,另一个就是selinux了。
首先来说一下ACL的控制方式。ACL是通过划分拥有者,群组,以及其它来划分用户权限的,每个档案的权限又分为读,写,执行;如下图所示:
建立一个档案或者目录的默认权限与umask有关,umask是指建立一个目录或者档案是的默认值。
对于目录和档案的建立时与umask的关系如下:
若使用者建立为『档案』则预讴『没有可执行( x )权限』,就是只有 rw 这两个项目,也就是最大为 666 分,预设权限如下: -rw-rw-rw-
若用户建立为『目录』,则由于 x 与能否进入该目录有关,因此默认为所有权限均开放,即为 777 分,预讴权限如下: drwxrwxrwx建立一个新的档案或者目录时,就是用上面的权限减去umask的值。如下:在讲到ACL时,其实档案都还有一些默认的权限,这些隐藏的属性对于我们来说有时还是很有用的。接下来会说到连个命令:chattr(配置文件的隐藏属性),lsattr(显示隐藏属性)
1)chattr:配置文件的隐藏属性
2)lsattr:显示隐藏属性
档案的特殊权限:SUID,SGID,SBIT
档案的权限我们所知道的一般就是读,写,执行,但是大家看一下下面的图:
这边多出了一个S的权限,这个就是档案的特殊权限,就是要说SUID或者SGID
1)SUID
当 s 这个标志出现在档案拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个档案的权限状忞:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 癿特殊权限。 那么SUID癿权限对亍一个档案的特殊功能是什么呢?基本上SUID有这样的限制与功能:
1.SUID 权限仅对二迚制程序(binary program)有效;2. 执行者对亍该程序需要具有 x 的可执行权限;3. 本权限仅在执行该程序癿过程中有效 (run-time);4. 执行者将具有该程序拥有者 (owner) 的权限。2)SGID
不与SUID 不同的是,SGID 可以针对档案或者目录设定!如果是对档案来说, SGID 有如下的功能:
1.SGID 对二迚制程序有用;2. 程序执行者对亍该程序来说,需具备 x 的权限;3. 执行者在执行癿过程中将会获得该程序群组的支持!除了 binary program 以外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途! 对一个目录设定了 SGID 癿权限后,他将具有如下的功能:
用户若对于此目录具有 r 不 x 的权限时,该用户能够迚入此目录; 用户在此目录下的有效群组(effective group)将会变成该目录癿群组; 用途:若用户在此目录下具有 w 癿权限(可以新建档案),则使用者所建立的新档案,该新档案的群组与此目录的群组相同。3)SBIT
这个 Sticky Bit, SBIT 目前只针对目录有效,对亍档案已经没有效果了。 SBIT 对于目录的作用是:
此用户对此目录具有 w, x 权限,即具有写入的权限时; 此用户在该目录下建立档案与目录时,仅有自己不 root 才有权力删除该档案
设定特殊权限时:
SUID(4),SGID(2),SBIT(1)
使用chmod时加上相应的权限即可,如chmod 4755 filename
上面我们讲了Linux中传统的权限控制方式,被称作自主式访问控制,基本上,就是依据程序的拥有者与档案资源的rwx权限来决定有无存取能力,不过这种DAC的访问控制有几个困扰那就是:
1)root具有最高权限,如果不小心某支程序被有心人士取得,且该程序具有root的权限,那么这支程序就可以在系统上进行任何资源的存取!
2)用户可以取得程序来变更档案资源的访问权限,如果不小心将某个目录的权限设定为777,由于对任何人的权限都会变成rwx,因此该目录就会被任何人所任意存取。
基于以上的问题,所以提出了一种新的访问控制方式那就是以政策规则制定特定程序读取特定的档案,就是委托式访问控制(MAC),他的具体实现就是我们常说的selinux,接下来就来说一下这个selinux的具体操作。
selinux的运作模式:
selinux控制的主体是程序,而目标则是该程序能否读取的档案资源。
1)主体:selinux主要想要管理的就是程序;
2)目标:主体程序能否存取的目标资源,一般就是文件系统;
3)政策:由于程序和档案数量庞大,因此selinux会依据某些服务来制定基本的存取安全策略。目前提供的主要有两种,分别是:
targeted:针对网络服务限制较多,针对本机限制较少,是预设的策略
stict:完整的selinux限制,限制方面较为严格。
建议是有预设的targeted策略即可。
除了上面所说的主体,目标和策略,主体能不能存取目标除了策略制定以外,还与安全性文本的设定有关,主体与目标的安全性文本设定必须一致才能顺利存取,安全性文本就相当于文件系统的rwx的,具体的实现过程如下:
接下来,再来说一下安全性文本,安全性文本存在于主体程序和目标档案中,档案中安全性文本是存在于iNode中的。我们先来看一下档案的安全性文本是什么样子的,我们可以用ls -Z 命令来查看文件的安全性文本。
如上图所示:安全性文本一共分为三个字段,代表的意思分别是身份识别,角色,类型;
身份识别:相当于账号方面的身份识别,只要的身份识别有以后的三种常见类型:root(表示root的账号身份),system_u(表示系统程序方面的识别,通常就是程序),user_u(代表是一般使用者账号相关的身份)
角色:通过角色字段我们知道这个数据是属于程序,档案资源还是代表使用者。一般的角色有以下的两种:object_r(代表是档案或目录等档案程序),system_r(代表的就是程序,不过,一般的使用者也会被指定为system_r)
类型(最重要):上面所说的两个字段基本是不重要的,重要的就是类型这个字段,基本上,一个主体程序能不能读取这个档案,与类型字段有关。而类型字段在档案和主体程序中定义不太相同,在档案中被称为类型(type),在主体程序中被称为领域(domain);domain与type搭配,则该程序才能顺利的读取档案资源。
接下来就来说一下具体是怎么进行控制的,拿httpd这个程序来举例子,首先网页一般都是放置在/var/www/html目录中的,来看一下主体程序和目录的权限:
httpd 属亍 httpd_exec_t 这个可以执行的类型,而 /var/www/html 则属于 httpd_sys_content_t 这个可以让 httpd 领域 (domain) 读取的类型。文字看起来太太容易了解了!我们使用图示来说明这两者的关系!
上述的流程告诉我们几个重点,第一个是政策内需要制订详细的 domain/type 相关性;第二个是若档案癿的type 设定错误, 那即使权限设定为 rwx 全开的 777 ,该主体程序也无法读取目标档案资源啦!不过如此一来, 也就可以避克用户将他的家目录设定为 777 时所造成的权限困扰。
selinux的启动,关闭与观察
selinux中共分为三个模式分别是enforcing(强制模式,代表selinux运行中),permissive(宽容模式,代表selinux运作中,不过只有警告信息,并不实际限制)domain/type(这种模式作为selinux的debug之用)disable(关闭)。
查看目前的selinux的模式可以通过getenforce来查看
查看selinux的政策可以通过sestatus来查看:
selinux的配置文件位于/etc/selinux/config,我们来查看一下这个档案
要永久改变selinux的模式可以在配置文件中修改并重启,临时修改的话可以通过setenforce[0|1]命令。
接下来就用www服务器来看一下selinux的运作方式:
首先用ps aux -Z |grep http 来查看一下httpd程序的安全性文本
可以看到程序都是属于httpd_t这个domain的。
接下来建立一个简单的网站首页:
在浏览器上访问,可以看到:
再来看一下这个档案的安全性文本:
如果安全性文本设定了错误,我们可以重设安全性文本:
把错误的安全性文本修改过来,例如/var/www/html中的文件就是要让Apache读取的,如果不能读取那就是不对的,所以应该修改过来,可以使用下面的命令:
监控selinux错误信息的配置,开启以后selinux的错误信息都会写到/var/log/audit/audit.log中:
selinux的政策与策略管理
策略查询: