LINUX.ORG.RU
ФорумAdmin

Запуск процесса в VRF без привилегий root

 


0

1

При попытке запуска процесса (telegraf) в vrf посредством systemd получаем проблемы с правами для cgroup. Есть systemd сервис, описанный следующим образом:

[Unit]
Description=The plugin-driven server agent for reporting metrics into InfluxDB
Documentation=GitHub - influxdata/telegraf: The plugin-driven server agent for collecting & reporting metrics.
After=network.target
[Service]
EnvironmentFile=-/etc/default/telegraf
User=telegraf
ExecStart=ip vrf exec oam /usr/bin/telegraf -config /run/telegraf/vyos-telegraf.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_CHOWN CAP_LEASE
[Install]
WantedBy=multi-user.target

systemctl start vyos-telegraf дает ошибку:

Aug 19 14:13:50 ip[4307]: mkdir failed for /sys/fs/cgroup/system.slice/vyos-telegraf.service/vrf: Permission denied
Aug 19 14:13:50 ip[4307]: Failed to setup vrf cgroup2 directory

Хотел спросить - это принципиальная проблема или как-то решается? Это не то чтоб совсем Debian, но VyOS 1.4 based on Debian 11. Собственно, попытки создать аналогичную конструкцию на Debian 11 дают тот же результат.

Хотел спросить - это принципиальная проблема

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

Если тебе действительно надо именно этого, попробуй Delegate=true. Поскольку, судя по ману, ip vrf нужны не просто пустые цгруппы, а конкретно BPF-контроллер, работать это будет только если у тебя unified hierarchy (т. к. делегировать можно только контроллеры в cgroups v2). Unified hierarchy можно включить через systemd.unified_cgroup_hierarchy=1 — я не знаю, какой там в твоих дистрибутивах дефолт.

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

Да, мне нужно это. Есть подвижка, но не до успешного завершения. Добавил в сервис Delegate=true CapabilityBoundingSet=CAP_NET_ADMIN CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_BPF

mkdir в cgroups отработал, но теперь

Aug 24 15:59:09 deb11 ip[884]: Failed to load BPF prog: ‘Operation not permitted’

Что-то не хватает всеравно.

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

root@deb11:~# sysctl kernel.unprivileged_bpf_disabled=1 kernel.unprivileged_bpf_disabled = 1 root@deb11:~# sysctl kernel.unprivileged_bpf_disabled kernel.unprivileged_bpf_disabled = 1 root@deb11:~# sysctl kernel.unprivileged_bpf_disabled=0 sysctl: setting key «kernel.unprivileged_bpf_disabled»: Operation not permitted

забавно. Пожалуй проще сказать в ExecStart=!ip vrf exec foo ….

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

Да, в самом деле, unprivileged BPF нельзя включить обратно.

А как задавать значения sysctl через kernel command line? Я такого не знаю. ТС руками их выключил первой же строчкой.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от aserkin
# sysctl kernel.unprivileged_bpf_disabled=1

См. выше. Единожды выключив unprivileged BPF, обратно включить нельзя. Просто выставь в 0, не понимаю проблемы.

Ну или вместо плясок с unprivileged — тупо CAP_BPF процессу выдавать не пробовал?

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

сейчас так:

[Service]
Type=notify
EnvironmentFile=-/etc/default/telegraf
User=telegraf
Delegate=true
ExecStart=strace -e bpf ip vrf exec oam /usr/bin/telegraf --debug -config /etc/telegraf/telegraf.conf -config-directory /etc/telegraf/telegraf.d $TELEGRAF_OPTS
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartForceExitStatus=SIGPIPE
KillMode=control-group
CapabilityBoundingSet=CAP_NET_ADMIN CAP_SYS_ADMIN CAP_DAC_OVERRIDE CAP_BPF

и

root@deb11:~# sysctl kernel.unprivileged_bpf_disabled
kernel.unprivileged_bpf_disabled = 0

и всеравно не хочет

Aug 25 09:52:27 deb11 strace[706]: bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_CGROUP_SOCK, insn_cnt=6, insns=0x7ffd06e0f790, license="GPL", log_level=0, log_size=0, log_buf=NULL, kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 120) = -1 EPERM (Operation not permitted)
Aug 25 09:52:27 deb11 strace[706]: bpf(BPF_PROG_LOAD, {prog_type=BPF_PROG_TYPE_CGROUP_SOCK, insn_cnt=6, insns=0x7ffd06e0f790, license="GPL", log_level=1, log_size=262144, log_buf="", kern_version=KERNEL_VERSION(0, 0, 0), prog_flags=0, prog_name="", prog_ifindex=0, expected_attach_type=BPF_CGROUP_INET_INGRESS, prog_btf_fd=0, func_info_rec_size=0, func_info=NULL, func_info_cnt=0, line_info_rec_size=0, line_info=NULL, line_info_cnt=0, attach_btf_id=0, attach_prog_fd=0}, 120) = -1 EPERM (Operation not permitted)
Aug 25 09:52:27 deb11 strace[709]: Failed to load BPF prog: 'Operation not permitted'
Aug 25 09:52:27 deb11 strace[706]: +++ exited with 255 +++
Aug 25 09:52:27 deb11 systemd[1]: telegraf.service: Main process exited, code=exited, status=255/EXCEPTION
aserkin
() автор топика
Ответ на: комментарий от aserkin

BPF_PROG_TYPE_CGROUP_SOCK

А, ну естественно.

Unprivileged BPF разрешает только два типа BPF-программ: SOCKET_FILTER и CGROUP_SKB. Я что-то не посмотрел, через что реализован ip vrf.

Тогда вариантов нет, выдавай процессу CAP_BPF.

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

Так это *bounding set* :). Это ограничительный набор, а не разрешающий.

Вот, можно почитать вместо страшной сказки на ночь: capabilities(7).

А если конкретно, то тебе нужны AmbientCapabilities=. Попробуй выставить AmbientCapabilities=CAP_BPF.

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

Интересно. Просто я в редхатовское ядро смотрел. Там по дефолту unprivileged_bpf_disabled=1 (а не 2, как в mainline), но добавлена kernel option unprivileged_bpf_disabled, которая и представляет собой единственный способ установить 0.

i586 ★★★★★
()