2

Я задал этот вопрос на StackOverflow, но, учитывая комментарии там, кажется, что он подходит здесь лучше.

Это почти наверняка проблема конфигурации системы - вы неправильно настроили джейл - а не Python. Вы можете легко это проверить, просто посмотрев, что произойдет, когда вы запустите, скажем, head -c16 /dev /urandom или dd if = /dev /urandom bs = 16 count = 1 изнутри тюрьмы. Если вы получили ту же ошибку, обратитесь в SuperUser или ServerFault или на другой общий форум по Unix или OpenBSD. - abarnert

Вот что я сделал:

Я хочу запустить несколько сценариев cgi (написанных на Python) на моем сервере OpenBSD. Поскольку веб-сервер в OpenBSD работает в тюрьме, я воссоздала всю структуру папок (/bin /dev /usr /usr /local /lib и т.д. И т.д.), Но я все еще получаю «500 Server Internal Error», когда Я пытаюсь импортировать некоторые модули Python, которым требуется доступ к устройству /dev /urandom.

Я создал специальные файлы устройства, используя 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 работает в 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

то есть это определенно ошибка конфигурации. Кто-нибудь может пролить свет на то, где я могу ошибаться? Любая помощь будет по достоинству оценена!

2 ответа2

2

Я нашел виновника.

Следуя совету из раздела комментариев этого сайта, достаточно mknod (как я делал ранее) и удалить nodev из /etc/fstab где система монтирует /var . Это удаляет разрешенный флаг «no-devices» в /var .

Чтобы запустить мой скрипт, мне наконец-то пришлось скопировать все общие объекты, от которых зависит модуль cgitb Python (ну, собственно, _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 (проверьте этот ответ для более подробной информации)

Надеюсь это поможет!

-1

У меня была похожая проблема с запуском Django во FreeBSD и OPENBSD. Моя проблема заключалась в том, что процесс gunicorn выполнялся с правами суперпользователя, в то время как сценарии находились в других пользователях home/dir.

tl; dr -> проверить, запущен ли процесс с нужным пользователем

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .