OpenBSD 在 chroot 环境中出现“设备未配置”错误

OpenBSD 在 chroot 环境中出现“设备未配置”错误

我已经在 StackOverflow 上问过这个问题,但是考虑到在那里评论它似乎更适合这里。

这几乎肯定是系统配置问题(您没有正确设置 jail),而不是 Python 问题。您可以非常轻松地测试这一点,只需查看在 jail 内部运行 head -c16 /dev/urandom 或 dd if=/dev/urandom bs=16 count=1 时会发生什么。如果您遇到同样的错误,请前往 SuperUser 或 ServerFault 或其他通用 Unix 或 OpenBSD 论坛提问。– abarnert

以下是我所做的:

我想在我的 OpenBSD 服务器上运行一些 cgi 脚本(用 Python 编写)。由于 OpenBSD 上的 Web 服务器在 jail 中运行,因此我重新创建了整个文件夹结构(/bin /dev /usr /usr/local/lib 等等),但当我尝试导入一些需要访问 /dev/urandom 设备的 Python 模块时,仍然收到“500 服务器内部错误”错误。

我已经使用 mknod 创建了设备特殊文件。

ls -la /dev/*random
ls -la /dev/{null,zero}

我得到了以下输出

crw-r--r--  1 root  wheel   45,   3 Sep 13 11:09 /dev/arandom
crw-r--r--  1 root  wheel   45,   0 Jul 15 19:02 /dev/random
crw-r--r--  1 root  wheel   45,   1 Jul 15 19:02 /dev/srandom
crw-r--r--  1 root  wheel   45,   2 Jul 15 19:02 /dev/urandom

crw-rw-rw-  1 root  wheel    2,   2 Sep 16 01:30 /dev/null
crw-rw-rw-  1 root  wheel    2,  12 Jul 15 19:02 /dev/zero

因此我在 /var/www/dev 文件夹中执行了以下命令(OpenBSD web 服务器在 chroot -u www /var/www 中运行)

mknod -m 666 null c 2 2
mknod -m 666 zero c 2 12
mknod -m 644 random 45 0
mknod -m 644 srandom 45 1
mknod -m 644 urandom 45 2
mknod -m 644 arandom 45 3

然而,Python 仍然报告

OSError: [Errno 6] Device not configured '/dev/urandom'

相同的代码在非 chroot 环境中运行良好。

import os
import cgitb
cgitb.enable()

根据 StackOverflow 上的建议,我运行

chroot -u www /var/www dd if=/dev/urandom bs=16 count=1

并得到了相同的结果

dd: /dev/urandom: Device not configured

也就是说,这肯定是配置错误。有人能告诉我我可能犯了什么错误吗?任何帮助都将不胜感激!

答案1

我找到罪魁祸首了。

按照评论部分的建议本网站nodev只需 mknod(如我之前所做的)并从/etc/fstab系统安装的位置删除 即可/var。这将删除 中的“无设备”允许标志/var

为了使我的脚本运行,我最终必须复制 Pythoncgitb模块(事实上_hashlib.so)所依赖的所有共享对象——即libcrypto.so

要查找您所_hashlib.so依赖的内容,请运行ldd _hashlib.so- 我的位于/usr/local/lib/python2.7/lib-dynload/_hashlib.so。注意 - 如果您的系统上安装了 OpenSSL,您将找到此库。如果没有,_hashlib.so请加载例如_md5.so等,只有在您

  1. 没有 OpenSSL
  2. 使用标志配置和构建 Python --with-pydebug(检查这个答案更多细节)

希望这可以帮助!

答案2

检查/etc/fstab。我nodev在挂载点处有,这阻止了我的 chroot 命令正常运行。

答案3

我在 FreeBSD 和 OpenBSD 中运行 Django 时遇到了类似的问题。我的问题是 gunicorn 进程以 root 身份运行,而脚本位于其他用户的 home/dir 中。

tl;dr -> 检查进程是否以正确的用户身份运行

相关内容