Security

全域可寫文件和基於使用者的程序監禁

  • May 30, 2016

我希望能夠一般地選擇某個執行檔(可能是惡意的)x並執行它(從管理員帳戶),寫入權限僅限於某些目錄(動態推斷)"${dirs[@]}"

執行檔應該有權訪問系統上可全域訪問的任何內容。

我想我可以使用簡單的使用者切換並擁有一個專用的無狀態系統使用者foreveralone來執行這些執行檔。

每當我想在x這些限制下執行時,我都會flock鎖定文件,chown -R foreveralone:foreveralone -- "${dirs[@]}"然後執行sudo -u foreveralone -g foreveralone $PWD/x.

之後,我會將chown目錄寫入其他人,這樣foreveralone文件系統上就沒有持久性文件。/tmp, /dev/shm我想我還需要從foreveralones 文件中清理全域寫入目錄(例如, )。

我的問題是:

  1. 給定標准設置的 *nix 系統,這是一種可行且安全的監禁程序機制嗎?
  2. 標准設置 *nix 上的標準全域可寫位置和文件到底是什麼?
  3. 我怎樣才能找到它們比使用類似的東西更好

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
  1. 有沒有更好的(更簡單/更靈活的解決方案)

在我的特殊情況下,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

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