Авторские статьи

LogStash и привилегированные порты.


Порты с 1 по 1024 в операционной системе могут быть использованы программой только с правами root. У вас может возникнуть задача схожей с моей: старое сетевое обрудование не даёт указать порт удалённого syslog сервера и использует дефолтный жёстковшитый в оборудование 514 порт. Значит для приёма сообщений от такого оборудования вы будете вынуждены решить вопрос - как LogStash откроет для прослушивания (bind) 514 порт?

Существует 3 различных пути решения вопроса:
1) Запустить LogStash от root. Но по ряду причин это плохая затея, тем более в 7 версии стека ElasticSearch + LogStash + Kibana (ELK) каждая программа таскает свою личную Java (Bundled JDK), нужно будет править стартовые скрипты и т.д.

2) Можно с помощью iptables перенаправить данные с 514 порта на любой непривилегированный порт выше 1024. Но и эта затея плоха тем, что с ростом сетевого трафика будет расти нагрузка на ЦПУ.

3) Самый простой и элегантный способ - воспользоваться механизмом возможностей (capabilities). Нам нужна CAP_NET_BIND_SERVICE, которую с помощью команды setcap нужно добавить к бинарнику Java у LogStash.

Остановите сервис LogStash - sudo systemctl stop logstash

Для LogStash 6, который использует установленную в системе Java (подразумеваем что вы выполняли требования по официальной инструкции), нужно отдать такую команду sudo setcap CAP_NET_BIND_SERVICE=+epi /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/bin/java

Для LogStash 7, который использует свою Java, нужно отдать такую команду sudo setcap CAP_NET_BIND_SERVICE=+eip /usr/share/logstash/jdk/bin/java

К сожалению, с 7 версии добавление возможности CAP_NET_BIND_SERVICE ломает в бинарнике Java поиск её библиотек и вы получите в системном журнале /var/log/syslog ругань типа
logstash: /usr/share/logstash/jdk/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory.

От версии к версии файл libjli.so может разработчиками располагаться в разных папках. Найдите где в данный момент находится libjli.so - find /usr/share/logstash/ -name "libjli.so"

И сделайте на этот путь ссылку sudo ln -s /usr/share/logstash/jdk/lib/libjli.so /usr/lib/

Перезапустите сервис LogStash - sudo systemctl restart logstash

Теперь вы можете смело использовать при создании своих конфигурационных файлов в /etc/logstash/conf.d/ конструкции вида

input {
    syslog {
        port => "514"
    }
}

Единственный остался ньюанс! Нужно не забывать при обновлении стека ELK снова выставлять CAP_NET_BIND_SERVICE на обновлённый бинарник /usr/share/logstash/jdk/bin/java, а лучше этот вопрос элегантно автоматизировать.

В Debian-like мире можете создать файл /etc/apt/apt.conf.d/80upgradehook и в нём прописать
APT::Update::Post-Invoke {"setcap CAP_NET_BIND_SERVICE=+eip /usr/share/logstash/jdk/bin/java"; };
DPkg::Post-Invoke {"setcap CAP_NET_BIND_SERVICE=+eip /usr/share/logstash/jdk/bin/java";};

При любых сомнения и/или проблемах с LogStash + непривилегированный порт, смотрите на бинарнике наличие возможностей - getcap /usr/share/logstash/jdk/bin/java

Вы должны наблюдать в выводе
/usr/share/logstash/jdk/bin/java = cap_net_bind_service+eip

Дополнительные материалы:
Заметки про FileBeat из стека ELK.
Журналы Postfix в ElasticSearch.

Дата последней правки: 2023-07-01 11:33:51

RSS vasilisc.com   


Разделы

Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта