SELinux(Security-Enhanced Linux) 是美國國家安全局(NAS)對于強制訪問控制的實現,是 Linux® 上最杰出的新安全子系統。NSA是在Linux社區的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件。SELinux 默認安裝在 Fedora 和 Red Hat Enterprise Linux 上,也可以作為其他發行版上容易安裝的包得到。本文是一篇翻譯稿件,主要介紹了怎樣通過SELinux從而加強網絡安全,原文地址如下:http://securityblog.org/brindle/2007/05/28/secure-networking-with-selinux/
在過去的一年中付出了相當多的努力后使得SELinux對網絡支持得更好,感謝偉大的SELinux社區,隨著支持的進一步發展,它變得對人們越來越有用,人們愿意嘗試使用它并提出反饋意見,最終將變得更加有用,受眾也更加廣泛,因為在SELinux中網絡支持還在不斷發展(已經有一部分其它想法正在討論中,可能今后會被包括進來),我將保持本文的更新,請隨時關注。
在SELinux中的網絡支持包括很多事情,過去SELinux通過對象類的方式實現細粒度的網絡訪問控制,這些對象類是網絡接口,網絡地址和一些套接字對象類(如tcp_socket,udp_socket,rawip_socket等)。
SELinux策略直接標記出了不同種類的網絡對象包括接口(使用netifcon),互聯網節點(使用nodecon)和端口(使用portcon),策略的語法結構看起來象下面這樣:
netifcon eth0 system_u:object_r:external_netif_t system_u:object_r: external_packet_t nodecon 192.168.1.1 255.255.255.255 system_u:object_r:external_node_t; portcon tcp 21 system_u:object_r:ftp_port_t ; 這些被標記了的對象使用正常的SELinux規則就可以訪問了: allow ftpd_t external_netif_t : netif {tcp_send tcp_recv }; allow ftpd_t external_node_t : node { tcp_send tcp_recv }; allow ftpd_t ftp_port_t : tcp_socket { send_msg recv_msg name_bind }; |
策略和規則結合起來實際上指定了ftpd_t綁定到端口21,在端口21上發送和接收tcp消息,在eth0(它的ip地址是192.168.1.1)網卡接口上發送和接收tcp消息,這些規則工作得很好,唯一的問題是它們不能在一條規則中進行描述,因此它們不是連接在一起的。這就意味著如果有另外一套規則指出ftpd_t只能在內部接口上發送和接收dns(名稱解析服務)數據包,依靠上面的規則他們也能在外部接口上發送和接收dns數據包,注意這些訪問控制也可以用在我稍后要介紹的在SELinux中通過echo 1 > /selinux/compat_net使用的compat_net選項上。這些對象的標簽最后都將增加到libsemanage中,使用semanage命令可以改變它們,但這個命令不能修改策略。
在2006年頂級SELinux開發者研討會期間,我們討論了如何使網絡標記變得更容易、更多地支持典型的網絡約束和大部分重要的精密地綁定接口、地址和端口的方法,幸運地是在Linux中netfilter已經支持這些內容以及一些額外的好處,例如網絡連接跟蹤可以更精確地限制諸如使用動態端口的ftp這些事情。
可能會想到向iptables中增加一條域分類符來控制更容易一些,因此可能會寫一條規則和SELinux域一樣定義端口、網絡地址、網絡接口實現僅允許ftp數據包到達ftpd_t。這可能會用到分布式SELinux策略,但是,可以從SELinux安全服務器移動一部分策略到iptables策略和子系統中去,但我們并不歡迎這樣做,因為我們喜歡單一的,集中的,可分析的SELinux策略,實際上讓我們使用netfilter和iptables來標記數據包,然后用SELinux規則描述同意或拒絕訪問,讓我們看看這都是如何使用的:
iptables -A INPUT -t mangle -p tcp --dport 21 -j SECMARK --selctx system_u:object_r:ftp_packet_t
這條語句標記了經過端口21的數據包為ftp_ packet_t,SELinux規則只是簡單地允許ftpd_t發送和接收這種類型的數據包:
allow ftpd_t ftp_packet_t : packet { send recv };
但是這相對于傳統的網絡控制而言并沒有做出更新穎的事情來,讓我們再來看看更有趣的內容:
iptables -A INPUT -t mangle -p tcp --dport 21 -i eth0 -s 192.168.0.1/24 -j SECMARK –selctx system_u:object_r:ftp_packet_t
這條語句標記了在eth0上,來自192.168.0.1/24,端口21的數據包為ftp_packet_t,因此這就體現了netfilter支持集中處理的好處,另一個iptables規則如下:
iptables -A INPUT -t mangle -m state --state RELATED,ESTABLISHED -j CONNSECMARK –restore
它將為與此相關的數據包進行拷貝,因此當ftp客戶端嘗試通過相關端口(傳輸時端口是動態指定的)傳輸一個文件時將接收到相同的標簽,它將運用netfilter的連接跟蹤特性來允許ftp僅僅接收與其連接有關的數據包,但這并不需要新增加策略規則或對策略進行修改,因為我們正在對標簽進行修改。
這將轉變netfilter已經存在的功能,使其能夠更精確地指定哪個域能訪問哪個數據包,因此它允許你相對于進程而不是機器控制防火墻的功能,如果你在同一臺機器上運行有一些不同安全屬性的服務那它就有用了,例如:允許你有一個內部的Apache實例訪問公司的機密數據,而另外一個外部的Apache實例提供靜態的web內容到internet上。
大多數人都在思考在SELinux中為什么不僅僅是提供對網絡的支持,而是要在防火墻規則條目中進行網絡訪問控制,下面的SELinux網絡支持就是標記網絡通訊。
共6頁: 1 [2] [3] [4] [5] [6] 下一頁 | ||||||||
|