73、利用SELinux增强Linux系统安全性

利用SELinux增强Linux系统安全性

1. 安装和查看策略文档

若要查看SELinux策略文档,可通过以下方式操作:
- 在Fedora或RHEL系统中,若系统没有策略文档,可在命令行输入 yum install selinux-policy-doc 进行安装。
- 在Ubuntu系统中,在命令行输入 sudo apt-get install selinux-policy-doc 进行安装。

安装完成后,可查看策略文档了解策略规则的创建和打包方式。策略规则包与SELinux的操作模式、策略类型和各种安全上下文共同作用,通过SELinux保障Linux系统的安全。

2. 配置SELinux

SELinux默认是预配置好的,即便不进行任何配置也能使用其功能。不过,预配置的设置很难满足Linux系统所有的安全需求。

SELinux的配置和策略文件位于 /etc/selinux 目录,主要的配置文件是 /etc/selinux/config ,示例如下:

# cat /etc/selinux/config
# 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 - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= can take one of these 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的模式和策略类型。

2.1 设置SELinux模式

  • 查看当前模式 :使用 getenforce 命令查看SELinux的当前模式,使用 sestatus 命令查看当前模式和配置文件中设置的模式。示例如下:
# getenforce
Enforcing
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      31
  • 更改模式设置 :使用 setenforce newsetting 命令更改模式, newsetting 可以是 enforcing 1 (强制模式),也可以是 permissive 0 (宽容模式)。但不能使用该命令将SELinux设置为禁用模式。

以下是将SELinux模式立即更改为宽容模式的示例:

# setenforce 0
# getenforce
Permissive
# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing

需要注意的是,从禁用模式切换到强制模式时,最好修改配置文件并重启系统。通过 setenforce 命令从禁用模式切换到强制模式可能会因文件标签不正确而导致系统挂起。当从禁用模式更改后重启系统,在宽容或强制模式下,可能需要等待较长时间对文件系统进行重新标记。

若要禁用SELinux,必须编辑SELinux配置文件。重启系统会将模式恢复为配置文件中设置的模式。推荐的更改SELinux模式的方法是修改配置文件,然后重启系统。

修改 /etc/selinux/config 文件中的模式,可将 SELINUX= 行更改为以下之一:
- SELINUX=disabled
- SELINUX=enforcing
- SELINUX=permissive

2.2 设置SELinux策略类型

选择的策略类型决定了SELinux是实施TE、MLS还是基本包。该类型设置直接决定了用于规定对象可访问内容的策略规则集。

默认情况下,策略类型设置为 targeted 。若要更改默认策略类型,可编辑 /etc/selinux/config 文件,将 SELINUXTYPE= 行更改为以下之一:
- SELINUX=targeted
- SELINUX=mls
- SELINUX=minimum

如果将SELinux类型设置为 mls minimum ,需要确保已安装相应的策略包。可通过以下命令进行检查:
- 在Fedora或RHEL系统中,使用 yum list selinux-policy-mls yum list selinux-policy-minimum 命令。
- 在Ubuntu系统中,使用 sudo apt-cache policy package_name 命令。

以下是将策略类型设置为 mls 的SELinux配置文件示例:

# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
...
# SELINUXTYPE= type of policy in use. Possible values are:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy.
#               Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=mls

2.3 管理SELinux安全上下文

SELinux安全上下文使SELinux能够对访问对象的主体实施策略规则。Linux系统已预先分配了安全上下文。

  • 查看安全上下文 :使用 secon 命令查看当前SELinux文件和进程的安全上下文。 secon 命令的可用选项如下表所示:
    | Option | Description |
    | ---- | ---- |
    | -u | 显示安全上下文的用户 |
    | -r | 显示安全上下文的角色 |
    | -t | 显示安全上下文的类型 |
    | -s | 显示安全上下文的敏感级别 |
    | -c | 显示安全上下文的许可级别 |
    | -m | 以MLS范围显示安全上下文的敏感和许可级别 |

如果不指定任何选项, secon 命令将显示当前进程的安全上下文。若要查看其他进程的安全上下文,可使用 -p 选项;若要查看文件的安全上下文,可使用 -f 选项。示例如下:

# secon -urt
user: unconfined_u
role: unconfined_r
type: unconfined_t
# secon -urt -p 1
user: system_u
role: system_r
type: init_t
# secon -urt -f /etc/passwd
user: system_u
role: object_r
type: passwd_file_t

若要查看自己的安全上下文,可使用 id 命令。

2.3.1 管理用户安全上下文

