1. 程式人生 > >Selinux的配置與管理

Selinux的配置與管理

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   

在這裡插入圖片描述