您好,登錄后才能下訂單哦!
小編給大家分享一下CentOS 8系統(tǒng)如何啟用selinux并實(shí)施強(qiáng)制訪問(wèn)控制,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
CentOS 8系統(tǒng)啟用selinux并實(shí)施強(qiáng)制訪問(wèn)控制。
安全增強(qiáng)型 Linux(Security-Enhanced Linux)簡(jiǎn)稱 SELinux,它是一個(gè) Linux 內(nèi)核模塊,也是 Linux 的一個(gè)安全子系統(tǒng)。SELinux主要由美國(guó)國(guó)家安全局開發(fā)。2.6 及以上版本的 Linux 內(nèi)核都已經(jīng)集成了 SELinux 模塊。
SELinux 主要作用就是最大限度地減小系統(tǒng)中服務(wù)進(jìn)程可訪問(wèn)的資源(最小權(quán)限原則)。
設(shè)想一下,如果一個(gè)以 root 身份運(yùn)行的網(wǎng)絡(luò)服務(wù)存在 0day 漏洞,黑客就可以利用這個(gè)漏洞,以 root 的身份在您的服務(wù)器上為所欲為了。是不是很可怕?SELinux 就是來(lái)解決這個(gè)問(wèn)題的。
1、 selinux的三種工作模式
SELinux 有三種工作模式,分別是:
enforcing //強(qiáng)制模式。違反 SELinux 規(guī)則的行為將被阻止并記錄到日志中
permissive //寬容模式。違反 SELinux 規(guī)則的行為只會(huì)記錄到日志中。一般為調(diào)試用
disabled //關(guān)閉 SELinux
SELinux 工作模式可以在/etc/selinux/config中設(shè)置。
如果想從disabled切換到enforcing或者permissive的話,需要重啟系統(tǒng)。反過(guò)來(lái)也一樣。
enforcing 和 permissive 模式可以通過(guò) setenforce 1|0 命令快速切換。
2、 啟用selinux
setenforce 1
vi /etc/selinux/config //編輯配置文件
將
SELINUX=disabled
改為
SELINUX=enforcing
保存退出。重啟后生效。
reboot //重啟計(jì)算機(jī)
getenforce //查看selinux工作模式
/usr/sbin/sestatus -v //查看selinux工作狀態(tài)詳情
當(dāng)前selinux的狀態(tài)為enabled,工作模式為enforcing,策略為targeted,說(shuō)明selinux已經(jīng)正常工作了。
反之,如果要禁用selinux,臨時(shí)的方法是setenforce 0,持久化的方法是修改配置文件,設(shè)置SELINUX=disabled,并重啟使之生效。
1、 selinux的策略
系統(tǒng)中通常有大量的文件和進(jìn)程,為了節(jié)省時(shí)間和開銷,通常我們只是選擇性地對(duì)某些進(jìn)程進(jìn)行管制。而哪些進(jìn)程需要管制、要怎么管制是由策略決定的。
在 CentOS系統(tǒng)中,有三套策略,分別是:
targeted //對(duì)大部分網(wǎng)絡(luò)服務(wù)進(jìn)程進(jìn)行管制,是默認(rèn)的策略
minimum //以targeted為基礎(chǔ),僅對(duì)選定的網(wǎng)絡(luò)服務(wù)進(jìn)程進(jìn)行管制。一般不用。
mls //多級(jí)安全保護(hù)。對(duì)所有的進(jìn)程進(jìn)行管制,這是最嚴(yán)格的策略,配置難度非常大。一般不用,除非對(duì)安全性有極高的要求。
策略可以在/etc/selinux/config文件中指定。
2、 selinux的規(guī)則
一套策略里面有許多規(guī)則,其中部分規(guī)則可以按照需求啟用或禁用,這些規(guī)則稱為布爾型規(guī)則。規(guī)則是模塊化、可擴(kuò)展的。在安裝新的應(yīng)用程序時(shí),應(yīng)用程序可通過(guò)添加新的模塊來(lái)添加規(guī)則。用戶也可以手動(dòng)地增減規(guī)則。
3、 使用seinfo查看selinux的策略信息
seinfo - SELinux policy information tool
seinfo //不加參數(shù)運(yùn)行,查看策略文件以及文件所包含的內(nèi)容
從輸出可以看到,策略中包含Users、Roles、Types、Boleans,它們分別是用戶、角色、類型和布爾型規(guī)則。下面分別查看:
seinfo -r //查看selinux的所有角色(role)
當(dāng)前有14個(gè)selinux角色。
seinfo -u //列出selinux的所有身份表示(user)
當(dāng)前有8個(gè)selinux用戶
seinfo -t //查看selinux的所有類型(type)
可以看到,當(dāng)前系統(tǒng)中selinux的類型有4940個(gè)。
seinfo -b //列出所有布爾型規(guī)則
當(dāng)前有330條布爾型selinux規(guī)則。
seinfo -b | grep nfs //-b --bool,查看與nfs相關(guān)的布爾型規(guī)則
4、 使用sesearch查詢selinux策略的詳情
sesearch是SELinux的策略查詢工具,使用方法如下:
sesearch --allow | grep \ cluster_t\ //查看主體類型為cluster_t的allow規(guī)則
sesearch --allow | grep \ cluster_t: //查看客體類型為cluster_d的allow規(guī)則
5、 使用setsebool開關(guān)一個(gè)布爾規(guī)則
setsebool [選項(xiàng)] <規(guī)則名稱> <on|off>
setsebool -P httpd_anon_write on
開關(guān)代表切換selinux規(guī)則的生效狀態(tài)。運(yùn)行成功后不顯示任何信息。
1、 什么是安全上下文?
安全上下文分為“進(jìn)程安全上下文”和“文件安全上下文”。一個(gè)“進(jìn)程安全上下文”一般對(duì)應(yīng)多個(gè)“文件安全上下文”。只有兩者的安全上下文對(duì)應(yīng)上了,進(jìn)程才能訪問(wèn)文件。它們的對(duì)應(yīng)關(guān)系由策略中的規(guī)則決定。
文件安全上下文由文件創(chuàng)建的位置和創(chuàng)建文件的進(jìn)程所決定。而且系統(tǒng)有一套默認(rèn)值,用戶也可以對(duì)默認(rèn)值進(jìn)行設(shè)定。
需要注意的是,單純的移動(dòng)文件操作并不會(huì)改變文件的安全上下文。
2、 安全上下文間結(jié)構(gòu)和含義
安全上下文有四個(gè)字段,分別用冒號(hào)隔開。形如:system_u:object_r:admin_home_t:s0。
3、 查看安全上下文
(1) 查看文件的安全上下文
ls -Z /var/www/htmp //查看目錄的安全上下文
可以看到/var/www/html/目錄的selinux類型為http_sys_content_t
(2) 查看進(jìn)程的安全上下文
ps auxZ | grep -v grep | grep httpd
可以看到,httpd進(jìn)程的selinux類型為http_t,且存在多個(gè)httpd進(jìn)程,具有相同的安全上下文。注意,進(jìn)程的安全上下文不同于其可執(zhí)行文件的安全上下文。
為什么httpd進(jìn)程可以訪問(wèn)/var/www/html目錄?因?yàn)楫?dāng)前存在著相應(yīng)的允許主體httpd_t訪問(wèn)客體http_sys_content_t進(jìn)行相關(guān)操作的的selinux規(guī)則。
4、 修改文件安全上下文
下面通過(guò)一個(gè)例子了解修改文件安全上下文的方法:
(1) 創(chuàng)建測(cè)試文件
//在/var/www/html目錄中創(chuàng)建測(cè)試文件:
echo index.html > /var/www/html/index.html
//查看文件的安全上下文
ls -Z /var/www/html/index.html
可以看到,文件的selinux type為httpd_sys_content_t
//在/root目錄創(chuàng)建另一個(gè)測(cè)試文件
echo index1.html > /root/index1.html
//將測(cè)試文件移動(dòng)到/var/www/html/目錄中
mv /root/index1.html /var/www/html/index1.html
//查看測(cè)試文件的安全上下文
ls -Z /var/www/html/index1.html
可以看到,index1.html文件的selinux類型為admin_home_t。這是因?yàn)槲募陌踩舷挛牟粫?huì)因?yàn)槲募灰苿?dòng)而發(fā)生變化。
//使用links遠(yuǎn)程訪問(wèn)index.html文件
links 192.168.242.164/index.html
訪問(wèn)成功。
//遠(yuǎn)程主機(jī)使用links訪問(wèn)index1.html文件
links 192.168.242.164/index1.html
提示沒(méi)有權(quán)限訪問(wèn)index1.html。
這是因?yàn)椴淮嬖谠试S類型為httpd_t的主體訪問(wèn)類型為admin_home_t的客體文件并進(jìn)行讀取操作的規(guī)則。可使用下面的命令查找符合條件的規(guī)則:
sesearch -s httpd_t -t admin_home_t -c file -p read --allow
找不到符合要求的規(guī)則條目。
要想解決這個(gè)問(wèn)題,要么修改/var/www/html/index1.html文件的安全上下文,將類型修改為httpd_sys_content_t或其它已經(jīng)被允許訪問(wèn)的類型;要么新建一條規(guī)則,允許httpd_t類型的主體對(duì)admin_home_t類型的客體文件進(jìn)行讀取操作。這里介紹第一種方式,即修改文件的安全上下文。
(2) 使用chcon修改文件的安全上下文
//使用chcon命令指定文件上下文中的類型,chcon命令的使用方法如下:
chcon <選項(xiàng)> <文件或目錄1> [<文件或目錄n>]
選項(xiàng) | 功能 |
-u <值> | 修改安全上下文的用戶字段 |
-r <值> | 修改安全上下文的角色字段 |
-t <值> | 修改安全上下文的類型字段 |
-l <值> | 修改安全上下文的級(jí)別字段 |
--reference <文件或目錄> | 將文件/目錄的安全上下文修改為與指定的文件/目錄一致 |
-R | 遞歸操作 |
-h | 修改符號(hào)鏈接的安全上下文,不加選項(xiàng)則修改符號(hào)鏈接所對(duì)應(yīng)的文件 |
//一種方法是使用-t選項(xiàng)直接指定類型
chcon -t httpd_sys_content_t /var/www/html/index1.html
//嘗試遠(yuǎn)程訪問(wèn)index1.html文件
links 192.168.242.164/index1.html
訪問(wèn)成功。說(shuō)明index1.html文件安全上下文的修改生效了。
另一種方法是使用--reference選項(xiàng)復(fù)制其它文件的安全上下文
//再次將index1.html文件的type修改為admin_home_t
chcon -t admin_home_t /var/www/html/index1.html
chcon --referece=/var/www/html/index.html /var/www/html/index1.html
文件的安全上下文修改成功。文件安全上下文中的類型設(shè)置成了httpd_sys_content_t,自然可以被httpd進(jìn)程訪問(wèn),因此不再使用links驗(yàn)證。
(3) 使用restorecon自動(dòng)為文件設(shè)置正確的安全上下文
ls -Z /var/www/html/index1.html //查看安全上下文
restorecon /var/www/html/index1.html //自動(dòng)設(shè)置安全上下文
文件安全上下文修改成功。
5、 修改目錄的安全上下文
通過(guò)一個(gè)例子了解修改目錄及其中文件的安全上下文的方法。
(1) 創(chuàng)建測(cè)試目錄和網(wǎng)頁(yè)
//在/root目錄創(chuàng)建目錄
mkdir /root/myweb/
//創(chuàng)建網(wǎng)頁(yè)
echo myweb > /root/myweb/myweb.html
//測(cè)試目錄移動(dòng)到/var/www/html/
mv /root/myweb /var/www/html/
//查看移動(dòng)后的測(cè)試目錄的安全上下文
ls -dZ /var/www/html/myweb/
//查看移動(dòng)后的測(cè)試目錄中網(wǎng)頁(yè)的安全上下文
ls -Z /var/www/html/myweb/myweb.html
//使用links遠(yuǎn)程訪問(wèn)index.html文件
links 192.168.242.164/myweb/myweb.html
產(chǎn)生錯(cuò)誤的原因和前面的例子一樣,都是因?yàn)闆](méi)有相應(yīng)的selinux規(guī)則。像上面一樣,我們修改文件的安全上下文中的類型。
chcon -t httpd_sys_content_t /var/www/html/myweb/myweb.html
成功。
//創(chuàng)建新的網(wǎng)頁(yè)文件
echo myweb1 > /var/www/html/myweb/myweb1.html
新建文件的安全上下文還是admin_home_t,這是因?yàn)槲募诘哪夸浀陌踩舷挛闹械念愋瓦€是admin_home_t,沒(méi)有被改變。因此我們需要修改目錄的安全上下文,這樣在此目錄中新建的文件將具有新的安全上下文。
chcon -t httpd_sys_content_t /var/www/html/myweb/
之后再創(chuàng)建新的文件,安全上下文的類型就變成httpd_sys_content_t了。
(2) 使用semanage命令修改目錄的默認(rèn)安全上下文
semanage-fcontext - SELinux Policy Management file context tool
看下面的例子:
//在/root目錄創(chuàng)建目錄
mkdir /root/newweb/
//創(chuàng)建網(wǎng)頁(yè)
echo newweb > /root/newweb/newweb.html
//測(cè)試目錄移動(dòng)到/var/www/html/
mv /root/newweb /var/www/html/
//查看移動(dòng)后的測(cè)試目錄的安全上下文
ls -dZ /var/www/html/newweb/
//查看移動(dòng)后的測(cè)試目錄中網(wǎng)頁(yè)的安全上下文
ls -Z /var/www/html/newweb/newweb.html
可以看到,移動(dòng)后目錄和其中的文件的安全上下文中的類型都是admin_home_t
//修改目錄及其中全部文件的安全上下文,添加httpd_sys_content_t類型
semanage fcontext -a -t httpd_sys_content_t "/var/www/html/newweb(/.*)?"
//修改之后的安全上下文并未生效,需要使用restorecon命令使其生效:
restorecon -Rv /var/www/html/newweb/
//查看目錄和文件的安全上下文
ls -dZ /var/www/html/newweb/ /var/www/html/newweb/newweb.html
安全上下文的修改生效了。
//查看測(cè)試目錄和文件的默認(rèn)安全上下文
semanage fcontext -l | grep /var/www/html/
可以看到,/var/www/html/newweb目錄和其中的文件又默認(rèn)的安全上下文,而前面的myweb目錄沒(méi)有設(shè)置默認(rèn)安全上下文,因此沒(méi)有處現(xiàn)在結(jié)果中。
默認(rèn)安全上下文的作用是什么?設(shè)置了默認(rèn)安全上下文后,不管如何修改安全上下文中的屬性,只要運(yùn)行restorecon命令,就可以將默認(rèn)安全上下文恢復(fù)到當(dāng)前配置中。
//使用chcon修改安全上下文
chcon -t admin_home_t /var/www/html/newweb/newweb.html
//使用restorecon命令恢復(fù)默認(rèn)安全上下文
restorecon /var/www/html/newweb/newweb.html
當(dāng)前的安全上下文已恢復(fù)為默認(rèn)。
1、 查看日志文件
selinux阻止進(jìn)程訪問(wèn)的記錄保存在/var/log/audit/audit.log文件中。
tail -n 3 /var/log/audit/audit.log type=*VC msg=audit(1615342682.388:139): *vc: denied { getattr } for pid=2632 comm="httpd" path="/var/www/html/index1.html" dev="sda1" ino=67619205 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0 type=SYSCALL msg=audit(1615342682.388:139): arch=c000003e syscall=6 success=no exit=-13 a0=7f261c043dc8 a1=7f261b7fd8d0 a2=7f261b7fd8d0 a3=1 items=0 ppid=2307 pid=2632 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)ARCH=x86_64 SYSCALL=lstat AUID="unset" UID="apache" GID="apache" EUID="apache" SUID="apache" FSUID="apache" EGID="apache" SGID="apache" FSGID="apache" type=PROCTITLE msg=audit(1615342682.388:139): proctitle=2F7573722F7362696E2F6874747064002D44464F524547524F554E44
在日志中詳細(xì)記錄了selinux的主體和客體的信息。
2、 使用sealert程序對(duì)日志進(jìn)行分析
將上面的日志信息復(fù)制到新建的文件中,之后使用sealert程序分析。
sealert -a se.txt //-a參數(shù)指定文件
sealert給出了事件的解釋:
SELinux is preventing /usr/sbin/httpd from getattr access on the 文件 /var/www/html/index1.html.
之后給出了兩個(gè)修復(fù)建議,一個(gè)是使用restorecon插件進(jìn)行修復(fù),置信度為99.5:
/sbin/restorecon -v /var/www/html/index1.html
另一個(gè)是使用catchall插件進(jìn)行修復(fù),置信度為1.49:
ausearch -c 'httpd' --raw | audit2allow -M my-httpd
semodule -i my-httpd.pp
使用restorecon可以完美地解決問(wèn)題,但是使用catchall只能滿足讀取文件屬性的要求,無(wú)法讀取文件內(nèi)容。這樣還是會(huì)出現(xiàn)selinux的錯(cuò)誤日志:
日志內(nèi)容是拒絕讀取文件。
1、 創(chuàng)建測(cè)試程序
在這個(gè)例子中,創(chuàng)建一個(gè)打開/var/log/messages文件并執(zhí)行寫入操作的程序。
//安裝policycoreutils-devel包 yum install policycoreutils-devel vi mydaemon.c //創(chuàng)建并編輯代碼文件,加入下面的內(nèi)容 #include <unistd.h> #include <stdio.h> FILE *f; int main(void) { while(1) { f = fopen("/var/log/messages","w"); sleep(5); fclose(f); } } 保存退出 //編譯文件 gcc -o mydaemon mydaemon.c vi mydaemon.service //創(chuàng)建并編輯服務(wù)配置文件,加入下面的內(nèi)容 [Unit] Description=Simple testing daemon [Service] Type=simple ExecStart=/usr/local/bin/mydaemon [Install] WantedBy=multi-user.target 保存退出 //安裝為服務(wù)并啟動(dòng) cp mydaemon /usr/local/bin/ cp mydaemon.service /usr/lib/systemd/system systemctl start mydaemon systemctl status mydaemon
//查看進(jìn)程
ps -efZ | grep mydaemon
可以看到,新的進(jìn)程尚未設(shè)置selinux安全上下文。
2、 生成自定義策略
sepolicy generate --init /usr/local/bin/mydaemon
生成了多個(gè)文件。
運(yùn)行生成的shell腳本,使用新的策略模塊重新構(gòu)建新的系統(tǒng)策略。
/mydaemon.sh
//設(shè)置可執(zhí)行文件的安全上下文
restorecon -v /usr/local/bin/mydaemon /usr/lib/systemd/system
//重啟進(jìn)程并查看安全上下文
systemctl restart mydaemon
ps -efZ | grep mydaemon
進(jìn)程的安全上下文已經(jīng)設(shè)置好了。
此進(jìn)程由于受到selinux的限制,無(wú)法寫入/var/log/messages文件。
//查看審計(jì)日志中記錄的錯(cuò)誤(將*VC中的*改為A)
ausearch -m *VC -ts recent
返回了最近產(chǎn)生的錯(cuò)誤,mydaemon進(jìn)程作為主體無(wú)法open和write客體/var/log/messages文件。
//使用sealert命令查看更詳細(xì)的信息
sealert
//使用audit2allow提出整改建議(將*VC中的*改為A)
ausearch -m *VC -ts recent | audit2allow -R
返回的結(jié)果表示,需要將mydaemon_t作為參數(shù)帶入到logging_write_generic_logs接口中。
由于audit2allow輸出的結(jié)果可能不準(zhǔn)確,所以需要去找對(duì)應(yīng)的策略接口,確認(rèn)其存在:
grep -r "logging_write_generic_logs" /usr/share/selinux/devel/include/ | grep .if
找到了策略接口文件。
查看策略接口文件的內(nèi)容
cat /usr/share/selinux/devel/include/system/logging.if
上面是logging_write_generic_logs接口的配置,可以使用這個(gè)接口。
//將接口寫入te文件
echo "logging_write_generic_logs(mydaemon_t)" >> mydaemon.te
//重新執(zhí)行腳本,構(gòu)建新的selinux策略
./mydaemon.sh
//查看審計(jì)日志中記錄的錯(cuò)誤(將*VC中的*改為A)
ausearch -m *VC -ts recent
程序仍在運(yùn)行,但是沒(méi)有產(chǎn)生新的錯(cuò)誤,說(shuō)明新的selinux規(guī)則生效了
以上是“CentOS 8系統(tǒng)如何啟用selinux并實(shí)施強(qiáng)制訪問(wèn)控制”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。