Вопрос или проблема
Привет! Я запускаю скрипт, используя самостоятелно размещённый 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
и перезапустили службу, но ошибка сохраняется. Это может быть связано не только с этой настройкой, но и с другими факторами:
-
Права пользователя: Убедитесь, что пользователь, под которым работает служба (в вашем случае
container-deployment
), действительно имеет привилегии на выполнение команд через sudo без ввода пароля. Это можно проверить, выполнив командуsudo -l
от имени этого пользователя. -
Настройки безопасности: Ваша служба включает множество других параметров безопасности, которые могут препятствовать работе с
sudo
. Примечания к флагам:-
PrivateDevices, PrivateMounts и другие строгие параметры: Эти параметры могут ограничивать доступ к устройствам и файловым системам, что может блокировать выполнение некоторых команд.
-
SystemCallFilter: Этот фильтр также может ограничивать доступ к системным вызовам, необходимым для выполнения
sudo
. Проверьте, не блокирует ли он операции, необходимые вашему скрипту.
-
-
Контейнерная среда: Если ваша служба работает в контейнере, необходимо учитывать, что при работе в контейнерах многие системные вызовы и операции могут быть ограничены.
Рекомендации по устранению
-
Обновление конфигурации:
- Попробуйте добавить следующий параметр в вашем unit-файле:
NoNewPrivileges=false
- Перезапустите службу и проверьте логи системы на наличие ошибок:
journalctl -u имя_вашей_службы
.
- Попробуйте добавить следующий параметр в вашем unit-файле:
-
Проверка привилегий:
- Убедитесь, что настройки sudo для вашего пользователя корректны. Команда для добавления разрешений без пароля в файле
/etc/sudoers
:container-deployment ALL=(ALL) NOPASSWD: ALL
- Убедитесь, что настройки sudo для вашего пользователя корректны. Команда для добавления разрешений без пароля в файле
-
Анализ safety flags:
- Если вы всё равно не можете выполнить команды, рассмотреть возможность временного отключения других параметров безопасности, таких как
PrivateDevices
, и проверять, решает ли это проблему.
- Если вы всё равно не можете выполнить команды, рассмотреть возможность временного отключения других параметров безопасности, таких как
-
Ведение логов:
- Убедитесь, что все логи правильно настраиваются, чтобы вы могли отслеживать, что происходит при вызове, что также будет полезно при диагностировании.
Заключение
Проблемы с выполнением команд sudo
из systemd-сервиса могут быть сложны и многогранны. Важно проанализировать не только сам флаг NoNewPrivileges
, но и общую конфигурацию безопасности вашей службы. Убедитесь, что все права и параметры установлены корректно, и используйте инструменты логирования для диагностики любых возникающих проблем.