selinux簡介:

SELinux(Security-Enhanced Linux) 是美國國家安全域性(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。NSA是在Linux社群的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,程序只能訪問那些在他的任務中所需要檔案。
SELinux 是 2.6 版本的 Linux 核心中提供的強制訪問控制(MAC)系統。對於目前可用的 Linux安全模組來說,SELinux 是功能最全面,而且測試最充分的,它是在 20 年的 MAC 研究基礎上建立的。SELinux 在型別強制伺服器中合併了多級安全性或一種可選的多類策略,並採用了基於角色的訪問控制概念。

SELINUX有「disabled」「permissive」,「enforcing」3種模式選擇。
Disabled就是關閉,permissive就是Selinux有效,但是即使你違反了策略的話它讓你繼續操作,
但是把你的違反的內容記錄下來。
Enforcing就是你違反了策略,你就無法繼續操作下去。

selinux的模式轉換需要重啟,因為selinux是核心級的外掛。

[root@localhost yum.repos.d]# vim /etc/sysconfig/selinux   將disabled改為enforcing
[root@localhost yum.repos.d]# getenforce                   未重啟不生效
Disabled
[root@localhost yum.repos.d]# reboot                       重啟
Connection to 172.25.254.221 closed by remote host.
Connection to 172.25.254.221 closed.
[kiosk@foundation21 Desktop]$ ssh root@172.25.254.221      連線虛擬機器
root@172.25.254.221's password: 
Last login: Sun May  6 02:50:29 2018 from 172.25.254.21
[[email protected] ~]# getenforce                             檢視生效
Enforcing

首先當重置了虛擬機器之後,需要配置IP和yum源,安裝一些必須服務:

[kiosk@foundation21 Desktop]$ rht-vmctl reset server
Are you sure you want to reset server? (y/n) y
[[email protected] Desktop]$ rht-vmctl view server進去配置IP
[[email protected] Desktop]$ ssh [email protected]
[email protected]'s password: 
Last login: Fri May 11 21:25:49 2018
[[email protected] ~]# vim /etc/sysconfig/selinux不用更改為Enforce即可
[[email protected] yum.repos.d]# getenforce 
Enforcing
[[email protected] ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
rhel_dvd.repo
[root@localhost yum.repos.d]# rm -fr *
[root@localhost yum.repos.d]# vim yum.repo
[root@localhost yum.repos.d]# cat yum.repo
[source7.0]
name=source7.0
baseurl=http://172.25.254.84/source7.0
gpgcheck=0

[root@localhost ~]# yum install vsftpd lftp -y 安裝服務

Complete!
[root@localhost ~]# systemctl start vsftpd  開始服務
[root@localhost ~]# systemctl enable vsftpd 開機自啟動
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service'
[root@localhost ~]# systemctl stop firewalld 關閉火牆
[root@localhost ~]# systemctl disable firewalld 開機自動關閉

配置IP和yum源,設定selinux為強制。
這裡寫圖片描述
安裝服務開機自啟動並設定開機自動關閉防火牆。
這裡寫圖片描述

設定selinux安全上下文有臨時設定和永久設定之分

1,臨時設定安全上下文:

[root@localhost ~]# mkdir /westos
[root@localhost ~]# touch /westos/westosfile  建立檔案安全上下文不改變就無法檢視
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf  編輯配置檔案
新增家目錄:anon_root=/westos
[root@localhost ~]# systemctl restart vsftpd  重啟服務
[root@localhost ~]# lftp 172.25.254.221 檢視家目錄中沒有我們建立的檔案
lftp 172.25.254.221:~> ls
lftp 172.25.254.221:/> ls
lftp 172.25.254.221:/> quit
[root@localhost ~]# vim /etc/sysconfig/selinux  檢視selinux狀態
[root@localhost ~]# getenforce  為強制即可
Enforcing
[root@localhost ~]# ls -Z /westos/  檢視
-rw-r--r--. root root unconfined_u:object_r:default_t:s0 westosfile
[root@localhost ~]# chcon -t public_content_t /westos -R 更改安全上下文
[root@localhost ~]# ls -Z /westos/  已經更改成功
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westosfile
[root@localhost ~]# lftp 172.25.254.221 檢視可以顯示我們建立的檔案
lftp 172.25.254.221:~> ls
-rw-r--r--    1 0        0               0 May 12 02:01 westosfile
lftp 172.25.254.221:/> quit

臨時配置安全上下文之後就可以看到家目錄下的檔案。
這裡寫圖片描述
但是這種設定是臨時的,重啟selinux失效,這裡的重啟指的是selinux的重啟,因為selinux是核心級別的,所以需要來回重啟系統。

[[email protected] ~]# vim /etc/sysconfig/selinux 更改為disabled
[[email protected] ~]# getenforce 沒有重啟看不到效果
Enforcing
[[email protected] ~]# reboot
Connection to 172.25.254.221 closed by remote host.
Connection to 172.25.254.221 closed.
[[email protected] Desktop]$ ssh [email protected]172.25.254.221
[email protected]172.25.254.221's password: 
Last login: Fri May 11 21:29:55 2018 from 172.25.254.21
[[email protected] ~]# getenforce  已經變為disabled
Disabled
[[email protected] ~]# vim /etc/sysconfig/selinux 重新變為enforcing
[[email protected] ~]# getenforce  重啟之前無法檢視
Disabled
[[email protected] ~]# reboot
Connection to 172.25.254.221 closed by remote host.
Connection to 172.25.254.221 closed.
[[email protected] Desktop]$ ssh [email protected]172.25.254.221
^C
[[email protected] Desktop]$ ssh [email protected]172.25.254.221
ssh: connect to host 172.25.254.221 port 22: No route to host
[[email protected] Desktop]$ ssh [email protected]172.25.254.221
[email protected]172.25.254.221's password: 
Last login: Fri May 11 22:06:24 2018 from 172.25.254.21
[[email protected] ~]# getenforce 
Enforcing
[[email protected] ~]# ls -Zd /westos/  重啟selinux之後安全上下文失效
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /westos/

如圖所示,重啟了兩遍系統之後就沒有了安全上下文許可權。
這裡寫圖片描述

2,永久設定安全上下文許可權:

[root@localhost ~]# ls -Zd /westos/ 目錄westos安全上下文已經失效
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /westos/  
[root@localhost ~]# ls -Zd /var/ftp/  /var/ftp/目錄/var/ftp永久生效
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp/ 
[root@localhost ~]# semanage fcontext -l | grep /var/ftp/   永久生效的原因是配置檔案中已經寫入了/var/ftp。
/var/ftp/bin(/.*)?                                 all files          system_u:object_r:bin_t:s0 
/var/ftp/etc(/.*)?                                 all files          system_u:object_r:etc_t:s0 
/var/ftp/lib(/.*)?                                 all files          system_u:object_r:lib_t:s0 
/var/ftp/lib/ld[^/]*\.so(\.[^/]*)*                 regular file       system_u:object_r:ld_so_t:s0 
[root@localhost ~]# semanage fcontext -l | grep /westos/   配置檔案中並沒有寫入/westos目錄所以重啟失效。
[root@localhost ~]# semanage fcontext -a -t public_content_t '/westos(/.*)?'
**

-a表示新增,-t表示型別。意思將westos新增到配置檔案中。
 semanage fcontext使用擴充套件正則表示式來指定路徑和檔名。
 fcontect規則中最常用的擴充套件正則表示式是(/.*)?,表示隨意的匹配/後跟任何數量的字元。

**
[root@localhost ~]# semanage fcontext -l | grep /westos  檢視配置檔案是否寫入
/westos(/.*)?                                      all files          system_u:object_r:public_content_t:s0 
[root@localhost ~]# restorecon -FvvR /westos/   重新整理
restorecon reset /westos context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
restorecon reset /westos/westosfile context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
[root@localhost ~]# lftp 172.25.254.221  連線可以顯示目錄下面的內容
lftp 172.25.254.221:~> ls                          
-rw-r--r--    1 0        0               0 May 12 02:01 westosfile
lftp 172.25.254.221:/> quit
[root@localhost ~]# touch /.autorelabel  建立這個檔案相當於重啟selinux
[root@localhost ~]# getenforce 
Enforcing
[root@localhost ~]# reboot
Connection to 172.25.254.221 closed by remote host.
Connection to 172.25.254.221 closed.
[kiosk@foundation21 Desktop]$ ssh [email protected]172.25.254.221
[email protected]172.25.254.221's password: 
Last login: Fri May 11 22:08:26 2018 from 172.25.254.21
[[email protected] ~]# ls -Zd /westos  檢視已經有了安全上下文許可權,意味著永久修改了安全上下文許可權
drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /westos

簡單演示個例子來解釋永久和臨時的概念,比如/var/ftp/目錄在每次重啟系統時不會影響其安全上下文許可權,是由於在配置檔案中已經寫入了正則表示式。而/westos區別就是配置檔案沒有寫入正則表示式。
這裡寫圖片描述
解決方案就是將/westos的正則表示式寫入即可就不會在重啟的時候安全上下文失效。
這裡寫圖片描述

管理SElinux布林值:

[root@localhost ~]# setenforce 0   改變selinux級別,1表示enforcing強制0表示permissive警告。
[root@localhost ~]# lftp 172.25.254.221 -u student
Password: 
lftp student@172.25.254.221:~> ls      
-rw-r--r--    1 1000     1000         2005 May 12 03:44 passwd
lftp student@172.25.254.221:~> put /etc/group       警告就是還可以執行只是會有警告
850 bytes transferred
lftp student@172.25.254.221:~> quit
[root@localhost ~]# setenforce 1   改變selinux級別為強制
[root@localhost ~]# lftp 172.25.254.221 -u student
Password: 
lftp student@172.25.254.221:~> ls      
-rw-r--r--    1 1000     1000          850 May 12 03:44 group
-rw-r--r--    1 1000     1000         2005 May 12 03:44 passwd
lftp student@172.25.254.221:~> put /etc/inittab   強制意味著直接拒絕
put: Access failed: 553 Could not create file. (inittab)  報錯553不能上傳
lftp student@172.25.254.221:~> quit
[root@localhost ~]# getsebool -a | grep ftp   檢視布林值顯示關閉狀態
ftp_home_dir --> off
[root@localhost ~]# setsebool -P ftp_home_dir on   
** 修改布林值,修改selinux策略,以永久保留修改。
系統會更加安全,將selinux改為警告0僅僅是可以執行,但是系統不安全。
引數-P會將波爾值記錄在檔案中。**
[root@localhost ~]# getsebool -a | grep ftp        顯示布林值
ftp_home_dir --> on
[root@localhost ~]# lftp 172.25.254.221 -u student
Password: 
lftp student@172.25.254.221:~> ls      
-rw-r--r--    1 1000     1000          850 May 12 03:44 group
-rw-r--r--    1 1000     1000         2005 May 12 03:44 passwd
lftp student@172.25.254.221:~> put /etc/inittab    可以正常上傳
491 bytes transferred
lftp student@172.25.254.221:~> quit

將selinux狀態設定成警告可以正常上傳,改成強制就無法上傳。
這裡寫圖片描述
我們可以將ftp下的家目錄布林值開啟,就可以正常上傳。
這裡寫圖片描述

監控selinux衝突:

1,必須安裝 setroubleshoot-server 軟體包 , 才能將 SELinux訊息傳送至 /var/log/messages。
2,setroubleshoot-server 監聽 /var/log/audit/audit.log 中的稽核資訊並將簡短摘要傳送至 /var/log/messages。
3,摘要包括 SELinux 衝突的唯一識別符號 ( UUIDs ), 可用於收集更多資訊。
4,/var/log/audit/audit.log 用於在該檔案中生成所有事件的報告。

[root@localhost ~]# ls
anaconda-ks.cfg  Documents  Music     Public     Videos
Desktop          Downloads  Pictures  Templates
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 將新增的主配置檔案中的東西刪除然後進行操作
[root@localhost ~]# systemctl restart vsftpd    重啟服務
[root@localhost ~]# cd /var/ftp                 
[root@localhost ftp]# ls
pub  westos  westos1
[root@localhost ftp]# rm -fr *          刪除裡面所有的檔案
[root@localhost ftp]# ls
[root@localhost ftp]# touch /mnt/westos
[root@localhost ftp]# mv /mnt/westos /var/ftp/   將檔案移動到/var/ftp目錄裡面
[root@localhost ftp]# > /var/log/messages        清空日誌
[root@localhost ftp]# cat /var/log/messages      檢視日誌
然後在瀏覽器中輸入ftp://172.25.254.221,檢視日誌監控效果。
[root@localhost ftp]# cat /var/log/messages      檢視日誌會出來解決方案
May 12 02:45:25 localhost dbus-daemon: dbus[525]: [system] Activating service 

*****  Plugin catchall (7.64 confidence) suggests   **************************

If you believe that vsftpd should be allowed getattr access on the  file by default.
Then you should report this as a bug.
You can generate a local policy module to allow this access.
Do
allow this access for now by executing:
# grep vsftpd /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp
[root@localhost ftp]# cat /var/log/audit/audit.log   根據解決方案來進行檢視
[root@localhost ftp]# restorecon -v /var/ftp/*       重新整理
restorecon reset /var/ftp/westos context unconfined_u:object_r:mnt_t:s0->unconfined_u:object_r:public_content_t:s0
[root@localhost ftp]# ls -Z                          檢視安全上下文
-rw-r--r--. root root unconfined_u:object_r:public_content_t:s0 westos

刪除主配置檔案中新增的家目錄。
這裡寫圖片描述
清空日誌通過生成的日誌進行效果檢視。
這裡寫圖片描述
瀏覽器輸入IP進行生成日誌檢視效果。
這裡寫圖片描述
檢視日誌時已經出現瞭解決方案。
這裡寫圖片描述
根據解決方案檢視重新整理。
這裡寫圖片描述
之所以可以生成解決方案是由於setroubleshoot-server 軟體可以監聽 /var/log/audit/audit.log 中的稽核資訊並將簡短摘要傳送至 /var/log/messages。所以才能進行監控衝突。

[root@localhost ftp]# rpm -qa | grep setrouble        查詢拍錯工具的安裝包
setroubleshoot-plugins-3.0.59-1.el7.noarch
setroubleshoot-server-3.2.17-2.el7.x86_64
[root@localhost ftp]# yum remove setroubleshoot-server-3.2.17-2.el7.x86_64  移除安裝包
Complete!
[root@localhost ftp]# > /var/log/messages    清空日誌
[root@localhost ftp]# > /var/log/audit/audit.log 
[root@localhost ftp]# cat /var/log/audit/audit.log  檢視效果沒有出錯提示
[root@localhost ftp]# cat /var/log/messages 
在瀏覽器中重新整理檢視日誌
[root@localhost ftp]# cat /var/log/audit/audit.log     檢視為空
[root@localhost ftp]# cat /var/log/messages     沒有出錯工具的提示
[root@localhost ftp]# yum install setroubleshoot-server -y    重新安裝監控工具
[root@localhost ftp]# > /var/log/audit/audit.log              清空日誌
[root@localhost ftp]# > /var/log/messages 
清空日誌在瀏覽器中重新整理然後檢視日誌:
[root@localhost ftp]# cat /var/log/messages                 已經有了排錯提示

# grep vsftpd /var/log/audit/audit.log | audit2allow -M mypol

[root@localhost ftp]# cat /var/log/audit/audit.log   可以檢視到日誌

1,解除安裝setroubleshoot-server 軟體進行演示檢視。
這裡寫圖片描述
2,將日誌全部清除。
這裡寫圖片描述
3,在瀏覽器重新整理
這裡寫圖片描述
4,檢視日誌沒有排錯提示。
5,重新安裝setroubleshoot-server 軟體進行監控。
這裡寫圖片描述
6,已經有了排錯提示:
這裡寫圖片描述

讓selinux允許使用阿帕奇服務以外的埠。

注意:埠不可以重複。

[root@localhost ftp]# yum install httpd -y   安裝阿帕奇
[root@localhost ftp]# cat /etc/services | grep http  檢視http埠
#       http://www.iana.org/assignments/port-numbers
http            80/tcp          www www-http    # WorldWideWeb HTTP
http            80/udp          www www-http    # HyperText Transfer Protocol
http            80/sctp                         # HyperText Transfer Protocol
[root@localhost ftp]# vim /etc/httpd/conf/httpd.conf   將42行埠改為6666
[root@localhost ftp]# systemctl restart httpd          重啟阿帕奇服務起不來
Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
[root@localhost ftp]# setenforce 0   將selinux改為警告
[root@localhost ftp]# systemctl restart httpd   可以重啟阿帕奇,但是不安全,所以需要新增埠。
[root@localhost ftp]# semanage port -l | grep http  檢視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
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989
[root@localhost ftp]# semanage port -a -t http_port_t -p tcp 6666   新增6666埠到http中
[root@localhost ftp]# semanage port -l | grep http   檢視http可用埠,6666已經成功新增
http_cache_port_t              tcp      8080, 8118, 8123, 10001-10010
http_cache_port_t              udp      3130
http_port_t                    tcp      6666, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988
pegasus_https_port_t           tcp      5989
[root@localhost ftp]# setenforce 1        將selinux設定為強制
[root@localhost ftp]# systemctl restart httpd   阿帕奇照樣可以重啟
[root@localhost ftp]# cat /etc/services | grep -E "\<21\>"  通過埠號檢視具體哪個服務在使用埠
# 21 is registered to ftp, but also used by fsp
ftp             21/tcp
ftp             21/udp          fsp fspd
ftp             21/sctp                 # FTP
matip-type-b    351/tcp bhoetty         # MATIP Type B / bhoetty (added 5/21/97)
[root@localhost ftp]# cat /etc/services | grep -E "\<32\>"   32埠並沒有在使用,通過檢視我們就不會重複使用埠以至於報錯。

安裝阿帕奇檢視http埠:
這裡寫圖片描述
編輯阿帕奇檔案,將埠寫入通過更改selinux級別將服務重啟,但是檢視時6666埠仍然不支援,需要新增。
這裡寫圖片描述
將配置檔案埠改為6666。
這裡寫圖片描述
新增埠成功,將selinux級別改回來,由於已經添加了埠就可以正常重啟服務。
這裡寫圖片描述

.