SELinux基本信息
信息 | 详情 | 备注 |
全称 | Security-Enhanced Linux | |
简称 | SELinux | |
开发单位 | 美国国家安全局(NSA)联合SCC(Secure Computing Corporation)等安全机构 | |
发布时间 | 2000年以GPL协议形式开源 | |
主要功能 | 通过强制访问控制机制限制进程、用户和应用程序对系统资源的访问 | 保护系统免受未授权访问和潜在威胁 |
与内核关系 | 支持从 Linux 内核 2.6.x 版本及以后的版本。 |
•
任何
2.6
版本或更高版本的
Linux
内核都具备运行
SELinux
的基础条件。
•
SELinux
已经成为许多
Linux
发行版(如
Fedora
、
Red Hat Enterprise Linux
、
Debian
、
CentOS
等)的一部分,这些发行版在内核中启用了
SELinux
,并提供了可定制的安全策略以及用户层的库和工具。
|
SELinux主要特点
特点 | 详情 | 备注 |
强制访问控制 | 通过预定义的安全策略或自定义策略强制实施访问控制 | 文件或资源的访问权限还受到策略规则的约束 |
多级安全策略 | SELinux支持多级安全模型,允许系统管理员根据数据的敏感性对数据进行分类,并限制不同级别的数据访问。 | 有助于防止敏感数据的泄露。 |
类型强制访问控制 | 使用类型强制(Type Enforcement,TE)策略,将每个文件、进程和用户分配一个安全级别(称为类型) | 通过确保进程只能访问与其安全级别相匹配的资源,SELinux有效地限制了潜在的安全威胁。 |
基于角色的访问控制 | 用户可以被分配一个或多个角色,这些角色定义了用户可以执行的操作。 | 提高了系统的安全性和灵活性。 |
策略管理 | 允许管理员定义和实施复杂的安全策略,这些策略可以非常精细地控制用户、进程和数据之间的交互。 | 管理员可以根据需要调整或创建新的安全策略,以适应不同的安全需求。 |
审计和日志记录 | SELinux提供了详细的审计和日志记录功能,有助于跟踪和审查系统的安全事件。 | 这对于分析安全漏洞、调查安全事件以及制定改进措施具有重要意义。 |
SELinux的工作模式
工作模式 | 详情 | 备注 |
强制模式(Enforcing) | 执行安全策略,任何违反策略的行为都会被阻止并记录。 | 默认工作模式,提供最高的安全性保障。 |
宽容模式(Permissive) | 不会强制执行安全策略,但会记录违反策略的行为。 | 通常用于策略测试和调试阶段,以便管理员在不影响系统正常运行的情况下发现潜在的安全问题。 |
禁用模式(Disabled) | 不会执行任何安全策略,与没有SELinux的Linux系统类似。 | 用于临时关闭SELinux或在特定情况下避免SELinux对系统性能的影响。 |
SELinux应用场景
应用场景 | 详情 |
服务器安全 | 保护Web服务器、数据库服务器和其他关键服务,防止未经授权的访问。 |
容器安全 | 在容器化环境中提供额外的安全层,限制容器间的相互影响。 |
网络安全 | 通过限制网络服务的通信范围来防止横向移动攻击。 |
敏感数据管理 | 控制对敏感文件或目录的访问,防止数据泄漏。 |
SELinux相关内核配置
配置项 | 详情 |
审计支持(Auditing support) |
•
SELinux
依赖于
Linux
的审计系统来记录安全事件和策略违规。因此,在内核配置中启用审计支持是
SELinux
能够正常工作的基础。
•
这通常位于“内核功能”或“安全选项”下的“审计支持”菜单中。
|
SELinux模块 |
•
在较新的
Linux
内核版本中,
SELinux
可能作为内核模块的一部分被自动包含在内核构建中。
•
在某些情况下,可能需要手动确保
SELinux
相关的模块(如
selinuxfs
)被包含在内核中。
|
安全选项(Security options) | 在内核配置的“安全选项”部分,可找到与SELinux直接相关的配置选项。这些选项可能允许启用SELinux支持、选择SELinux的策略类型(如targeted、minimum等),以及配置其他与SELinux相关的安全特性。 |
文件系统和块设备支持 |
•
SELinux
需要文件系统支持扩展属性(
xattrs
),以便存储与文件和目录相关的安全上下文信息。因此,在内核配置中启用对扩展属性的支持是很重要的。
•
通常位于“文件系统”或“文件系统类型”菜单下的相关选项中。
|
网络和安全相关的其他选项 |
•
SELinux
还可能与网络命名空间、
IPC
命名空间等安全特性相关。
•
这些特性虽然不直接属于
SELinux
配置的一部分,但它们可能对于在特定场景下使用
SELinux
很重要。
|
SELinux组成
SELinux组成 | 详情 | 备注 |
安全上下文 |
•
系统中每个对象(如文件、进程、端口等)都有一个安全上下文(
security context
),包括用户、角色、类型和级别等属性。
| SELinux使用这些安全上下文来决定某个动作(如读取、写入、执行等)是否被允许。 |
策略 |
•
配置文件
/
etc
/
selinux
/config
•
SELinux
策略文件通常位于
/
etc
/
selinux
/
目录下
| 这些文件包含了类型定义、角色定义、布尔值设置以及访问规则等。 |
管理工具 |
•
semodule
、
semanage
等
:
编辑
SELinux
策略文件
•
日志分析工具
:
ausearch
、
aureport
|
策略文件组成 | 详情 | 备注 |
类型强制规则文件(te文件) |
•
每个以
.
te
结尾的文件都包含了类型定义和规则定义。
•
类型定义用于指定主体(如进程)和客体(如文件、目录、套接字等)的安全类型
•
规则定义则用于指定哪些主体可以对哪些客体执行哪些操作。
|
•
SELinux
策略文件中最核心的部分
•
比如
swtelnetd.te
文件中可能定义了
swtelentd
和
swtelentd_exec
两种类型,并规定了
swtelentd
进程可以对哪些文件或目录执行哪些操作。
|
文件上下文定义文件(file_contexts) |
•
保存了系统中所有文件的安全上下文。
•
通过这个文件,管理员可以为系统中的每个文件或目录指定其安全上下文,从而控制哪些进程可以访问它们。
|
•
安全上下文是
SELinux
用于确定访问权限的关键因素之一,它通常由用户、角色、类型和级别组成。
|
属性定义文件(attributes) |
•
包含了
SELinux
策略中使用的所有属性值的定义。
|
•
这些属性值用于进一步细化安全策略,为类型强制规则提供额外的判断依据。
|
布尔值设置文件 |
•
SELinux
还允许通过布尔值来控制某些安全功能的启用或禁用。
•
|
•
这些布尔值的设置通常保存在特定的配置文件中,虽然它们不是直接的类型强制规则文件,但对于调整
SELinux
策略的行为非常重要。
|
策略配置文件(如policy.conf) |
•
在某些
Linux
发行版中,
SELinux
的策略配置可能还包含在如
/
etc
/
selinux
/targeted/policy/
policy.conf
或
/
etc
/
selinux
/strict/policy/
policy.conf
等文件中。
|
•
这些文件包含了策略的整体配置信息,如策略类型(
targeted
、
strict
等)和其他全局设置。
|
注:SELinux策略文件的具体内容和位置可能因不同的Linux发行版和SELinux版本而有所差异。
SELinux的使用
操作 | 详情 | 备注 |
禁用SELinux |
•
在系统启动时,还可以通过向内核传递特定的参数(如
selinux
=0
)来禁用
SELinux
。
| |
永久禁用 |
•
打开
SELinux
的配置文件
/
etc
/
selinux
/config
•
找到
SELINUX=
这一行,通常,这一行会设置为
enforcing
(强制模式)、
permissive
(宽容模式)或
disabled
(禁用模式)。设置为
disabled
。如果不存在这一行,则在文件末尾添加一行
SELINUX=disabled
•
重启系统生效
| |
临时禁用 |
•
将
SELinux
设置为
Permissive
模式:
sudo
setenforce
0/Permissive
•
重新启用
SELinux
的强制模式
:
sudo
setenforce
1/Enforcing
| |
查看状态 |
•
getenforce
命令查看
SELinux
的运行模式
•
sestatus
命令查看
SELinux
的当前状态
| |
查看日志 |
•
SELinux
将所有违反策略的行为记录在
/var/log/audit/audit.log
文件中
•
可以使用
ausearch
和
audit2allow
等工具来分析日志,了解哪些进程间的交互被
SELinux
阻止了
| |
设置进程的可执行文件的安全上下文 |
•
假设有一个名为
/
usr
/local/bin/
myapp
的可执行文件,并且你想将其
SELinux
类型设置为
myapp_t
:
chcon -t myapp_t /usr/local/bin/
myapp
•
使用
semanage fcontext
定义默认安全上下文
:
semanage
fcontext
-a -t
httpd_exec_t
'/
usr
/local/bin/
mywebapp
'
•
恢复默认
SELinux
类型
:
restorecon
-
v
/usr/local/bin/
myapp
•
查看当前可执行文件的安全上下文
: ls -
lZ
/path/to/executable
•
验证
SELinux
类型:
ps
-
eZ
| grep
myapp
|
•
使用
ps
命令结合
Z
选项来查看进程的
SELinux
类型
•
如果所需的
SELinux
类型不存在于当前策略中,你可能需要编辑
SELinux
策略以添加新类型和相关规则。这通常涉及到编辑
SELinux
策略文件(如
.
te
文件),然后重新编译和加载策略。
|
修改文件和目录的上下文 |
•
查看当前上下文
: ls -
lZ
/path/to/
directory_or_file
•
修改上下文
:
chcon [-R] [-t type] [-r role] [-u user] [-l range] file...
•
恢复上下文
:
restorecon
[-R] [-v] file...
|
•
-t type
用来指定新的类型(
type
)。
•
-r role
用来指定新的角色(
role
)。
•
-u user
用来指定新的用户(
user
)。
•
-l range
用来指定新的敏感度级别(
level
),这在
MLS
(
Multi-Level Security
)系统中使用。
•
-R
或
--recursive
表示递归地恢复目录及其所有子目录和文件的上下文。
•
-v
或
--verbose
表示显示详细的操作信息。
|
Android与SELinux
项目 | 详情 |
策略文件的组织和编译 |
•
策略文件组成:
Android
的
SELinux
策略文件主要包括
.
te
(类型强制规则)、
file_contexts
(文件上下文定义)、
property_contexts
(属性上下文定义)等。这些文件定义了
SELinux
的类型、角色、布尔值以及访问控制规则。
•
编译过程:在
Android
构建过程中,
SELinux
策略文件会被编译成二进制格式,并打包进系统镜像中。编译过程通常涉及
checkmodule
、
semodule_package
等工具,这些工具将文本格式的策略文件转换成
SELinux
内核可以理解的二进制格式。
•
模块化设计:从
Android 8.0
开始,
SELinux
策略的设计变得更加模块化,允许芯片厂商和
ODM
厂商独立地更新他们自有的
SELinux
策略部分。这种设计使得策略文件可以被分散存储在不同的分区中(如
vendor.img
、
odm.img
等),并在系统启动时合并加载。
|
SELinux的启动和加载 |
•
启动模式:在系统启动时,
SELinux
并不立即进入强制模式(
Enforcing Mode
),而是先以宽容模式(
Permissive Mode
)运行。在宽容模式下,
SELinux
会记录违反策略的行为,但不会阻止它们。这有助于在不影响系统启动的情况下,发现潜在的策略配置问题。
•
策略加载:在系统启动的早期阶段,
init
进程会加载
SELinux
策略文件,并将其应用到系统中。这包括从各个分区中读取策略文件,并将它们合并成完整的
SELinux
策略集。
|
SELinux标签系统的应用 |
•
标签系统:
SELinux
通过标签系统来控制对系统资源的访问权限。每个进程、文件、目录等系统资源都有一个与之关联的
SELinux
标签,该标签由用户、角色、类型(域)和级别组成。
•
访问控制:
SELinux
根据标签和策略规则来决定一个进程是否可以访问某个资源。如果访问请求符合策略规则,则允许访问;否则,拒绝访问并可能记录相应的安全事件。
|
框架对SELinux的集成 |
•
框架支持:
Android
框架通过提供
SELinux
相关工具来支持
SELinux
的集成。例如,开发者可以使用
SELinux
相关的
API
来查询和修改文件或进程的
SELinux
标签。
•
权限管理:
Android
的权限管理系统与
SELinux
紧密集成。系统服务和应用程序的权限被映射到
SELinux
的类型和规则中,从而实现对系统资源和服务的细粒度访问控制。
|
安全性提升 |
•
限制
root
权限:即使在获得了
root
权限的情况下,
SELinux
仍然能够限制对系统资源的访问。这是因为
SELinux
的访问控制是基于标签和策略的,而不是基于传统的用户权限模型。
•
防止漏洞利用:
SELinux
通过限制对关键系统资源的访问权限,可以降低恶意软件的影响,并防止因代码缺陷而产生的安全漏洞被利用。
|
有关SELinux的工具和命令
命令/工具 | 工作方式 | 备注 |
getenforce |
•
通过读取
SELinux
状态文件(如
/sys/fs/
selinux
/enforce
)来获取当前
SELinux
的执行模式
| 这个文件包含了SELinux的当前状态(Enforcing、Permissive或Disabled) |
setenforce |
•
用于更改
SELinux
的执行模式。
•
它通过向
SELinux
内核模块发送命令来更改模式。
| 需要root权限来执行,因为更改SELinux模式会影响整个系统的安全性。 |
audit2allow |
•
用于分析
SELinux
的
audit
日志,并生成建议的策略规则,以允许被拒绝的访问。
•
生成的规则可以被添加到
SELinux
策略文件中,以放宽或收紧访问控制。
| 它读取SELinux的audit日志(通常通过dmesg、auditd或logcat等工具获取),分析日志中的拒绝消息,并尝试根据这些信息生成相应的SELinux策略规则。 |
semodule_package |
•
将
SELinux
策略模块(
.
te
文件)编译成二进制格式(
.mod
文件),并将其打包成
.pp
文件。
| |
semodule |
•
用于加载、卸载、列出或更新
SELinux
策略模块。加载模块时,
semodule
将
.pp
文件的内容加载到
SELinux
策略数据库中,从而使新的策略规则生效。
|