LINUX.ORG.RU
решено ФорумAdmin

sudo в скрипте, запускаемом systemd

 , , , ,


0

2

Здравствуйте.

Есть системный(systemctl) сервис OpenVPN, который при запуске запрашивает login, password, otp. Для хранения этих данных был выбран менеджер паролей pass, который запускается в пользовательском(systemctl –user) окружении.

Для передачи этих данных в сервис OpenVPN был написан простой скрипт, который реализует эту логику для пользователя.

Я хочу дальше автоматизировать процесс и засунуть скрипт в сервис systemctl --user, потом прикрутить к этому отслеживание запроса пароля через inotify интерфейс systemd. Проблема в том что скрипт использует внутри sudo socat для записи ответов в сокет, что приводит к ошибке:

янв 07 21:25:01 nixos systemd[1954]: Starting Run when /run/systemd/ask-password/ask* file...
янв 07 21:25:01 nixos sh[30678]: Enter Auth Username:
янв 07 21:25:01 nixos sh[30678]: /run/systemd/ask-password/sck.ff39e0ee07bdce4c
янв 07 21:25:01 nixos sh[30688]: /home/rav/auth.sh: строка 13: echo: ошибка записи: Broken pipe
янв 07 21:25:01 nixos systemd[1954]: ask-password.service: Main process exited, code=exited, status=1/FAILURE
янв 07 21:25:01 nixos systemd[1954]: ask-password.service: Failed with result 'exit-code'.
янв 07 21:25:01 nixos systemd[1954]: Failed to start Run when /run/systemd/ask-password/ask* file.

а если отказаться от sudo то соответственно к ошибке:

янв 07 16:58:38 nixos systemd[1963]: Starting Run when /run/systemd/ask-password/ask* file...
янв 07 16:58:38 nixos sh[4554]: Enter Auth Username:
янв 07 16:58:38 nixos sh[4554]: /run/systemd/ask-password/sck.e54bbba053f04fee
янв 07 16:58:38 nixos sh[4564]: 2024/01/07 16:58:38 socat[4564] E sendto(5, 0x556fd758e000, 11, 0, AF=1 "/run/systemd/ask-password/sck.e54bbba053f04fee", 48): Permission denied
янв 07 16:58:38 nixos systemd[1963]: ask-password.service: Main process exited, code=exited, status=1/FAILURE
янв 07 16:58:38 nixos systemd[1963]: ask-password.service: Failed with result 'exit-code'.
янв 07 16:58:38 nixos systemd[1963]: Failed to start Run when /run/systemd/ask-password/ask* file.

Отсюда вопрос, как в systemd --user использовать скрипры с sudo?



Последнее исправление: torm7 (всего исправлений: 1)

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

Да и вообще используй сертификаты/ключи для соединений openvpn, а права на них такие, от имени чего работает openvpn сервис.

rumgot ★★★★★
()
Последнее исправление: rumgot (всего исправлений: 1)

Отсюда вопрос, как в systemd --user использовать скрипры с sudo?

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

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

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

ivanov17
()
Ответ на: комментарий от rumgot

А какие права у сокета, который ты хочешь открыть? И какие пользователь/группа?

[rav@nixos:~]$ id
uid=1000(rav) gid=100(users) группы=100(users),1(wheel),57(networkmanager),67(libvirtd),131(docker)

[rav@nixos:~]$ ls -la /run/systemd/ask-password/
итого 4
drwxr-xr-x  2 root root  80 янв  8 11:00 .
drwxr-xr-x 22 root root 560 янв  8 09:05 ..
-rw-r--r--  1 root root 166 янв  8 11:00 ask.0dzhzR
srw-------  1 root root   0 янв  8 11:00 sck.3a36d9bf1e265034

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

Меня такой вариант тоже устраивает, вопрос, как системным пользователем выдернуть пароли и otp коды из пользовательского pass?

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

Покопал немного тему с gpg, для расшифрования файлов. Из под пользователя отлично расшифровывается командой:

[rav@nixos:~]$ gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/linux.org.ru.gpg

но тоже самое не работает для root:

[root@nixos:/home/rav]# gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/linux.org.ru.gpg
gpg: Внимание: небезопасный владелец домашнего каталога '/home/rav/.gnupg'

отсюда вопрос, как использовать gpg ключи пользователя для расшифрования файлов из под root?

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

