[Linux] 不同 user 建立的 Unix domain socket 不能互通?

[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,063 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料