LINUX.ORG.RU

Polkit authentication agent: кто знает, как это работает?

 ,


1

1

Что-то как-то не могу ущучить, как такой агент состряпать. Ну понятно, что сначала надо выполнить RegisterAuthenticationAgent (). Тут мы вроде как регистрируем сессию/процесс, который будет запрашивать некие действия, и путь к объекту агента аутентификации. Теперь, насколько я понял, когда процесс (id которого мы зарегистрировали) через dbus вызовет процедуру, для выполнения которой нужна проверка прав пользователя (пусть мы хотим смонтировать раздел на винте), polkit daemon должен опять таки через dbus вызвать метод моего зарегистрированного агента BeginAuthentication (). В этом методе я получаю id действия (подробности похоже можно глянуть через EnumerateActions) и прочую инфу о том, что от меня хотят. Дальше, вроде как, нужно вызвать на Polkit метод AuthenticationAgentResponse (). А тут я уже теряю нить происходящего. Где же передавать пароль? Как получить результат аутентификации?

Пароль по D-Bus передавать не нужно. Ты делаешь всю аутентификацию самостоятельно и вызываешь org.freedesktop.PolicyKit1.Authority.AuthenticationAgentResponse(), если получилось. Если не получилось, возвращаешь объект ошибки.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Что значит: Ты делаешь всю аутентификацию самостоятельно? Конкретно можно? И зачем тогда вообще все остальное, если я сам сделаю всю аутентификацию самостоятельно?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Что значит: Ты делаешь всю аутентификацию самостоятельно? Конкретно можно?

Это значит: тебе приходит запрос, в котором написана identity — имя учётной записи, которое нужно аутентифицировать. Ты создаёшь окно, запрашиваешь у юзера пароль этой учётной записи, проверяешь этот пароль (через PAM или getpwent или вообще через libastral) и отвечаешь «да» или «нет».

И зачем тогда вообще все остальное, если я сам сделаю всю аутентификацию самостоятельно?

Ну, ты вообще представляешь, зачем нужен полкит?

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Это значит: тебе приходит запрос, в котором написана identity — имя учётной записи, которое нужно аутентифицировать. Ты создаёшь окно, запрашиваешь у юзера пароль этой учётной записи, проверяешь этот пароль (через PAM или getpwent или вообще через libastral) и отвечаешь «да» или «нет».

Я правильно понимаю, что в этом случае все расчитано на то, что моя прога должна «добросовестно» выполнить через PAM, или что-то другое проверку пароля, введенного пользователем и отдать результат? Т.е. сервис, к которому я обращаюсь и который запрашивает у меня полномочия, поностью мне доверяет?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Если ты пишешь агента — конечно, ему polkit будет доверять. FWIW, рандомную прогу нельзя просто так запустить как агента (полкит не будет принимать от не-рута вызов AuthenticationAgentResponse()).

Т.е. сервис, к которому я обращаюсь и который запрашивает у меня полномочия, поностью мне доверяет?

Не понял.

polkit, агент аутентификации, программа-«клиент» (которую запускает непривилегированный юзер) и программа-«сервер» (которая использует polkit для авторизации запросов от клиента) — четыре разных сущности. Три из них (все, кроме «клиента») друг другу доверяют.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Ответ на: комментарий от intelfx

Т.е. агент это еще одна прслойка между требуемым мной сервисом, моим пользовательским приложением, которое хочет выполнить привелегированную операцию через сервис и polkit-ом? И эта еще одна прослойка должна работать от root-а?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Т.е. агент это еще одна прслойка между требуемым мной сервисом, моим пользовательским приложением, которое хочет выполнить привелегированную операцию через сервис и polkit-ом?

Ну вот почему бы не заглянуть в ман (man 8 polkit)? Там даже картинку нарисовали.

И эта еще одна прослойка должна работать от root-а?

