1. 程式人生 > >SElinux 設置與HTTP服務結合

SElinux 設置與HTTP服務結合

-m 決定 min pat dex appdata 實體 com 布爾值

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服務結合