Повышение привилегий в веб-среде для доступа к файлам - PullRequest
1 голос
/ 10 марта 2009

У меня есть ситуация, когда я хочу повысить разрешения, которые у меня есть в веб-среде, чтобы я мог получить доступ к последовательному устройству.

В конкретном случае у меня есть веб-интерфейс для настройки модема, который подходит для /dev/ttyUSB[0-9].

Конечный пользователь подключит ноль или более модемов. Я пишу какое-то программное обеспечение, способное распознавать беспроводной USB-модем, читая /sys/devices и разговаривая с модемом, используя некоторые AT-команды.

Я хотел бы иметь возможность открыть устройство и сделать что-то вроде:

ser = serial.Serial(tty, baudrate=115200, timeout=10)
ser.write('AT+CGSN\r\n')
imei = ser.readline()

Проблема в том, что pyserial делает это: self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK), чтобы открыть последовательный порт, где portstr равен /dev/ttyUSB0, но делает это как пользователь nobody, который непривилегирован.

Последовательные порты в этой системе принадлежат root: uucp и имеют значение 0660 (т.е. rw-rw----).

Каков наилучший способ для пользователя, такого как nobody, у которого должно быть как можно меньше разрешений для открытия файла в dev?

Идеи, которые я рассмотрю:

  • Выполнение действий в подпроцессе с использованием sudo.
  • Изменение прав доступа к файлам в /dev/ (инструкции о том, как сделать это правильно с помощью udev, приветствуются!)
  • Использование другого API или программного обеспечения, которое я не рассматривал.

Ответы [ 5 ]

2 голосов
/ 10 марта 2009

Есть еще один способ сделать это: Unix / Linux позволяет отправлять файловые дескрипторы через сокеты Unix. Для этого есть даже модуль Perl: PassAccessRights.pm . Не нашел аналогичного модуля для Python, но его легко реализовать.

2 голосов
/ 10 марта 2009

В этом случае я бы написал демон, запущенный системным пользователем, который принимал соединения с сокетом и передавал их на соответствующее устройство, а затем использовал сокеты в веб-приложении для связи с демоном. Это также помогает предотвратить блокировку веб-приложения при открытии устройства, которое не совсем готово работать с пользователями, разрешать блокировки чуть более разумно, чем с помощью CGI и т. Д.

Однако, если вы хотите, чтобы приложение могло напрямую взаимодействовать с устройствами, предоставьте им те же разрешения, что и у null.

1 голос
/ 12 марта 2009

Настройте правило udev для chgrp , для нового устройства - nobody , если допустимо, чтобы при каждом доступе через веб-интерфейс был разрешен такой же доступ к Устройство. Вот что я положил в мой пакет eee-bpw в файле / etc / udev / rules.d / 99-bpw.rules .

# Sierra Wireless AirCard 880 U
BUS=="usb", KERNEL=="ttyUSB2*", ACTION=="add", \
   PRODUCT=="1199/6855/0", DEVNAME=="/dev/tts/USB2", \
   OWNER="root", GROUP="dialout", \
   SYMLINK+="bpw", RUN="/usr/sbin/bpw"

Заменить nobody на dialout . Это конкретное правило предполагает, что имя устройства будет / dev / ttyUSB2 , но вы можете значительно расширить это правило, см. Документацию udev .

1 голос
/ 10 марта 2009

"Каков наилучший способ для пользователя, такого как никто, у которого должно быть как можно меньше разрешений для открытия файла в dev?"

На самом деле, вам лучше использовать mod_wsgi в режиме демона для вашего веб-приложения. Пользователь mod_wsgi может быть любым именем пользователя (и группой), которое вы предоставляете.

Вы можете работать как пользователь с соответствующими правами доступа.

См. http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGIDaemonProcess

0 голосов
/ 10 марта 2009

Идея sudo может быть возможной. IIRC, вы можете установить определенные команды для sudo-совместимости, но без пароля.

Другой вариант - поместить nobody в группу, которая имеет доступ к нужному устройству, или запустить Apache в качестве группы, которая имеет доступ.

Если вы используете fastcgi (или его эквивалент), я думаю, вы можете заставить его запускать скрипты от имени владельца (некоторые общие хосты делают это).

Чтобы изменить права доступа к файлам в /dev, просто выполните chmod их.

...