Archives par étiquette : ssh

Trouver la date d’installation de Linux

Un jour j’avais besoin de réviser quels serveurs arrivaient à leur fin de vie physique au travail avant qu’un événement malheureux arrive.  Je n’étais pas là lors de l’installation de certains de ces serveurs et l’ancien technicien n’avait pas noté les dates d’installation de ces serveurs nulle part…

Après quelques recherches, j’ai trouvé quelques response.  La première concerne les distributions de Linux basées sur les RPM telles que RHEL et CentOS :

# rpm -qi basesystem

Note: Sur certains types de serveurs virtuels (V-Server), cette commande affiche la date d’installation du « basesystem » de la machine hôte et non pas de la machine virtuelle donc faites attention et vérifiez l’autre commande ci-dessous.

La deuxième réponse que j’ai trouvé est plus générique mais dépend du fait que le fichier en question aurait pu être modifié ou recréé même si ceci est peu probable.  Presque toutes les distributions de Linux vont créer une clé d’hôte ssh lors du premier démarrage suivant l’installation, on peut donc vérifier sa date de création très simplement :

# ls -l /etc/ssh/

J’espère que ceci vous aura aidé un peu!  Du moins, ça a fonctionné dans tous les cas où je l’ai essayé jusqu’à présent…

Configurer SSH de façon sécuritaire

Introduction

Dans cet article, je ferai le tour de la connexion, autant du côté client (PC sous Windows) que du côté serveur (Linux sous CentOS).  Voici les étapes qui seront couvertes :

  1. Comment générer une clé publique et privée avec PuTTY
  2. Comment utiliser les clés générées avec PuTTY
  3. Déposer la clé publique sur le serveur
  4. Tester la clé publique sur le serveur
  5. Configurer le serveur SSH pour que le tout soit un peu plus sécuritaire

Évidemment, avant de débuter, il est préférable de télécharger PuTTY (la version « Installer » car elle contient d’autres logiciels qui nous seront utiles).  Ci ce lien (l’original) ne fonctionne plus, faites une recherche pour PuTTY dans votre moteur de recherche préféré.

1. Comment générer une clé publique et privée avec PuTTY

Une fois PuTTY téléchargé et installé, ouvrez le logiciel PuTTYgen qui sert à la génération de clés.  Par défaut, on vous suggère une clé SSH2-RSA de 1024bits.  Ceci est déjà très bon mais si vous désirez des paramètres différents, je ne couvrirai pas cette partie dans cet article.

PuTTYgen

Cliquez pour agrandir

Ensuite, lancez la génération en cliquant sur « Generate » et en bougeant la souris sur la zone grise pour générer la clé.  Assurez-vous de mettre un identifiant (habituellement votre adresse courriel) dans la partie « Key Comment » pour identifier votre clé.  Ainsi, ce sera plus simple si jamais vous avez plus d’une clé dans le fichier « authorized_keys » qui sera couvert plus loin dans l’article.

Par la suite, entrez un mot de passe dans la section « Key passphrase » et « Confirm passphrase ».  Ceci est une mesure de sécurité supplémentaire empêchant quelqu’un qui trouverais le fichier de votre clé privée de s’en servir façilement.  Il devra avoir la clé ainsi que le mot de passe de la clé pour s’en servir.

Finalement, sauvegardez les deux clés sur votre ordinateur pour utilisation future.  Vous pouvez aussi les mettre sur votre clé USB ou tout autre média portable, ce qui vous permettra de vous en servir un peu partout.  Même si vous avez un mot de passe, essayez tout de même de ne pas perdre la clé.  Si ça vous arrive, générez vous rapidement une autre clé et effacez votre clé publique de tous les endroits où vous l’avez mise.

2. Comment utiliser les clés générées avec PuTTY

Première chose que je fais à ce point, je copie le raccourci de PuTTY Authentication Agent (Pageant) dans mon menu « Démarrage » (startup) de Windows pour qu’il démarre automatiquement à chaque redémarrage.  L’icône apparaîtra dans la barre de tâches près de l’heure.

Pageant

Cliquez pour agrandir

Ensuite, il faut double cliquer sur l’icône de Pageant et cliquer sur le bouton « Add Key ».  Si vous avez plusieurs clés, vous pouvez toutes les sélectionner et les ajouter d’un seul coup.  Si vous avez le même mot de passe pour toutes les clés sélectionnées, le logiciel ne vous le demandera qu’une seule fois.

