Ich will einen Host im „offenen“ Internet via ssh erreichbar machen. Um da noch etwas mehr Sicherheit zu bekommen, habe ich Maßnahmen ergriffen: fail2ban mit Ansible aktivieren, Passwort-Logins verbieten und root-Login nur von internen IPs erlauben. Wer fail2ban noch nicht kennt, findet hier mehr Infos: Im Kern macht es Ports zu, sobald eine bestimmte Aktion zu oft passiert. Also z.B. wird der ssh-Port zugemacht, wenn zu viele Login-Fehlversuche registriert werden. Ich habe es ja auch für owncloud schon verwendet.
fail2ban mit Ansible
Fail2ban wollte ich diesmal auch mit Ansible konfigureren, da ich schon einiges damit erledige. Ich habe mich für die Role tersmitten.fail2ban entscheiden, weil sie mir am einfachsten und gut „alleine“ verwendbar erschien. Damit war/ist die Einrichtung sehr einfach – hier mein Playbook fail2ban.yml:
- name: Install fail2ban
hosts: fail2ban
# see https://galaxy.ansible.com/tersmitten/fail2ban/
roles:
- role: tersmitten.fail2ban
tags: fail2ban
fail2ban_maxretry: 10
fail2ban_action: "%(action_mwl)s"
fail2ban_destemail: bla@foo.bar
Hier gleich noch die ersten, wichtigsten Kommandos, um sich anzuschauen, was fail2ban so tut:
tail -f /var/log/fail*log /var/log/auth.log
fail2ban-client status
fail2ban-client status sshd
fail2ban-client set sshd unbanip 192.168.99.99
Passwort-Logins verbieten
Passwort-Logins verbiete ich auch via ansible – das Playbook dazu ist noch trivialer und steht auch unten. Hier könnte/sollte vielleicht in Zukunft noch mehr rein. Mein Playbook sshd-secure2.yml:
- name: secure ssh for external reachable hosts
hosts: externalsshhosts
tasks:
- name: add PasswordAuthentication no to sshd_config line
lineinfile: dest=/etc/ssh/sshd_config regexp=PasswordAuthentication.* line="PasswordAuthentication no"
notify: restart sshd
handlers:
- name: restart sshd
service: name=ssh state=restarted
Root-Login verbieten
Außerdem erlaube ich den direkten root-Login nur von internen IPs. Ich kann das nicht ganz abschalten, weil beim Backup mit backuppc root-Login benötigt wird.
Mein /etc/ssh/sshd_config
(sollte in Zukunft natürlich auch per Ansible passieren):
# DSTK 2018-01-01 was: PermitRootLogin prohibit-password
# see match block at bottom of file
PermitRootLogin no
...
# Must be at bottom of file
Match Address 192.168.99.*
PermitRootLogin prohibit-password
Die Ansible Rolle steht leider nicht mehr zur Verfügung. Kennst du eine andere gute Alternative?
Ja, stimmt.
tersmitten
scheint jetztoefenweb
zu heißen. Ich habe keine Ahnung, ob das so wirklich richtig ist. Ich benutze von ihm jetzt jedenfalls:Das Playbook zu fail2ban sieht bei mir nun so aus: