Спасибо за комплимент, однако OpenVPN, двоичный файл, принимает файл конфигурации (или параметры) и сам выполняет и создает соединение, изменяя маршруты и т. Д. Мое приложение только переносит эту процедуру. Однако я добавлю концепции групп к правилам polkit (поскольку я планирую реализовать это в своем собственном приложении, т.е. myvpngroup)

й день

Фон:

Я создаю приложение-оболочку OpenVPN для систем Linux, которое почти завершено. Я столкнулся с небольшим препятствием.

OpenVPN требует root-доступа для изменения таблиц маршрутизации (добавления и удаления маршрутов). Здесь вещи становятся немного расплывчатыми и запутанными.

Надеюсь, продливэтот вопроснекоторые стандартные ответы и решения могут быть разделены.

Документация:

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

Давайте рассмотрим следующие методы.

1. Использование pkexec & polkits

Пожалуйста, найдите официальныйДокументация freedesktop polkit здесь а такжеВот для получения некоторой информации о лучших практиках

В Интернете есть несколько учебных пособий с использованием pkexec и polkits -Вот, это помогло мне создать мой файл polkit. -ТАК Нить - ипрекрасный маленький учебник для приложений Qt

Чтобы дать краткое объяснение (моего понимания) оpkexec а такжеpolkits:

polkits:

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

pkexec:

приложение, используемое для взаимодействия с действиями polkit и аутентификации приложения для получения корневого доступа.

Это требует добавления действия в/usr/share/polkit-1/actions/ а также/usr/share/polkit-1/rules.d/ (среди других каталогов, см. документацию для всех мест)

Этот метод, кажется, хорошо используется (но требует немного большего объяснения, чтобы быть понятным, imo)

примечание: естьqt-polkit библиотеки, доступные для использования, см. ихGitHub хранилище

Для простой версии TL; DR см.это

Файл polkit, который я создал (обратите внимание, что это может быть не правильно, но он работает для меня):

Место, где его можно найти / добавить (есть и другие)

/usr/share/polkit-1/actions

Имя файла Policy Kit: com.myappname.something.policy //.policy требуется

Примечание:

com.myappname.something

упоминается как пространство имен политики (читая документацию, это не будет понятно)

Содержимое Policy Kit

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC "-//freedesktop//DTD polkit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/software/polkit/policyconfig-1.dtd">
<policyconfig>
  <vendor>My App Name</vendor>
  <vendor_url>http://myappurl.com/</vendor_url>

  <action id="com.myappname.something.myaction-name">
    <description>Run the polkit for My App which requires it for X usage</description>
    <message>My App requires access to X, which requires root authentication, please let me have su access</message>
    <icon_name>myappname</icon_name>
    <defaults>
      <allow_any>auth_admin_keep</allow_any>
      <allow_inactive>auth_admin_keep</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
    <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/myappname</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
  </action>

</policyconfig>

Заметки о моем файле политики (важные биты)

Это только пример, см. Документацию для официальных примеров и описаний:<vendor>My App Name</vendor> имя приложения, оно может содержать пробелы

<action id="com.myappname.something.myaction-name"> любое название действия здесь.

НОТА! Имя файла ->com.myappname.something.policy иaction id ->com.myappname.something.myaction-name должно иметь одинаковое пространство имен

Имя иконки должно соответствовать последней найденной спецификации иконки freedesktopВот

TL; DR (или не хочу): расположение иконок:

 1. /home/yourusername/.icons (sometimes not there)
 2. /home/yourusername/.local/share/icons
 2. /usr/share/icons

до тех пор, пока они соответствуют размерам и являются.png, вы можете передать только имя файла (опуская формат)

Very Important:

<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/myappname</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>

При звонкеpkexec <myappname>и не имеющие этих строк(честно говоря, я не совсем уверен, цель их), вы столкнетесь с ошибкой, подобной этой:

2017-12-19 12::58:24 Fatal: QXcbConnection: Could not connect to display  ((null):0, (null))

Aborted (core dumped)

Примечание: сохранитьkey то же самое, однако вы можете и, вероятно, должны изменитьexec.path ключ к местоположению вашего приложения.

Как работают комплекты политики?

Короче, если вы посмотрите прекрасныйпример Упомянутый ранее (и пропускающий все очень похожие имена файлов) становится понятно.

Когда один бежит:

pkexec <myappname> 

это вызывает локальный агент аутентификации для запуска приложения (в нашем случае) от имени пользователя root.

Это обрабатываетсяactions (комплект политики, упомянутый выше). Более того, правила используютaction id выполнять дополнительные запросы и т. д., которые можно посмотреть в приведенных выше примерах.

После ввода пароля администратора, в зависимости от «настроек», введенных по умолчанию (см.Вот), у нас есть:

auth_admin_keep

Подобно auth_admin, но авторизация сохраняется в течение короткого периода (например, пять минут).

Таким образом, пользователь может (в моем приложении OpenVPN) подключаться к соединению OpenVPN в течение следующих 5 минут, пока пароль не будет запрошен снова.

2.Sudo (/ и т.д. / sudoers):

Похоже, это метод go to для большинства пользователей, которым требуется root-доступ, однако это не рекомендуется:

например Проверьте корневой доступ перед запуском основного приложения, вызвав singleShotQProcess с аргументами:

/bin/sh -c sudo -v

приведет к коду выхода1 в различных дистрибутивах Linux (что побуждает меня искать альтернативы)

3. setuid ():

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

Короче говоря, процесс требует, чтобы:

chmod +x <executable>

и проверяя, чтоs бит устанавливается в приложении с помощьюgetuid() чтобы получить идентификатор пользователя иgetgid() получить идентификатор группы пользователя.

Эти функции можно найти в заголовках Linux, определяемых как:

<sys/types.h> // defines structs
<unistd.h>    // defines methods

Тем не менее, это не похоже на современные системы Linux. Вот результат выполнения корневого приложения сs бит установлен, запускается как обычный (непривилегированный) пользователь:

2017-12-19 12::21:08 Fatal: FATAL: The application binary appears to be running setuid, this is a security hole. ((null):0, (null))

Aborted (core dumped)

Прощание,setuid()

4. Другие методы:

РАМ

для дальнейшего чтения см.

справочная страницаучебник / объяснение

A QT Forum вопрос относительно межплатформенной интеграции PAM

QT usermode Qt предоставляетнебольшая реализация для получения корневого доступа, но он доступен только для дистрибутивов Linux, использующихyum менеджер пакетов.

Вопрос по этому вопросу, см.этот вопрос QT форума

Проблема:

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

После этого исследования оно расширило мои знания, но не дало мне надежного метода, который рекомендуется, но только намеки.

Вопрос:

Какой из перечисленных выше методов предпочтителен в промышленности, то есть когда мне следует использовать один из них над другим (PAM или polkits против простого sudo) и если доступны другие методы, предпочтительны ли они?

Ответы на вопрос(2)

Ваш ответ на вопрос