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.