SElinux 設置與HTTP服務結合
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的子對象
實例
? 查看默認的安全上下文
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服務結合