Nginx
nginx代理的多個服務(如uwsgi)如何實現權限分離?
我維護的一個網站由多個本地應用程序組成,所有應用程序都由同一個nginx實例代理。每個應用程序都在其自己的使用者下執行,並公開一個可由 web 伺服器組寫入的unix 套接字
www-data
。所有應用程序使用者都是該
www-data
組的一部分,因此他們可以chown他們的套接字。如何改進我的設置,以便不再使用一個應用程序中的漏洞通過直接連接到其他套接字來嘗試進一步提升權限?*我以前的解決方案:*為每個使用者創建一個新組並將 Web 伺服器添加到所有這些使用者。此解決方案不太可取,因為它使添加/刪除應用程序變得複雜,並且需要硬重啟 Web 伺服器來更新組。
與服務如何從systemd繼承特權埠類似,它們可以接收對本地套接字的訪問權限,否則它們將無權打開。 Systemd創建 unix 套接字並僅將文件描述傳遞給服務 - 這樣,服務不需要套接字文件的訪問權限。
像這樣設置套接字
/etc/systemd/system/example.socket
:(閱讀man systemd.socket
)[Unit] PartOf=example.service [Socket] SocketUser=www-data SocketMode=0600 ListenStream=%t/example.sock
並像這樣使用該套接字
/etc/systemd/system/example.service
:(閱讀man systemd.unit
)[Unit] Requires=example.socket After=example.socket [Service] User=example WorkingDirectory=~ ExecStart=/usr/bin/uwsgi --uwsgi-socket=fd://3 --opt2 --opt3 ..
請注意,包括 uwsgi 在內的許多程序
LISTEN_FDS
在它們的環境中都可以理解,因此通常不需要硬編碼文件描述符 3。使用以下方法應用並啟動設備:
systemctl dameon-reload systemctl start example.service
如果一個服務帳戶隨後嘗試打開另一個服務的套接字,他將不會成功 - 套接字是由其擁有和獨占讀取的
www-data
(即只有在該使用者下執行的 Web 伺服器才能訪問它們)。