一。selinux相關知識html
1.SELinux簡介node
SELinux是一個強制訪問控制的安全模塊,linux內核2.6版本後集成在內核python
DAC:Discretionary Access Control自由訪問控制linux
MAC:Mandatory Access Control 強制訪問控制web
DAC下進程是毫無束縛的centos
MAC環境下策略的規則決定控制的嚴格程度緩存
MAC環境下,進程能夠被限制安全
策略被用來定義被限制的進程可使用哪些資源(文件和端口)服務器
默認狀況下,沒有被明確容許的行爲將被拒絕網絡
2.selinux運行模式
(1)對象(object):全部可讀取的對象,包括文件、目錄、進程、端口等
(2)主體:進程稱爲主體(subject)
(3)selinux的工做模式(selinux策略)
strict:只有centos5纔有,每一個進程都受到selinux嚴格的控制
targeted:用來保護常見的網絡服務,只監控容易被***的進程;rhel4保護13個服務,rhel5保護88個服務
minimum:centos7,修改過的targeted
mls:提供MLS(多級安全)機制的安全性
mls和minimum穩定性不足,未加以應用
(4)selinux安全上下文
<1>傳統linux,一切皆文件,由用戶、組、權限控制訪問
<2>在selinux中,一切皆對象,
文件安全上下文:由存放在inode拓展屬性域中的安全元素所控制其訪問
進程安全上下文:存放在內存當中
<3>全部文件、端口資源、進程都具備安全標籤:安全上下文
ll 查看文件屬性,權限所在列的尾部的「.」表明有安全標籤
<4>安全上下文由5個元素組成
user:role:type:sensitivity:category
user_u:object_r:tmp_t:s0:c0
user:指示登陸系統的用戶類型,如root、user_u、system_u;多數本地進程屬於自由(unconfined)進程
role:定義文件、進程和用戶的用途
文件:object_r
進程和用戶:system_r
type:指定數據類型,規則中定義何種進程類型訪問何種文件,target策略是基於type實現的, 多服務功用:public_content_t
sensitivity:限制訪問的須要,由組織定義的分層安全級別,如unclassfied,secret,top,一個對象有且只有一個sensitivity,分0-15級,s0最低,target策略默認使用s0
category:對於特定組織劃分不分層的分類,如FBI Secret,NSA Secret,一個對象能夠有多個category,c0-c1023共1024個分類,target策略不使用category
<5>實際安全上下文存放在文件系統中,ls -Z ;ps -Z
<6>默認上下文:存放在二進制的selinux策略庫中
semanage fcontext -l
小結:selinux對全部的文件都賦予一個type的文件類型標籤,對於全部的進程也賦予各自的一個domain的標籤;domain標籤可以執行的操做由安全策略規定
當一個subject試圖訪問一個object,kernel中的策略執行服務器將檢查AVC(Access Vector Cache訪問矢量緩存),在AVC中,subject和object的權限被緩存,查找「應用+文件」的安全環境。而後根據查詢結果容許或拒絕訪問
3.設置selinux的相關注意操做
selinux是否啓用
給文件從新打標籤
給端口設置安全標籤
設置某些操做的布爾值開關
selinux的日誌管理
4.selinux的(狀態|模式)
enforcing:強制,每一個受限的進程都必然受限
permissive:容許,每一個受限的進程違規操做不會被禁止,但會被記錄於審計日誌
disabled:禁用
enforceing與permissive相互加的切換不須要重啓,其他狀態間切換須要重啓,由於selinux是整合到內核中的
selinux的策略改變後須要重啓
5.管理selinux的相關命令
(1)查看selinux狀態及修改相關狀態
getenforce:獲取selinux當前狀態
sestatus:查看selinux狀態
-v 檢查列於/etc/sestatus.conf內的文件與程序的安全上下文內容
-b:將目前策略的規則布爾值列出來,即某些規則(rule)是否要啓動之意
setenforce 0|1
0:設置爲permissive
1:設置enforcing
(2)相關配置文件
下面兩類文件有一個禁用即禁用selinux
在/etc/grub/grub.conf文件的kernel行的行尾添加「selinux=0」,內核會忽略過selinux的加載
/etc/grub/grub.conf 使用selinux=0禁用selinux
/etc/sysconfig/selinux
/etc/selinux/config SELINUX={disabled|enforcing|permissive}
(3)seinfo 查詢selinux策略的工具
-t 列出selinux的全部類型(type)
-r 列出selinux的全部角色(role)
-u 列出selinux的全部身份表示(user)
-b 列出全部規則的種類(布爾值)
(4)sesearch命令詳解
知道某個類型或者布爾值後,可用此命令瞭解詳細規則
sesearch [-A] [-s 主體類型] [-t 目標類型] [-b 布爾值]
-A 列出該類型或布爾值的全部相關信息
(5)修改文件的selinux安全標籤
<1>給文件從新打安全標籤
chcon [option] ... [-u user] [-r role] [-t type] file...
chcon [option] ... --reference=rfile file
-R 遞歸打標
-v 將過程顯示到屏幕上
<2>恢復文件默認的安全上下文
restorecon [-R] /path/to/somewhere
(6)默認安全上下文查詢與修改
semanage命令來自於policycoreutils-python包
查看默認的安全上下文
semanage fcontext -l
添加安全上下文(只是爲用來恢復默認安全文,在所添加的特定目錄下所新建的文件,繼承的是當前目錄的安全文而不是默認安全文)
semanage fcontext -a -t httpd_sys_content_t '/testdir(/.*)?'
restore -Rv /testdir
刪除安全上下文
semanage fcontext -d -t httpd_sys_content_t '/testdir(/.*)?'
(7)修改端口的selinux標籤
查看端口標籤
semanage port -l
添加端口
semanage port -a -t port_label -p tcp|udp PORT
semanage port -a -t httpd_port_t -p tcp 9527
刪除端口
semanage port -a -t port_label -p tcp|udp PORT
semanage port -d -t port http_port_t -p tcp 9527
修改
semanageport -m -t port_label-p tcp|udpPORT
semanageport -m -t http_port_t-p tcp9527
(8)selinux布爾值
布爾型規則
getsebool
setsebool
查看bool命令
getsebool [-a] [boolean]
semanage boolean -l
semanage boolean -l -C 查看修改過的布爾值
設置bool值命令
setsebool [-P] boolean value 將設置寫入配置文件
setsebool [-P] boolean=value
(9)selinux日誌管理
yum install setroublesshoot*(重啓生效)
方法一:
<1>將錯誤的信息寫入/var/log/message(錯誤信息其實最終是在/var/log/audit/audit.log中)
<2>用grep setroubleshoot /var/log/messages過濾所需的信息,
<3>而後用「sealert -l UUID 」 查看安全事件日誌說明
方法二:
sealert -a /var/log/audit/audit.log 掃描並分析日誌
6.mv /dir1/file1 /dir2/file2 file2的安全標籤與file1安全標籤同樣
cp /dri1/file1 /dir2/file2 file2的安全標籤繼承/dir2目錄的安全標籤
二selinux網絡服務運行範例
1.在服務器端上邊啓動httpd服務,並關閉防火牆
2.在服務器端上邊的/var/www/html/目錄下新建文件index.html
3.在客戶端上邊訪問pc1的httpd服務
發現能夠成功訪問
4.在服務器端查看/var/www/html/index.html的安全上下文
5.在服務器端的root下新建index2.html文件,查看安全上下文;而後移動到/var/www/html下,而後再查看安全上下文
發現通過mv安全上下文並無改變
6.在客戶端訪問服務器端的index2.html文件
發現沒有權限訪問
7. 在服務器端執行grep 'setroubleshoot' /var/log/message,會出現以下界面
8.由上圖知道,想了解更詳細信息,在服務器端執行sealert -l 92d22156-08a9-4967-a2e9-aa48a3207115
9由上圖可知,在服務器端執行/sbin/restorecon -v /var/www/html/index2.html科解決問題
10.在客戶端從新訪問服務器端的web服務
/sbin/restorecon -v /var/www/html/index2.html
發現實驗成功
3、
一、安裝httpd服務,改變網站的默認主目錄爲/website,添加SELinux文件標籤規則,設置http_sys_content_t到/website及目錄下全部文件,使網站可訪問
二、修改網站端口爲9527,增長SELinux端口標籤,使網站可訪問
三、啓用SELinux布爾值,使用戶student的家目錄可經過http訪問
從本質上將:一、3小題實現的功能是同樣的,都是死特定目錄可經過http訪問
第一小題:
本題pc1指的是服務器端,pc2指的是客戶端
(1)進入pc1「httpd」服務配置文件/etc/httpd/conf/httpd.conf
,做以下修改
修改前:
修改後:
(2)給/website目錄添加默認標籤規則
(3)在pc1上邊的/website目錄下新建index.html文件
(4)在pc1上邊重啓web服務
(5)發現/website/index.html的安全標籤以下
並非/website目錄下的默認安全文
(6)用restorecon -Rv /website/index.html的默認安全文
(5)在pc2上邊訪問pc1的web服務
第二小題:
(1)進入httpd服務配置文件做以下修改
修改前:
修改後:
(2) 添加端口默認安全標籤
發現http_port_t爲咱們要找的端口類型
(3)爲http_port_t端口類型添加9527端口
(4)重啓httpd服務
(5)在pc2訪問pc1的web服務
發現試驗成功
第三小題:
(1)進入httpd服務的配置文件做以下修改
修改前
修改後
(2)重啓httpd服務,而後在pc2上邊訪問pc1的web服務
(3)在pc1上邊查看/~tian文件屬性,而後修改成Apache進程能夠切入該目錄
(4)此時在pc2上邊訪問pc1的web服務
(5)在pc1的圖形界面看到有selinux警報
(6)運行setsebool -P httpd_enable_homedirs 1,查看結果以下
(7)在pc2訪問pc1的web服務