Linux安全系统

Linux OS在嵌入式,移动设备和服务器上获得巨大成功的原因之一是内核,相关服务和应用程序的高度安全性。但是,如果您仔细观察Linux内核的体系结构,那么您将无法在其中找到一个负责安全性的盒子。Linux安全子系统隐藏在哪里,它由什么组成?



Linux安全模块和SELinux的背景



安全增强型Linux是一套基于强制性和基于角色的访问模型的规则和访问机制,可保护Linux系统免受潜在威胁并修复传统Unix安全系统自由访问控制(DAC)的缺陷。该项目起源于美国国家安全局的官僚机构,主要由承包商Secure Computing Corporation和MITER以及许多研究实验室直接参与开发。





Linux安全模块



Linus Torvalds对NSA的新开发发表了许多评论,以便可以将它们包含在上游Linux内核中。他描述了一个通用环境,该环境具有一组用于管理对象操作的拦截器,以及一组在内核数据结构中用于存储相应属性的保护字段。然后,可加载内核模块可以使用此环境来实现任何所需的安全模型。 LSM在2003年完全集成到Linux v2.6内核中。



LSM框架包括数据结构中的保护字段,并调用以拦截内核代码中关键点处的函数以管理它们并执行访问控制。它还增加了注册安全模块的功能。/ sys / kernel / security / lsm接口包含系统上活动模块的列表。LSM挂钩存储在列表中,列表以CONFIG_LSM中指定的顺序调用。详细的挂钩文档包含在include /linux/lsm_hooks.h头文件中。



LSM子系统允许完全相同的稳定Linux内核v2.6的SELinux集成。SELinux几乎立即成为安全Linux环境的事实上的标准,并成为最受欢迎的发行版的一部分:RedHat Enterprise Linux,Fedora,Debian,Ubuntu。



SELinux词汇表



  • — SELinux , Unix/Linux user id, , . Linux SELinux. SELinux , , — .
  • — SELinux , . . . , . — , . : sysadm_t , user_t, . init init_t, named named_t.
  • — , SELinux. , . . Role Based Access Control (RBAC), SELinux.
  • — Type Enforcement, , . , , , , , , . .
  • — , . : , , ., , , — .
  • SELinux — SELinux . SELinux , — — . , . .


LSM SELinux



尽管名称如此,但LSM通常不是Linux可加载模块。但是,就像SELinux一样,它直接集成到内核中。对LSM源代码的任何更改都需要新的内核编译。必须在内核设置中启用相应的选项,否则引导后将不会激活LSM代码。即使这样,也可以使用OS bootloader选项启用它。





LSM检查堆栈



LSM在核心核心功能中配有可能与检查相关的挂钩。 LSM的主要特征之一是它们是堆叠的。因此,仍然执行标准检查,并且每个LSM层仅添加其他控件。这意味着该禁令无法回滚。如图所示,如果常规DAC检查的结果失败,那么它甚至不会到达LSM挂钩。



SELinux已经采用了Fluke研究操作系统的Flask安全体系结构,特别是最小特权原则。顾名思义,此概念的实质是授予用户或仅处理执行预期动作所必需的那些权限。使用强制访问类型来实现该原理,因此SELinux准入控制基于domain =>类型模型。



由于强制键入访问权限,因此SELinux具有比Unix / Linux OS中使用的传统DAC模型更重要的访问控制功能。例如,您可以限制ftp服务器将使用的网络端口号,允许在特定文件夹中写入和更改文件,但不能删除它们。



SELinux的主要组件是:



  • Policy Enforcement Server-组织访问控制的主要机制。
  • 系统安全策略数据库。
  • 与LSM事件拦截器的交互。
  • Selinuxfs-伪FS,与/ proc相同,安装在/ sys / fs / selinux中。由Linux内核在运行时动态填充,并包含包含SELinux状态信息的文件。
  • 访问向量缓存-性能助手。




SELinux的工作方式



所有这些工作如下。



  1. 用SELinux术语来说,某个主题在DAC检查之后对对象执行允许的操作,如上图所示。执行该操作的请求转到LSM事件拦截器。
  2. 从那里,该请求以及主题和对象的安全性上下文被传递到SELinux抽象和挂钩逻辑模块,该模块负责与LSM进行交互。
  3. Policy Enforcement Server是用于确定主体对对象的访问权的实例,并且来自SELinux AnHL的数据也随之而来。
  4. 为了决定访问还是拒绝,Policy Enforcement Server会参考最常用的访问矢量缓存(AVC)规则的缓存子系统。
  5. 如果在高速缓存中找不到对应规则的解决方案,则该请求将传递到安全策略数据库。
  6. 来自数据库和AVC的搜索结果将返回到Policy Enforcement Server。
  7. 如果找到的策略与请求的操作一致,则允许该操作。否则,禁止操作。


管理SELinux设置



SELinux以以下三种模式之一运行:



  • 强制执行-严格遵守安全策略。
  • 允许-允许违反限制,在日志中进行相应标记。
  • 禁用-安全策略无效。


您可以使用以下命令查看SELinux处于哪种模式。



[admin@server ~]$ getenforce
Permissive


重新引导之前更改模式,例如,将其设置为Enforceing或1。permissive参数对应于数字代码0。



[admin@server ~]$ setenfoce enforcing
[admin@server ~]$ setenfoce 1 #  


您还可以通过编辑文件来更改模式:



[admin@server ~]$ 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 - 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 = targete



setenfoce的区别在于,当操作系统启动时,将根据配置文件的SELINUX参数的值来设置SELinux模式。此外,对禁用<=>的更改仅通过编辑/ etc / selinux / config文件并在重新引导后生效。



