簡體   English   中英

如何將root創建的套接字與普通用戶一起使用

[英]How to use a socket created by root with a normal user

所以我有這個服務器:

import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.bind('/tmp/sock.sock')
sock.listen(1)
while True:
    conn, ca = sock.accept()
    print(conn.recv(1024))

而這個客戶:

import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect('/tmp/sock.sock')
sock.send('Hello, World')

實際的發送和接收有點復雜,但只要服務器和客戶端都由 root 運行,就可以完美地工作。 當客戶端以 root 身份運行並且服務器由普通用戶運行時,它也可以工作。 但是當我嘗試由普通用戶使用 root 和客戶端運行服務器時,我得到了這個:

$ python3 client.py
connecting to /tmp/sock.sock
[Errno 13] Permission denied

我該如何解決這個問題? 服務器需要以 root 身份運行,客戶端需要以非特權用戶身份運行。

我已經明白它與套接字文件的文件權限有關,但我看不出我應該如何修復它。 我看不到任何傳遞給可以解決此問題的套接字構造函數的選項。

更改文件模式以允許任何人訪問它。 在您的服務器中添加此行

import os
os.chmod("/tmp/sock.sock", 0o777)

感謝 P.Dmitry 為我指明了正確的方向。 我最終對相同的想法進行了修改,這更適合我的需要:

import pwd
import grp
...
# Change the owner of the socket
os.chown('/tmp/sock.sock', 
         pwd.getpwnam('user').pw_uid, 
         grp.getgrnam('group').gr_gid)
# Restrict access to only this user (and root of course)
os.chmod('/tmp/sock.sock', 0o600)

筆記:

0o是 Python3 中的八進制前綴。 在 Python2 中,它只是0 ,就像在 C 中一樣。

這不是一個好主意,如果您將整個服務器設計為以 root 身份運行,則某處存在設計錯誤。

這里發生的是 root 用戶使用自己的權限創建/tmp/sock.sock文件,並且該文件只能由創建它的用戶訪問。

問題是,即使 Linux(但不是在 Mac OS 上)上的bind方法已被修補為不遵循符號鏈接。 您仍在創建安全問題,假設該文件不存在。 並且服務器沒有運行。 然后,普通用戶可以創建從/tmp/sock.sock/etc/passwd的符號鏈接,當服務器嘗試啟動時,它將嘗試綁定、設置權限,然后由於符號鏈接而失敗,但權限將是放。 因此,您將 passwd 文件設置為可寫。

即使沒有權限問題,假設有人發送了非常大量的數據並且它填滿了磁盤導致服務器崩潰。 如果您使用普通用戶運行服務器,則可以設置最大配額,但您不想在 root 上設置。

我的建議是:創建一個新用戶,其唯一任務是運行服務器和客戶端,並且具有所需的最低權限集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM