Mes 5 premières minutes sur un serveur Debian

sam

Sur une idée originale pompée honteusement sur le blog de Bryan Kennedy.

La virtualisation ou la possibilité d'acheter des machines à bas prix comme le Raspberry implique le fait que l'installation de serveurs devient une tâche de plus en plus fréquente. Afin d'éviter les grossières erreurs qui peuvent rapidement devenir fatales si la machine est exposée au réseau Internet, voici les actions que j'effectue systématiquement sur mes systèmes d'exploitations Debian ou Ubuntu Server.

Si vous suivez ce blog, vous savez que je suis un gros fainéant pour ce genre de tâches récurrentes. J'ai donc écrit un ensemble de scripts permettant d'effectuer les actions de "post installation". J'ai également commencé à regarder du coté des systèmes de gestion de configuration comme Puppet qui sont des solutions à utiliser en priorité si vous avez un parc informatique important.

L'objectif de ce billet est donc pédagogique pour partager avec vous les actions à effectuer et, je l'espère, en apprendre de nouvelles.

Assez de palabres, place au clavier...

1) S'occuper de ses comptes

Je parle bien évidemment ici des comptes utilisateurs qu'il va falloir sécuriser. On commence par le compte root qui ne sera PAS (jamais, c'est mal) utilisé directement pour vous connecter sur votre machine. Lors de l'installation du système, il faut saisir un mot de passe sécurisé, c'est à dire assez long avec un mélange de lettres, de chiffres et d'autres caractères mais sans utiliser des mots connus ou des suites de chiffres. Vous n'avez pas besoin de connaitre ce mot de passe par coeur mais il faudra le conserver bien au chaud.

Une fois logué sur la machine (on durant la phase d'installation du serveur), on commence par créer un utilisateur principal que l'on utilisera pour se connecter à la machine.

J'ai choisi morpheus pour illustrer mon billet.

useradd morpheus
mkdir /home/morpheus

La suite des opérations sera donc faite à partir de cet utilisateur.

2) S'occuper de ses portes d'entrées avec SSHd

SSH est devenu le mode d'accès le plus utilisé pour accéder aux serveurs GNU/Linux. Par défaut, il propose un contrôle d'accès par nom d'utilisateur et mot de passe. J'essaye au maximum d'éviter cette solution. J'utilise le système d'authentification par clé publique qui est un peu plus lourde à mettre en oeuvre et à administrer mais qui offre un niveau de sécurité plus important.

Pour ajouter la clé publique de mon PC avec lequel je vais me connecter au serveur, il suffit de lancer la commande suivante à partir de cette machine:

ssh-copy-id morpheus@monserveur

Puis on force l'utilisation de l'authentification par clé publique et on ferme ensuite cette porte à l'utilisateur root:

sudo vim /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no

Attention: l'authentification par  nom d'utilisateur / mot de passe sera désactivée pour les accès SSH. 

On relance ensuite le daemon SSH:

sudo service  ssh restart

3) Contrôler les entrées avec Fail2ban

Une fois le daemon SSH sécurisé, il faut ensuite ajouter une couche permettant de contrôler plus finement les accès. J'utilise pour cela Fail2ban que j'ai abordé plus précisément dans un précédant billet. Dans notre sujet du jour, je vais configurer Fail2ban pour bloquer, pendant 5 minutes, l'accès à SSH à un utilisateur qui se trompe 3 fois de mot de passe.

On commence par installer fail2ban:

sudo apt-get-install fail2ban

On va ensuite éditer le fichier /etc/fail2ban/jail.conf pour le configurer comme l'on souhaite:

[ssh]
enabled = true
port = ssh
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 3
bantime = 300

On relance ensuite le service pour prendre en compte la configuration:

sudo service fail2ban restart

4) Fermer les fenêtres (de votre Firewall)

Comme nous l'avons vu dans le point précédant, Fail2ban utilise le Firewall IPtable qui part défaut laisse passer l'ensemble des flux. J'applique systématiquement une configuration beoucoup plus restrictive qui autorise les flux SSH entrant (pour l'accès à distance) et HTTP/HTTPs/DNS sortant (pour la mise à jour de mon serveur).

J'utilise pour cela un script de démarrage maison:

sudo wget --no-check-certificate -O /etc/init.d/firewall.sh https://raw.github.com/nicolargo/debianpostinstall/master/firewall.sh
sudo chmod a+x /etc/init.d/firewall.sh

que je lance au démarrage de la machine (et aussi immédiatement):

sudo update-rc.d firewall.sh defaults 20
sudo service firewall start

Il est bien sûr possible d'adapter ce script à vos besoins de flux entrants et sortants en éditant les lignes suivantes:

# Services that the system will offer to the network
TCP_SERVICES="22" # SSH only
UDP_SERVICES=""
# Services the system will use from the network
REMOTE_TCP_SERVICES="80 443" # web browsing
REMOTE_UDP_SERVICES="53" # DNS

5) Prendre soin de ses fondations en tenant son système à jour

Maintenir à jour ses serveurs est une tâche à la fois indispensable et rébarbative. Il y a ici deux écoles possibles. La première est d'utiliser un logiciel comme unattended-upgrades qui va installer automatiquement pour vous les mises à jours de sécurités ou même l'ensemble de votre système. C'est une solution élégante mais qui n'est pas sans risque si un pépin arrive suite à une mise à jour alors que vous êtes loin de vous machines. J'opte donc pour la seconde solution, basée sur cron-apt, qui va me notifier par mail les mises à jours à effectuer sur mes machines.

On installe cron-apt avec la commande:

sudo apt-get install cron-apt

Puis on configure l'adresse mail de destination des messages de notifications dans le fichier /etc/cron-apt/config:

MAILTO="bibi+monserveur@gmail.com"

Note: comme vous pouvez le lire, j'utilise une adresse Gmail bibi@gmail.com pour la réception de mes notifications. J'y ajoute +monserveur (qui sera ignoré par Gmail) afin de pouvoir facilement les filtrer.

On relance le service pour prendre en compte la configuration:

sudo service cron-apt restart

Les notifications seront envoyés par défaut toutes les nuits à 4h du matin.

6) Surveiller le tout avec Logwatch

A ce stade vous avez un serveur disposant d'une sécurité de base qui va le protéger de la grande majorité des attaques que l'on peut trouver sur Internet. Il ne reste plus qu'à installer Logwatch, un outil permettant d'analyser les logs et ainsi de remonter par mail des rapports permettant d'analyser des tentatives d'intrusions éventuelles.

La mise en place est assez simple.

sudo apt-get install logwatch

Puis on configure l'adresse mail de destination des messages de notifications dans le fichier /etc/cron-apt/config:

#execute
/usr/sbin/logwatch --output mail --mailto bibi+monserveur@gmail.com --detail high

On relance le service pour prendre en compte la configuration:

sudo service cron-apt restart

Les notifications seront envoyés par défaut toutes les nuits.

7) Conclusion

Nous arrivons à la fin de ce billet avec une machine à l'épreuve d'une exposition à Internet sans risque de se faire hacker par le premier "script kiddie" venu.

A vous de nous faire partager vos techniques, méthodes que vous appliquez sur vos nouveaux serveurs !

Cet article Mes 5 premières minutes sur un serveur Debian est apparu en premier sur Le blog de NicoLargo.

Vus : 1952
Publié par Nicolargo : 402