Вся — не должна. От рута нужно только отправить ответ. Опять же, читай документацию по агентам — там вполне ясно сказано, как это нужно делать на практике.

intelfx ★★★★★
()
Ответ на: комментарий от zloy_starper

Ещё раз: есть аутентификация, а есть авторизация. Вот polkit — это прослойка между ними. Всё очень похоже на sudo, только более развесисто и гибко.

Изначально у нас есть программа-«сервер» (привилегированная, выполняющая запросы) и «клиент» (непривилегированный, генерирующий запросы). Задача: авторизовать конкретный запрос клиента.

Обычно запрос — это вызов метода по D-Bus, но возможны варианты. Например, pkexec(1) — это такой эквивалент sudo (SUID-ный бинарник), только вместо sudoers у него вся эта полкитовская машинерия.

Так вот, polkit выполняет авторизацию: определяет, можно ли данному пользователю выполнять данное действие. Если нельзя, то выполняется аутентификация: пользователю предлагается продемонстрировать доступ к более привилегированой учётной записи. Для этого и нужны агенты.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Т.е. вся эта трехомудь с polkit и dbus только для того с точки зрения логики построения клиента, чтобы указать клиенту, что под текущей учетной записью сервер выполнить запрос не может, а нужно сменить учетную запись на X, Y, Z ...? А дальше клиент должен сменить свой UID на соответствующий возможным для него способом и по новой запросить сервер выполнить необходимую операцию. Так получается?

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Нет, не так. Аутентификацию тоже делает полкит, пиная один из запущенных в данный момент агентов. Если получилось — серверу прозрачно возвращается положительный результат.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Аутентификацию тоже делает полкит, пиная один из запущенных в данный момент агентов.

Таки аутентификацию делает все-таки полкит, или же агент, которого полкит всего лишь пинает?

Итого на данный момент я это понимаю так: Работают 4 независимых процесса: 1. Сервис 2. Демон полкита 3. Клиент сервиса 4. Агент аутентификации

Клиент запрашивает у сервиса операцию, требующую подтверждения полномочий. Сервис обращается к демону полкита. Полкит проверяет, если для uid клиента нет необходимых полномочий, то он запрашивает агента для проверки административных (root) полномочий у пользователя. Агент выплевывает окошко с просьбой ввести пароль для админа. Затем проверяет пароль. Если пароль верный, то отдает положительный ответ полкиту. Если полкит получил положительный ответ от агента, то он отдает подтверждение сервису. Если сервис получает от полкита подтверждение полномочий, то он выполняет операцию. Верно?

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

zloy_starper ★★★
() автор топика
Ответ на: комментарий от zloy_starper

Таки аутентификацию делает все-таки полкит, или же агент, которого полкит всего лишь пинает?

Второе.

Клиент запрашивает у сервиса операцию, требующую подтверждения полномочий. Сервис обращается к демону полкита. Полкит проверяет, если для uid клиента нет необходимых полномочий, то он запрашивает агента для проверки административных (root) полномочий у пользователя. Агент выплевывает окошко с просьбой ввести пароль для админа. Затем проверяет пароль. Если пароль верный, то отдает положительный ответ полкиту. Если полкит получил положительный ответ от агента, то он отдает подтверждение сервису. Если сервис получает от полкита подтверждение полномочий, то он выполняет операцию. Верно?

для проверки административных (root) полномочий у пользователя

В зависимости от конкретного запроса и того, что написано в политике — или административных, или своих собственных (типа «введите свой собственный пароль, чтобы доказать, что вы не верблюд»). Если юзер «является администратором» (в группе wheel или иной, зависит от настроек полкита) — то в обоих случаях спрашивается пароль самого пользователя.

Формально, полкит сам это всё решает и в dbus-запросе говорит агенту, чей пароль нужно спрашивать.

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

Да. Как вариант, можно написать правило авторизации, которое будет разрешать нужный запрос нужному пользователю без необходимости интерактивных проверок.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.