Pré-requis
Depuis notre poste client, on s’assure qu’une paire de clés (rsa c’est mieux que dsa) existe pour notre utilisateur courant. Celle-ci servira à se connecter à notre VPS sans mot de passe, mais de manière sécurisée. Si ce n’est pas le cas, on n’en créé une et on lui affecte un mot de passe.
ssh-keygen -t rsa
On se sert ensuite de l’agent SSH pour ne renseigner le mot de passe de notre clé privée qu’une seule fois, mais si on préfère le taper à chaque fois ….
ssh-add
Sécurisation
On peut maintenant s’occuper de notre VPS:
- Dès réception du mail de confirmation d’installation, on se connecte en SSH sur notre VPS, avec le login root et le mot de passe fourni.
Cette session ne doit pas être fermée avant de pouvoir se connecter sans mot de passe (par clé donc) avec l’utilisateur qui sera créé (point 7). - On modifie tout de suite le mot de passe root
passwd
- On ajoute un utilisateur standard et on lui affecte un mot de passe
useradd -m -s /bin/bash -c "<Nom> <Prenom>" <mon-user> passwd <mon-user>
- Depuis notre poste client, on autorise notre clé sur le serveur
ssh-copy-id <mon-user>@<ip-de-mon-vps>
- On Modifie la configuration du service SSH (typiquement le fichier /etc/ssh/sshd_config):
- ne plus autoriser le super-utilisateur root
PermitRootLogin no
- ne plus autoriser les connexions par mot de passe (n’accepter que les connexions par clé)
PasswordAuthentication no
- On redémarre le service ssh (fedora, centos7 ou rhel7)
systemctl restart sshd
ou sur les distributions ne prenant pas en charge systemd (centos6 ou rhel6)
service sshd restart
- ne plus autoriser le super-utilisateur root
- Dans un autre shell, on s’assure que notre utilisateur peut se connecter au VPS sans mot de passe
ssh <mon-user>@<ip-de-mon-vps>
- Maintenant que la porte d’entrée a été changée, que notre VPS est bien accessible depuis notre poste client avec un utilisateur normal, on peut fermer le shell ouvert en début de procédure, mais cela reste optionnel
- On met à jour son système
yum update
- On met en place un firewall
Si le service firewalld est disponible, il est normalement déjà installé:- On obtient la zone par défaut
firewall-cmd --get-default-zone public
Notre zone par défaut s’appelle public
- On vérifie que le service ssh est autorisé sur le firewall
firewall-cmd --zone=public --list-services dhcpv6-client ssh
- Si le service ssh n’est pas dans la liste, on l’ajoute (de manière permanente) et on recharge le firewall
firewall-cmd --zone=public --permanent --add-service=ssh firewall-cmd --reload
Sinon, on utilise le service iptables
- Si firewalld est installé mais qu’il ne fonctionne pas (merci à l’hébergeur qui ne sait pas configurer la technologie proxmox correctement), on le supprime
yum remove firewalld
- On installe le service iptables
yum install iptables-services
- On le démarre et on l’active
systemctl start iptables systemctl enable iptables
Ou sur les distributions ne prenant pas en charge systemd (centos6 ou rhel6)
service iptables start chkconfig iptables on
- On met en place une configuration minimale dans le fichier /etc/sysconfig/iptables: on autorise le trafic entrant sur la boucle locale (localhost), les pings (protocole icmp), ainsi que le trafic entrant sur les connexions déjà établies ( state RELATED,ESTABLISHED ) plus le trafic entrant sur le port 22 (ssh) et surtout on ignore tout le reste avec la politique par défaut à DROP. Par contre, on autorise le trafic sortant.
# sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT COMMIT
- On redémarre le service iptables
systemctl restart iptables
Ou sur les distributions ne prenant pas en charge systemd (centos6 ou rhel6)
service iptables restart
- On obtient la zone par défaut
- On met en place le service fail2ban sur le service ssh
- Installation
yum install fail2ban
- On met en place une configuration minimale: on surcharge le fichier jail.conf dans le fichier jail.local pour bannir les gros lourds 48 heures directement, car il ne peut y avoir de mots de passe mal renseigné, vu qu’on accepte uniquement les connexions par clés.
[DEFAULT] ignoreip = 127.0.0.1/8 <ip-de-mon-vps> bantime = 3600 banaction = firewallcmd-ipset banaction_allports = firewallcmd-ipset backend = systemd sender = fail2ban@<mon-domaine> destemail = root action = %(action_mwl)s [sshd] enabled = true maxretry = 5 bantime = 172800 findtime = 172800
ou si firewalld n’est pas disponible
[DEFAULT] ignoreip = 127.0.0.1/8 <ip-de-mon-vps> bantime = 3600 banaction = iptables-multiport banaction_allports = iptables-allports backend = systemd sender = fail2ban@<mon-domaine> destemail = root action = %(action_mwl)s [sshd] enabled = true maxretry = 5 bantime = 172800 findtime = 172800
- On démarre et on active le service
systemctl start fail2ban systemctl enable fail2ban
Ou sur les distributions ne prenant pas en charge systemd (centos6 ou rhel6)
service fail2ban start chkconfig fail2ban on
- Installation
Voilà, le VPS est maintenant sécurisé et les premiers courriels de bannissement des gros relous ne devraient pas tarder…
Pingback: Protéger apache avec fail2ban – TartareFR
Pingback: Didier Fabert (tartare): Protéger apache avec fail2ban | Fedora Colombia