首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在普通用户中使用root创建的套接字

问如何在普通用户中使用root创建的套接字
EN

Stack Overflow用户
提问于 2019-10-08 15:34:21
回答 3查看 1.3K关注 0票数 2

所以我有这个服务器:

代码语言:javascript
复制
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))

和这个客户端:

代码语言:javascript
复制
import socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect('/tmp/sock.sock')
sock.send('Hello, World')

实际的发送和接收稍微复杂一些,但只要服务器和客户机都由root运行,就能完美地工作。当客户机以root用户身份运行,而服务器由普通用户运行时,它也可以工作。但是,当我尝试以普通用户的root和客户端运行服务器时,我得到的结果是:

代码语言:javascript
复制
$ python3 client.py
connecting to /tmp/sock.sock
[Errno 13] Permission denied

我该如何解决这个问题呢?服务器需要以root用户身份运行,客户端需要以非特权用户身份运行。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-08 15:46:48

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

代码语言:javascript
复制
import os
os.chmod("/tmp/sock.sock", 0o777)
票数 1
EN

Stack Overflow用户

发布于 2019-10-08 16:13:42

感谢P.Dmitry为我指明了正确的方向。我最终修改了相同的想法,它更适合我的需求:

代码语言:javascript
复制
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中一样。

票数 0
EN

Stack Overflow用户

发布于 2019-10-08 16:35:36

这不是一个好主意,如果您将整个服务器设计为以root用户身份运行,那么一定是某个地方存在设计错误。

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

问题是,即使bind方法在Linux上(而不是在Mac!)已经打了补丁,不再遵循符号链接,你仍然在制造一个安全问题。假设文件不在那里,并且服务器没有运行。然后,普通用户可以创建从/tmp/sock.sock到/etc/passwd的符号链接,当服务器尝试启动时,它将尝试绑定,设置权限,然后由于符号链接而失败,但将设置权限。因此,您将把passwd文件设置为可写。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58281963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档