La situazione: è necessario inviare i log da un vecchio apparecchio a logstash in esecuzione su un CentOS 8, per archiviare i log su ElasticSearch.
Il problema
Il dispositivo è vecchio e non supporta la modifica della porta syslog predefinita da 514/udp a qualcosa di diverso, come la porta 5140/udp. Purtroppo questo può accadere, ad esempio su appliance virtuali come ZeroShell, dove non c’è modo di cambiare la porta syslog da quella predefinita, ma c’è una soluzione rapida a questo problema!
Quello che vi mostrerò è come fare il binding di qualsiasi processo su qualsiasi porta privilegiata, mentre lo si esegue come utente non privilegiato
Perché
Si tratta di una funzione di sicurezza, in quanto se ci si connette a un servizio su una di queste porte si può essere abbastanza sicuri di essere in presenza di un servizio vero e non di un falso messo in piedi da qualche hacker. Sarebbe davvero pericoloso permettere a tutto il sistema di collegarsi a qualsiasi servizio su una porta non privilegiata, perché le porte da 1 a 1023 sono effettivamente privilegiate!
Comunque, questa non è una guida su come impostare la porta di ascolto di logstash, ma piuttosto per consentire a java di effettuare il binding su una porta < 1024.
Come
La procedura è molto semplice. Prima di tutto dobbiamo trovare il percorso del processo java fornito con logstash e il percorso della libreria libjli.so.
I due percorsi dovrebbero assomigliare a questo:
/usr/share/logstash/jdk/bin/java
/usr/share/logstash/jdk/lib/jli
Una volta ottenuto il percorso dei due file, è possibile iniziare. Immettere i seguenti comandi come root.
setcap CAP_NET_BIND_SERVICE=+eip /usr/share/logstash/jdk/bin/java; getcap /usr/share/logstash/jdk/bin/java # questo permette a java di fare il bind su porta < 1024
echo "/usr/share/logstash/jdk/lib/jli" > /etc/ld.so.conf.d/java.conf # questo sarà usato da ldconfig
ldconfig; ldconfig -v -p | grep libjli # controllo se la libreria è nella cache
reboot
Quando il sistema si carica, avviare il servizio e verificare lo stato e se è collegato alla porta giusta.
systemctl start logstash; journalctl -xef -u logstash # avvia il servizio e controlla il servizio
systemctl status logstash # controlla lo stato del servizio
ss -tlnp | grep 514 # controlla se logstash ha il bind sulla 514
A questo punto si dovrebbe avere logstash attivo e funzionante, e soprattutto in ascolto sulla porta 514.