web-dev-qa-db-fra.com

Substitution de commandes utilisant la sortie grep'ed et sed'ed tail -f comme source d'argument dans la commande 'at'

Il s'agit d'un système de surveillance domestique, d'un serveur sans tête exécutant Ubuntu 15.04, et je veux que sa sécurité soit exemplaire. J'envisage une solution en ligne de commande (avec script facultatif, si absolument nécessaire) surveillant les sondes IP des utilisateurs/hackers connectés dans mon ufw.log et les mettant sur liste noire en temps réel si elles ne sont pas portées correctement à temps. Jusqu'à présent, j'ai:

tail -n+1 -F /var/log/ufw.log | 
  grep -v --line-buffered '0.0.0.0' | 
    sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g'

qui sort pour stdout un flux en direct de sonde atteignant les IP. Ce sont les IP que je veux mettre sur liste noire x (3?) Minutes à partir de "maintenant". Cela donne aux utilisateurs légitimes le temps de figurer sur la liste blanche en premier en supprimant les ports. J'utilise la commande ufw insert pour la liste noire et la liste blanche, ce qui signifie que la liste se produit en premier domine.

La partie de la liste blanche fonctionne bien en ce moment. Ensuite, je veux développer la commande "at" qui exécute correctement le ufw insert 1 deny from x.x.x.x commande où x.x.x.x provient de la commande tail susmentionnée.

Ma première tentative est quelque chose comme

ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | 
   grep -v --line-buffered '0.0.0.0' | 
   sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g');
