Security-Enhanced Linux(SELinux)是一种Linux系统的安全体系结构,允许管理员对系统访问权限进行更精细的控制。它最初由美国国家安全局(NSA)开发,使用Linux安全模块(LSM)对Linux内核打了一系列补丁。
SELinux于2000年发布给开源社区,并于2003年集成到Linux内核中。
SELinux如何工作?
SELinux为系统上的应用、进程和文件定义访问控制。它使用安全策略,安全策略是一组规则,告诉SELinux什么可以或不能被访问,以执行策略允许的访问。
当主体(如应用或进程)发出请求访问对象(如文件)时,SELinux会检查访问向量高速缓存(AVC),其中缓存了主体和对象的权限。
如果SELinux无法根据缓存就访问权限做出决定,它会将请求发送到安全服务器。安全服务器会检查应用、进程和文件的安全上下文做出决定。安全上下文是根据SELinux策略数据库生成的。
如果权限被拒绝,avc: denied
消息将出现在/var/log.messages
。
SELinux如何配置
有几种方式可以配置SELinux来保护系统。最常见的是针对策略(targeted policy)或多级安全(MLS)。
针对策略是默认选项,涵盖一系列进程、任务和服务。MLS可能非常复杂,通常仅政府组织使用。
可以通过查看/etc/sysconfig/selinux
文件来确定系统应该运行的内容。该文件将包含一个部分,显示SELinux是否处于宽容模式、强制模式或禁用模式,以及应加载哪种策略。
/etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
SELinux的视角下,系统中的所有文件、进程和端口都有关联的标签。标签用于将这些受保护资源按照逻辑分类。内核会在启动过程中管理标签。
标签格式为:user:role:type:level(level可选)
。user
、role
和level
更常用于MLS等高级SELinux实现。对于目标策略,type
是最重要的。
SELinux依据类型来执行策略。这些策略定义了是否此种类型的进程可以访问这种类型的文件?
常用用例
- 隔离服务: 为不同的服务指定不同的域,实现进程隔离。例如,可以为httpd、mysqld等服务指定不同的域,防止它们相互访问。
- 实现最小权限: 给不同的服务指定最小的权限,限制其访问权限范围。例如,可以禁止httpd访问用户home目录。
- 保护系统文件: 定义不同的文件类型,并指定哪种类型的进程可以访问这些文件。例如,可以禁止普通用户进程访问系统日志文件。
- 限制软件功能: 禁止某些软件的某些功能。例如,可以禁止sshd进行端口转发。
- 防止未知漏洞利用:SELinux以策略为中心,当某个服务出现漏洞时,攻击者即使获取了服务权限,也无法轻易破坏系统或访问重要文件,因为策略可以限制服务的权限范围。
- 审计与监控: 审计所有访问控制决策,可以根据审计日志监控谁在访问什么资源,检测异常活动。
- 容器化: 为容器技术如Docker提供了安全机制,可以为不同容器指定安全上下文,实现容器隔离。
总之,是一个功能强大的mandatory access control机制。可以为系统提供全面的安全控制,应用于服务隔离、最小权限原理、重要文件保护、软件限制、漏洞利用防护、审计与监控等方面。结合容器等新技术,还可以实现微服务与容器安全。