简介
在Linux的安全机制中,通过文件权限来限定某些用户是否对该资源具有某种能力,这种访问控制称为自主访问控制(Discretionary Access Control,DAC)。一个程序能否被启动成为进程取决于发起者是否对该程序有执行权限。当该程序成为进程后,该进程的属主则不再是程序文件的属主,而是这个进程发起者。而该程序对Linux系统其他资源的访问能力,则取决于该进程的属主(进程发起者)是否对这些资源有相应的访问权限,称为Linux的安全上下文(Security Context)。
然而,这种机制是不安全,或者说是不完善的。当某个进程被挟持时(或者说被植入恶意代码),那么挟持该进程的用户就可以对进程属主访问能力内的资源任意修改。于是,在Linux 2.6内核版本以后,Linux在内核层引入了一个新的安全子系统——SELinux(Security Enhanced Linux),属于强制访问控制(Mandatory Access Control,MAC)。其工作机制是将某些服务进程划分入对应的域内,对应的服务进程只能访问域内的资源,达到限制进程访问空间的目的。首先SELinux在系统启动时为根下所有资源打上一个类型标签,随后对服务进程分配域,并且在规则库中定义哪些域能访问何种类型的资源,就实现了将进程限制在一个沙箱内运行。而对于某些特殊的服务,在不同状况下所需要访问的资源时不同的,所以为保证其正常运行,它所在的杀向是可以扩容或者切换的。
SELinux工作特性及管理
SELinux虽然能很好的限制进程访问能力,但是对于一些不容易被利用的进程来说,它显得没必要,并且在实际管理工作中也没有足够的精力去为每个进程配置SELinux,所以SELinux又提供了两种工作级别:
strict:所有进程都受到SELinux的控制
targeted:仅一些必要的进程受到SELinux的控制
在实际使用中,更倾向于使用targeted级别。同时,SELinux还提供了两种(三种)工作状态:
disabled:关闭SELinux
permissive:启用SELinux,但是对于进程的违规操作不作限制,仅记录于日志中
enforcing:启用SELinux,对受SELinux控制的进程严格管理
想要更改SELinux的工作模式可以通过命令或修改配置文件两种方式修改,不过命令方式只能临时有效,对于已禁用SELinux的情况下想要启用SELinux,必须修改其配置文件并且重启计算机生效。
# getenforcing #查看SELinux当前工作状态
# setenforing 0 #设置SELinux工作状态为permissive,1则为enforing
# vim /etc/selinux/config #SELinux工作状态配置文件
/*
SELinux= #该选项定义工作状态,可用值:permissive,enforing,disabled
*/
对SELinux的管理,通常是改变某些文件的类型来改变进程对其的访问能力:
# ls -lZ /FILE #查看某文件的SELinux相关标签
# chcon -t TYPE /FILE #更改某文件的类型标签,-r选项递归修改
# restorecon /FILE #还原某文件标签为默认值,-r选项递归还原
在某些场景下也可以禁用服务的某些功能来实现缩小服务进程访问能力的目的,这些功能通过设置其对应模块的布尔值来表示其是否开启。
# getsebool -a #获取所有服务进程模块的布尔值
# getsebool BOOLEAN #指定获取某功能模块是否开启
# setsebool BOOLEAN=BOOL #修改某功能的布尔值,可用值on,off(1,0),使用-P选项则会将修改写入策略库,永久有效