查看简要状态报告:



[admin@server ~]$ 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

Policy MLS status: enabled

Policy deny_unknown status: allowed

Max kernel policy version: 31


一些本机实用程序使用-Z参数来查看SELinux属性。



[admin@server ~]$ ls -lZ /var/log/httpd/
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200920
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20200927
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201004
-rw-r--r--. root root system_u:object_r:httpd_log_t:s0 access_log-20201011
[admin@server ~]$ ps -u apache -Z
LABEL                             PID TTY          TIME CMD
system_u:system_r:httpd_t:s0     2914 ?        00:00:04 httpd
system_u:system_r:httpd_t:s0     2915 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2916 ?        00:00:00 httpd
system_u:system_r:httpd_t:s0     2917 ?        00:00:00 httpd
...
system_u:system_r:httpd_t:s0     2918 ?        00:00:00 httpd


与通常的ls -l输出相比,还有以下格式的几个其他字段:



<user>:<role>:<type>:<level>



最后一个字段表示类似机密标记的内容,并且由两个元素组成:



  • s0-重要性,也写为低电平-高电平间隔
  • c0,c1…c1023-类别。


更改访问配置



使用semodule加载SELinux模块,添加和删除它们。



[admin@server ~]$ semodule -l |wc -l #  
408
[admin@server ~]$ semodule -e abrt #enable -  
[admin@server ~]$ semodule -d accountsd #disable -  
[admin@server ~]$ semodule -r avahi #remove -  


第一个命令是semanage login,将SELinux用户绑定到操作系统用户,第二个命令显示列表。最后,带有-r开关的最后一条命令将删除SELinux用户到OS帐户的映射。上一节中提供了有关MLS / MCS范围值的语法的说明。



[admin@server ~]$ semanage login -a -s user_u karol
[admin@server ~]$ 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 *

system_u system_u s0-s0:c0.c1023 *

[admin@server ~]$ semanage login -d karol



semanage的用户命令是用来管理SELinux的用户和角色之间的映射。



[admin@server ~]$ semanage user -l
                Labeling   MLS/       MLS/                          
SELinux User    Prefix     MCS Level  MCS Range             SELinux Roles
guest_u         user       s0         s0                    guest_r
staff_u         staff      s0         s0-s0:c0.c1023        staff_r sysadm_r
...
user_u          user       s0         s0                    user_r
xguest_u        user       s0         s0                    xguest_r
[admin@server ~]$ semanage user -a -R 'staff_r user_r'
[admin@server ~]$ semanage user -d test_u


命令参数:



  • -a添加定制角色映射条目;
  • -l用户和角色之间的对应关系列表;
  • -d删除用户定义的角色映射条目;
  • -R分配给用户的角色列表;


文件,端口和布尔值



每个SELinux模块都提供了一组用于标记文件的规则,但是您也可以根据需要添加自己的规则。例如,我们希望Web服务器具有对/ srv / www文件夹的访问权限。



[admin@server ~]$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?
[admin@server ~]$ restorecon -R /srv/www/


第一个命令注册新的标记规则,第二个命令根据当前规则重置或设置文件类型。



同样,TCP / UDP端口被标记为只有相应的服务才能侦听它们。例如,为了使Web服务器在端口8080上侦听,您需要运行命令。



[admin@server ~]$ semanage port -m -t http_port_t -p tcp 8080


大量SELinux模块的参数可以采用布尔值。可以使用getsebool -a查看此类参数的完整列表。布尔值可以使用SetSebool进行更改。



[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_cgi --> on
[admin@server ~]$ setsebool -P httpd_enable_cgi off
[admin@server ~]$ getsebool httpd_enable_cgi
httpd_enable_homedirs --> off


研讨会,访问Pgadmin-web界面



考虑一个实践中的示例,我们在RHEL 7.6 pgadmin4-web上安装了PostgreSQL数据库管理。我们通过设置pg_hba.conf,postgresql.conf和config_local.py完成了一个小任务,设置了文件夹的权限,从pip安装了缺少的Python模块。一切准备就绪,运行它,并得到500 Internal Server error







从典型的犯罪嫌疑人开始,检查/ var / log / httpd / error_log。那里有一些有趣的条目。 此时,大多数Linux管理员都倾向于运行setencorce 0,仅此而已。坦率地说,我第一次这样做。当然,这也是一种出路,但远非最佳。



[timestamp] [core:notice] [pid 23689] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0

...

[timestamp] [wsgi:error] [pid 23690] [Errno 13] Permission denied: '/var/lib/pgadmin'

[timestamp] [wsgi:error] [pid 23690]

[timestamp] [wsgi:error] [pid 23690] HINT : You may need to manually set the permissions on

[timestamp] [wsgi:error] [pid 23690] /var/lib/pgadmin to allow apache to write to it.








尽管结构庞大,但SELinux仍然易于使用。安装setroubleshoot软件包并查看系统日志就足够了。 请注意,尽管操作系统中存在systemd,但是必须以这种方式重新启动被审计的服务,并且不使用systemctl。系统日志不仅会显示阻止的事实,而且还会显示克服该限制的原因和方式 我们执行以下命令:我们 检查对pgadmin4-web网页的访问,一切正常。



[admin@server ~]$ yum install setroubleshoot

[admin@server ~]$ journalctl -b -0

[admin@server ~]$ service restart auditd
















[admin@server ~]$ setsebool -P httpd_can_network_connect 1

[admin@server ~]$ setsebool -P httpd_can_network_connect_db 1















All Articles