簡體   English   中英

如何通過進程屬性限制對Linux目錄的寫訪問?

[英]How to restrict write access to a Linux directory by process attributes?

我們遇到的情況是,將日志記錄目錄的寫訪問權限限制為特定的用戶進程子集是有利的。 我們已經修改了這些特定的進程(例如,telnet等),以便在發生重要的用戶操作時生成日志記錄(如遠程連接等)。 我們不想要的是用戶通過復制和編輯現有的日志記錄來手動創建這些記錄。

syslog接近但仍然允許用戶生成虛假記錄, SELinux似乎看似合理,但作為一個無法管理的野獸有一個可怕的聲譽。

任何見解都表示贊賞。

以root身份運行本地日志記錄守護程序。 讓它監聽Unix域套接字(通常是/var/run/my-logger.socket或類似的)。

編寫一個簡單的日志記錄庫,通過Unix域套接字將事件消息發送到本地運行的守護程序。 對於每個事件,還通過輔助消息發送進程憑據。 有關詳細信息,請參閱man 7 unix

當本地日志記錄守護程序收到消息時,它會檢查輔助消息,如果沒有,則丟棄該消息。 憑證的uidgid確切地告訴誰正在運行已發送記錄請求的進程; 這些都是由內核本身驗證的,所以它們不能被欺騙(除非你有root權限)。

這里有一個聰明的位:守護進程還檢查憑證中的PID ,並根據其值/proc/PID/exe 它是由發送消息的進程執行的實際進程二進制文件的符號鏈接,用戶無法偽造。 為了能夠偽造消息,他們必須用自己的二進制覆蓋實際的二進制文件,這應該需要root權限。

(可能存在競爭條件:用戶可能會制作一個執行相同操作的特殊程序,並且立即exec()是他們知道允許的二進制文件。為避免該競爭,您可能需要在檢查憑據后讓守護程序響應,並且日志記錄客戶端發送另一條消息(帶有憑據),因此守護程序可以驗證憑據是否仍然相同,並且/proc/PID/exe符號鏈接沒有更改。我個人會使用它來檢查消息的真實性(通過記錄器要求對事件進行確認,使用隨機cookie,並讓請求者用校驗和和cookie響應事件校驗和是否正確。包括隨機cookie應該使得無法將確認填入套接字隊列之前exec() 。)

使用pid您還可以進一步檢查。 例如,您可以跟蹤進程父級以通過跟蹤父級來查看人類用戶如何連接,直到您通過ssh或控制台檢測到登錄。 這有點單調乏味,因為您需要解析/proc/PID/stat/proc/PID/status文件,並且不可移植。 OSX和BSD有一個sysctl調用,您可以使用它來查找父進程ID,因此您可以通過編寫特定於平台的parent_process_of(pid_t pid)函數使其可移植。

這種方法將確保您的日志記錄守護程序確切地知道1)日志記錄請求來自哪個可執行文件,以及2)哪個用戶(以及如何執行進程跟蹤時如何連接)運行該命令。

當本地日志記錄守護程序以root身份運行時,它可以將事件記錄到僅root目錄中的文件,和/或將消息轉發到遠程計算機。

顯然,這不是完全輕量級的,但假設每秒事件少於十幾個,那么日志記錄開銷應該完全可以忽略不計。

通常有兩種方法可以做到這一點。 一,以root身份運行這些進程並寫保護目錄(主要用於歷史目的)。 那么除了root之外沒有人可以在那里寫。 第二個,更安全的是將它們作為另一個用戶(不是root )運行,並為該用戶提供寫入訪問日志目錄的權限。

我們采用的方法是使用setuid二進制文件來允許對日志記錄目錄進行寫訪問,二進制文件可由所有用戶執行,但只允許在/ proc / $ PPID定義的父進程路徑時寫入日志記錄/ exe匹配我們放置在系統上的修改后的二進制路徑的子集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM