Запуск sudo из сервиса systemd

Вопрос или проблема

Привет! Я запускаю скрипт, используя самостоятелно размещённый runner для GitHub Actions, но когда я пытаюсь выполнить команду sudo, я получаю ошибку:

sudo: Флаг "нет новых привилегий" установлен, что мешает sudo работать от имени root.
sudo: Если sudo работает в контейнере, возможно, вам нужно отредактировать конфигурацию контейнера, чтобы отключить этот флаг.

Я проверил определение службы SystemD и нашёл NoNewPrivileges=true, поэтому я изменил его на false и перезапустил службу. Но я всё равно получаю ту же ошибку, есть ли какие-либо другие настройки, которые могут помешать мне выполнять команды sudo?

Определение службы SystemD приведено ниже:

[Unit]
After=network.target network-online.target
Description=Runner для GitHub Actions
Wants=network-online.target

[Service]
Environment="HOME=/opt/github-runner"
Environment="LOCALE_ARCHIVE=/nix/store/b7dsnpdzj51zxvxwwpvqlj6hyywp8ic8-glibc-locales-2.39-52/lib/locale/locale-archive"
Environment="PATH=/nix/store/syl4snn859kpqvn9qh91kr7n9i4dws04-bash-5.2p32/bin:/nix/store/hazsx60lrysd393fw7z7vpy4g6gn4acd-coreutils-9.5/bin:/nix/store/6yszhb3mbar672imyx6zfcgpvqh8i44l-git-2.44.2/bin:/nix/store/gnnfd78winj1lc3xb0z7j6wzm35wybwc-gnutar-1.35/bin:/nix/store/xmvlam256mq7lv32mf8rxmb76pznvdsk-gzip-1.13/bin:/nix/store/ixjixjj9f1k7h8rqab8frjhl6gm8k466-nix-2.18.8/bin:/nix/store/s4fcvic1pi8m4jqf9vi39amd7b6gxxmc-powershell-7.4.2/bin:/nix/store/k4wv1x26rba1hz725dcsawlzfpg3ywbl-sudo-1.9.15p5/bin:/nix/store/hazsx60lrysd393fw7z7vpy4g6gn4acd-coreutils-9.5/bin:/nix/store/749gm6fvnqph38vpg8b0jy6imxhq5bbf-findutils-4.9.0/bin:/nix/store/da0r6y8bzs9jn9d3p1mmv0vxmi1d80ab-gnugrep-3.11/bin:/nix/store/gi25l7za3bwy9havx02p7s201z0iykgk-gnused-4.9/bin:/nix/store/h05qs7dk5i6490ji0f9fndia9q2wwjac-systemd-255.9/bin:/nix/store/syl4snn859kpqvn9qh91kr7n9i4dws04-bash-5.2p32/sbin:/nix/store/hazsx60lrysd393fw7z7vpy4g6gn4acd-coreutils-9.5/sbin:/nix/store/6yszhb3mbar672imyx6zfcgpvqh8i44l-git-2.44.2/sbin:/nix/store/gnnfd78winj1lc3xb0z7j6wzm35wybwc-gnutar-1.35/sbin:/nix/store/xmvlam256mq7lv32mf8rxmb76pznvdsk-gzip-1.13/sbin:/nix/store/ixjixjj9f1k7h8rqab8frjhl6gm8k466-nix-2.18.8/sbin:/nix/store/s4fcvic1pi8m4jqf9vi39amd7b6gxxmc-powershell-7.4.2/sbin:/nix/store/k4wv1x26rba1hz725dcsawlzfpg3ywbl-sudo-1.9.15p5/sbin:/nix/store/hazsx60lrysd393fw7z7vpy4g6gn4acd-coreutils-9.5/sbin:/nix/store/749gm6fvnqph38vpg8b0jy6imxhq5bbf-findutils-4.9.0/sbin:/nix/store/da0r6y8bzs9jn9d3p1mmv0vxmi1d80ab-gnugrep-3.11/sbin:/nix/store/gi25l7za3bwy9havx02p7s201z0iykgk-gnused-4.9/sbin:/nix/store/h05qs7dk5i6490ji0f9fndia9q2wwjac-systemd-255.9/sbin"
Environment="RUNNER_ROOT=%S/github-runner/github-runner"
Environment="TZDIR=/nix/store/9kcxc7476dghdz3rpfi32mz0pzclsxbj-tzdata-2024b/share/zoneinfo"
AmbientCapabilities=
BindPaths=/opt/github-runner
BindPaths=/opt/containers
CapabilityBoundingSet=
DeviceAllow=
DynamicUser=false
ExecStart=/nix/store/i46xkb43dkx95xfr386i7g3m2bkd7g94-github-runner-2.320.0/bin/Runner.Listener run --startuptype service
ExecStartPre=+/nix/store/wsa0drj2izrciki3hk7ink9y61iw0725-github-runner-github-runner-unconfigure.sh '%S/github-runner/github-runner' '/opt/github-runner' '%L/github-runner/github-runner'
ExecStartPre=/nix/store/s8llwdk9g488vfz13xn26b9flldl4yy4-github-runner-github-runner-configure.sh '%S/github-runner/github-runner' '/opt/github-runner' '%L/github-runner/github-runner'
ExecStartPre=/nix/store/1y7qcc6a5ylsqazif5fbw23iiv0isaav-github-runner-github-runner-setup-work-dirs.sh '%S/github-runner/github-runner' '/opt/github-runner' '%L/github-runner/github-runner'
Group=container-deployment
InaccessiblePaths=-/opt/secrets/github-runner-token
InaccessiblePaths=%S/github-runner/github-runner/.current-token
KillSignal=SIGINT
LockPersonality=false
LogsDirectory=github-runner/github-runner
MemoryDenyWriteExecute=false
NoNewPrivileges=false
PrivateDevices=true
PrivateMounts=true
PrivateNetwork=false
PrivateTmp=true
PrivateUsers=true
ProcSubset=all
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
ProtectSystem=strict
RemoveIPC=true
Restart=no
RestartForceExitStatus=2
RestrictAddressFamilies=AF_INET
RestrictAddressFamilies=AF_INET6
RestrictAddressFamilies=AF_UNIX
RestrictAddressFamilies=AF_NETLINK
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
RuntimeDirectory=github-runner/github-runner
StateDirectory=github-runner/github-runner
StateDirectoryMode=0700
SystemCallFilter=~@clock
SystemCallFilter=~@cpu-emulation
SystemCallFilter=~@module
SystemCallFilter=~@mount
SystemCallFilter=~@obsolete
SystemCallFilter=~@raw-io
SystemCallFilter=~@reboot
SystemCallFilter=~capset
SystemCallFilter=~setdomainname
SystemCallFilter=~sethostname
UMask=0006
User=container-deployment
WorkingDirectory=/opt/github-runner

