Tag Archives: Sécurité

Sécuriser son VPS centos/redhat/fedora en 10 étapes.

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:

  1. 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).
  2. On modifie tout de suite le mot de passe root
    passwd
  3. 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>
  4. Depuis notre poste client, on autorise notre clé sur le serveur
    ssh-copy-id <mon-user>@<ip-de-mon-vps>
  5. 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
  6. 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>
  7. 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
  8. On met à jour son système
    yum update
  9. On met en place un firewall
    Si le service firewalld est disponible, il est normalement déjà installé:

    1. On obtient la zone par défaut
      firewall-cmd --get-default-zone
      public
      

      Notre zone par défaut s’appelle public

    2. On vérifie que le service ssh est autorisé sur le firewall
      firewall-cmd --zone=public --list-services
      dhcpv6-client ssh
    3. 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

    1. 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
    2. On installe le service iptables
      yum install iptables-services
    3. 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
      
    4. 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
      
    5. 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
  10. 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
      

Voilà, le VPS est maintenant sécurisé et les premiers courriels de bannissement des gros relous ne devraient pas tarder…

Rediriger les mails locaux sur son adresse email

Il suffit d’avoir un serveur de courriel (serveur de mail) installé, avec la configuration par défaut, si ce n’est pas le cas, on l’installe.

sudo yum install postfix

Bien évidemment, on s’assure que le service est démarré et activé.

sudo systemctl start postfix
sudo systemctl enable postfix

Ou sur les distributions ne prenant pas en charge systemd (centos6 ou rhel6)

sudo service postfix start
sudo chkconfig postfix on

On modifie le fichier /etc/aliases pour rediriger les messages locaux vers son adresse de courriel. Exemple de redirection des messages locaux de l’utilisateur root vers l’adresse de courriel mon-user@mon-domain

root:         <mon-user>@<mon-domain>

On lance la reconstruction du cache des redirections

sudo newaliases

Il n’y a plus qu’à tester

echo 'Test depuis la ligne de commande' | \
mail -s 'test redirection' root

On devrait avoir un courriel avec le sujet test redirection

Et la sécurité dans tout ça ?

Par défaut, le service de mail se branche sur localhost et n’est pas accessible depuis l’extérieur. Donc aucun soucis.

Serveur SFTP

Tutorial de mise en place d’un service de transfert de fichier sécurisé (SFTP) avec possibilité de téléversement.

Pour donner un accès en téléversement à un tiers, la solution la plus logique serait d'utiliser ssh et de limiter ce tiers au serveur sFTP. Bien que ce ne soit obligatoire, celui-ci serait emprisonné dans son répertoire utilisateur (chroot)

Création du groupe et des utilisateurs

Création du groupe sftponly qui limiterait les utilisateurs à l'utilisation de sFTP (accès SSH interdit)

groupadd sftponly

Création d'un utilisateur dont l'accès serait uniquement via sFTP (pas d'ouverture de session possible, en local ou distant) et affectation d'un mot de passe.

useradd -m -s /bin/false -c 'sFTP User Only' sftptest
usermod -aG sftponly  sftptest
passwd sftptest

Modification de la configuration du démon SSH

Dans le fichier /etc/ssh/sshd_config Modifier le programme gérant le sFTP afin d'utiliser le wrapper interne à ssh pour lancer le programme sFTP. En effet le binaire ne sera pas accessible depuis le chroot.

Subsystem       sftp    internal-sftp

Ajouter à la fin du fichier, la configuration des utilisateurs ayant pour groupe sftponly afin de les emprisonner dans leur répertoire personnel et de leur permettre l'accès uniquement au service sFTP.

Match Group sftponly
   ChrootDirectory %h
   ForceCommand internal-sftp
   X11Forwarding no
   AllowTcpForwarding no

Le démon SSH (sshd) doit être rafraichi

service sshd reload

Ajuster les droits des répertoires utilisateurs créés

Le répertoire personnel des utilisateurs sFTP doit avoir pour propriétaire et groupe root et pour permission 755 (root:root rwxr-xr-x). Afin de pouvoir téléverser, il faut créer un répertoire ayant pour propriétaire l'utilisateur (sftptest ici). en effet l'utilisateur ne pourra pas téléverser à sa racine (son répertoire utilisateur).

chown root:sftponly /home/sftptest
chmod 755 /home/sftptest
mkdir /home/sftptest/upload
chown sftptest: sftponly /home/sftptest/upload
chmod 755 /home/sftptest/upload

SELinux

Par défaut, pour SELinux, le chroot sFTP est en lecture seule. Afin d'autoriser le téléversement, il faut qu'il soit en lecture/écriture. SELInux dispose d'un booléen pour ça.

setsebool -P ssh_chroot_rw_homedirs on

Test

Afin de ne pas perturber le démon SSH en cours d'utilisation, on peut lancer une seconde instance (sur un port différent) en mode debug

/usr/sbin/sshd -p 2222 -d

Depuis un autre poste, on test la connexion ssh (qui ne doit pas fonctionner) et le téléversement d'un fichier à la racine (qui doit rapporter une erreur) et dans le répertoire upload (seul ce dernier doit fonctionner).

ssh -p 2222 sftptest@monserver
sftptest@monserver's password:
This service allows sftp connections only.
Connection to monserver closed.
sftp -p 2222 sftptest@monserver
sftptest@monserver's password:
Connected to monserver.
sftp> ls
upload
sftp> put test.txt
Uploading test.txt to /test.txt
remote open("/test.txt"): Permission denied
sftp> cd upload
sftp> put test.txt
Uploading test.txt to /upload/test.txt
test.txt                    100%    5     0.0KB/s   00:00
sftp> exit
source: https://wiki.tartarefr.eu/index.php/Services/FTP/SFTP