man gpg

      --no-permission-warning
              Suppress the warning about unsafe file  and  home  directory  (--homedir)
              permissions.  Note that the permission checks that GnuPG performs are not
              intended to be authoritative, but rather they simply warn  about  certain
              common  permission  problems.  Do  not  assume that the lack of a warning
              means that your system is secure.
futurama ★★★★★
()
Ответ на: комментарий от torm7

Тогда зачем ты это сообщение здесь привёл?

Перед расшифровкой скопируй файлы к себе (руту), выставь нужные разрешения и после этого расшифровывай

futurama ★★★★★
()

В общем порешал проблему так: Скрипт auth.sh для ввода запрашиваемых данных:

#!/bin/sh

MESSAGE=$(cat /run/systemd/ask-password/ask.* | grep 'Message=' | cut -b9-)
SOCKET=$(cat /run/systemd/ask-password/ask.* | grep 'Socket=' | cut -b8-)
echo $MESSAGE
echo $SOCKET
case "$MESSAGE" in
  "Enter Auth Username:" ) echo +$(echo "$(su rav -c 'gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/sber/LDAP.gpg 2>/dev/null')" | grep 'login:' | cut -b8-) | socat - UNIX-SENDTO:$SOCKET
  ;;
  "Enter Auth Password:" ) echo +$(echo "$(su rav -c 'gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/sber/LDAP.gpg 2>/dev/null')" | head -n 1) | socat - UNIX-SENDTO:$SOCKET
  ;;
  "CHALLENGE: Enter OTP token" ) echo +$(oathtool --totp -b "$(echo $(su rav -c 'gpg --homedir ~rav/.gnupg/ --decrypt ~rav/.password-store/sber/OpenVPN.gpg 2>/dev/null | grep 'SberDevices_CloudVPN' | cut -b54-'))") | socat - UNIX-SENDTO:$SOCKET
  ;;
esac

Юнит ask-password.service толкающий скрипт:

[Unit]
Description=Run when /run/systemd/ask-password/ask* file

[Service]
Environment="LOCALE_ARCHIVE=/nix/store/akdhm0j22qps967w9qarcf2k0436z39x-glibc-locales-2.38-27/lib/locale/locale-archive"
Environment="PATH=/nix/store/bblyj5b3ii8n6v4ra0nb37cmi3lf8rz9-coreutils-9.3/bin:/nix/store/l974pi8a5yqjrjlzmg6apk0jwjv81yqw-findutils-4.9.0/bin:/nix/store/rx2wig5yhpbwhnqxdy4z7qivj9ln7fab-gnugrep-3.11/bin:/nix/store/9c5qm297qnvwcf7j0gm01qrslbiqz8rs-gnused-4.9/bin:/nix/store/i0sdqs34r68if9s4sfmpixnnj36npiwj-systemd-254.6/bin:/nix/store/bblyj5b3ii8n6v4ra0nb37cmi3lf8rz9-coreutils-9.3/sbin:/nix/store/l974pi8a5yqjrjlzmg6apk0jwjv81yqw-findutils-4.9.0/sbin:/nix/store/rx2wig5yhpbwhnqxdy4z7qivj9ln7fab-gnugrep-3.11/sbin:/nix/store/9c5qm297qnvwcf7j0gm01qrslbiqz8rs-gnused-4.9/sbin:/nix/store/i0sdqs34r68if9s4sfmpixnnj36npiwj-systemd-254.6/sbin"
Environment="TZDIR=/nix/store/3vx4ajfr2gy3zbl803frpabh4n85cacp-tzdata-2023c/share/zoneinfo"
Environment=PATH=/run/current-system/sw/bin:$PATH
ExecStart=/bin/sh -c '~rav/auth1.sh'
Type=oneshot

inotify событие ask-password.path по которому толкается юнит:

[Unit]
Description=Run when /run/systemd/ask-password/ask* file

[Path]
PathExistsGlob=/run/systemd/ask-password/ask*
torm7
() автор топика
Ответ на: комментарий от torm7
su -l <user> -c 'команда_которую_хочешь_выполнить_от_пользователя_user'

При запуске su от root пароль пользователя user не требуется. Соответственно systemd unit пускай от рута, а когда нужно понизить привилегии - понижай, получай выхлоп необходимых тебе программ и возвращайся обратно.

Pinkbyte ★★★★★
()