Сетевые возможности для приложений - PullRequest
0 голосов
/ 14 декабря 2011

Я занят разработкой приложения на C ++ на компьютере с Linux. Приложение использует стороннюю библиотеку, которая использует адаптер Ethernet и сеть. Библиотека - это библиотека камеры GigE Vision. При запуске мое приложение пытается подключиться к камере, а затем возвращает информацию о камере, после чего оно начинает потоковую передачу видео в приложение.

Через некоторое время приложение не может подключиться или получить информацию о камере с камеры, но запуск приложения от имени пользователя root (sudo) решает проблему.

Я связался с поставщиком библиотеки, и они указали, что я должен сделать следующее:

Пользователи, которые считают, что запуск от имени root ставит под угрозу их безопасность системы, могут найти следующую реализацию удовлетворительной:

  1. установить владельца исполняемого файла как root.
  2. установить бит разрешения "setuid" для исполняемого файла
  3. в коде, когда приложение запускается, используйте capset (), чтобы освободить все, кроме этих привилегий: CAP_SYS_NICE, CAP_NET_ADMIN, CAP_NET_BROADCAST, CAP_NET_RAW Приложение запустится со всеми привилегиями root, но оно удалит их сразу после запуска.

Это работает, но нет ли альтернативного способа сделать это без изменения исполняемого файла? Я думаю о добавлении моего пользователя в какую-либо группу, которая позволит мне получить доступ к этим привилегиям, и любая помощь будет принята с благодарностью.

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

ОС: Ubuntu Linux 11.10 Среда: C ++ с Qt

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Похоже, что библиотека делает то, что на самом деле требует привилегий root.

Пожалуй, самое простое решение этого - добавить разрешения в процесс сборки (например, Makefile).

Один из способов частично обойти это состоит в том, чтобы разделить вашу программу на две программы: одну, которая связывается с камерой с помощью библиотеки, и одну - для пользовательского интерфейса, который связывается с программой интерфейса через сокет или канал. Таким образом, вам нужно будет изменить разрешения только при изменении интерфейса программы. Это также было бы хорошей идеей для setuid программ - у вас есть небольшая программа-оболочка с повышенными разрешениями, а более крупная программа с графическим интерфейсом работает без расширенных разрешений. Было бы проще провести аудит программы setuid, особенно если это сделать очень просто.

0 голосов
/ 14 декабря 2011

Вы действительно можете установить необходимые возможности вручную, используя setcap() в качестве пользователя root.

Поэтому используйте эту команду для установки соответствующих возможностей, и она будет работать как обычный пользователь, даже не требуякорень.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...