Linux

允許通過應用程序只讀文件

  • December 30, 2020

我有一個包含秘密的文件和一個生成器應用程序,它讀取它並生成類似於許可證的東西。

該 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().

execve()手冊頁

如果在路徑名引用的程序文件上設置了 set-user-ID 位,則呼叫程序的有效使用者 ID更改為程序文件所有者的有效使用者 ID。

返回的“真實”使用者 IDgetuid()不變,即它是啟動程序的使用者的 UID。


另一件事:

我不希望從 shell 執行生成器。我希望它只從另一個呼叫生成器的腳本 generator.sh 執行,因為我在 generator.sh 中做了更多的事情。

更難,因為你不能有 setuid 腳本。但是您可以有一個執行腳本的 setuid 包裝器(僅此而已),然後該腳本可以執行最終的二進製文件。或者使用 sudo 執行腳本。但是,您可能會遇到不喜歡 setuid 的 shell 的問題,請參閱Setuid 位似乎對 bash 沒有影響Allow setuid on shell scripts

**另請注意,**包含 shell 可能會帶來更多可能的安全問題,並且對於任何 setuid 程序,您應該小心確保執行環境是乾淨的。這包括環境變數和文件描述符,但也可能包括其他可繼承的特性。使用 sudo 的一個原因是它至少嘗試處理此類問題。

另一種可能更好的方法是將特權程序實現為網路服務,並讓使用者只執行一個簡單的啞客戶端程序。

引用自:https://unix.stackexchange.com/questions/626868