Outils pour utilisateurs

Outils du site


telnew_securite

Sécurité serveur

Après le piratage de telnew en avril 2017. La sécurité a été renforcée sur le serveur. Vous trouverez donc ci-dessous les méthodes utilisée pour sécuriser le serveur.

Configuration SSH

On va modifier la configuration SSH pour que notre serveur soit moins sensible au brute force.

Nous allons bloquer l'utilisateur root en connection SSH à distance. Nous allons commencer par créer un autre compte avec les droits admin pour se connecter à distance au serveur. Puis on va remplacer la authentification par mot de passe, par une authentification par clé.

On installe sudo :

sudo aptitude install sudo

On créé notre utilisateur et on lui donne les droits administrateur.

Configuration de base sécurisée avec password

# Création de l'utilisateur
useradd UTILISATEUR
usermod -G root,sudo UTILISATEUR
 
# Changement de shell
chsh admin --shell /bin/zsh
 
# Création de son home
mkdir /home/UTILISATEUR
chown UTILISATEUR:UTILISATEUR /home/UTILISATEUR
 
# Ajout d'un mot de passe (qui sera temporaire car on va mettre en place l'authentification par clé)
passwd UTILISATEUR

Maintenant on modifie la configuration SSH. Notre fichier /etc/ssh/sshd_config devrait ressembler à ça :

### SSH configuration file ###

# General
Port 9123
Protocol 2
AcceptEnv LANG LC_*
Banner /etc/banner

# Allow users
#AllowUsers git deldel traajan pixtel
#AllowGroups sftpapps

# Authentification
PermitRootLogin no
RSAAuthentication yes
PubkeyAuthentication yes
StrictModes yes
PermitEmptyPasswords no
LoginGraceTime 20s
MaxAuthTries 3
MaxStartups 2
AuthenticationMethods publickey

#Forwarding
AllowTcpForwarding no
X11Forwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no

# Desactivate other auth methodes
PasswordAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
PasswordAuthentication no

# For GitLab
usePam yes

# SFTP
Subsystem	sftp	/usr/lib/openssh/sftp-server

Match Group sftpapps
      ChrootDirectory /home/apps/%u
      ForceCommand  internal-sftp
      AllowTCPForwarding no
      X11Forwarding no
      PasswordAuthentication yes
      AuthenticationMethods password

On redémarre le service pour que la configuration soit prise en compte :

service ssh restart

La connexion root à distance ne devrait plus fonctionner (vous pouvez tester :p). Il vous faudra à présent vous connecter avec le UTILISATEUR et taper sudo <commande> pour exécuter une commande en root. Ou faire un sudo su - pour passer root une fois connecté sur le serveur.

Connexion par clé SSH

On va à présent mettre en place la connexion par clé.

Premièrement, sur votre ordi personnel (Linux), vous lancez ces commandes :

# Génération d'une clé SSH RSA 4096 bits
ssh-keygen -t rsa -b 4096 -C votre@email.com
 
# Envoie de la clé sur le serveur
ssh-copy-id -i ~/.ssh/id_rsa.pub UTILISATEUR@telnew.imt-lille.club -p 9123
 
# Taper votre mot de passe UTILISATEUR

Votre clé devrait maintenant être présente sur le serveur.

ssh -p '9123' 'UTILISATEUR@telnew.imt-lille.club'

Si vous avez réussi à vous connecter au serveur sans qu'il vous demande votre mot de passe, c'est que tout est ok.

Vous pouvez à présent désactiver l'authentification par mot de passe et n'autoriser que votre utilisateur à ce connecter en SSH dans le fichier /etc/ssh/sshd_config. Remplacer UTILISATEUR par le nom de votre utilisateur.

AllowUsers UTILISATEUR
PasswordAuthentication no

Puis redémarrez une nouvelle fois le service SSH.

service ssh restart

Règles Firewall

Pour sécuriser un serveur contre les intrusions, un firewall bien configuré est requis. Sur telnew, iptables est installé et fait le taff.

Pour l'installer :

sudo aptitude install iptables

Puis on créé ensuite un script dans /etc/init.d/firewall qui nous permettra de sauvegarder et générer nos règles firewall.

Le script actuel :

#!/bin/sh 
 
### BEGIN INIT INFO
# Provides: firewall
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Démarre les règles iptables
# Description: Charge la configuration du pare-feu iptables
### END INIT INFO
 
 
# Réinitialise les règles
iptables -t filter -F 
iptables -t filter -X 
 
# Bloque tout le trafic
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP 
iptables -t filter -P OUTPUT DROP 
 
