Selinux的配置與管理
阿新 • • 發佈:2018-11-08
Selinux的設定
1.概述
selinux :核心級加強型火牆(Security-Enhanced Linux)是美國國家安全域性(NAS)對於強制訪問控 制的實現,
在這種訪問控制體系的限制下,程序只能訪問那些在他的任務中所需要檔案。最大限度的保證了linux系統的安全
2.特點
1.MAC 對訪問的控制徹底化,對所有的檔案、目錄、埠的訪問都是基於策略設定的,可由管理員時行設定。 2.RBAC 對於使用者只賦予最小許可權。使用者被劃分成了一些role(角色),即使是root使用者,如果不具有sysadm_r角色的話,也不是執行相關的管理。哪裡role可以執行哪些domain,也是可以修改的。 3.安全上下文 當啟動selinux的時候,所有檔案與物件都有安全上下文。程序的安全上下文是域,安全上下文由使用者:角色:型別表示。 (1)系統根據pam子系統中的pam_selinux.so模組設定登入者執行程式的安全上下文 (2)rpm包安裝會根據rpm包內記錄來生成安全上下文, (3)如果是手工他建的,會根據policy中規定來設定安全上下文, (4)如果是cp,會重新生成安全上下文。 (5)如果是mv,安全上下文不變。
3 安全上下文格式
安全上下文由user:role:type三部分組成,下面分別說明其作用: 1.user identity:類似linux系統中的UID,提供身份識別,安全上下文中的一部分。 三種常見的user: user_u-: 普通使用者登入系統後預設; system_u-:開機過程中系統程序的預設; root-: root登入後預設; 在targeted policy中users不是很重要; 在strict policy中比較重要,的有預設的selinuxusers都以 "_u"結尾,root除外。 2.role 檔案與目錄的role,通常是object_r; 程式的role,通常是system_r; 使用者的role,targetedpolicy為system_r; strict policy為sysadm_r,staff_r,user_r 使用者的role,類似於系統中的GID,不同的角色具備不同的許可權;使用者可以具備多個role;但是同一時間內只能使用一role; role是RBAC的基礎; 3.type type:用來將主體與客體劃分為不同的組,組每個主體和系統中的客體定義了一個型別;為程序執行提供最低的許可權環境。 當一個型別與執行的程序關聯時,該type也稱為domain,也叫安全上下文。 域或安全上下文是一個程序允許操作的列表,決字一個程序可以對哪種型別進行操作。
4.主要功能:
對於檔案來說載入標籤,程式的安全上下文和檔案的安全上下文必須匹配才能被允許
對於程式來說控制功能開關, 用setsebool設定布林值 ,把程式的功能加了開關,並且把開關全部關掉
,
配置實驗環境:
(1)做實驗之前,最好先重置虛擬機器,以保持純淨的實驗環境(注意:重置虛擬機器後需要設定ip以及配置yum源)
(2)部署ftp服務
##1.安裝vsftpd和lftp,讓這個虛擬機器既是伺服器又是客戶端,便於操作
[[email protected] ~]# yum install -y vsftpd lftp -y
##2.開啟服務
[[email protected] ~]# systemctl start vsftpd
[[email protected] ~]# systemctl enable vsftpd
##3.新增火牆策略(或者直接關閉火牆)
[[email protected] ~]# firewall-cmd --permanent --add-service=ftp
success
[[email protected] ~]# firewall-cmd --reload
success
[[email protected] ~]# firewall-cmd --list-all
1.selinux的狀態設定
(1)selinux的狀態
1)開啟狀態
enforing #強制模式(警告並且拒絕)
permissive #警告模式(警告但不拒絕)
2)關閉狀態
disabled ##關閉模式(禁用模式)
(2)selinux的狀態的修改
1).臨時性修改
getenforce #檢視selinux的狀態
setenforce 0 #設定selinux的狀態為警告模式(permissive)
setenforce 1 #設定selinux的狀態為強制模式(Enforcing)
注意:此方法只能實現 permissive 狀態 和 Enforcing 狀態之間的轉換
即當selinux的狀態為 Disabled 時,用此方法不能更改selinux的狀態
實驗:
##檢視selinux的狀態
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# setenforce 1
[[email protected] ~]# getenforce
Enforcing
2).永久性修改:
通過修改配置檔案/etc/sysconfig/selinux的引數來更改selinux的狀態
實驗:
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# vim /etc/sysconfig/selinux
###############
SELINUX=disabled
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# reboot
[[email protected] ~]# getenforce
Disabled
2.selinux安全上下文的管理
ls -Z filename #檢視檔案的安全上下文
chcon -t public_content_t filename #臨時更改檔案的安全上下文的型別
semanage fcontext -a -t public_content_t '/westos(/.*)?' #永久更改檔案的安全上下文的型別; -a 新增,-t 型別,(/ 本身內容;.* 所有隱藏檔案;)
實驗1:selinux對檔案的影響
@1.當selinux的狀態為Disabled時,lftp連線後可以檢視到外來檔案
##檢視selinux的狀態
[[email protected] ~]# getenforce
Disabled
[[email protected] ~]# touch /mnt/westosfile1
##將外來檔案移動到ftp服務的預設釋出目錄/var/ftp中
[[email protected] ~]# mv /mnt/westosfile1 /var/ftp
[[email protected] ~]# cd /var/ftp
[[email protected] ftp]# ls
pub westosfile1
##可以檢視到外來檔案
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
drwxr-xr-x 3 0 0 69 Aug 03 2015 pub
-rw-r--r-- 1 0 0 0 Nov 03 06:12 westosfile1
lftp 172.25.254.234:/> exit
@2.預設本地使用者可以登陸,上傳,建立目錄,下載(不能下載自己建立的檔案,但可以下載自己上傳的檔案),刪除(不能刪除自己建立的檔案,但可以刪除自己上傳的檔案)
##建立使用者
[[email protected] ~]# useradd westos
##設定使用者密碼
[[email protected] ~]# passwd westos
[[email protected] ~]# lftp 172.25.254.234 -u westos
Password:
lftp [email protected]:~> ls
lftp [email protected]:~> put /etc/passwd
2101 bytes transferred
lftp [email protected]:~> ls
-rw-r--r-- 1 1001 1001 2101 Nov 06 16:11 passwd
lftp [email protected]:~> mkdir linux
mkdir ok, `linux' created
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Nov 06 16:11 linux
-rw-r--r-- 1 1001 1001 2101 Nov 06 16:11 passwd
lftp [email protected]:~> get /etc/passwd
2101 bytes transferred
lftp [email protected]:~> get linux/
get: Access failed: 550 Failed to open file. (linux/)
lftp [email protected]:~> rm linux/
rm: Access failed: 550 Delete operation failed. (linux/)
lftp [email protected]:~> rm passwd
rm ok, `passwd' removed
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Nov 06 16:11 linux
lftp [email protected]:~> put /etc/passwd
2101 bytes transferred
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Nov 06 16:11 linux
-rw-r--r-- 1 1001 1001 2101 Nov 06 16:12 passwd
lftp [email protected]:~> exit
排錯1:如果此時報錯:550服務認證失敗,說明一定是vsftpd服務未開啟,
因為我這裡的主配置檔案是重新生成的,是一份全新的檔案。而預設本地使用者可以登陸的
@@當selinux的狀態為關閉模式時,檔案和程式的安全上下文都會被隱藏起來
檢視 /var/ftp裡的所有檔案的安全上下文
[[email protected] ~]# ls -Z /var/ftp
[[email protected] ~]# ps auxZ | grep ftp
@3.當selinux的狀態更改為enforcing時,此時lftp連線便無法訪問外來檔案,並且有警告資訊
##更改selinux的狀態
[[email protected] ~]# vim /etc/sysconfig/selinux
###############
SELINUX=enforcing ##強制模式(警告並拒絕)
[[email protected] ~]# getenforce
Disabled
##必須重啟,否則不生效
[[email protected] ~]# reboot
##檢視selinux的狀態
[[email protected] ~]# getenforce
Enforcing
##將外來檔案移動到ftp服務的預設釋出目錄/var/ftp中
[[email protected] ~]# touch /mnt/westosfile2
[[email protected] ~]# mv /mnt/westosfile2 /var/ftp
[[email protected] ~]# cd /var/ftp/
[[email protected] ftp]# ls
pub westosfile1 westosfile2
##先清空日誌
[[email protected] ~]# > /var/log/messages
[[email protected] ~]# cat /var/log/messages
##此時無法訪問外來檔案!!!
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
drwxr-xr-x 3 0 0 69 Aug 03 2015 pub
-rw-r--r-- 1 0 0 0 Nov 03 06:12 westosfile1
lftp 172.25.254.234:/> exit
##檢視日誌,發現有警告資訊
[[email protected] ~]# cat /var/log/messages
@4.並且本地使用者不能刪除,上傳,下載,建立目錄
[[email protected] ~]# lftp 172.25.254.234 -u westos
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Nov 06 12:35 linux
-rw-r--r-- 1 0 0 2048 Nov 06 12:58 passwd
lftp [email protected]:~> rm passwd
rm: Access failed: 550 Delete operation failed. (passwd)
lftp [email protected]:~> put /etc/inittab
put: Access failed: 553 Could not create file. (inittab)
lftp [email protected]:~> mkdir westos
mkdir: Access failed: 550 Create directory operation failed. (westos)
lftp [email protected]:~> get passwd
get: Access failed: 550 Failed to open file. (passwd)
lftp [email protected]:~> exit
@5.當selinux的狀態為Permissive時,可以訪問外來檔案但有警告
[[email protected] ~]# getenforce
Enforcing
##更改selinux的為警告狀態
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# > /var/log/messages
[[email protected] ~]# cat /var/log/messages
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
-rw-r--r-- 1 0 0 0 Nov 06 12:29 westosfile1
-rw-r--r-- 1 0 0 0 Nov 06 12:49 westosfile2
lftp 172.25.254.234:/> exit
##檢視日誌,發現有警告資訊
[[email protected] ~]# cat /var/log/messages
@6.檔案的安全上下文
[[email protected] ~]# cd /var/ftp
##檢視所有檔案的安全上下文
[[email protected] ftp]# ls -Z
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 pub
-rw-r--r--. root root system_u:object_r:public_content_t:s0 westosfile1
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0 westosfile2
[[email protected] ftp]# pwd
/var/ftp
[[email protected] ftp]# touch file1
[[email protected] ftp]# ls -Z file1
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 file1
[[email protected] ftp]# cd /mnt
[[email protected] mnt]# touch file2
[[email protected] mnt]# ls -Z file2
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0 file2
[[email protected] mnt]# cd /var/ftp
##核心記錄過的安全上下文
[[email protected] ftp]# semanage fcontext -l | grep /var/ftp
1.臨時更改安全上下文
[[email protected] ftp]# chcon -t public_content_t westosfile2
##檢視單個檔案的安全上下文
[[email protected] ftp]# ls -Z westosfile2
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westosfile2
##此時即使selinux的狀態為enforecing仍然可檢視到外來檔案
[[email protected] ftp]# getenforce
Permissive
[[email protected] ftp]# setenforce 1
[[email protected] ftp]# getenforce
Enforcing
[[email protected] ftp]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
-rw-r--r-- 1 0 0 0 Nov 06 13:11 file1
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
-rw-r--r-- 1 0 0 0 Nov 06 12:29 westosfile1
-rw-r--r-- 1 0 0 0 Nov 06 12:49 westosfile2
lftp 172.25.254.234:/> exit
[[email protected] ~]# mkdir /linux
[[email protected] ~]# touch /linux/linuxfile
##匿名使用者登陸預設在ftp的預設釋出目錄/var/ftp下
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
-rw-r--r-- 1 0 0 0 Nov 06 13:11 file1
drwxr-xr-x 2 0 0 6 Mar 07 2014 pub
-rw-r--r-- 1 0 0 0 Nov 06 12:29 westosfile1
-rw-r--r-- 1 0 0 0 Nov 06 12:49 westosfile2
lftp 172.25.254.234:/> exit
##更改匿名使用者家目錄
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
###############
anon_root=/linux
[[email protected] ~]# systemctl restart vsftpd
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
lftp 172.25.254.234:/> exit
[[email protected] ~]# getenforce
Enforcing
##將slinux的狀態更改為警告模式
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
-rw-rw-r-- 1 0 0 0 Nov 06 13:27 linuxfile
lftp 172.25.254.234:/> exit
##檢視目錄的安全上下文
[[email protected] ~]# ls -Z /linux -d
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /linux
##臨時更改 /linux目錄的安全上下文為public_content_t型別
[[email protected] ~]# chcon -t public_content_t /linux -R
[[email protected] ~]# ls -Z /linux -d
drwxr-xr-x. root root unconfined_u:object_r:public_content_t:s0 /linux
測試:
##重啟selinux
[[email protected] ftp]# vim /etc/sysconfig/selinux
################
SELINUX=disabled
[[email protected] ftp]# reboot
[[email protected] ~]# vim /etc/sysconfig/selinux
###############
SELINUX=enforcing
[[email protected] ~]# reboot
[[email protected] ftp]# ls -Z westosfile1
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 westosfile1
2.永久性更改安全上下文
[[email protected] ~]# ls -Zd /linux/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /linux/
[[email protected] ~]# ls -Zd /var/ftp/
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp/
[[email protected] ~]# semanage fcontext -l | grep /var/ftp
[[email protected] ~]# semanage fcontext -l | grep /linux/
##永久性更改安全上下文
[[email protected] ~]# semanage fcontext -a -t public_content_t '/linux(/.*)?'
[[email protected] ~]# restorecon -FvvR /linux/
[[email protected] ~]# ls -Zd /linux/
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /linux/
測試:
##此時即使selinux的狀態為強制模式,仍然可以看到家目錄裡的檔案
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# lftp 172.25.254.234
lftp 172.25.254.234:~> ls
-rw-rw-r-- 1 0 0 0 Nov 06 13:27 linuxfile
lftp 172.25.254.234:/> exit
##建立/.autorelabel檔案,相當於重啟selinux
[[email protected] ~]# touch /.autorelabel
[[email protected] ~]# reboot
[[email protected] ~]# ls -Zd /linux/
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /linux/
還原:
[[email protected] ~]# vim /etc/vsftpd/vsftpd.conf
#anon_root=/linux
[[email protected] ~]# systemctl restart vsftpd.service
3.管理linux布林值
setenforce 0 #強制模式,有警告,但操作不會被阻止
setenforce 1 #禁止模式,有警告,且操作會被阻止
getsebool -a |grep ftp #檢視目前系統上面ftp服務的所有布林值條款
setsebool -P ftp_home_dir on #開啟ftp的布林值
實驗2:selinux對程式的影響
@@當selinux處於強制模式時,本地使用者將無法put上傳檔案
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# lftp 172.25.254.234 -u westos
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Nov 06 12:35 linux
-rw-r--r-- 1 0 0 2048 Nov 06 12:58 passwd
lftp [email protected]234:~> put /etc/group
put: Access failed: 553 Could not create file. (group)
lftp [email protected]:~> exit
解決方案:
1)直接將selinux的狀態更改為警告模式即可,但用在這種模式下上傳檔案不安全
2)直接開啟ftp的布林值
#檢視ftp服務的布林值條款
[[email protected] ~]# getsebool -a | grep ftp
##開啟ftp家目錄的布林值
[[email protected] ~]# setsebool -P ftp_home_dir on
[[email protected] ~]# getsebool -a | grep ftp
測試:
[[email protected] ~]# lftp 172.25.254.234 -u westos
Password:
lftp [email protected]:~> ls
drwxr-xr-x 2 1001 1001 6 Nov 06 12:35 linux
-rw-r--r-- 1 0 0 2048 Nov 06 12:58 passwd
lftp [email protected]:~> put /etc/group
865 bytes transferred
lftp [email protected]:~> ls
-rw-r--r-- 1 1001 1001 865 Nov 06 14:55 group
drwxr-xr-x 2 1001 1001 6 Nov 06 12:35 linux
-rw-r--r-- 1 0 0 2048 Nov 06 12:58 passwd
lftp [email protected]:~> exit
4.selinux日誌的管理
/var/log/audit/audit.log #記錄selinux的日誌,只會說明錯誤,但不會提供解決方法,且閱讀複雜
/var/log/messages #記錄selinux的日誌,會詳細的記錄錯誤,並且可提供解決方法
實驗:
##檢視selinux的狀態
[[email protected] ~]# getenforce
Enforcing
[[email protected] ~]# touch /mnt/westosfile3
[[email protected] ~]# mv /mnt/westosfile3 /var/ftp/
[[email protected] ~]# cd /var/ftp/
[[email protected] ftp]# ls
file1 pub westosfile1 westosfile2 westosfile3
[[email protected] ftp]# > /var/log/messages
##發現westosfile3檔案與/var/ftp/目錄的安全上下文不同
[[email protected] ftp]# ls -Z /var/ftp/westosfile3
-rw-r--r--. root root unconfined_u:object_r:mnt_t:s0 /var/ftp/westosfile3
[[email protected] ftp]# ls -Z /var/ftp/ -d
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp/
測試:
由於westosfile3的安全上下文與/var/ftp的安全上下文不同,所以網頁上無法訪問到此檔案
##檢視日誌,只會說明錯誤
[[email protected] ~]# cat /var/log/audit/audit.log
##檢視日誌,不僅有錯誤說明還有解決方案
[[email protected] ~]# cat /var/log/messages
[[email protected] ~]# restorecon -v /var/ftp/*
##檢視安全上下文
[[email protected] ~]# ls -Z /var/ftp/westosfile3
測試:
重新整理網頁;此時便可以檢視到westosfile3,因為這時它的安全上文與/var/ftp的安全上文一樣
@@此解決方案來自 setroubleshoot-server-3.2.17-2.el7.x86_64
##解除安裝此軟體
[[email protected] ~]# yum remove -y setroubleshoot-server-3.2.17-2.el7.x86_64
[[email protected] ~]# touch /mnt/westosfile4
[[email protected] ~]# mv /mnt/westosfile4 /var/ftp
[[email protected] ~]# > /var/log/messages
[[email protected] ~]# > /var/log/audit/audit.log
測試:
##此時仍然可以看到錯誤資訊
[[email protected] ~]# cat /var/log/audit/audit.log
##但無法再檢視到解決方案
[[email protected] ~]# cat /var/log/messages
##安裝setroubleshoot
[[email protected] ~]# yum install -y setroubleshoot-server-3.2.17-2.el7.x86_64
[[email protected] ~]# > /var/log/messages
##先重新整理網頁;此時便又可以檢視到解決方案
[[email protected] ~]# cat /var/log/messages
5.修改程序訪問的埠號
semanage port -l | grep 服務名稱 #檢視某個服務的埠
semanage port -a -t 型別 -p 協議 埠號 #新增某個埠號為指定服務的訪問埠
例如:
semanage port -l | grep http #檢視http服務的埠
semanage port -a -t http_port_t -p tcp 6666 #新增6666為http_port_t服務的訪問埠
實驗:selinux對服務所使用的資源的影響
[[email protected] ~]# yum install -y httpd
Loaded plugins: langpacks
[[email protected] ~]# getenforce
Enforcing
##修改apache的預設埠
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
###############
Listen 6666 ##此埠必須是系統中不存在的埠
##強制模式下無法重啟apache
[[email protected] ~]# systemctl restart httpd
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
##將selinux的狀態更改為警告模式
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
[[email protected] ~]# systemctl restart httpd
##檢視http的埠;發現並沒有埠號為6666的
[[email protected] ~]# semanage port -l | grep http
##新增6666為http_port_t服務的訪問埠
[[email protected] ~]# semanage port -a -t http_port_t -p tcp 666
##此時便可以檢視到6666埠
[[email protected] ~]# semanage port -l | grep http