Notez qu’il s’agit ici de vos clés privées.  Les clés publiques seront utilisées plus loin au cours de l’article.

3. Déposer la clé publique sur le serveur

Par la suite, cliquez avec le bouton de droite sur l’icône de Pageant et sélectionnez « New Session ».  Vous y retrouverez la prochaine boîte de dialogue dans laquelle vous pourrez configurer et sauvegarder les différents serveurs auxquels vous désirez vous connecter.

PuTTY Configuration

Cliquez pour agrandir

Pour la cause de l’article, faites simplement entrer l’adresse IP du serveur auquel vous voulez vous connecter (ou le nom d’hôte de ce serveur).  Il est toujours préférable d’entrer l’adresse IP du serveur au cas où un problème DNS devait survenir.

Vous pouvez maintenant cliquer sur « Open », ce qui ouvrira un terminal vers le serveur en question.  Évidemment, il faut que le service sshd soit démarré et que le port 22 soit ouvert en TCP pour que le tout fonctionne.

Connectez-vous en tant que l’utilisateur désiré et entrez votre mot de passe pour la dernière fois pour cet utilisateur sur ce serveur.  Ensuite, vérifiez si le dossier « .ssh » existe dans le dossier de l’utilisateur en tapant « ls -la ».  S’il n’existe pas, créez le avec « mkdir .ssh ».

Une fois le dossier créé, entrez dedans avec « cd .ssh » et creez un nouveau fichier texte nommé « authorized_keys ».  Insérez votre clé publique générée et affichée dans PuTTYgen en entier (voir image de PuTTYgen au début de l’article).

Pour vous assurer de la sécurité de ce dossier et du fichier en question, vous pouvez appliquer les permissions « 600 » au fichier authorized_keys et les permissions 700 au dossier « .ssh ».  Dans une telle situation, seulement cet utilisateur pourra voir et modifier le tout.

4. Tester la clé publique sur le serveur

Puisque nous avons déjà inséré la clé dans PuTTY à l’étape 2, il ne reste qu’à se connecter.  Je vais donc vous donner un truc pour vous connecter plus rapidement encore.  Cliquez avec le bouton de droite de la souris sur l’icône de Pageant et sélectionnez « New Session ».

Dans la fenêtre de configuration de session, entrez l’adresse IP du serveur dans « Host name (or IP address) ».  Insérez un nom pour reconnaître ce serveur dans la case « Saved Sessions ».  Ensuite, allez dans le menu de gauche dans la section « Connexion – Data » et entrez le nom d’utilisateur voulu dans la case « Auto-login username ».  Ensuite, allez dans la section « Connexion – SSH – Auth » et cochez la case « Allow agent forwarding » qui vous permettera de vous promener d’un serveur à l’autre ayant la même clé sans problèmes. Finalement, retournez dans la section « Session » et cliquez sur « Save », puis cliquez sur « Cancel » ou « X » pour fermer cette fenêtre.

Maintenant, testez le tout en cliquant avec le bouton droit de la souris sur l’icône de Pageant, ensuite allez dans « Saved Sessions » et cliquez sur la session du serveur que nous venons de configurer.  Vous devriez vous connecter sans même entrer d’utilisateur ou de mot de passe!  Quelle joie!

5. Configurer le serveur SSH pour que le tout soit un peu plus sécuritaire

Connectez-vous sur le serveur et allez dans le dossier « /etc/ssh/ » et ouvrez le fichier « sshd_config » dans votre éditeur texte favori.  Assurez vous d’avoir les lignes suivantes :

PermitRootLogin without-password
PubkeyAuthentication yes
PasswordAuthentication no

Avec ces lignes, vous vous assurez que personne ne peut se connecter à distance à cette boîte avec un mot de passe.  Tout les utilisateurs SSH doivent avoir une clé d’installée sur le serveur (il est donc important de ne pas effacer ou corrompre les clés sans quoi vous ne pourrez plus vous connecter à moins de vous déplacer physiquement au serveur).