# Autorise les connexions déjà établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 
# Autorise le loopback
iptables -t filter -A INPUT -i lo -j ACCEPT 
iptables -t filter -A OUTPUT -o lo -j ACCEPT 
 
# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT 
iptables -t filter -A OUTPUT -p icmp -j ACCEPT 
 
# SSH
iptables -t filter -A INPUT -p tcp --dport 9123 -j ACCEPT 
iptables -t filter -A OUTPUT -p tcp --dport 9123 -j ACCEPT 
 
# DNS
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT 
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT 
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT 
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT 
 
# NTP (horloge du serveur) 
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
 
# HTTP
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT 
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
 
# HTTPS
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
 
# Mail SMTP
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 587 -j ACCEPT 
iptables -t filter -A OUTPUT -p tcp --dport 587 -j ACCEPT 
 
# Anti Flood / Deni de service / scan de port
iptables -A FORWARD -p tcp --syn -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p udp -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

On donne les droits d'exécution au script :

sudo chmod +x /etc/init.d/firewall

:!: Faites attention avec la définition de vos règles ! Une erreur peut vous faire perdre l'accès au serveur. Je vous conseille donc d’exécuter le script avant de lancer un redémarrage de la machine.

Pour mettre en place les règles de filtrage :

/etc/init.d/firewall

Tentez maintenant de vous connecter avec une seconde console. Si la connexion est établie, tant mieux. Sinon, vérifiez votre fichier de configuration. Si la connexion est perdue sur votre première console, il ne vous reste plus d'autres choix que de faire un hard reboot de la machine afin de lui faire perdre sa configuration. Sur un serveur où vous avez un accès, il suffit de couper l'alimentation. Sinon sur un serveur OVH, on peut faire un hard reboot depuis l'interface manager.

Si la configuration est bonne vous pouvez faire en sorte que le script se lance au (re)démarrage du serveur :

update-rc.d firewall defaults

Compilation et installation seulement pour le root

Pour restreindre l'installation et la compilation des paquets pour un autre utilisateur de le root :

sudo chmod o-x /usr/bin/gcc-X.X
sudo chmod o-x /usr/bin/make
sudo chmod o-x /usr/bin/apt-get
sudo chmod o-x /usr/bin/apt
sudo chmod o-x /usr/bin/aptitude
sudo chmod o-x /usr/bin/dpkg

Cette mesure permet de limiter l'escalade de privilège.

Fail2Ban

Fail2Ban permet de bannir les machines qui tentent de brute forcer votre serveur. Pour cela, il se base sur les logs du serveur et en fonctions de règles établies, bannit les IPs pirates.

Pour installer le paquet :

aptitude install fail2ban

On va adapter Fail2Ban a nos besoins.

Copiez /etc/fail2ban/jail.conf vers /etc/fail2ban/jail.local puis éditez le :

sudo vim /etc/fail2ban/jail.local

Puis on change les lignes suivantes :

# Durée du bannissement en seconde
bantime  = 600

# Plage de temps de surveillance des logs
findtime = 600

# Nombre de tentatives avant bannissement
maxretry = 3

# Adresse mail des notifications
destemail = ???@?????????.????

Dans ce même fichier, dans la catégorie HTTP server, on va rajouter des configurations pour Apache.

[apache-404]
enabled = true
port = http
filter = apache-404
logpath = /var/log/apache*/error*.log
maxretry = 10

[apache-admin]
enabled = true
port = http
filter = apache-admin
logpath = /var/log/apache*/error*.log
maxretry = 6

[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log

On va maintenant créer les fichiers de configuration pour ces 3 types d'attaques :

/etc/fail2ban/filter.d/apache-w00tw00t.conf

[Definition]

# Option:  failregex
# Notes.:  regex to match the w00tw00t scan messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching.
# Values:  TEXT
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
ignoreregex =

/etc/fail2ban/filter.d/apache-admin.conf

[Definition]

# Fail2Ban configuration file
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
#
# Option: failregex
# Notes.: Regexp to match often probed and not available phpmyadmin paths.
# Values: TEXT
#
failregex = [[]client <HOST>[]] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2|wp-admin)

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

/etc/fail2ban/filter.d/apache-404.conf

[Definition]

# Option:  failregex
# Notes.:  regex to match the 404 failure messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values:  TEXT
#
failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): .*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Une fois toutes ces configurations terminées, on redémarre le service.

sudo service fail2ban restart

Isolation d'environnements : chroot

telnew_securite.txt · Dernière modification: 2017/12/06 12:56 par deldel