SELinux策略语言--客体类别和许可
1. 簡介
? ? SELinux策略語言主要描述policy.conf的相關語法,其相關部分如下圖所示:
2. 客體類別
? ??定義內核支持的客體類別和許可的策略語言指令,并對SELinux系統中內核客體類別標準做一個概述。
2.1 SELinux中客體類別的用途
? ? ? 客體類別及其許可是SELinux中訪問控制的基礎,客體類別代表資源的范疇,如文件和套接字,許可代表對這些資源的訪問權限,如讀或發送。理解客體類別和許可是SELinux中比較困難的部分,因為這需要SELinux和Linux兩方面的知識。
? ? ? ?一個客體類別代表某個確定類型(如文件或套接字)的所有資源,一個客體類別的實例(如某個特定的文件或套接字)被稱為一個客體,通常,客體類別和客體這兩個術語可以交替使用,但是理解其定義是相當重要的,客體類別指的是資源(文件)的所有范疇,客體指的是客體類別的某個特定實例(/etc/passwd)。
2.2 在SELinux策略中定義客體類別
? ? ? 策略中必須包括所有SELinux內核支持的客體類別和許可的聲明,以及其他客體管理器。? ? ? 添加新的客體類別和修改現有客體類別的許可是一項復雜的任務,僅當修改真實系統代碼本身時應該這樣做,與SELinux策略語言的其他方面不同,客體類別和許可依賴于Linux的實現細節,特別是內核。實際上,客體類別和許可被設計為盡可能準確地代表系統執行的資源,正是由于這個原因,改變客體類別或在系統中改變對應的許可才變得有意義。
? ? ??聲明許可有兩種方法,第一種叫做通用許可(被多個客體類別所共用),它允許我們創建與客體類別一起作為一個組的許可,通用許可在類似的客體類別(如文件和符號連接)共享一套訪問許可時很有用;第二種方法叫做特定類別許可(由某個客體類別所獨用),它允許我們單獨為客體類別聲明特定的許可,正如將會看到的,有一些客體類別只有特定的許可,有一些只有通用許可,還有一些是這兩者都有。
? ? ? 客體類別和許可定義方法如下:
? ? ? ???聲明客體類別:class 類別名字
? ? ? ???通用許可:common 通用名 {許可集}
? ? ? ???聯合許可和客體類別:class 類別名 [inherits 通用許可集名] [{許可集}]
2.3 有效的客體類別和許可
? ? ? ?在Kernel3.0.36客體類別和許可定義如下(定義見kernel/security/selinux/include/classmap.h),共有49個客體類別 被定義:? ?
[cpp]?view plaincopy? ? ? 為了易于理解,我們將內核客體類別分解成四大類:文件相關的,網絡相關的,System V IPC和雜項。
2.3.1?與文件相關的客體類別
? ? ? ? ?此類客體類別是那些與文件及其他存儲在文件系統中的資源有關的,這是大多數用戶最熟悉的客體類別了,它包括了所有的與持續不變的,在磁盤上的文件系統和在內存中的文件系統,如proc和sysfs結合在一起的客體類別。與文件相關的客體類別如下表所示:
| 客體類別 | 描述 |
| filesystem | 文件系統(如一個真實的分區) |
| file | 普通文件 |
| dir | 目錄 |
| fd | 文件描述符 |
| lnk_file | 符號鏈接 |
| chr_file | 字符文件 |
| blk_file | 塊文件 |
| sock_file | UNIX域套接字 |
| fifo_file | 命名管道 |
2.3.2?與網絡相關的客體類別
? ? ? ? ?與網絡有關的客體類別代表網絡資源如網絡接口、不同種類的套接字和主機。目前的客體類別足以允許對單個系統上的網絡進行廣泛的控制,另外還有增強,如標記網絡數據包,下表列出了與網絡和套接字有關的客體類別。| 客體類別 | 描述 |
| socket | 其它的套接字 |
| tcp_socket | TCP套接字 |
| udp_socket | UDP套接字 |
| rawip_socket | 發送原始IP數據包的套接字 |
| node | 代表一個IP地址或一段IP地址的主機 |
| netif | 網絡接口(如eth0) |
| netlink_socket | 所有其它的Netlink套接字 |
| packet_socket | 發送其它類型的原始數據包的套接字 |
| key_socket | PF_KEY協議家族的套接字,用于管理IPsec中的密鑰 |
| unix_stream_socket | 本地機器上(unix域)的IPC流套接字 |
| unix_dgram_socket | 本地機器上(unix域)的IPC數據報套接字 |
| netlink_route_socket | 用于控制和管理網絡資源如路由表和IP地址的Netlink套接字 |
| netlink_firewall_socket | 用于創建用戶空間防火墻過濾器的Netlink套接字 |
| netlink_tcpdiag_socket | 用于監視TCP連接的Netlink套接字 |
| netlink_nflog_socket | 用于接收Netfilter日志消息的Netlink套接字 |
| netlink_xfrm_socket | 用于獲取、管理和設置IPsec<IP Security>參數的Netlink套接字 |
| netlink_selinux_socket | 用于接收策略載入通知,強制模式切換和清空AVC緩存的Netlink套接字 |
| netlink_audit_socket | 用于控制審核的Netlink套接字 |
| netlink_ip6fw_socket | 用于創建用戶空間IPV6防火墻過濾器的Netlink套接字 |
| netlink_dnrt_socket | 用于控制DECnet路由的Netlink套接字 |
| association | IPsec安全聯盟 |
| netlink_kobject_uevent_socket | 用于在用戶空間接收內核事件通知的Netlink套接字 |
| appletalk_socket | |
| packet | |
| dccp_socket | |
| tun_socket | ? |
? ? ? 使用IP安全(IPsec)的通訊擁有額外的資源,由客體類別association和key_socket表示,IPsec安全聯盟是為通訊提供安全服務的連接,association客體類別代表IPsec聯盟,IPsec需要通過密鑰管理(PF_KEY)套接字管理密鑰,它通過key_socket客體類別進行表現。
? ? ??Linux系統上的本地通訊可以使用unix域套接字(PF_UNIX)實現,這些套接字通常用于本地IPC,面向連接的套接字也叫做流套接字,通過unix_stream_socket客體類別進行表現,數據報套接字通過unix_dgram_socket表現,unix域套接字可以與文件系統上的某個特定文件關聯起來,讓其它應用程序很容易就連接到套接字,這個文件通過sock_file客體類別表現,它是一個與文件有關的客體類別。
? ? ??SELinux中最后一組套接字是Netlink套接字,這些套接字最初是開發用于在Linux最后提供一個標準意義的網絡配置,現在它們常常用于在內核與用戶空間之間通訊,基于協議類型的不同有多種表示Netlink套接字的客體類別,常見的netlink_socket表示無特定客體類別的保留協議。
2.3.3 System V IPC客體類別
? ? ? ??與IPC有關的客體類別代表System V IPC資源,msgq和msg客體類別分別代表消息隊列和消息隊列中的消息,sem客體類別代表信號量,shm客體類別代表共享內存段,注意對關于所有System V IPC資源的全局系統信息的訪問是通過system類別上的許可進行控制的。
| 客體類別 | 描述 |
| sem | 信號量 |
| msg | 消息隊列中的消息 |
| msgq | 消息隊列 |
| shm | 共享內存段 |
| ipc | 已經沒有使用了 |
2.3.4?其它雜類客體類別
? ? ?下表列出了剩下的客體類別,這些客體類別與其它種類不容易混合在一起。| 客體類別 | 描述 |
| security | 內核中的SELinux安全服務器 |
| process | SELinux中的進程 |
| system | 整個系統 |
| capability | Linux中表示權利的特權 |
| key | |
| memprotect | |
| peer | |
| capability2 | |
| kernel_service | ? |
3. 客體類別許可(file和process)
? ? 在2.3中,描述了每種客戶類別的許可,為了更好地理解許可是如何控制對系統資源的訪問,下面我們進一步討論一下兩個客體類別許可:file和process。
3.1?文件客體類別許可
? ? 下表列出了file客體類別許可,大多數對所有與文件有關的客體類別的許可都是公用的,只有execute_no_trans,entrypoint和execmod是特定給file客體類別的(這些許可都加了星號*)。? ??
| file許可 | 描述 | 分類 |
| ioctl | ioctl(2)系統調用請求 | |
| read | 讀取文件內容,對應標準Linux下的r訪問權 | 標準Linux許可 |
| write | 寫入文件內容,對應標準Linux下的w訪問權 | 標準Linux許可 |
| create | 創建一個新文件 | |
| getattr | 獲取文件的屬性,如訪問模式(例如:stat,部分ioctl) | |
| setattr | 改變文件的屬性,如訪問模式(例如:chmod,部分ioctl) | |
| lock | 設置和清除文件鎖 | |
| relabelfrom | 從現有類型改變安全上下文 | SELinux特定許可 |
| relabelto | 改變新類型的安全上下文 | SELinux特定許可 |
| append | 附加到文件內容(即用o_append標記打開) | 文件擴展許可 |
| unlink | 移除硬鏈接(刪除) | |
| link | 創建一個硬鏈接 | |
| rename | 重命名一個硬鏈接 | |
| execute | 執行,與標準Linux下的x訪問權一致 | 標準Linux許可 |
| swapon | 不贊成使用。它用于將文件當做換頁/交換空間 | 文件擴展許可 |
| quotaon | 允許文件用作一個限額數據庫 | 文件擴展許可 |
| mounton | 用作掛載點 | 文件擴展許可 |
| audit_access | ||
| open | 打開文件 | |
| execmod | 使被修改過的文件可執行(含有寫時復制的意思) | SELinux特定許可 |
| execute_no_trans | 在訪問者域轉換的執行文件(即沒有域轉換) | SELinux特定許可 |
| entrypoint | 通過域轉換,可以用作新域的入口點的文件 | SELinux特定許可 |
? ? ? 文件客體類別有三類許可:直接映像到標準Linux訪問控制許可的許可,標準Linux許可的擴展和SELinux特定的許可。
3.1.1?標準Linux許可
? ? ?許可read,write和execute基本上與標準Linux學科讀,寫和執行(即r,w,x)類似,但與標準許可檢查有些不同,在標準Linux中,訪問權通常是在文件打開時進行檢查,在SELinux中,訪問權是每次使用時都會檢查,read許可包括了讀取整個文件的能力,它包括以一種隨機方式訪問文件的許可,write許可包括寫入文件的許可,包括附加。與read許可類似,write許可包括了隨機訪問寫,當一個文件被映像到內存中時,也會檢查read和write許可,例如:mmap(2)系統調用,或使用mprotect(2)系統調用保護現有映像被改變。? ? ?execute許可使用execve(2)系統調用控制執行文件的能力,不管有沒有域轉換(參考下面的exec_no_trans),它都是必需要有的,execute許可在成功使用一個文件作為共享庫時也是必需的。
3.1.2?標準Linux訪問控制的擴展
? ? ? ?SELinux的一個好處就是它提供了額外的許可,可以更細粒度地進行控制。
? ? ? ?在標準Linux中,創建文件的能力受到寫入容納該文件的目錄的權限限制,在SELinux中,create許可直接控制創建每個特定SELinux類型文件的能力,使用這個許可,我們可以允許一個域類型創建etc_t類型的文件,而不是shadow_t類型,與SELinux中的大多數許可類似,文件create許可是必需的,但并不充分,例如:創建域類型也必須要有權在dir客體中創建客體,并且要有創建file客體的許可,我們可能需要write許可。 ?
? ? ? ?最后的文件擴展許可是mounton,quotaon和swapon。mounton許可控制使用文件作為一個掛載點的能力(mount(2)系統調用),更常見的是使用目錄作為一個掛載點,然而,在執行綁定掛載時(MS_BIND),可以使用文件作為掛載點。quotaon許可控制存儲限額信息,當使用quotactl(2)系統調用(q_quotaon)開啟限額時,存儲限額信息的文件的路徑就確定了,調用進程域類型必須要有那個文件的quotaon許可,才能成功完成系統調用。
3.1.3?SELinux特定許可
? ? ? 對于文件而言有五種SELinux特定許可:relabelfrom,relabelto,execute_no_trans,enTRypoint和execmod。
? ? ? relabelfrom和relabelto許可控制域類型將文件從一個類型改為另一個類型的能力,為了使重新標記文件成功,域類型必須要有該文件客體當前類型的relabelfrom許可,并且還要有新類型的relabelto許可,注意這些許可不允許控制確切的許可對,域可以將它有relabelfrom許可的任何類型改為它有relabelto許可的任何類型,在重新標記時可以增加約束。
? ? ??execute_no_trans許可允許域執行一個無域轉換的文件,這個許可還不夠執行一個文件,還需要execute許可,沒有execute_no_trans許可,進程可能只能在一個域內執行,如果我們想要確保一個執行過程總是會引發一個域轉換(或失敗)時,此時就會想要排除execute_no_trans許可,例如:當登陸進程為一個用戶登陸執行一個shell時,我們總是想要shell進程從有特權的登陸域類型轉移出來。
? ? ?entrypoint許可控制使用可執行文件允許域轉換的能力,execute,execute_no_trans和entrypoint許可允許精確控制什么代碼可以執行什么域類型,SELinux控制各個程序域類型的能力是它能夠提供強壯靈活的安全的主要原因。
? ? ?execmod許可控制執行在進程內存中已經被修改了的內存映像文件的能力,這在防止共享庫被另一個進程修改時非常有用,沒有這個許可時,如果一個內存映像文件在內存中已經被修改了,進程就不能再執行這個文件了。
3.2?進程客體類別許可
? ? ? 下表列出了進程客體類別許可,與文件許可不同,許多進程許可沒有直接對應到標準的Linux訪問控制,因為傳統的Linux沒有將進程作為一個正式的客體對待。
| process許可 | 描述 | 分類 |
| fork | 派生兩個進程 | 創建進程 |
| transition | 通過execve(2)系統調用轉換到一個新的上下文(域類型) | 進程域類型轉換 |
| sigchld | 發送sigchld信號 | 進程信號 |
| sigkill | 發送sigkill信號 | 進程信號 |
| sigstop | 發送sigstop信號 | 進程信號 |
| signull | 不發送信號測試另一個進程的存在性 | 進程信號 |
| signal | 發送一個非sigkill,sigstop或sigchld的信號 | 進程信號 |
| ptrace | 跟蹤程序執行的父進程或子進程 | |
| getsched | 獲取進程的優先級 | 進程屬性 |
| setsched | 設置進程的優先級 | 進程屬性 |
| getsession | 獲取進程的會話ID | 進程屬性 |
| getpgid | 獲取進程的組進程ID | 進程屬性 |
| setpgid | 設置進程的組進程ID | 進程屬性 |
| getcap | 獲取這個進程允許的Linux能力 | 進程屬性 |
| setcap | 為進程設置允許的Linux能力 | 進程屬性 |
| share | 允許與克隆的或派生的進程共享狀態 | 創建進程 |
| getattr | 通過/proc/[pid]/attr/目錄獲取進程的屬性 | |
| setexec | 下一次調用execve(2)時覆蓋默認的上下文 | |
| setfscreate | 允許進程設置由其創建的客體的上下文 | |
| noatsecure | 禁用清除安全模式環境,允許進程在execve(2)上禁用glibc的安全模式特性 | 進程域類型轉換 |
| siginh | 在execve(2)上繼承信號狀態 | 創建進程 |
| setrlimit | 改變進程硬性資源限制 | |
| rlimitinh | 在execve(2上)繼承進程資源限制 | 創建進程 |
| dyntransition | 允許進程動態地轉移到新的上下文中 | 進程域類型轉換 |
| setcurrent | 設置當前的進程上下文,當進程試圖執行一個動態域轉換時,這是第一個檢查的能力 | |
| execmem | 產生一個匿名的映像或可寫的私有文件映像可執行體 | 執行可寫入內存 |
| execstack | 產生進程堆棧可執行體 | 執行可寫入內存 |
| execheap | 產生一個堆棧可執行體 | 執行可寫入內存 |
| setkeycreate | ||
| setsockcreate | ? |
3.2.1?創建進程
? ? ?fork許可控制進程使用fork(2)系統調用的能力,這個系統調用創建一個進程的副本,只是進程標識符和資源利用數據有所不同,派生進程的安全上下文不能改變,通常,執行一個新程序的第一步就是派生,控制進程派生的能力,限制它使用系統資源的能力,可以潛在地預防某些類型的拒絕服務攻擊。
? ??三個其它的許可在進程轉換時控制狀態的共享,share許可控制進程狀態的共享,如在一個execve(2)系統調用上的文件描述符和內存地址空間,siginh許可控制信號狀態的繼承,包括任意掛起的信號,最后,rlimitnh許可控制從父進程那里繼承的資源限制。
3.2.2?進程域類型轉換
? ? ?transition許可控制進程通過execve(2)系統調用從一個域轉到另一個域的能力,如果允許,域轉換或明確地請求時可能會自動產生一個type_transition規則,請求明確的域轉換的能力是由setexec許可控制的,這個請求會往proc文件系統中寫一個特定的文件,這個過程在setexeccon(3)庫函數中被抽象出來,為下一個請求execve(2)系統調用查看當前請求的轉換的能力是由getattr許可控制的。
? ? ?noatsecure許可使內核在進行域轉換時不設置glibc的安全模式,在安全模式下,glibc清除進程環境,包括相當多的環境變量,如LD_PRELOAD,如果不清除環境,源域可能會控制目標域的關鍵部分,當域轉換進入更高特權域時,允許noatsecure許可是特別危險的。
? ? ?dyntransition許可與轉換許可類似,但它是控制進程在任何時間改變域類型的能力,不僅僅是執行程序那一刻,這個許可比transition許可更危險,因為它允許起始域在新域中執行任意的代碼,由于這個原因,dyntransition許可只有在目標域是起始域的一個受限的子集時可以安全地使用,否則,想要理解域改變的保護就會失敗,所有授予目標域的訪問權對起始域都必須要能夠可訪問。
3.2.3?創建文件
? ? ? 與域轉換類似,與文件有關的客體的安全上下文設置可以通過繼承或type_transition規則進行自動創建,也可以明確地創建,通過在proc文件系統中寫入一個特定的文件實現與文件有關的客體的安全上下文的設置,這個過程抽象在setfscreatecon(3)庫調用中,setfscreate許可控制產生這個明確請求的能力,與setexeccon類似,查看文件系統客體上下文請求的當前狀態是由getattr許可控制的。
3.2.4?進程信號
? ? ?向進程發送信號的權力非常大,因為它可能允許結束或停止進程,此外,信號可以用于在進程間傳輸信息,sigchld,sigkill和sigstop許可分別控制發送SIGCHLD,SIGKILL和SIGSTOP信號的能力,signull許可控制發送空信號的能力,例如:通過傳遞一個0字符作為一個信號參數給kill(2)系統調用,最后,signal許可控制發送其它信號的能力。
? ? ?為什么有的信號有明確的許可定義,而剩下的都在常見的signal許可控制之下呢?有兩個原因,SIGKILL和SIGSTOP這兩個信號有明確的許可,因為它們不能由進程阻礙,SIGCHLD信號有它自己的許可主要是因為它是被正式使用的(如它經常是每個進程init時使用),剩下的安全屬性都相同,因此它們都由signall許可控制。
3.2.5?進程屬性
? ? ?查詢或設置調度優先級以及進程策略的能力是由getsched和setched許可控制的,設置調度優先級和策略,特別是設置SCHED_FIFO策略,使用sched_setscheduler(2)系統調用可以允許進程不受限制占用CPU時間,因此,它可以用于拒絕服務攻擊。
? ? ? 進程組和會話標識符控制大部分進程的交互,包括終端處理和信號傳遞,getpgid和setpgid許可控制查詢和設置進程組標識符,getsession許可控制進程標識符的查詢。
? ? ? getcap和setcap許可控制查詢和設置進程的Linux許可,要成功設置一個許可,這個許可也必須被標記了域類型的capability客體類別接受。
? ? ? 資源限制,如核心轉儲的最大大小或CPU時間的最大大小,都是使用setrlimit(2)系統調用,setrlimit許可控制設置硬性資源限制的能力。
3.2.6?執行可寫入內存
? ? 正如在file客體類別的execmod許可中討論的那樣,執行可寫入內存段的能力是許多安全事件的起源,為了幫助標記出這些事件,首先創建execmem,execstack和execheap許可,它們分別控制可執行的匿名映像、堆棧和堆的創建,許可的執行依賴于另外的軟件,如ExecShied,硬件特性,如NX。
? ? ?ExecShied是Red Hat開發的內核補丁,控制內存執行,并添加了其它安全特性,它包括在所有的Fedora Core和自Red HatEnterprise Linux 3以來的版本中。NX是一個硬件設置,它實現了許多ExecShied相同的目標。
4. 小結
? ? ?客體類別和許可是SELinux中訪問控制的基礎,它們是策略語言和內核中訪問實施機制的一部分。
? ? ?客體類別代表資源,如文件、進程、目錄和套接字,每種系統資源都對應著一個客體類別。
? ? ?許可代表對系統資源的訪問權,每個客體類別都有一套定義好的許可,叫做訪問向量。
? ? ?客體類別使用類別聲明語句(class)進行聲明。
? ? ?使用訪問向量語句(也是class)將許可與客體類別進行關聯。
? ? ?SELinux中定義了兩類許可:通用許可和特定類別許可。
? ? ?通用許可是一套由多個客體類別共享的許可集,使用訪問向量語句將它們與客體類別作為一個組進行關聯。
? ? ?SELinux提供客體類別和許可精確地覆蓋了所有的系統資源,在FC 4中,有超過40個客體類別,反映了Linux的豐富和復雜。
? ? ?理解所有的客體類別和許可需要深入理解SELinux和Linux。在Linux中允許訪問完成多個任務需要一個或多個客體類別的多個許可。
總結
以上是生活随笔為你收集整理的SELinux策略语言--客体类别和许可的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 脐带血要不要保存?看了你就明白!
- 下一篇: Android 在 SElinux下 如