SElinux 设置与HTTP服务结合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SElinux 设置与HTTP服务结合相关的知识,希望对你有一定的参考价值。

SElinux是基于MAC策略的。


DAC:Discretionary Access Control自由访问控制

MAC:Mandatory Access Control 强制访问控制

? DAC环境下进程是无束缚的

? MAC环境下策略的规则决定控制的严格程度

? MAC环境下进程可以被限制的

? 策略被用来定义被限制的进程能够使用那些资源(文件和端口)

? 默认情况下,没有被明确允许的行为将被拒绝

SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。连Root账户也只能在策略范围能运作。


SELinux工作类型:

Centos 6 和 7 默认的工作类型为targeted, 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程。


SELinux安全上下文

在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问

所有文件和端口资源和进程都具备安全标签:安全上下文(security context)

安全上下文有五个元素组成,以冒号分隔

user:role:type:sensitivity:category

?User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程

? Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r

? Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t

? Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified, secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0

? Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy, c0-c1023共1024个分类, Target 策略不使用category

实际上下文:存放在文件系统中,ls –Z ; ps –Z

文件权限属性中出现这个点,就表明有selinux标签。可以使用 -Z 选项来查看

技术分享图片技术分享图片

期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中


查看SElinux策略库

# semanage fcontext -l

此软件包在最小化安装时并未包含

# yum install policycoreutils-python.x86_64


启用与关闭SElinux

# vi /etc/selinux/config

# This file controls the state of SELinux on the system.

# SELINUX= can take one of these three values:

#     enforcing - 强制,每个受限的进程都必然受限

#     permissive - 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志

#     disabled - 禁用

SELINUX=enforcing

enforcing 与 disabled 这2种状态之间的转换,必须要重启系统。从disabled切换至enforcing时,重启后会扫描并重设安全上下文,所以会有花费而外的时间。


查看SElinux状态

# getenforce  获取selinux当前状态

Enforcing


#sestatus 获取selinux当前状态与配置文件状态

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

Max kernel policy version:      28


设置SElinux当前状态

#setenforce 1 将当前状态设置为Enforcing

#setenforce 0 将当前状态设置为 permissive


与SElinux相关的配置文件:

/boot/grub/grub.conf

在内核参数后添加selinux=0  禁用SELinux

selinux的主配置文件存放的目录

/etc/selinux/

/etc/sysconfig/selinux > /etc/selinux/config


文件复制到其他位置后,标签将会发生变化

#ll -Z

-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

#cp index.html /root

#ll -Z /root/index.html

-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/index.html


修改SELinux安全标签

给文件重新打安全标签:

chcon [OPTION]... [-u USER] [-r ROLE] [-tTYPE] FILE...

#chcon -t admin_home_t index.html

chcon [OPTION]... --reference=RFILE FILE...

-R:递归打标;

从策略库恢复目录或文件默认的安全上下文,

restorecon [-R] /path/to/somewhere


默认安全上下文查询与修改

semanage

-l:查询。

-a:增加,你可以增加一些目录的默认安全上下文类型设置。

-m:修改。

-d:删除


下面为配合semanage的子对象

import  

Import local customizations导入

export

Output local customizations导出

login

Manage login mappings between linux users and SELinux confined users

user

Manage SELinux confined users (Roles and levels for an SELinux user)

port

Manage network port type definitions 网络端口

interface

Manage network interface type definitions 网卡

module

Manage SELinux policy modules 模块

node

Manage network node type definitions

fcontext

Manage file context mapping definitions 文件

boolean

Manage booleans to selectively enable functionality

permissive

Manage process type enforcement mode 权限

dontaudit

Disable/Enable dontaudit rules in policy


实例              

? 查看默认的安全上下文

semanage fcontext –l


? 添加安全上下文

semanage fcontext -a –t httpd_sys_content_t ‘/testdir(/.*)?’

restorecon –Rv /testdir


? 删除安全上下文

semanage fcontext -d –t httpd_sys_content_t ‘/testdir(/.*)?’


? 查看端口标签

semanage port –l

#semanage port -l|grep http

http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010

http_cache_port_t              udp      3130

http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000


? 添加端口

semanage port -a -t port_label -p tcp|udp PORT

