【问题标题】:How to use a socket created by root with a normal user如何将root创建的套接字与普通用户一起使用
【发布时间】:2020-02-05 11:33:39
【问题描述】:

所以我有这个服务器:

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身份运行,客户端需要以非特权用户身份运行。

我已经明白它与套接字文件的文件权限有关,但我不知道应该如何修复它。我看不到任何传递给套接字构造函数的选项来解决这个问题。

【问题讨论】:

  • 套接字本身遵循正常的文件权限。
  • @Torxed 是的,我明白这一点,但我不知道应该如何解决。

标签: python python-3.x linux sockets python-sockets


【解决方案1】:

更改文件模式以允许任何人访问它。在您的服务器中添加此行

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

【讨论】:

  • 0777 这是一个八进制数。如果由于某种原因它不起作用,请尝试使用 511 它是 0777 作为十进制数
  • 0 用于八进制在 Python3 中不起作用。在那里你必须使用0o。我改变了你的答案,现在它可以工作了。谢谢。
【解决方案2】:

感谢 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 中一样。

【讨论】:

    【解决方案3】:

    这不是一个好主意,如果您将整个服务器设计为以 root 身份运行,则某处存在设计错误。

    这里发生的情况是 root 用户使用自己的权限创建了 /tmp/sock.sock 文件,并且该文件只有创建它的用户才能访问。

    问题在于,即使 Linux(但不是 Mac OS!)上的 bind 方法已被修补为不遵循符号链接,您仍然会产生安全问题。假设该文件不存在,并且服务器没有运行。然后,普通用户可以创建从/tmp/sock.sock/etc/passwd 的符号链接,当服务器尝试启动时,它将尝试绑定、设置权限,然后由于符号链接而失败,但权限将被设置。因此,您将 passwd 文件设置为可写。

    即使没有权限问题,假设有人发送了非常大量的数据并且它填满了磁盘导致服务器崩溃。如果您使用普通用户运行服务器,则可以设置最大配额,但您不想在 root 上设置。

    我的建议是:创建一个新用户,其唯一任务是运行服务器和客户端,并拥有所需的最低权限集。

    【讨论】:

    • 在实际服务中,我之前做过unlink。但该服务确实需要使用 root 权限执行某些操作。
    猜你喜欢
    • 2012-08-09
    • 1970-01-01
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    相关资源
    最近更新 更多