ufw reload | 
   at now +3 minute`

mais aucune commande at n'est générée comme indiqué par at -l. Quelqu'un peut-il voir ce que je fais mal avec cette commande?

NOUVELLE PENSÉE - Je pense que le tail -F la commande doit être le début. Toute autre façon semble ne traiter qu'une seule ligne du fichier journal ufw.

Pour les curieux d'entre vous, les règles de port knocking que j'ai en place maintenant peuvent et font une liste noire, mais de manière très limitée car je dois définir le comportement de sondage à l'avance dans les règles. Donc, s'ils optent pour les ports 22 deux fois ou 21 deux fois ou 443 deux fois, ils sont maintenant sur liste noire. Mais je vois des sondages en cours pour les ports de la gamme 55xxx, 4 ou 5 sondes vers différents ports. Je ne vois pas comment ceux-ci peuvent raisonnablement être caractérisés dans les règles de pare-feu, mais ce que je peux faire est de me connecter avec ufw toutes les sondes tombant à travers la liste blanche et la liste noire dans la section finale deny + log. Je veux leur donner x minutes pour porter correctement le port, puis la partie 'ufw' de cette commande programmée par la partie 'at' s'exécutera.

Je vous remercie!

muru m'a très proche. Voici l'état d'avancement actuel, mais notez que ufw a une propension à cette erreur: ERROR: initcaps
[Errno 2] iptables: Chain already exists.
Donc, je ne pense pas que cela fonctionne suffisamment avec iptables pour gérer très bien cette intégration. Je pense qu'il vaut mieux utiliser les commandes iptable directement au lieu d'avoir ufw interpréter.

tail -F /var/log/ufw.log | 
  grep -v --line-buffered '0.0.0.0' | 
  sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g' | 
  while read IP; do
    echo ufw insert 1 deny from "$IP" | 
      at now +3 minute;
    echo ufw reload | at now +3 minute; 
  done 

REMARQUE LES DOSSIERS NE S'AFFICHERONT PAS DANS CE TEXTE MAIS J'AI BESOIN DE LES AJOUTER JE PENSE. ILS APPARTIENNENT AVANT CHAQUE COMMANDE ECHO ET APRÈS CHAQUE MINUTE MOT-CLÉ.

La façon dont cela échoue a maintenant à voir avec 'tail -F' canalisé dans la construction 'while': avec chaque ligne ajoutée au fichier ufw.log, le fichier ENTIRE est réintroduit dans la boucle 'while' au lieu de juste cela ligne nouvellement ajoutée. J'ai fouillé mon cœur et je ne peux pas trouver le moyen de contourner cela. Aidez-moi, s'il vous plaît.

2
kenneth558

Le correctif dont j'avais besoin: stdbuf -o0 pour sed et awk contenus dans la ligne de commande, comme ceci:

tail -F /var/log/ufw.log|grep --line-buffered ...... | stdbuf -o sed ..... | stdbuf -o awk ...... |

Peut utiliser stdbuf -o0 avec grep également, au lieu de --line-buffered. C'est ce que stdbuf -o0 does - it line buffers, c'est ce dont la commande avait besoin dans mon cas. Bien sûr, le reste de la commande devait être assemblé et répercuté en `` à '', mais cette partie était assez simple pour moi (en utilisant intensément awk) une fois que l'aspect de mise en mémoire tampon des lignes était conquis. J'ai fini par avoir besoin d'un script pour une saisie manuelle facile ainsi que de ces adresses IP à mettre sur liste noire, ainsi que d'une ou deux tâches supplémentaires comme je le mentionne ci-dessous.

Je démarre le processus @reboot avec la commande décrite ci-dessus dans crontab tail-ing /var/log/kern.log où iptables enregistre les paquets de sondage. Cette commande envoie chaque adresse IP de sondage avec l'heure et les détails du paquet dans un script bash. Ce script bash, lors de la construction de la dernière commande de liste noire iptables, donne la queue /var/log/knockd.log pour la séquence de knock commencée avec succès ('étape n'), auquel cas il envoie une version de la commande blacklist-IP construite par script dans 'at' pour l'entrée sur la liste noire 3 minutes plus tard. Sinon, la commande blacklist-IP construite par script s'exécute immédiatement. Si le détournement de port réussit, l'IP est placée sur la liste blanche [FUTURE - ce qui empêche la commande programmée de la liste noire-IP de réussir (la version de la commande programmée dans 'à' commencera en vérifiant la présence d'IP dans la liste blanche)].

Je mets la touche finale, comme la version programmée "at" pour vérifier la présence sur liste blanche. J'ai arrêté d'utiliser ufw et simplifié ma vie en contrôlant directement iptables. Pas de fail2ban non plus, car c'était trop lourd à mon goût juste pour sécuriser un système privé, sur liste blanche uniquement. Désormais, chaque fois qu'un port de mon système est sondé une seule fois, cette adresse IP est mise sur liste noire. Voici quelques lignes de mes iptables, la liste noire suit la liste blanche, les règles LOG et DROP ne sont pas affichées à la fin (DROP uniquement nécessaire si policy = ACCEPT). Plus tard, je me compacterai en sous-réseaux quand j'en aurai envie.

(Désolé, la mise en forme a été perdue) ENTRÉE en chaîne (la politique ACCEPTE 0 paquets, 0 octets) nombre de paquets octets cible prot opt ​​in out source source
1 0 0 ACCEPTER tout - eth0 * xxx.72.26.233 0.0.0.0/0
2 592 53357 ACCEPTER tout - * * 0.0.0.0/0 0.0.0.0/0 ctstate LIÉ, ÉTABLI 3 98 5922 ACCEPTER tout - lo * 0.0.0.0/0 0.0.0.0/0
4 0 0 ACCEPTER tout - eth1 * 0.0.0.0/0 0.0.0.0/0
5 1 60 ACCEPTER tout - eth0 * xx.179.31.188 0.0.0.0/0/* knocked Sun 25 octobre 16:33:53 CDT 2015 */6 0 0 ACCEPTER tout - eth0 * xxx. 32.31.196 0.0.0.0/0/* isp server lun 26 oct 12:43:59 CDT 2015 */7 0 0 ACCEPT all - eth0 * xxx.142.225.5 0.0.0.0/0/* isp server lun 26 oct 12:43:45 CDT 2015 */8 0 0 ACCEPTER tout - eth0 * xxx.32.31.195 0.0.0.0/0/* serveur isp lun 26 oct 12:43:31 CDT 2015 */9 0 0 ACCEPTER tout - - eth0 * xxx.72.26.254 0.0.0.0/0/* serveur isp lun 26 oct 12:43:11 CDT 2015 */10 1118 DROP all - eth0 * 185.86.148.68 0.0.0.0/0/* kern. log 27 oct 22:29:53 PROTO = UDP SPT = 56177 DPT = 1900 */11 0 0 DROP all - eth0 * 184.105.247.220 0.0.0.0/0/* kern.log 27 oct 22 22:22:30 PROTO = UDP SPT = 53700 DPT = 53413 */12 0 0 DROP all - eth0 * 195.211.154.179 0.0.0.0/0/* kern.log 27 oct 22:21:49 PROTO = TCP SPT = 48465 DPT = 21320 */13 2120 DROP all - eth0 * 75.111.59.88 0.0.0.0/0/* kern.log 27 oct 22:21:37 PROTO = TCP SPT = 35727 DPT = 23 */14 0 0 DROP all - eth0 * 74.82. 47.16 0.0.0.0/0/* kern.log Oc t 27 22:17:34 PROTO = TCP SPT = 38695 DPT = 27017 */15 0 0 DROP all - eth0 * 1.93.3.124 0.0.0.0/0/* kern.log 27 octobre 22:16:33 PROTO = TCP SPT = 1414 DPT = 1433 */16 0 0 DROP all - eth0 * 184.105.139.96 0.0.0.0/0/* kern.log 27 oct 22:12:42 PROTO = UDP SPT = 51153 DPT = 123 */17 0 0 DROP all - eth0 * 121.230.163.125 0.0.0.0/0/* kern.log 27 oct 21:57:06 PROTO = ICMP */18 0 0 DROP all - eth0 * 120.132.50.66 0.0.0.0/0/* kern.log 27 octobre 21:53:30 PROTO = TCP SPT = 51864 DPT = 1023 * /

1
kenneth558

Sauf si ufw reload et ufw insert afficher un ensemble de commandes qui recharge le pare-feu, le redirigeant vers at ne serait pas ce que vous voulez.

Vouliez-vous dire:

echo ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | 
   grep -v --line-buffered '0.0.0.0' | 
   sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g') | at now +3 minute
echo ufw reload | at now +3 minute

Ou, combiné:

at now +3 minute <<EOF
ufw insert 1 deny from $(tail -n+1 -F /var/log/ufw.log | grep -v --line-buffered '0.0.0.0' | sed -e 's/BLOCK/&/g' -e 's/.*SRC\=//g' -e 's/\ DST.*//g')
ufw reload
EOF
2
muru