# semanage port -a -t http_port_t -p tcp 9527


? 删除端口

semanage port -d -t port_label -p tcp|udp PORT

# semanage port -d -t http_port_t -p tcp 9527


系统内置的策略端口是不可以删除的

技术分享图片技术分享图片


? 修改现有端口为新标签

semanage port -m -t port_label -p tcp|udp PORT

# semanage port -m -t http_port_t -p tcp 9527

规则支持BRE扩展正则表达式


SELinux布尔值


布尔型规则:

getsebool

setsebool


查看bool命令:

getsebool [-a] [boolean]

semanage boolean –l

semanage boolean -l –C 查看修改过的布尔值

这2个栏位中的on 或 off 代表的是当前状态或数据库中的值

SELinux boolean                State  Default Description

privoxy_connect_any            (on   ,   on)  Allow privoxy to connect any

mount_anyfile                  (on   ,   off)  Allow mount to anyfile


设置bool值命令:

-P 写入磁盘保存

setsebool [-P] boolean value(on,off)

setsebool [-P] Boolean=value(0,1)


SELinux日志管理

? yum install setroubleshoot(重启生效)

将错误的信息写入/var/log/message

? grep setroubleshoot /var/log/messages

? sealert -l UUID

查看安全事件日志说明

? sealert -a /var/log/audit/audit.log

扫描并分析日志


实例:

1、启用SELinux策略并安装httpd服务,改变网站的默认主目录为/web,添加SELinux文件标签规则,使网站可访问

2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问


实验环境:VMware Workstation Pro 14(试用版)

系统平台:

CentOS Linux release 7.4.1708 (Core)       内核  3.10.0-693.el7.x86_64


操作如下:


1.查看当前SElinux状态

#sestatus

SELinux status:                 enabled

Current mode:                   enforcing

Mode from config file:          enforcing


2.安装http服务

#yum install httpd -y


3.改变网站默认目录为/web,并且http端口为9527

# mkdir /web    创建网站根目录

# echo "Welcome to SElinux" > /web/index.html 生成网页文件

#sed -i '/^DocumentRoot/c\DocumentRoot "/web"' /etc/httpd/conf/httpd.conf 修改httpd配置文件

#sed -i '/^<Directory "\/var\/www"/c\<Directory "/web">' /etc/httpd/conf/httpd.conf 修改httpd配置文件

#sed -i '/^Listen/c\Listen 9527' /etc/httpd/conf/httpd.conf 修改httpd配置文件


4.设置SElinux相关

#semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?' 添加SElinux安全标签到策略库

#semanage fcontext -l|grep ^/web 验证

/web(/.*)?                                         all files          system_u:object_r:httpd_sys_content_t:s0

#restorecon -R /web 从SElinux策略库恢复安全标签到网站根目录

#ll -Z   验证

-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html

#semanage port -a -t http_port_t -p tcp 9527 添加SElinux的http的网络端口

#semanage port -l|grep http_port_t 验证

http_port_t                    tcp      9527, 80, 81, 443, 488, 8008, 8009, 8443, 9000


5.启动http服务并访问

#systemctl start httpd && lsof -i:9527   启动httpd服务并验证

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

httpd   6475   root    4u  IPv6  47831      0t0  TCP *:9527 (LISTEN)

httpd   6476 apache    4u  IPv6  47831      0t0  TCP *:9527 (LISTEN)

httpd   6477 apache    4u  IPv6  47831      0t0  TCP *:9527 (LISTEN)

httpd   6478 apache    4u  IPv6  47831      0t0  TCP *:9527 (LISTEN)

httpd   6479 apache    4u  IPv6  47831      0t0  TCP *:9527 (LISTEN)

httpd   6480 apache    4u  IPv6  47831      0t0  TCP *:9527 (LISTEN)

访问网站成功

技术分享图片技术分享图片


以上是关于SElinux 设置与HTTP服务结合的主要内容,如果未能解决你的问题,请参考以下文章

http和https简单使用

LINUX系统服务与管理(Services)---------第六天

LINUX系统服务与管理(Services)---------第六天

LINUX系统服务与管理(Services)---------第五天

LINUX系统服务与管理(Services)---------第四天

keepalived与haproxy结合实现网站负债均衡