每个系统用户登录ID都映射到特定的SELinux用户ID。使用 semanage login -l 命令查看系统上的映射列表。示例如下:

# semanage login -l
Login Name           SELinux User         MLS/MCS Range     Service
__default__          unconfined_u         s0-s0:c0.c1023    *
root                 unconfined_u         s0-s0:c0.c1023    *

使用 semanage user -l 命令查看SELinux用户及其关联角色的当前显示。示例如下:

# semanage user -l
             Labeling MLS/      MLS/
SELinux User Prefix   MCS Level MCS Range       SELinux Roles
guest_u      user     s0        s0              guest_r
...
user_u       user     s0        s0              user_r
xguest_u     user     s0        s0              xguest_r

若需要添加新的SELinux用户名,可使用 semanage user -a selinux_username 命令;若要将登录ID映射到新添加的SELinux用户名,可使用 semanage login -a -s selinux_username loginID 命令。

2.3.2 管理文件安全上下文

文件标签对于维护对每个文件数据的正确访问控制至关重要。SELinux在安装时和从禁用模式切换后重启系统时会设置文件安全标签。使用 ls -Z 命令查看文件的当前标签(即安全上下文)。示例如下:

# ls -Z /etc/passwd
-rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/passwd

管理文件安全上下文标签的命令如下表所示:
| Utility | Description |
| ---- | ---- |
| chcat | 更改文件安全上下文标签的类别 |
| chcon | 更改文件的安全上下文标签 |
| fixfiles | 调用 restorecon/setfiles 实用程序 |
| restorecon | 与 setfiles 实用程序功能相同,但界面不同 |
| setfiles | 验证和/或更正安全上下文标签,可在向系统添加新策略模块时用于文件标签验证和/或重新标记文件 |

以下是使用 chcon 命令将 file.txt 文件关联的SELinux用户从 unconfined_u 更改为 system_u 的示例:

# ls -Z file.txt
-rw-rw-r--. johndoe johndoe
 unconfined_u:object_r:user_home_t:s0 file.txt
# chcon -u system_u file.txt
# ls -Z file.txt
-rw-rw-r--. johndoe johndoe
 system_u:object_r:user_home_t:s0 file.txt
2.3.3 管理进程安全上下文

进程是正在运行的程序。在具有SELinux的系统上,进程也会被赋予安全上下文。进程的安全上下文取决于启动它的进程。

  • systemd 启动的进程会被赋予新的安全上下文。例如,当 apache 守护进程由 systemd 启动时,它会被分配类型(即域) httpd_t
  • 用户运行的程序或应用程序(父进程),新进程(子进程)会继承用户的安全上下文(前提是用户被允许运行该程序)。
  • 进程也可以运行程序,子进程会继承其父进程的安全上下文,从而在相同的域中运行。

可使用以下命令更改程序运行的安全上下文:
- runcon :使用选项确定用户、角色和类型(即域)来运行程序。
- sandbox :在严格控制的域(即沙箱)中运行程序。

使用 runcon 可能会导致一些问题,因此需谨慎使用;而 sandbox 提供了很大的保护,可灵活地在Linux系统上测试新程序。

2.4 管理SELinux策略规则包

策略规则用于确定主体是否有权访问对象,它们被分组到包(也称为模块)中,并随SELinux一起安装。使用 semodule -l 命令查看系统上的模块,该命令会列出所有策略模块及其当前版本号。示例如下:

# semodule -l
abrt
accountsd
acct
...
xserver
zabbix
zarafa
zebra
zoneminder
zosremote

在Fedora系统上,可使用以下工具管理和创建自己的策略模块:
| Policy Tool | Description |
| ---- | ---- |
| audit2allow | 根据拒绝操作的日志生成策略允许/不审核规则 |
| audit2why | 根据拒绝操作的日志生成访问被拒绝的原因描述 |
| checkmodule | 编译策略模块 |
| checkpolicy | 编译SELinux策略 |
| load_policy | 将新策略加载到内核中 |
| semodule_expand | 扩展策略模块包 |
| semodule_link | 将策略模块包链接在一起 |
| semodule _ package | 创建策略模块包 |

以下是一个典型的用于创建本地策略规则的示例策略:

# cat /usr/share/doc/selinux-policy/example.te
policy_module(myapp,1.0.0)
########################################
#
# Declarations
#
type myapp_t;
type myapp_exec_t;
domain_type(myapp_t)
domain_entry_file(myapp_t, myapp_exec_t)
type myapp_log_t;
logging_log_file(myapp_log_t)
type myapp_tmp_t;
files_tmp_file(myapp_tmp_t)
...
allow myapp_t myapp_tmp_t:file manage_file_perms;
files_tmp_filetrans(myapp_t,myapp_tmp_t,file)

