允許通過應用程序只讀文件
我有一個包含秘密的文件和一個生成器應用程序,它讀取它並生成類似於許可證的東西。
該 Linux 機器上有允許使用該應用程序的使用者。
由於該應用程序讀取了該機密文件,因此這些使用者必須對該文件具有讀取權限。
有沒有辦法從這些使用者那裡刪除讀取權限 - 當這些使用者執行它時,讓應用程序僅通過該應用程序讀取該文件?
我只想讓執行該應用程序的人能夠讀取該文件,並且只能通過該文件。不只是
cat
它,看它的內容。
- 我看到了一種解決方法
chmod 400 secret_file chmod 110 generator chmod u+s generator
這樣,同一組中的使用者
generator
可以執行generator
而不能讀取secret_file
。但因為
generator
是用的,setuid
所以generator
可以閱讀secret_file
。這是一個很好的解決方案,但我想在 中包含使用者的姓名
generator
,並且使用該解決方案我總是得到所有者的姓名。這就是我從 c/cpp 應用程序獲取使用者名的方式:
#include <pwd.h> uid_t uid = geteuid(); struct passwd *pw = getpwuid(uid); std::string user_name = pw->pw_name;
有沒有其他方法可以解決這個問題?
能以某種方式
apparmor
提供幫助嗎?(我無法理解)一個後續問題 - 有沒有辦法僅通過特定腳本使文件可執行?我的意思是我不想
generator
被shell執行。我希望它只從另一個generator.sh
呼叫的腳本中執行generator
,因為我在generator.sh
. 我希望直接跑generator
的使用者失敗,跑generator.sh
的使用者成功。
使用
getuid()
而不是geteuid()
.如果在路徑名引用的程序文件上設置了 set-user-ID 位,則呼叫程序的有效使用者 ID更改為程序文件所有者的有效使用者 ID。
返回的“真實”使用者 ID
getuid()
不變,即它是啟動程序的使用者的 UID。另一件事:
我不希望從 shell 執行生成器。我希望它只從另一個呼叫生成器的腳本 generator.sh 執行,因為我在 generator.sh 中做了更多的事情。
更難,因為你不能有 setuid 腳本。但是您可以有一個執行腳本的 setuid 包裝器(僅此而已),然後該腳本可以執行最終的二進製文件。或者使用 sudo 執行腳本。但是,您可能會遇到不喜歡 setuid 的 shell 的問題,請參閱Setuid 位似乎對 bash 沒有影響和Allow setuid on shell scripts。
**另請注意,**包含 shell 可能會帶來更多可能的安全問題,並且對於任何 setuid 程序,您應該小心確保執行環境是乾淨的。這包括環境變數和文件描述符,但也可能包括其他可繼承的特性。使用 sudo 的一個原因是它至少嘗試處理此類問題。
另一種可能更好的方法是將特權程序實現為網路服務,並讓使用者只執行一個簡單的啞客戶端程序。