Сетевые возможности для приложений

Я занят разработкой приложения на 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


person CJCombrink    schedule 14.12.2011    source источник


Ответы (2)


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

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

person fge    schedule 14.12.2011

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

Возможно, самое простое решение — добавить разрешения в процесс сборки (например, ваш Makefile).

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

person David Brigada    schedule 14.12.2011