Redémarrez SSH avec « service sshd restart » pour prendre les modifications en effet et amusez vous!  Et voilà, nous avons déjà établi une bonne sécurité en peu d’efforts et sans même toucher a iptables.  Évidemment, si vous pouvez vous connecter d’un endroit ayant une IP fixe, il est bien de bloquer tous les accès sauf cette IP dans iptables.  Par contre, ceci à pour défaut que si vous êtes à l’extérieur du bureau ou de la maison et que vous désirez accéder au serveur, vous ne pourrez pas puisque cette IP ne sera pas allouée.  Une méthode peut aussi être qu’un seul de vos serveur alloue les connexions de n’importe quelle IP et que les autres serveurs acceptent les connexions de vos bureaux, de votre maison ainsi que de ce serveur en particulier.  Il devient en quelques sortes, le « gateway » ssh.

Conclusion

Il s’agit donc simplement de générer des clés (ou plutôt une paire de clés) et de garder sécuritairement votre clé privée et de distribuer votre clé publique sur tous les serveurs sur lesquels vous désirez vous connecter de façon sécuritaire et empêcher les connexions n’ayant pas de clé approuvée (dans le fichier à cet effet sur le serveur) d’accéder en SSH tout simplement.

Une fois que vous l’avez fait une fois, cette procédure s’applique en a peine 5 minutes sur les serveurs subséquents que vous voudrez configurer.  Une méthode rapide et efficace d’éviter les attaques de type « Brute Force ».

Utilisation de base de iptables

Introduction

Cet article vise les gens qui ont déjà une légère base de connaissances sous linux en shell et une base en réseautique et dans les pare-feu (firewall) en général.  Il a pour but d’aider a comprendre et être capable d’utiliser quelques commandes de base de iptables qui vous permetterons de sécuriser une bonne partie de votre serveur.  Cet article implique que vous ayez déjà iptables d’installé sur votre système.

Les exemples sont basés sur un serveur web avec Apache, MySQL, SSH, ProFTPD, Bind, SendMail sur CentOS.  Notez que les commandes iptables sont aussi fonctionnelles sur d’autres distributions de linux et que vous pouvez modifier ces règles pour les adapter à d’autres logiciels (ex.: vsftpd, pureftpd, powerdns, etc.).  Notez que les commandes shell ci-dessous sont exécutées en tant que root.

Créer un fichier de configuration initial

Avant de tout commencer, sauvegardez le fichier de configuration actuel si vous en avez un :

# cp -p /etc/sysconfig/iptables /etc/sysconfig/iptables.backup

Une façon simple de créer le fichier de configuration iptables est d’entrer une première commande iptables à la volée en shell et ensuite demander à iptables de créer le fichier de configuration lui-même.  Tapez les commandes suivantes, même si vous ne les comprenez pas pour l’instant (on accepte toute communication provenant de l’extérieur, question de ne pas se bloquer nous-même en partant) :

# iptables -A INPUT -j ACCEPT
# iptables-save > /etc/sysconfig/iptables

Ensuite, ouvrez votre fichier /etc/sysconfig/iptables avec votre éditeur texte favori.  Vous devriez y voir quelque chose qui ressemble à ceci :

# Generated by iptables-save v1.3.5 on Fri May 28 20:34:23 2010
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [41:3804]
-A INPUT -j ACCEPT
COMMIT
# Completed on Fri May 28 20:34:23 2010

C’est ici que le plaisir débute!

DNS avec Bind

