Ошибка OpenBSD "устройство не настроено" в среде chroot
Я задал этот вопрос на 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
то есть это определенно ошибка конфигурации. Кто-нибудь может пролить свет на то, где я могу ошибаться? Любая помощь будет по достоинству оценена!
3 ответа
Я нашел виновника.
Следуя совету из раздела комментариев этого сайта, достаточно mknod (как я делал ранее) и удалить nodev
от /etc/fstab
где система монтируется /var
, Это удаляет разрешенный флаг "no-devices" в /var
,
Чтобы запустить мой скрипт, мне наконец-то пришлось скопировать все общие объекты, которые есть у Python. cgitb
модуль (ну, на самом деле, _hashlib.so
) зависит от - а именно libcrypto.so
,
Чтобы найти то, что ваш _hashlib.so
зависит от пробега ldd _hashlib.so
- шахта находится в /usr/local/lib/python2.7/lib-dynload/_hashlib.so
, Примечание - вы найдете эту библиотеку, если в вашей системе установлен OpenSSL. Если нет, _hashlib.so
нагрузки, например _md5.so
и т.д., которые можно найти только если вы
- У меня нет OpenSSL
- Сконфигурировал и собрал Python с
--with-pydebug
флаг (проверьте этот ответ для более подробной информации)
Надеюсь это поможет!
проверять/etc/fstab
. я имелnodev
в точке монтирования, и это помешало моей команде chroot работать должным образом.
У меня была похожая проблема с запуском Django во FreeBSD и OPENBSD. Моя проблема заключалась в том, что процесс gunicorn выполнялся с правами суперпользователя, в то время как сценарии находились в других пользователях home / dir.
tl; dr -> проверить, запущен ли процесс с нужным пользователем