2.5 通过布尔值管理SELinux

SELinux策略规则的编写和模块的创建是一项复杂且耗时的工作,创建不正确的策略规则可能会危及Linux系统的安全。幸运的是,SELinux提供了布尔值。

布尔值是一个开关,可用于打开或关闭设置。使用布尔值开关可以在不了解策略编写的情况下更改SELinux策略规则的部分内容,并且无需重启系统。

  • 查看布尔值列表 :使用 getsebool -a 命令查看SELinux中当前使用的所有布尔值列表。示例如下:
# getsebool -a
abrt_anon_write --> off
abrt_handle_event --> off
...
xserver_object_manager --> off
zabbix_can_network --> off
  • 查看特定策略 :使用 getsebool 命令并传入策略名称,查看可由布尔值修改的特定策略。示例如下:
# getsebool httpd_can_connect_ftp
httpd_can_connect_ftp --> off
  • 切换策略 :使用 setsebool 命令切换策略,该命令会临时更改策略规则。若需要永久更改设置,可使用 -P 选项。 setsebool 命令有六个设置:三个用于打开策略( on 1 true ),三个用于关闭策略( off 0 false )。

以下是限制用户从 /home 目录执行程序的示例:

# setsebool -P allow_user_exec_content off
# getsebool allow_user_exec_content
allow_user_exec_content --> off

布尔值使修改当前SELinux策略规则变得更加容易。SELinux的命令行配置实用程序(如 getsebool )易于使用。若需要GUI配置工具,可通过以下命令安装:
- 在Fedora系统中,使用 yum install policycoreutils-gui 命令。
- 在Ubuntu系统中,使用 sudo apt-get install policycoreutils 命令。

使用 system-config-selinux 命令打开GUI配置界面。

2.6 监控和故障排除SELinux

SELinux是监控系统的另一个工具,它会记录所有访问拒绝信息,有助于确定是否正在尝试进行攻击,这些日志文件也有助于解决SELinux问题。

2.6.1 理解SELinux日志记录

SELinux在审查特定安全上下文的策略规则时使用一个名为访问向量缓存(AVC)的缓存。当访问被拒绝(即AVC拒绝)时,拒绝消息会被记录到日志文件中。

拒绝消息的记录位置取决于 auditd rsyslogd 守护进程的状态:
- 如果 auditd 守护进程正在运行,拒绝消息将记录到 /var/log/audit/audit.log 文件中。
- 如果 auditd 未运行,但 rsyslogd 守护进程正在运行,拒绝消息将记录到 /var/log/messages 文件中。

如果 auditd rsyslogd 都在运行,并且系统上有 setroubleshootd 守护进程,拒绝消息将同时发送到 audit.log messages 日志文件中, setroubleshootd 守护进程会将 messages 日志文件中的拒绝信息转换为更易于理解的格式。

2.6.2 故障排除SELinux问题的一般流程

当遇到SELinux相关问题时,可以按照以下流程进行故障排除:

graph LR
    A[发现系统异常或访问被拒] --> B[检查SELinux日志]
    B --> C{日志位置}
    C -->|auditd运行| D[/var/log/audit/audit.log]
    C -->|auditd未运行但rsyslogd运行| E[/var/log/messages]
    D --> F[分析AVC拒绝消息]
    E --> F
    F --> G{是否能确定问题原因}
    G -->|是| H[根据原因解决问题]
    G -->|否| I[使用audit2why分析]
    I --> J[获取访问被拒原因描述]
    J --> H
    H --> K{问题是否解决}
    K -->|是| L[完成故障排除]
    K -->|否| M[进一步检查策略规则或咨询专家]
  • 检查SELinux日志 :根据 auditd rsyslogd 守护进程的状态,找到相应的日志文件,查看其中的AVC拒绝消息。
  • 分析AVC拒绝消息 :仔细阅读拒绝消息,尝试确定是哪个策略规则被违反,以及涉及的主体和对象。
  • 使用 audit2why 工具 :如果无法直接从日志中确定问题原因,可以使用 audit2why 命令,它会根据拒绝操作的日志生成访问被拒绝的原因描述。
  • 根据原因解决问题 :根据分析结果,可能需要调整SELinux策略规则、更改文件或进程的安全上下文,或者修改布尔值设置。
  • 进一步检查和咨询 :如果问题仍然存在,可能需要深入检查策略规则包,或者向SELinux专家咨询。

2.7 SELinux配置示例总结

为了更清晰地展示SELinux的配置过程,下面总结一些常见的配置示例:
| 配置需求 | 操作步骤 |
| ---- | ---- |
| 安装SELinux策略文档 |
- Fedora或RHEL系统: yum install selinux-policy-doc
- Ubuntu系统: sudo apt-get install selinux-policy-doc |
| 更改SELinux模式 |
- 临时更改: setenforce newsetting newsetting enforcing / 1 permissive / 0
- 永久更改:编辑 /etc/selinux/config 文件,将 SELINUX= 行改为 disabled enforcing permissive ,然后重启系统 |
| 更改SELinux策略类型 | 编辑 /etc/selinux/config 文件,将 SELINUXTYPE= 行改为 targeted mls minimum ,若为 mls minimum 需先检查并安装相应策略包 |
| 查看用户安全上下文映射列表 | semanage login -l |
| 添加新的SELinux用户名并映射登录ID |
- 添加用户名: semanage user -a selinux_username
- 映射登录ID: semanage login -a -s selinux_username loginID |
| 查看文件安全上下文 | ls -Z file_path |
| 更改文件安全上下文 | chcon -option value file_path option -u -r -t 等) |
| 查看策略模块 | semodule -l |
| 临时切换布尔值策略 | setsebool policy_name on/off |
| 永久切换布尔值策略 | setsebool -P policy_name on/off |

2.8 SELinux的优势和注意事项

2.8.1 SELinux的优势
  • 增强安全性 :通过精细的策略规则和安全上下文,SELinux可以有效限制进程和用户的访问权限,防止非法访问和攻击。
  • 日志监控 :记录所有访问拒绝信息,有助于及时发现潜在的安全威胁,并进行故障排除。
  • 灵活性 :支持多种策略类型和布尔值设置,可以根据不同的安全需求进行灵活配置。
2.8.2 注意事项
  • 配置复杂性 :SELinux的配置和策略规则编写较为复杂,需要一定的专业知识和经验。在进行配置时,建议先在测试环境中进行试验,避免对生产系统造成影响。
  • 性能影响 :SELinux在运行过程中会对系统性能产生一定的影响,尤其是在进行大量文件或进程的安全上下文检查时。在高负载系统中,需要权衡安全性和性能。
  • 文件重新标记 :从禁用模式切换到其他模式时,系统会自动对文件系统进行重新标记,这可能需要较长时间,尤其是在文件系统较大的情况下。

3. 总结

SELinux是Linux系统中一个强大的安全增强工具,通过策略规则、安全上下文和布尔值等机制,可以有效提高系统的安全性。虽然其配置和管理具有一定的复杂性,但通过合理的配置和监控,可以充分发挥其优势,保护系统免受各种安全威胁。在实际应用中,建议根据系统的安全需求和实际情况,逐步进行SELinux的配置和优化,同时注意配置过程中的注意事项,确保系统的稳定运行。

希望本文能够帮助你更好地理解和使用SELinux,提升Linux系统的安全性。如果你在使用过程中遇到任何问题,欢迎参考相关文档或咨询专业人士。

分布式微服务企业级系统是一个基于Spring、SpringMVC、MyBatis和Dubbo等技术的分布式敏捷开发系统架构。该系统采用微服务架构和模块化设计,提供整套公共微服务模块,包括集中权限管理(支持单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和通知等功能。系统支持服务治理、监控和追踪,确保高可用性和可扩展性,适用于中小型企业的J2EE企业级开发解决方案。 该系统使用Java作为主要编程语言,结合Spring框架实现依赖注入和事务管理,SpringMVC处理Web请求,MyBatis进行数据持久化操作,Dubbo实现分布式服务调用。架构模式包括微服务架构、分布式系统架构和模块化架构,设计模式应用了单例模式、工厂模式和观察者模式,以提高代码复用性和系统稳定性。 应用场景广泛,可用于企业信息化管理、电子商务平台、社交应用开发等领域,帮助开发者快速构建高效、安全的分布式系统。本资源包含完整的源码和详细论文,适合计算机科学或软件工程专业的毕业设计参考,提供实践案例和技术文档,助力学生和开发者深入理解微服务架构和分布式系统实现。 【版权说明】源码来源于网络,遵循原项目开源协议。付费内容为本人原创论文,包含技术分析和实现思路。仅供学习交流使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值