目錄
前言
一、SELinux安全上下文
1、SELinux 簡介
2、基礎操作命令
1. 查看SELinux狀態
2. 切換工作模式
3、安全上下文(Security Context)
1. 查看上下文
2. 修改上下文
chcon命令
semanage 命令
4、SELinux布爾值(Booleans)
5、日志分析與故障排除
1. 查看SELinux日志
2.生成解決方案建議
6、常見問題與解決方案
場景1:Web服務器無法訪問文件
場景2:服務無法綁定非標準端口
7、注意事項
二、Linux防火墻-Firewalld
1、 概述
2、 Linux防火墻
防火墻結構
firewalld防火墻
區域分類
區域功能
firewall-cmd命令用法
結語
前言
學習Linux系統,安全管理為重中之重,保護好系統的安全,就是保護數據的安全,今天主要是SELinux系統講解以及Linux系統防火墻firewall的命令運用。
一、SELinux安全上下文
1、SELinux 簡介
-
是什么? SELinux(Security-Enhanced Linux)是Linux內核的強制訪問控制(MAC)安全子系統,提供更細粒度的權限控制,防止進程或用戶越權操作。
-
核心思想
-
最小權限原則:進程/用戶只能訪問其明確需要的資源。
-
基于標簽的訪問控制:所有資源(文件、端口、進程)被賦予安全上下文(Security Context)。
-
-
工作模式
模式 | 描述 |
Enforcing | 強制執行策略,拒絕非法操作并記錄日志。 |
Permissive | 僅記錄違規操作,不阻止(用于調試)。 |
Disabled | 完全關閉SELinux(需重啟生效)。 |
2、基礎操作命令
1. 查看SELinux狀態
getenforce# 查看當前模式
sestatus# 詳細狀態(模式/策略類型)
2. 切換工作模式
setenforce 0# 切換到Permissive模式
setenforce 1# 切換到Enforcing模式
注意:setenforce僅臨時生效,永久修改需編輯 /etc/selinux/config 文件。
3、安全上下文(Security Context)
1. 查看上下文
ls -Z /var/www/html # 查看文件/目錄的上下文
ps -Z -C httpd# 查看進程的上下文
2. 修改上下文
chcon命令
選項 | 說明 | 示例消息 |
-t, --type TYPE | 設置安全上下文的類型部分 | 已將 file.txt 的類型更改為 httpd_sys_content_t |
-u, --user USER | 設置安全上下文的用戶部分 | 已將 file.txt 的用戶更改為 system_u |
-r, --role ROLE | 設置安全上下文的角色部分 | 已將 file.txt 的角色更改為 object_r |
--reference=FILE | 使用指定文件的安全上下文 | 已從 ref_file 復制上下文到 target_file |
-R, --recursive | 遞歸處理文件和目錄 | 已遞歸更改 dir/ 及其內容的上下文 |
-h, --help | 顯示幫助信息 | 顯示幫助菜單 |
-v, --verbose | 顯示操作詳情 | 正在更改 file.txt 的安全上下文 |
--version | 顯示版本信息 | chcon (GNU coreutils) 8.32 |
選項使用案例
設置文件類型 將 /var/www/html/index.html 的上下文類型設為 httpd_sys_content_t:
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
設置用戶部分 將 /etc/nginx/nginx.conf 的用戶部分設為 system_u:
sudo chcon -u system_u /etc/nginx/nginx.conf
設置角色部分 將 /home/user/file.txt 的角色部分設為 object_r:
sudo chcon -r object_r /home/user/file.txt
遞歸操作目錄 遞歸修改 /var/www/html/ 目錄下所有文件的上下文類型:
sudo chcon -R -t httpd_sys_content_t /var/www/html/
顯示幫助信息
chcon --help
顯示版本信息
chcon --version
詳細模式操作 啟用詳細輸出,修改 ~/.ssh/config 的上下文類型:
sudo chcon -v -t ssh_home_t ~/.ssh/config
說明:
-
實際執行時,若未添加 -v 參數,chcon 默認不輸出成功信息,僅在出錯時顯示錯誤。
-
使用 -v 參數可查看操作詳情(如上述表格中的“示例消息”)。
chcon -t httpd_sys_content_t /var/www/html/index.html # 臨時修改文件類型
restorecon -v /var/www/html/index.html # 恢復默認上下文
semanage 命令
子命令/選項 | 用途說明 | 常用選項 | 示例消息/操作 |
semanage login | 管理SELinux用戶與Linux賬戶的映射關系 | -a (添加)、-d (刪除)、-m (修改) | |
semanage user | 管理SELinux用戶及其角色和權限 | -a、-d、-R (角色)、-L (限制) | 創建新SELinux用戶 web_user 并分配角色 httpd_role |
semanage port | 管理網絡端口與SELinux類型的綁定關系 | -a、-d、-t (類型)、-p (協議) | 將TCP端口 8080 綁定到 http_port_t 類型 |
semanage interface | 管理網絡接口與SELinux類型的綁定關系 | -a、-d、-t | 將接口 eth1 綁定到 netif_t 類型 |
semanage module | 管理SELinux策略模塊(啟用/禁用) | -a、-d、-e (啟用)、-D (禁用) | 啟用策略模塊 my_custom_module |
semanage fcontext | 管理文件/目錄的默認SELinux上下文規則 | -a、-d、-t、-s (范圍) | 添加規則:/webapps(/.*)? 的上下文類型為 httpd_sys_content_t |
semanage boolean | 管理SELinux布爾值(開關策略功能) | -1 (查看)、--on、--off | 啟用布爾值 httpd_can_network_connect |
semanage dontaudit | 管理dontaudit規則(是否記錄特定訪問拒絕事件) | --on、--off | 關閉對 sshd 的 dontaudit 規則 |
-h / --help | 顯示幫助信息 | - | 顯示子命令的幫助菜單 |
-v / --verbose | 顯示詳細操作信息 | - | 顯示添加端口 8080 的詳細過程 |
-n / --noheading | 輸出時隱藏列標題 | - | 僅顯示端口列表數據,無標題行 |
選項使用案例
管理端口綁定
將TCP端口 8080 標記為HTTP服務端口:
sudo semanage port -a -t http_port_t -p tcp 8080
說明:允許Apache等HTTP服務使用8080端口。
管理文件上下文規則
為自定義Web目錄 /opt/webapps 設置默認上下文:
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/webapps(/.*)?"
sudo restorecon -Rv /opt/webapps
說明:添加規則后需運行 restorecon 立即生效。
管理SELinux用戶映射
將Linux用戶 dev_user 映射到SELinux用戶 user_u:
sudo semanage login -a -s user_u dev_user
說明:限制用戶 dev_user 的SELinux權限。
啟用布爾值
允許HTTP服務訪問網絡:
sudo semanage boolean --on httpd_can_network_connect
說明:無需重啟服務,立即生效。
管理策略模塊
禁用自定義策略模塊 mymodule:
sudo semanage module -D mymodule
說明:禁用后相關規則不再生效。
查看當前端口綁定
列出所有HTTP相關端口:
semanage port -l | grep http_port_t
輸出示例:
http_port_t tcp 80, 443, 8080
?刪除文件上下文規則
移除對 /tmp/custom_dir 的上下文規則:
sudo semanage fcontext -d "/tmp/custom_dir(/.*)?"
注意事項
-
權限要求:大多數操作需 sudo 或 root 權限。
-
持久化存儲:semanage 修改的規則會保存到策略庫(默認路徑 /etc/selinux/targeted),重啟后仍有效。
-
結合工具使用:修改文件上下文后,需運行 restorecon 或重啟服務使更改生效。
4、SELinux布爾值(Booleans)
SELinux策略通過布爾值動態調整權限控制(例如允許Apache訪問用戶家目錄)。
getsebool -a | grep httpd# 查看所有與Apache相關的布爾值
setsebool -P httpd_enable_homedirs=on # 啟用布爾值(-P永久生效)
5、日志分析與故障排除
1. 查看SELinux日志
tail -f /var/log/audit/audit.log # 直接查看原始日志
ausearch -m AVC -ts recent# 使用工具過濾日志
2.生成解決方案建議
grep "avc: denied" /var/log/audit/audit.log | audit2allow -M mypolicy
semodule -i mypolicy.pp# 編譯并加載自定義策略
6、常見問題與解決方案
場景1:Web服務器無法訪問文件
-
現象:Apache返回403錯誤,但文件權限正常。
-
解決:
-
檢查文件上下文:ls -Z /var/www/html
-
修復上下文:restorecon -Rv /var/www/html
-
場景2:服務無法綁定非標準端口
-
現象:Nginx無法監聽8080端口。
-
解決:
semanage port -a -t http_port_t -p tcp 8080# 添加端口到SELinux策略
7、注意事項
-
不要隨意禁用SELinux:優先使用Permissive模式調試。
-
謹慎使用chcon:錯誤修改上下文可能導致系統不穩定。
-
備份策略:修改策略前備份 /etc/selinux 目錄。
二、Linux防火墻-Firewalld
1、 概述
按表現形式劃分:
軟件防火墻: 集成在系統內部,Linux系統: iptables、firewalld、ufw; windows系統下: windows defender
硬件防火墻: 華為防火墻、思科防火墻、奇安信防火墻、深信服防火墻等
按技術劃分:
包過濾防火墻: 檢查數據包的源IP、目的IP、源端口、目的端口、TCP的syn控制位
七層防火墻:除了上述檢查外,還會檢查數據內容
防火墻的作用:
阻止來自網絡外部的攻擊、進行流量控制
2、 Linux防火墻
防火墻結構
用戶態:
iptables: 使用iptables命令對防火墻規則進行管理,必須深度理解網絡技術和四表五鏈,對于初學者或者網絡技術不達標的人員不友好
firewalld:使用firewall-cmd命令對防火墻進行管理,采用的是區域劃分的形式。不需要連接底層的四表五鏈,對于初學者比較友好
ufw: 使用ufw命令對防火墻進行管理,命令簡單易懂。
內核態:
四表: 從內核->用戶的順序: raw -> mangle -> nat -> filter
五鏈: input、output、forward、prerouting、postrouting
firewalld防火墻
區域分類
九大區域: block、dmz、drop、external、home、internal、public、trusted、work
區域功能
public:公共區域,默認區域
public (active)
target: default #區域類型規則
icmp-block-inversion: no
interfaces: ens33 #屬于該區域的接口
sources:#來源
services: dhcpv6-client ssh #放行服務的名稱
ports:#放行端口號
protocols:#放行協議
masquerade: no#NAT地址轉換
forward-ports:#轉發端口
source-ports:#源端口
icmp-blocks:#ICMP的阻塞類型,ping的阻塞
rich rules:#富規則
?home: 家庭區域
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?work: 工作區域
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?trusted: 完全信任區域
trusted
target: ACCEPT#不采用默認規則,放行一切
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?internal: 內部區域 (連接內部網絡)
internal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?external: 外部區域 (連接外部網絡,例如: internet網絡)
ternal
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes#默認進行NAT地址轉換
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?dmz: 非軍事化管理區域(內部的服務器放于該區域)
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?drop: 丟棄區域(丟棄一切流量,不給出任何回應)
drop
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
?block: 阻塞區域 (拒絕任何流量,但給出回應)
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
firewall-cmd命令用法
關鍵字:
--list-*
--get-*
--set-*
--add-*
--remove-*
--change-*
--zone=
命令分類:
查看:
#查看所有區域的詳細信息
[root@arthur ~]# firewall-cmd --list-all-zones
#查看指定區域的詳細信息
[root@arthur ~]# firewall-cmd --list-all --zone=public
#查看指定區域的放行服務
[root@arthur ~]# firewall-cmd --list-services --zone=public
#查看指定區域的放行端口
[root@arthur ~]# firewall-cmd --list-ports --zone=public
#查看指定區域包含的網絡接口
[root@arthur ~]# firewall-cmd --list-interfaces --zone=public
#查看指定區域的放心協議
[root@arthur ~]# firewall-cmd --list-protocols --zone=public
#查看指定區域的ICMP阻塞類型
[root@arthur ~]# firewall-cmd --list-icmp-blocks --zone=public
#查看指定區域的放行源地址
[root@arthur ~]# firewall-cmd --list-sources --zone=public
#查看指定區域的源端口
[root@arthur ~]# firewall-cmd --list-source-ports --zone=public
#查看指定區域的富規則
[root@arthur ~]# firewall-cmd --list-rich-rules --zone=public
#查看指定區域的轉發端口
[root@arthur ~]# firewall-cmd --list-forward-ports --zone=public
#查看firewalld支持的服務類型
[root@arthur ~]# firewall-cmd --get-services
#查看firewalld的默認區域
[root@arthur ~]# firewall-cmd--get-default-zone
#查看firewalld支持的ICMP的阻塞類型
[root@arthur ~]# firewall-cmd--get-icmptypes
#查看firewalld所有的活動區域
[root@arthur ~]# firewall-cmd --get-active-zones
#查看指定網絡接口所屬區域
[root@arthur ~]# firewall-cmd --get-zone-of-interface=ens33
#查看所有區域名稱
[root@arthur ~]# firewall-cmd --get-zones
?添加:
#添加指定服務到指定區域
[root@arthur ~]# firewall-cmd --add-service=http --zone=public
success
#添加端口到指定區域
[root@arthur ~]# firewall-cmd --add-port=80/tcp --zone=public
success
#添加指定協議到指定區域
[root@arthur ~]# firewall-cmd --add-protocol=ah --zone=public
success
#添加ICMP阻塞類型到指定區域
[root@arthur ~]# firewall-cmd --add-icmp-block=echo-request --zone=public
success
#windows端驗證
C:\Users\zzh>ping 192.168.115.129正在 Ping 192.168.115.129 具有 32 字節的數據:
來自 192.168.115.129 的回復: 無法訪問目標主機。
來自 192.168.115.129 的回復: 無法訪問目標主機。
來自 192.168.115.129 的回復: 無法訪問目標主機。
#添加指定網絡接口到指定區域
[root@arthur ~]# firewall-cmd --add-interface=ens33 --zone=work
success
#添加指定區域的放行源地址
[root@arthur ~]# firewall-cmd --add-source=192.168.1.0/24 --zone=work
success
#添加指定區域的放行源端口
[root@arthur ~]# firewall-cmd --add-source-port=999/tcp --zone=work
success
#添加轉發端口到指定區域
[root@arthur ~]# firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.115.115 --zone=work
success
#添加地址轉換功能到指定區域
[root@arthur ~]# firewall-cmd --add-masquerade --zone=work
success
#驗證添加
[root@arthur ~]# firewall-cmd --list-all --zone=public
?修改:
#修改默認區域
[root@arthur ~]# firewall-cmd --set-default-zone=work
success
#修改網絡接口所屬區域
[root@arthur ~]# firewall-cmd --change-interface=ens33 --zone=internal
success
[root@arthur ~]# firewall-cmd --change-zone=ens33 --zone=external
success
#追加指定區域的放行源地址
[root@arthur ~]# firewall-cmd --change-source=192.168.2.0/24 --zone=work
success
?刪除:
#刪除指定服務到指定區域
[root@arthur ~]# firewall-cmd --remove-service=http --zone=public
success
#刪除端口到指定區域
[root@arthur ~]# firewall-cmd --remove-port=80/tcp --zone=public
success
#刪除指定協議到指定區域
[root@arthur ~]# firewall-cmd --remove-protocol=ah --zone=public
success
#刪除ICMP阻塞類型到指定區域
[root@arthur ~]# firewall-cmd --remove-icmp-block=echo-request --zone=public
success
#刪除指定網絡接口到指定區域
[root@arthur ~]# firewall-cmd --remove-interface=ens33 --zone=work
success
#刪除指定區域的放行源地址
[root@arthur ~]# firewall-cmd --remove-source=192.168.1.0/24 --zone=work
success
#刪除指定區域的放行源端口
[root@arthur ~]# firewall-cmd --remove-source-port=999/tcp --zone=work
success
#刪除轉發端口到指定區域
[root@arthur ~]# firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=80:toremover=192.168.115.115 --zone=work
success
#刪除地址轉換功能到指定區域
[root@arthur ~]# firewall-cmd --remove-masquerade --zone=work
success
#驗證刪除
[root@arthur ~]# firewall-cmd --list-all --zone=public
?保存規則:
#逐行規則保存
[root@arthur ~]# firewall-cmd --remove-masquerade --zone=work --permanent
#一次性保存所有規則
[root@arthur zones]# firewall-cmd --runtime-to-permanent
success
#保存的規則存儲路徑
/etc/firewalld/zones
結語
今天的主要試驗是關于防火墻的練習,需要在練習中對防火墻的相關命令進行熟練掌握。?