cyberflow_gravatar

Cyberflow

I am linux system administrator.


Navigation
» Home
» Categories
» Code
» XML Feed

Запуск logstash pipeline на привелигерованных портах

05 Feb 2019 » elk

Logstash является хорошим сборщиком логов, и хорошо, когда приложение, с которого собираются логи, можно настроить так, чтобы оно слало логи на выбранный порт. Но что делать, если такой возможности нет? Или это вообще не приложение, а некая железка в сети? И умее она слать только на 514 порт?

Конечно можно сделать перенаправление пакетов на уровне iptables. Но, с моей точки зрения, решение не очень элегантное и тяжело контролируемое.

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

В этой статье я кратко опишу решение, которое понравилось лично мне.

Настройка authbind

Opensource утилита, позволяющая разрешать приложениям использовать привелигированные порты без прав суперпользователя (root).

Утилита доступна в репозиториях debian/ubuntu и устанавливается через sudo apt-get install authbind.

Настраивается утилита достаточно просто: Например, чтобы разрешить приложению, запускаемому под пользователем logstash использовать порт 514, необходимо сделать следующее:

  • Создать файл в /etc/authbind/byport/
    sudo touch /etc/authbind/byport/!514
    

    Использование “!” при создании файла указывает на протокол UDP.

  • Дать прова на созданный файл, соответствующему пользователю:
    sudo chown logstash /etc/authbind/byport/!514
    

    Очевидно, что этот шаг указывает какому конкретно пользователю разрешено использовать соответствующий привелигерованный порт.

  • Дать прова на полное использование файла для пользователя
    sudo chmod 755 /etc/authbind/byport/!514
    

Настройка logstash

Для того, чтоб logstash получил доступ до привелигерованных портов, необходимо добавить в строку запуска usr/bin/authbind --deep до запуска самого logstash.

Это можно сделать путем редактирования юнита systemd. Должно получиться что-то вроде этого:

[Unit]
Description=logstash

[Service]
Type=simple
User=logstash
Group=logstash
EnvironmentFile=-/etc/default/logstash
ExecStart=/usr/bin/authbind "--deep" "/usr/bin/authbind" "--deep" "/usr/share/logstash/bin/logstash" "--path.settings" "/etc/logstash"
Restart=always
WorkingDirectory=/
Nice=19

[Install]
WantedBy=multi-user.target

Однако хочется заметить, что logstash имеет свой скрипт настройки юнитов systemd. И, мне кажется, что правильнее использовать его, для настройки systemd юнитов. Но, к сожалению, их коробки он таких штук, как обертка для запуска не умеет. Но добавить руками эту функцию не сложно. В фале /usr/share/logstash/bin/system-install надо поправить строчку:

program="$(cd `dirname $0`/..; pwd)/bin/logstash"

и поправить на:

program="/usr/bin/authbind --deep $(cd `dirname $0`/..; pwd)/bin/logstash"

Теперь запустив этот скрипт мы получим новый systemd юнит с authbind.