[Linux] 不同 user 建立的 Unix domain socket 不能互通?
以前為了方便起見,專案的幾個 Linux daemon 都跑在 root 權限下,
但這其實是蠻危險的,假設程式裡有漏洞的話,
被打進來就是 root 權限被壞人拿去用了~
因此最近在將一些 daemon 降成一般使用者的權限,
意外的遇到一個問題:我們有個一般使用者權限的 daemon,
會用 Unix domain socket,送資料到另一隻目前仍是 root 權限的 daemon,卻發現送不過去了~
如果將發送端改用 root 執行,就又恢復正常…
查了一下,看起來 Unix domain socket 需要兩端 (server/client) 都是同一個 user 才行,
但如果 client 端是 root 的話,是可以送資料給任何的 server 的~
用 python 寫一個 domain socket 的 server/client 程式來做測試~
這邊是 server 部分的程式:
import socket s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.bind("test_unix_domain.socket") s.listen(1) conn, addr = s.accept() print 'Connected by', addr while 1: data = conn.recv(1024) if not data: break conn.sendall(data) conn.close()
這邊是 client 端的程式:
import socket s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.connect("test_unix_domain.socket") s.sendall('Hello, world') data = s.recv(1024) s.close() print 'Received', repr(data)
如果用 testuser 分別執行 server 和 client 程式,運作正常:
testuser@localhost ~ $ python unix_domain_client.py Received 'Hello, world'
但如果用 testuser 執行 server, 另一個使用者 www-data 執行 client,則會遇到錯誤:
www-data@localhost ~ $ python unix_domain_client.py Traceback (most recent call last): File "unix_domain_client.py", line 5, in <module> s.connect("test_unix_domain.socket") File "/usr/lib64/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 13] Permission denied
如果 client 是 root 的話,狀況就又不同了,就可以送資料給 testuser:
root@localhost ~ # python unix_domain_client.py Received 'Hello, world'
參考資料:
python socket — Low-level networking interface
UNIX domain sockets not accessable across users?
(本頁面已被瀏覽過 1,060 次)