selinux概念
由美國國家安全域(NSA)和SCC聯合開發的,強制訪問控制的安全模塊,2000年以GPL開源,linux2.6內核后集成在內核里,
不啟用selinux時,訪問模式叫:DAC(discretionary access control)自由訪問控制
在DAC模式下的行程能夠訪問哪些資源是由啟用這個行程的用戶身份決定的,這個用戶能訪問的,這個行程都可以訪問,
啟用selinux時,訪問模式叫:MAC(Mandatory access control)強制訪問控制
在MAC模式下的行程能夠訪問哪些資源是由selinux設定的,
selinux的作業型別
selinux的作業型別定義在/etc/selinux/config檔案中
centos7:
# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
centos6:
# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
- targeted:保護常見的網路服務(默認作業型別)
- minimum:只對選擇的服務保護
selinux安全背景關系
-
傳統linux,一切皆檔案,由用戶,組,權限控制訪問
-
在selinux中,一切皆物件(object),由存放在inode的擴展屬性域的安全元素所訪問控制,
查看inode的擴展屬性域的命令:
ls -Z和ps -Z,這些屬性起名叫標簽或context,
ls:
# ls -lZ -rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg -rw-r--r--. root root system_u:object_r:admin_home_t:s0 initial-setup-ks.cfg -rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 linux-3.10.67.tar.xz drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 scriptsps:
# ps auxZ LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND system_u:system_r:init_t:s0 root 1 0.0 0.1 193788 6904 ? Ss 05:25 0:06 /usr/lib/systemd/systemd --swit system_u:system_r:kernel_t:s0 root 2 0.0 0.0 0 0 ? S 05:25 0:00 [kthreadd] system_u:system_r:kernel_t:s0 root 3 0.0 0.0 0 0 ? S 05:25 0:00 [ksoftirqd/0] -
所以檔案,埠,行程都具備安全標簽:安全背景關系(security context)
-
安全上下位由5個元素組成:user:role:type:sensitivity:category
- user:登錄系統的用戶型別
- root:root用戶
- user_u:普通用戶
- system_u:系統用戶
- unconfined_t:自由行程/檔案,多數本地行程都屬于此,
- role:定位檔案,行程和用戶的用途,檔案:object_r;行程和用戶:system_r
- type:資料型別,最常用的屬性,target策略就是根據type的值,控制可以訪問/不可訪問哪些資源,但是有個問題,每個資源只有唯一的type,當有多個別的東西想訪問同一個資源的時候就麻煩了,就要修改type成public_content_t(只讀,不可以修改這個資源);public_content_rw_t(讀寫)
- sensitivity:默認是s0
- category:target作業型別下,不使用,
- user:登錄系統的用戶型別
-
標簽/context分實際的標簽和期望標簽
-
實際標簽:使用ls -Z和ps -Z看到的標簽,
-
期望標簽:安裝作業系統后,系統給的標簽,標簽是可以修改的,所以有期望標簽,修改了某個檔案的標簽后,這個檔案的期望標簽和實際標簽就不一樣了,
查看檔案,行程,埠的期望標簽:
semanage fcontext -l# semanage fcontext -l | grep "/var/log/messages" /var/log/messages[^/]* all files system_u:object_r:var_log_t:s0 # ls -Z /var/log/messages -rw-------. root root system_u:object_r:var_log_t:s0 /var/log/messages期望標簽存放在:/etc/selinux/targeted/contexts/files/目錄
# ls /etc/selinux/targeted/contexts/files/ file_contexts file_contexts.homedirs.bin file_contexts.subs file_contexts.bin file_contexts.local file_contexts.subs_dist file_contexts.homedirs file_contexts.local.bin media
-
selinux策略
- object:所以可以讀取的物件,包括檔案,目錄,行程,埠
- subject:行程
- 當一個subject要訪問object時,selinux執行AVC(access vector cache)檢查,在AVC中,subject和object的權限被快取,
- 安全策略:定義subject讀取object的規則資料庫,規則中記錄了哪個型別的(type)的subject使用哪個方法讀取哪一個object是允許的還是拒絕的,并且定義了哪種行為是允許或拒絕的,
啟用selinux
查看selinux是啟用還是禁用
# getenforce
Enforcing
[root@localhost ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
enforcing:啟用狀態
permissive:沒啟用,但是違反了selinux的規則,只出警告資訊而已,
disabled:禁用狀態,
-
臨時啟用:
# setenforce 1 # getenforce Enforcing -
臨時禁用:
# setenforce 0 # getenforce Permissive注意:使用命令setenforce,只能在Enforcing和Permissive間切換,不能從disabled狀態切換成Enforcing,
永久修改selinux啟用或禁用:修改檔案/etc/selinux/config,重啟才生效,
禁用后(disabled而不是permissive)創建的檔案就沒有標簽了,
而且【-rw-r--r--】后面沒有點,有點就說明有標簽,
# sestatus
SELinux status: disabled
# setenforce 1
setenforce: SELinux is disabled
# touch temp2
[root@localhost ~]# ls -Z temp2
-rw-r--r-- root root ? temp2
從disabled切換到enabled后,在看剛才創建的temp2檔案:
有點了,但是type是unlabeled_t
# getenforce
Enforcing
# ls -Z temp2
-rw-r--r--. root root system_u:object_r:unlabeled_t:s0 temp2
查看詳細狀態資訊:
# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive//當前是禁用的
Mode from config file: enforcing//組態檔是啟用的
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 31
定義的策略存放在:SELinuxfs mount /sys/fs/selinux
avc快取在avc目錄,
# ls /sys/fs/selinux/
access checkreqprot context disable load null policyvers status
avc class create enforce member policy reject_unknown user
booleans commit_pending_bools deny_unknown initial_contexts mls policy_capabilities relabel
安全布林值存放在:/sys/fs/selinux/booleans
# pwd
/sys/fs/selinux/booleans
[root@localhost booleans]# ll ftp*
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_anon_write
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_connect_all_unreserved
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_connect_db
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_full_access
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_use_cifs
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_use_fusefs
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_use_nfs
-rw-r--r--. 1 root root 0 Feb 28 16:44 ftpd_use_passive_mode
檔案ftpd_anon_write里的內容是2個0,從檔案名字可以看出來是ftp的匿名寫,值是0,說明不允許匿名寫,
# cat ftpd_anon_write
0 0
管理檔案安全標簽
1,修改標簽中的type:chcon-t file
測驗標簽中type的作用,/var/log/messages檔案的標簽中的type是var_log_t,
手動使用logger命令,往它里面寫東西,發現是可以寫進去的,
修改它的type成tmp_t,再用logger寫,發現寫不進去了,
# ll /var/log/messages -Z
-rw-------. root root system_u:object_r:var_log_t:s0 /var/log/messages
# logger "test sdf "
# tail -1 /var/log/messages
Feb 29 18:33:32 localhost root: test sdf
# chcon -t tmp_t /var/log/messages
# ll -Z /var/log/messages
-rw-------. root root system_u:object_r:tmp_t:s0 /var/log/messages
# logger "test 2222sdf "
# grep "test 2222sdf " /var/log/messages
根據某個檔案的標簽,修改:chcon --reference f1 f2
把檔案f2的標簽修改成和檔案f1完全一樣,
# ll -Z /tmp/website/
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 aa
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
# chcon --reference /tmp/website/index.html /tmp/website/aa
# ll -Z /tmp/website/
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 aa
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
選項-R:遞回修改目錄所有的檔案
# ls /tmp/website/d1
11 22
# ll /tmp/website/d1/11 -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/website/d1/11
# ll /tmp/website/d1/22 -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/website/d1/22
# ll /tmp/website/d1/ -Zd
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /tmp/website/d1/
# chcon -R --reference /var/www/html/ /tmp/website/d1/
# ll /tmp/website/d1/ -Zd
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /tmp/website/d1/
# ll /tmp/website/d1/ -Z
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 11
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 22
2,cp命令和mv命令多標簽的影響,
cp命令type會改變,
# ll -Z /var/log/messages
-rw-------. root root system_u:object_r:var_log_t:s0 /var/log/messages
# cp /var/log/messages /root/
# ll -Z messages
-rw-------. root root unconfined_u:object_r:admin_home_t:s0 messages
mv命令不改變type
# mv messages /tmp/
# ll /tmp/messages -Z
-rw-------. root root unconfined_u:object_r:admin_home_t:s0 /tmp/messages
3,修改回原來的type,但是忘了原來的type是啥了怎么辦,去看期望(原始)策略是啥,
# semanage fcontext -l | grep "/var/log/message"
/var/log/messages[^/]* all files system_u:object_r:var_log_t:s0
還有一種更簡單的方法:restorecon
# chcon -t tmp_t /var/log/messages
# ll -Z /var/log/messages
-rw-------. root root system_u:object_r:tmp_t:s0 /var/log/messages
# restorecon /var/log/messages
# ll -Z /var/log/messages
-rw-------. root root system_u:object_r:var_log_t:s0 /var/log/messages
把/var/log/messages回復成原來的標簽后,有可能還log還是寫不進去,這時就要重啟服務了,systemctl rsyslog restart
4,修改httpd的默認根目錄,導致selinux標簽不對,網頁檔案無法訪問,
-
修改httpd的組態檔/etc/httpd/conf/httpd.conf,把服務的目錄修改成/tmp/website/
# ll -Z /tmp/website/ -d drwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/website/type是user_tmp_t
-
在/tmp/website/建立index.html檔案
# ll -Z /tmp/website/ -rw-r--r--. root root unconfined_u:object_r:user_tmp_t:s0 index.htmltype是user_tmp_t
-
啟動httpd
-
在瀏覽器訪問index.html
-
結果是訪問不到
原因:/tmp/website/index.html的標簽的type不符合selinux對httpd的要求,所以httpd行程無法訪問它,
httpd能夠訪問的標簽是:httpd_sys_content_t,
而/tmp/website/index.html檔案的type是user_tmp_t,所以httpd不可以訪問它,被selinux給擋住了,
# ll -Zd /var/www/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/
解決辦法:
1,安裝桌面小程式,能夠把selinux相關的資訊顯示出來,(不安裝也無所謂)
2,添加/tmp/website/目錄的期望(默認)策略,到selinux,
添加選項:-a
指明type:-t
/tmp/website(/.*)?:正則運算式/tmp/website目錄自身和目錄下的所有檔案的意思,
# semanage fcontext -a -t httpd_sys_content_t "/tmp/website(/.*)?"
# semanage fcontext -l | grep "/tmp/website"
tmp/website(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
3,由于/tmp/website/有了期望策略,所以恢復/tmp/website/的標簽成,默認標簽,
選項-R:遞回修改目錄下的所有檔案,
# restorecon -R /tmp/website/
# ll -Zd /tmp/website/
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /tmp/website/
# ll -Z /tmp/website/
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
4,重啟httpd
5,當不想讓/tmp/website/是httpd的根目錄了,洗掉它在selinux里的期望策略
洗掉選項:-d
# semanage fcontext -d -t httpd_sys_content_t "/tmp/website(/.*)?"
管理埠標簽
1,查看埠期望(默認)策略:
http協議的埠的期望(默認)策略:80, 81, 443, 488, 8008, 8009, 8443, 9000是可以使用的,
所以不能把其他的埠用于http服務,
# semanage port -l
SELinux Port Type Proto Port Number
afs3_callback_port_t tcp 7001
afs3_callback_port_t udp 7001
# semanage port -l | grep http
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
2,添加埠到默認策略
選項-a:添加
選項-t:指定type
選項-p:指定傳輸層的協議(tcp或udp)型別
# semanage port -a -t http_port_t -p tcp 9932
[root@localhost ~]# semanage port -l | grep "^http_port_t"
http_port_t tcp 9932, 80, 81, 443, 488, 8008, 8009, 8443, 9000
3,從默認策略里洗掉埠
# semanage port -d -t http_port_t -p tcp 9932
# semanage port -l | grep "^http_port_t"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
4,把埠策略里的某個埠,移動到另一個策略
讓9000埠也能用于ssh服務,
# semanage port -l | grep "^http_port_t"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
# semanage port -m -t ssh_port_t -p tcp 9000
# semanage port -l | grep "^ssh_port_t"
ssh_port_t tcp 9000, 22
# semanage port -l | grep "^http_port_t"
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443
管理selinux布林值開關
布林值的作用:細化控制某個服務里的某個小功能是否可以使用,
1,查看布林值
State:是當前的狀態(記憶體中的)
Default:是默認值(本地磁盤存盤的)
# semanage boolean -l
SELinux boolean State Default Description
privoxy_connect_any (on , on) Allow privoxy to connect any
smartmon_3ware (off , off) Allow smartmon to 3ware
比如:
httpd_enable_cgi:控制httpd的cgi功能是否可用,
httpd_enable_homedirs:控制httpd是否可以訪問家目錄,
# semanage boolean -l | grep httpd_enable
httpd_enable_cgi (on , on) Allow httpd to enable cgi
httpd_enable_homedirs (off , off) Allow httpd to enable homedirs
另一種命令:getsebool
選項-a:查看全部布林值
# getsebool -a | grep httpd_use
httpd_use_cifs --> off
httpd_use_fusefs --> off
2,修改布林值:setsebool
只修改當前狀態(重啟后,恢復成default):
# setsebool httpd_enable_homedirs=on
# semanage boolean -l | grep httpd_enable
httpd_enable_cgi (on , on) Allow httpd to enable cgi
httpd_enable_homedirs (on , off) Allow httpd to enable homedirs
httpd_enable_ftp_server (off , off) Allow httpd to enable ftp server
既修改當前狀態,也修改default狀態:
# semanage boolean -l | grep httpd_enable
httpd_enable_homedirs (off , off) Allow httpd to enable homedirs
# setsebool -P httpd_enable_homedirs=on
# semanage boolean -l | grep httpd_enable
httpd_enable_homedirs (on , on) Allow httpd to enable homedirs
3,查看都修改過哪些布林值
# semanage boolean -l -C
SELinux boolean State Default Description
httpd_enable_homedirs (on , on) Allow httpd to enable homedirs
管理日志
日志工具: yum install -y setroubleshoot,有圖形界面,
使用下面命令啟動圖形界面:
# sealert
1,查看由selinux的限制導致的服務不好用的日志,日志檔案:/var/log/message
由selinux的限制導致的服務不好用的日志的特點是有:setroubleshoot字樣,并告訴使用sealert命令去查看詳細的日志,選項-l后面的串是這條日志的標識,
Mar 1 00:04:05 localhost python: SELinux is preventing in ,,,,,,,,
sealert -l 0d882054-5ff7-4693-bf09-7b02f763df6c
使用sealert查看:
# sealert -l 0d882054-5ff7-4693-bf09-7b02f763df6c
使用sealert輸出的日志是保存在檔案: /var/log/audit/audit.log
2,整理/var/log/audit/audit.log檔案,輸出可讀的格式
# sealert -a /var/log/audit/audit.log
查看selinux幫助
安裝selinux幫助檔案:
# yum install selinux-policy-doc
查看與selinux相關的幫助檔案有哪些:
# man -k _selinux
如果沒有顯示出來,說明沒有更新man的資料庫,使用下面的命令更新:
- centos6:
makewhatis - centos7:
mandb
查看與ftp相關的selinux幫助:
# man 8 ftpd_selinux
# c/c++ 學習互助QQ群:877684253

# 本人微信:xiaoshitou5854
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/137089.html
標籤:Linux
