全域可寫文件和基於使用者的程序監禁
我希望能夠一般地選擇某個執行檔(可能是惡意的)
x
並執行它(從管理員帳戶),寫入權限僅限於某些目錄(動態推斷)"${dirs[@]}"
。執行檔應該有權訪問系統上可全域訪問的任何內容。
我想我可以使用簡單的使用者切換並擁有一個專用的無狀態系統使用者
foreveralone
來執行這些執行檔。每當我想在
x
這些限制下執行時,我都會flock
鎖定文件,chown -R foreveralone:foreveralone -- "${dirs[@]}"
然後執行sudo -u foreveralone -g foreveralone $PWD/x
.之後,我會將
chown
目錄寫入其他人,這樣foreveralone
文件系統上就沒有持久性文件。/tmp, /dev/shm
我想我還需要從foreveralone
s 文件中清理全域寫入目錄(例如, )。我的問題是:
- 給定標准設置的 *nix 系統,這是一種可行且安全的監禁程序機制嗎?
- 標准設置 *nix 上的標準全域可寫位置和文件到底是什麼?
- 我怎樣才能找到它們比使用類似的東西更好
sudo -u 永遠單獨 -g 永遠單獨找到 / !-type l -writable 2>/dev/null | grep -v ‘^/proc’
(我的
find
遊戲很弱。/proc/$pid
似乎有很多文件看起來是可寫的,但實際上並非如此,所以我跳過了那些(我想知道這是怎麼回事))。無論如何,在我的系統上,3. 返回(過濾以顯示文件類型):
character special file /dev/full character special file /dev/fuse character special file /dev/net/tun character special file /dev/null character special file /dev/ptmx character special file /dev/random character special file /dev/tty character special file /dev/urandom character special file /dev/zero character special file /sys/kernel/security/apparmor/.null directory /run/lock directory /run/shm directory /tmp directory /tmp/.ICE-unix directory /tmp/.X11-unix directory /var/local/dumps directory /var/mail directory /var/spool/samba directory /var/tmp regular empty file /run/sendmail/mta/smsocket regular empty file /sys/kernel/security/apparmor/.access socket /dev/log socket /run/acpid.socket socket /run/avahi-daemon/socket socket /run/cups/cups.sock socket /run/dbus/system_bus_socket socket /run/gdm_socket socket /run/mysqld/mysqld.sock socket /run/samba/nmbd/unexpected socket /run/sdp socket /tmp/.ICE-unix/2537 socket /tmp/mongodb-27017.sock socket /tmp/.X11-unix/X0
- 有沒有更好的(更簡單/更靈活的解決方案)
在我的特殊情況下,
x
這將是一個潛在的惡意建構腳本,它應該在不寫入錯誤位置或讀取全域不可讀的內容的情況下執行。
首先對不起我的英語不好。讓我們只使用 unix 概念為您展示一些東西,因為我認為它可以幫助(或者可能沒有)。
想像一下,我希望每個使用者都可以執行執行檔 nano,但絕不能以呼叫其執行檔的使用者身份執行,但環境有限,只能編輯 apache 配置或某些組中的文件,換句話說我希望 nano 像限制特定虛擬使用者權限的 linux 服務一樣執行。
1-首先我將創建使用者 nano 並禁用其登錄:
useradd nano -d /var/nano mkdir /var/nano chown -R nano:nano /var/nano passwd -l nano
2- 讓 nano 以使用者 nano 身份執行(例如,如果 root 呼叫 nano,它必須作為 nano 而不是 root 執行)
chown nano:nano /usr/bin/nano chmod a+s /usr/bin/nano
現在 +s 表示, nano 將作為所有者執行,而不是由誰呼叫它。
3- 使用 root 呼叫 nano 進行測試:
#nano #ps aux | grep nano nano 3399 0.0 0.0 13828 3840 pts/0 S+ 08:48 0:00 nano
美麗的!Nano 現在以使用者 nano 身份執行,而不取決於我登錄的使用者。
4- 那麼現在呢?我想讓 nano 編輯 /var/www/apache2 的文件
chgrp -R www-data /var/www/ (yes i now that is unnecessary in Debian if the group are respected) chmod -R g+rw /var/www adduser nano www-data
5- 還有什麼?
您會注意到現在每個使用者都可以使用 nano(或它的特殊副本“nano-special”;-) 來編輯 /var/www 文件,那麼如果您希望只有 nano 組中的使用者可以這樣做呢?
簡單刪除其他權限即可執行:
chmod o-x /usr/bin/nano
並將使用者添加到組 nano
adduser myuser1 nano