Débutons par enlever la ligne que nous avons ajouté pour créer le fichier iptables (-A INPUT -j ACCEPT).  Ensuite, attaquons nous au service DNS de Bind.  Voici les commandes de base que j’entre pour laisser passer Bind (j’aime bien apposer des commentaires pour me comprendre plus tard si j’y reviens, ils sont précédés d’un #) :

# DNS TCP et UDP et RNDC
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT

Dans la première ligne, le « -A INPUT » veut dire d’ajouter (append) à la chaine nommée INPUT, ce qui a pour but d’ajouter une commande pour vérifier les paquets qui tentent d’entrer dans le serveur.

Le « -m state » veut dire qu’il faut que le paquet concorde « match » un état « state ».

Le « –state NEW » veut dire que l’état « state » qui doit concoder doit être une nouvelle communication « NEW ».

Le « -m tcp » veut dire que le paquet doit concorder avec le protocole tcp.

Le « -p tcp » veut dire que le protocole du paquet doit être tcp.

Le « –dport 53 » veut dire que le paquet doit être destiné au port 53.

Le « -j ACCEPT » veut dire que l’action à effectuer si toutes les vérifications précédentes sont véridictes est d’accepter le paquet.

Les deux règles suivantes sont similaires et acceptent les paquets sur le port 53 en udp et sur le port 953 en tcp.

Emails avec sendmail, ipop3d et imapd

# 25 SMTP, 110 POP3, 143 IMAP, 465 SMTPS, 993 IMAPS, 995 POP3S
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 465 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT

Pas très compliqué…  Exactement la même commande mais pour les ports ayant trait aux emails (SMTP, POP3, IMAP, SMTPS, IMAPS et POP3S).  Notez que certaines configurations SMTPS utilisent aussi le port 587.

FTP avec ProFTPD

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 60000:60199 --syn -j ACCEPT

Ici on accepte les connexions sur le port 21 ainsi que les connexions de type « syn » qui permettent d’initier des nouvelles connections en tcp.  Nous acceptons les nouvelles connexions tcp sur les ports 60000 à 60199 (ça aurait pu être d’autres ports, plus de ports ou moins de ports).  Je configure ensuite ProFTPD pour accepter les connexions passives dans ces mêmes ports donc les transferts FTP fonctionnent normalement en mode passif et il n’y a pas plein de ports ouverts à toutes les requêtes en tout temps.

HTTP avec Apache

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

Ici nous acceptons simplement les requêtes sur les ports HTTP et HTTPS normaux.

ICMP Ping

-A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

Il est toujours intéressant de pouvoir faire des « ping » sur le serveur pour diverses raisons telles que vérifier si le serveur réponds, s’il réponds assez rapidement ou pour générer des rapports de disponibilité.

MySQL

#-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1 -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
#-A INPUT -s 10.10.10.10 -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

La première ligne est déconseillée puisqu’elle ouvre MySQL pour n’importe qui.  L’utiliser seulement si c’est bien le but et que vous comprenez les risques.

La deuxième ligne donne accès à MySQL localement (pour toute requête venant du serveur lui-même), ce qui est nécessaire.

La troisième ligne est un exemple si vous voulez ouvrir MySQL pour l’IP d’une personne en particulier ou de vos bureaux par exemple.

SSH

# Local
-A INPUT -s 127.0.0.1 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# Adresses connues
-A INPUT -s 10.10.10.10 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

Simplement ajouter les IPs desquelles vous vous connecter.  Si vous n’avez pas d’IP statique, enlevez la partie « -s 10.10.10.10 » et vous pourrez vous connecter de n’importe ou.  Il est aussi toujours préférable d’accepter les connections SSH seulement avec des clés et non pas par mot de passe.  Par contre, cette configuration ne touche pas iptables et sort du contenu de cet article.

Pour boucler la boucle

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j DROP

Ici, la première ligne accepte tous les paquets provenant de connexions déjà établies ou reliées.

La deuxième ligne laisse tomber tous les paquets n’ayant pas trouvé de règle les acceptant.  Ainsi, tout ce qui n’est pas un service accepté ou une IP acceptée sera automatiquement laissé de côté sans même une réponse comme quoi il est refusé, ce qui est plus sécuritaire.

Le résultat complet

Une fois tout réuni, le fichier devrait maintenant avoir l’air de ceci :

# Generated by iptables-save v1.3.5 on Fri May 28 20:34:23 2010
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [41:3804]

#######
# DNS #
#######

# DNS TCP et UDP et RNDC
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT

#########
# EMAIL #
#########

# 25 SMTP, 110 POP3, 143 IMAP, 465 SMTPS, 993 IMAPS, 995 POP3S
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 465 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT

#######
# FTP #
#######

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 60000:60199 --syn -j ACCEPT

########
# HTTP #
########

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

########
# ICMP #
########

-A INPUT -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT

#########
# MySQL #
#########

-A INPUT -s 127.0.0.1 -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

#######
# SSH #
#######

# Local
-A INPUT -s 127.0.0.1 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
# Adresses connues
-A INPUT -s 10.10.10.10 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

##########
# GLOBAL #
##########

# Accept everything related or already established, drop everything that did not match
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j DROP

COMMIT
# Completed on Fri May 28 20:34:23 2010

Activation de iptables au démarrage

Vérifiez si iptables est déjà activé en tapant « chkconfig –list iptables ».  Si vous voyez quelques « on », c’est qu’il est actif.  Sinon, tapez « chkconfig iptables on ».

Conclusion

Vous savez maintenant comment faire une protection minimaliste de votre serveur web et ainsi éviter d’avoir des trous béants de sécurité.  J’espère que ceci vous aura aidé!