[Install]
WantedBy=multi-user.target

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

Ответ или решение

Использование команды sudo в службах systemd

Когда вы сталкиваетесь с ошибкой:

sudo: The "no new privileges" flag is set, which prevents sudo from running as root.
sudo: If sudo is running in a container, you may need to adjust the container configuration to disable the flag.

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

Понимание ошибок

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

Анализ вашей конфигурации

Вы уже изменили строку NoNewPrivileges=true на NoNewPrivileges=false и перезапустили службу, но ошибка сохраняется. Это может быть связано не только с этой настройкой, но и с другими факторами:

  1. Права пользователя: Убедитесь, что пользователь, под которым работает служба (в вашем случае container-deployment), действительно имеет привилегии на выполнение команд через sudo без ввода пароля. Это можно проверить, выполнив команду sudo -l от имени этого пользователя.

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

    • PrivateDevices, PrivateMounts и другие строгие параметры: Эти параметры могут ограничивать доступ к устройствам и файловым системам, что может блокировать выполнение некоторых команд.

    • SystemCallFilter: Этот фильтр также может ограничивать доступ к системным вызовам, необходимым для выполнения sudo. Проверьте, не блокирует ли он операции, необходимые вашему скрипту.

  3. Контейнерная среда: Если ваша служба работает в контейнере, необходимо учитывать, что при работе в контейнерах многие системные вызовы и операции могут быть ограничены.

Рекомендации по устранению

  1. Обновление конфигурации:

    • Попробуйте добавить следующий параметр в вашем unit-файле:
      NoNewPrivileges=false
    • Перезапустите службу и проверьте логи системы на наличие ошибок: journalctl -u имя_вашей_службы.
  2. Проверка привилегий:

    • Убедитесь, что настройки sudo для вашего пользователя корректны. Команда для добавления разрешений без пароля в файле /etc/sudoers:
      container-deployment ALL=(ALL) NOPASSWD: ALL
  3. Анализ safety flags:

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

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

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...