Bug 38108 - ping plugin: ping_host_add failed: Operation not permitted
Summary: ping plugin: ping_host_add failed: Operation not permitted
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: collectd-ping (show other bugs)
Version: unstable
Hardware: all Linux
: P5 normal
Assignee: Anton Farygin
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-02-17 15:25 MSK by Alexander Makeenkov
Modified: 2020-02-18 17:14 MSK (History)
12 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Alexander Makeenkov 2020-02-17 15:25:53 MSK
Версия пакета: collectd-ping-5.10.0-alt1

Система: ALT Workstation x86_64

Не работает плагин ping. При запуске collectd в логах появляются такие ошибки (collectd при этом запускается успешно):

collectd[2553]: plugin_load: plugin "ping" successfully loaded.
collectd[2553]: ping plugin: ping_host_add (www.google.com) failed: Operation not permitted
collectd[2553]: ping plugin: No host could be added to ping object. Giving up.

Шаги воспроизведения:

1. Установить collectd collectd-ping 

2. В файле /etc/collectd.conf раскомментировать следующие строки (изменить параметры Host, SourceAddress, Device на нужные значения):

LoadPlugin ping

<Plugin ping>
        Host "www.google.com"
        Interval 1.0
        Timeout 0.9
        TTL 255
        SourceAddress "8.8.8.8"
        AddressFamily "any"
        Device "eth0"
        MaxMissed -1
</Plugin>

3. Запустить collectd (предварительно необходимо удалить строку LoadPlugin rrdtool, либо установить пакет collectd-rrdtool, см. баг https://bugzilla.altlinux.org/36950):

# systemctl start collectd

# systemctl status collectd
Comment 1 Alexey Shabalin 2020-02-17 16:10:14 MSK
что показыват
control ping ?
Comment 2 Alexander Makeenkov 2020-02-17 16:16:34 MSK
(Ответ для Alexey Shabalin на комментарий #1)
> что показыват
> control ping ?

# control ping
public
Comment 3 Anton Farygin 2020-02-17 19:31:09 MSK
Это фича, нужно выдать collectd CAPABILITY для ping. 

Читайте документацию, там всё есть.
Comment 4 Anton Farygin 2020-02-17 19:33:40 MSK
выдаётся через unit systemd для collectd
Comment 5 Michael Shigorin 2020-02-17 22:17:24 MSK
Вообще хорошо бы вместо такого костыля сделать штатный механизм по управлению capabilities (возможно, на базе или навроде control).
Comment 6 Dmitry V. Levin 2020-02-18 00:14:24 MSK
(In reply to Anton Farygin from comment #3)
> Это фича, нужно выдать collectd CAPABILITY для ping.

Вы точно ничего не путаете?  Странно, что ping'у не нужна, а collectd'у нужна.
Comment 7 Anton Farygin 2020-02-18 07:04:29 MSK
Желающие могут поправить это поведение в liboping:
The I<oping> library opens a raw socket to be able to send ICMP packets. On
most systems normal users are not allowed to do this. This is why on most
systems the L<ping(1)> utility is installed as SetUID-root. Since, when using
this module, no external process is spawned B<this> process needs the
appropriate permissions. This means that either your script has to run as
superuser or, under Linux, needs the C<CAP_NET_RAW> capability.

Но ping же у нас SGID'ный, так что не совсем честно говорить о том, что ему не нужны CAPABILITY. Нужны, просто они у него есть в момент запуска.

Вот если сделать так:
chmod 0711 /usr/libexec/ping/ping
то и у нас ping работать не будет под обычным пользователем.

в случае с collectd capability сбрасываются на стороне systemd, в самом collectd нет никакой поддержки управление capabilities, кроме проверок их наличия.
Comment 8 Anton Farygin 2020-02-18 07:06:06 MSK
(Ответ для Michael Shigorin на комментарий #5)
> Вообще хорошо бы вместо такого костыля сделать штатный механизм по
> управлению capabilities (возможно, на базе или навроде control).

Штатный механизм - это юниты systemd. 

Администратор, использующий collectd, должен понимать как его настраивать.
Можно положить нужный юнит в пакет но я бы не хотел этого делать.
Comment 9 Alexey Shabalin 2020-02-18 11:10:01 MSK
(Ответ для Anton Farygin на комментарий #8)
> (Ответ для Michael Shigorin на комментарий #5)
> > Вообще хорошо бы вместо такого костыля сделать штатный механизм по
> > управлению capabilities (возможно, на базе или навроде control).
> 
> Штатный механизм - это юниты systemd. 
> 
> Администратор, использующий collectd, должен понимать как его настраивать.
> Можно положить нужный юнит в пакет но я бы не хотел этого делать.

Можно положить в пакет collectd-ping дополнительный конфиг для юнита а /(lib|etc)/systemd/system/collectd.service.d/ping.conf с добавлением только одного нужного параметра. И все будет работать из коробки.
Comment 10 Dmitry V. Levin 2020-02-18 13:33:23 MSK
(In reply to Anton Farygin from comment #7)
> Желающие могут поправить это поведение в liboping:
> The I<oping> library opens a raw socket to be able to send ICMP packets. On
> most systems normal users are not allowed to do this. This is why on most
> systems the L<ping(1)> utility is installed as SetUID-root. Since, when using
> this module, no external process is spawned B<this> process needs the
> appropriate permissions. This means that either your script has to run as
> superuser or, under Linux, needs the C<CAP_NET_RAW> capability.
> 
> Но ping же у нас SGID'ный, так что не совсем честно говорить о том, что ему
> не нужны CAPABILITY. Нужны, просто они у него есть в момент запуска.

ping'у не нужны CAPABILITY, потому что ping использует другой механизм в ядре (ping socket).  Судя по процитированному, collectd-ping написан давно и не умеет использовать этот механизм.  Это объясняет разницу.

В таком случае остаётся только сделать так, как предлагает Алексей.
Comment 11 Anton Farygin 2020-02-18 13:49:49 MSK
Я не хочу делать из коробки так, как процитировал Алексей. Считаю такое поведение из пакета не правильным. 

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

По мне так лучше пусть этот плагин заработает после донастройки, чем всему collectd молча дадут какие-то дополнительные привилегии.
Comment 12 Michael Shigorin 2020-02-18 17:08:17 MSK
(Ответ для Anton Farygin на комментарий #8)
> (Ответ для Michael Shigorin на комментарий #5)
> > Вообще хорошо бы вместо такого костыля сделать штатный механизм по
> > управлению capabilities (возможно, на базе или навроде control).
> Штатный механизм - это юниты systemd. 
Это механизм, зависящей от реализации pid 1, которая умеет SEGV'иться.
Соответственно штатным в production он у нас не является (спроси ldv@).
Comment 13 Anton Farygin 2020-02-18 17:14:16 MSK
А без systemd у collectd нет проблем с ping ;)