Порты с 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.
Главная
Новости
Ворох бумаг
Видео Linux
Игры в Linux
Безопасность
Статьи об Astra Linux
Статьи о FreeBSD
Статьи об Ubuntu
Статьи о Snappy
Статьи об Ubuntu Phone
Статьи о Kubuntu
Статьи о Xubuntu
Статьи о Lubuntu
Статьи об Open Source
Карта сайта
1С под Linux. Ускорение Ubuntu. 21 пример iptables. Цикл статей о Ceph. Убунту в дикой среде. Ubuntu Linux на SSD. Ubuntu для блондинок. Поддержка железа в Linux. BTSync на службе у админа. Андроид программы в Ubuntu. Прокидывание портов для p2p. Анти СПАМ в Postfix. BGT - шумоизоляция арок москва с гарантией