所以我有这个服务器:
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用户身份运行,客户端需要以非特权用户身份运行。
我知道这与套接字文件的文件权限有关,但我不知道该如何修复它。我看不到任何可以传递给套接字构造函数的选项来修复这个问题。
发布于 2019-10-08 15:46:48
更改文件模式以允许任何人访问它。在您的服务器中添加以下行
import os
os.chmod("/tmp/sock.sock", 0o777)发布于 2019-10-08 16:13:42
感谢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中一样。
发布于 2019-10-08 16:35:36
这不是一个好主意,如果您将整个服务器设计为以root用户身份运行,那么一定是某个地方存在设计错误。
这里发生的情况是,根用户使用自己的权限创建/tmp/sock.sock文件,并且只有创建该文件的用户才能访问该文件。
问题是,即使bind方法在Linux上(而不是在Mac!)已经打了补丁,不再遵循符号链接,你仍然在制造一个安全问题。假设文件不在那里,并且服务器没有运行。然后,普通用户可以创建从/tmp/sock.sock到/etc/passwd的符号链接,当服务器尝试启动时,它将尝试绑定,设置权限,然后由于符号链接而失败,但将设置权限。因此,您将把passwd文件设置为可写。
即使没有权限问题,假设有人发送了非常大量的数据,并且它填满了磁盘,导致服务器崩溃。如果您使用常规用户运行服务器,则可以设置最大配额,但您不希望在root上设置该配额。
我的建议是:创建一个新用户,该用户的唯一任务是运行服务器和客户端,并且具有所需的最小权限集。
https://stackoverflow.com/questions/58281963
复制相似问题