{"id":31,"date":"2015-10-21T11:02:06","date_gmt":"2015-10-21T10:02:06","guid":{"rendered":"http:\/\/blog.vincentcharles.ovh\/?p=31"},"modified":"2019-04-18T16:59:10","modified_gmt":"2019-04-18T14:59:10","slug":"securiser-son-serveur-linux-partie-1-sshroot","status":"publish","type":"post","link":"https:\/\/blog.vincentcharles.ovh\/index.php\/2015\/10\/21\/securiser-son-serveur-linux-partie-1-sshroot\/","title":{"rendered":"S\u00e9curiser son serveur Linux (Partie 1)"},"content":{"rendered":"<p>Comme vous le savez (maintenant si), le compte root sur une machine Linux\/Unix est le compte utilisateur (enfin administrateur) le plus important. Et pour cause, il permet de faire absolument tout sur la machine, le meilleur comme le pire. Beaucoup de d\u00e9butants dans le monde des serveurs (je parle de personnes utilisant pour diverses raisons un serveur d\u00e9di\u00e9 lou\u00e9 \u00e0 droite ou \u00e0 gauche) ne connaissent rien en s\u00e9curit\u00e9 informatique et il faut le dire, \u00e7a se voit :<\/p>\n<ul>\n<li>Acc\u00e8s root depuis l&rsquo;ext\u00e9rieur (acc\u00e8s en SSH)<\/li>\n<li>Acc\u00e8s SSH par mot de passe (et qui dit mot de passe de d\u00e9butant, dit mot de passe avec 3 chiffres et 4 lettres)<\/li>\n<li>Firewall qui fait la t\u00eate (enfin non il laisse tout passer c&rsquo;est plus simple comme \u00e7a)<\/li>\n<\/ul>\n<p><!--more--><\/p>\n<p>Bref vous l&rsquo;avez compris l&rsquo;id\u00e9e ici est de proposer quelques modifications simples pour s\u00e9curiser un minimum votre serveur linux \u00e0 distance. On va partir sur deux parties :<\/p>\n<ul>\n<li>Partie I (ce tuto) : Ajout d&rsquo;un utilisateur \/ Configuration SSH \/ Acc\u00e8s limit\u00e9 au compte \u00ab\u00a0root\u00a0\u00bb<\/li>\n<li>Partie II (<a href=\"https:\/\/blog.vincentcharles.ovh\/index.php\/2015\/10\/21\/securiser-son-serveur-linux-partie-2\/\">http:\/\/blog.vincentcharles.ovh\/index.php\/2015\/10\/21\/securiser-son-serveur-linux-partie-2\/<\/a>) : Configuration du firewall \/ Outils de protection DDOS &#8211; Scan de ports&#8230;<\/li>\n<\/ul>\n<h2>Cr\u00e9ation d&rsquo;un utilisateur et ajout au groupe wheel<\/h2>\n<p>Pour commencer, on va faire un nouvel utilisateur qui aura donc l&rsquo;acc\u00e8s \u00e0 SSH (acc\u00e8s \u00e0 distance) mais \u00e9galement la possibilit\u00e9 d&rsquo;acc\u00e8der au \u00ab\u00a0root\u00a0\u00bb par \u00e9l\u00e9vation de droits via la commande \u00ab\u00a0su\u00a0\u00bb.<\/p>\n<p>Pour cella !<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">useradd -m -s \/bin\/bash admin<\/code><\/pre><\/figure>\n<p>On peut ensuite changer son mot de passe pour commencer (m\u00eame si on va vite le remplacer pour une cl\u00e9 RSA)<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">passwd admin<\/code><\/pre><\/figure>\n<p>On tape le mot de passe souhait\u00e9, \u00e0 deux reprises.<\/p>\n<p>Au sujet du mot de passe, attention \u00e0 utiliser un mot de passe fort pour vos utilisateurs et surtout pour votre compte root. Vous pouvez le modifier avec cette commande :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">passwd<\/code><\/pre><\/figure>\n<p>Nous le verrons plus tard, mais nous allons limit\u00e9 l&rsquo;\u00e9l\u00e9vation de droits (c&rsquo;est \u00e0 dire le passage en root) qu&rsquo;au utilisateur appartenant au groupe \u00ab\u00a0wheel\u00a0\u00bb. Il nous faut donc ajouter ce groupe \u00e0 notre nouvel utilisateur :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">gpasswd -a admin wheel<\/code><\/pre><\/figure>\n<p>Vous pouvez ajouter autant d&rsquo;utilisateurs que vous voulez de cette fa\u00e7on, mais tout le monde n&rsquo;a pas forcement besoin de cet acc\u00e8s, qu&rsquo;en pensez-vous ?<\/p>\n<p>Si vous souhaitez retirer les droits du groupe wheel \u00e0 un utilisateur, c&rsquo;est comme \u00e7a<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">gpasswd -d admin wheel<\/code><\/pre><\/figure>\n<p>La premi\u00e8re m\u00e9thode supprime tous les groupes secondaires de l&rsquo;utilisateur (sur un utilisateur d\u00e9di\u00e9 \u00e0 l&rsquo;acc\u00e8s SSH c&rsquo;est ok), la seconde retire juste le groupe en question (plus adapt\u00e9 si l&rsquo;utilisateur en question g\u00e8re d&rsquo;autres choses sur la machine).<\/p>\n<p>Maintenant, on a :<\/p>\n<ul>\n<li>un utilisateur root (avec son mot de passe mis \u00e0 jour si on l&rsquo;a chang\u00e9)<\/li>\n<li>un utilisateur admin (qui a son propre mot de passe et appartient \u00e0 wheel pour l&rsquo;acc\u00e8s root)<\/li>\n<\/ul>\n<h2>Restreinte l&rsquo;acc\u00e8s aux droits root aux membres de \u00ab\u00a0wheel\u00a0\u00bb<\/h2>\n<p>Vous pouvez vous d\u00e9connect\u00e9 de l&rsquo;utilisateur root (#logout ou #exit) et vous reconnectez en \u00ab\u00a0admin\u00a0\u00bb.<\/p>\n<p>Pour repasser root :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">su root<\/code><\/pre><\/figure>\n<p>puis votre mot de passe<\/p>\n<p>Maintenant, nous allons restreindre l&rsquo;utilisation de \u00ab\u00a0su\u00a0\u00bb qu&rsquo;aux utilisateurs du groupe \u00ab\u00a0wheel\u00a0\u00bb. Pour \u00e7a, nous \u00e9ditons le fichiers : <em>\/etc\/pam.d\/su<\/em> en d\u00e9commentant la ligne suivante :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">#auth      required      pam_wheel.so use_uid<\/code><\/pre><\/figure>\n<p>Si vous cr\u00e9ez un nouvel utilisateur qui n&rsquo;appartient pas \u00e0 wheel, il ne pourra pas passer en root m\u00eame s&rsquo;il connait le mot de passe de ce dernier.<\/p>\n<h2>G\u00e9n\u00e9ration de cl\u00e9 RSA(2048bits) pour SSH<\/h2>\n<p>Depuis le d\u00e9but, on consid\u00e8re que l&rsquo;on a acc\u00e8s \u00e0 la machine via SSH. Nous allons passer \u00e0 la configuration de ce service mais avant \u00e7a, on va cr\u00e9\u00e9 notre couple de cl\u00e9 RSA pour un acc\u00e8s sans mot de passe, plus s\u00e9curis\u00e9 donc.<\/p>\n<p>La, il y a deux \u00e9coles :<\/p>\n<ul>\n<li>on utilise son utilisateur du cot\u00e9 serveur pour g\u00e9n\u00e9rer les cl\u00e9s :<\/li>\n<\/ul>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">ssh-keygen -b 2048 -t rsa<\/code><\/pre><\/figure>\n<p>Vous validez le dossier de cr\u00e9ation des fichiers puis choisissez un mot de passe pour d\u00e9chiffrer la cl\u00e9<\/p>\n<p>A ce stade, vous avez deux fichiers g\u00e9n\u00e9r\u00e9s : id_rsa (cl\u00e9 priv\u00e9e = SECR\u00c8TE) et id_rsa.pub (cl\u00e9 publique).<\/p>\n<ul>\n<li>on utilise un g\u00e9n\u00e9rateur de cl\u00e9 SSH (celui de Putty sous Windows est tr\u00e8s bien<\/li>\n<\/ul>\n<p>On choisi le type de cl\u00e9 : RSA2048 puis on g\u00e9n\u00e8re la cl\u00e9. On enregistre sa cl\u00e9 priv\u00e9e quelque part (fichier .ppk) et on met de cot\u00e9 la cl\u00e9 publique.<\/p>\n<p>La deuxi\u00e8me m\u00e9thode est sans doute la plus simple puisque le fichier (cl\u00e9 priv\u00e9e) g\u00e9n\u00e9r\u00e9 est disponible sur votre machine personnelle directement et surtout elle est compatible avec la majorit\u00e9 des applications ssh sous Windows (Putty, WinSCP)<\/p>\n<p>Maintenant, il faut renseigner \u00e0 votre serveur les cl\u00e9s publiques qui correspondent aux cl\u00e9s priv\u00e9es :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">cd \/home\/admin\n# S&#039;il n&#039;existe pas d\u00e9j\u00e0\nmkdir .ssh \ncd .ssh\n#  Nano ou vi ou l&#039;\u00e9diteur de fichier que vous voulez\nnano -w authorized_keys<\/code><\/pre><\/figure>\n<p>Dans ce fichier (<em>authorized_keys<\/em>) qui doit se trouver tr\u00e8s exactement \u00e0 cet emplacement : <em>\/home\/admin\/.ssh\/<\/em>, vous inscrivez vous cl\u00e9s publiques (copier\/coller)&#8230; et vous laissez dans lignes vides \u00e0 la suite des cl\u00e9s (une cl\u00e9 par ligne).<\/p>\n<p>Il faut enfin v\u00e9rifier les droits de chaque fichier :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">chown admin:admin \/home\/admin\/.ssh -R\nchmod 700 \/home\/admin\/.ssh\nchmod 600 \/home\/admin\/.ssh\/authorized_keys<\/code><\/pre><\/figure>\n<p>Faites un essai en vous connectant maintenant avec votre cl\u00e9 et non votre mot de passe. Si tout est OK, on passe pour finir \u00e0 la configuration de SSH pour limiter les acc\u00e8s.<\/p>\n<h2>Configuration de SSH<\/h2>\n<p>Dans la m\u00eame foul\u00e9e, on va :<\/p>\n<ul>\n<li>Emp\u00eacher la connexion par mot de passe<\/li>\n<li>Bloquer l&rsquo;utilisateur root en SSH<\/li>\n<li>Permettre l&rsquo;acc\u00e8s par cl\u00e9s publique\/priv\u00e9e<\/li>\n<li>Restreindre SSH \u00e0 certains utilisateurs<\/li>\n<\/ul>\n<p>Pour \u00e7a, il faut \u00e9diter le fichier \/etc\/ssh\/sshd_config :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">################################################################\n###   Fichier de configuration SSHD - By Linux 2015-10-21    ###\n################################################################\n\n\n#### Options r\u00e9seau ####\n\n# Port d&#039;\u00e9coute de SSH (d?faut 22)\nPort 22\n\n# R\u00e9striction inet = IPv4, inet6 = IPv6, any = both (d\u00e9faut both)\nAddressFamily inet\n\n# N&#039;\u00e9coute que certaines IP (si vous n&#039;\u00eates pas sur ne faites rien)\n#ListenAddress 192.168.1.0\n\n# Utilise le Protocole 2 (1 est obsol?te)\nProtocol 2\n\n# D\u00e9sactive le X11 Forwarding (serveur)\nX11Forwarding no\n\n# Protection du TCP Spoofing\nTCPKeepAlive no\nClientAliveInterval 600\nClientAliveCountMax 3\n\n#### Options r\u00e9seau ####\n\n\n#### Configuration des cl\u00e9s ####\n\n# Cl\u00e9s host pour le protocole niveau 2\nHostKey \/etc\/ssh\/ssh_host_rsa_key\nHostKey \/etc\/ssh\/ssh_host_dsa_key\nHostKey \/etc\/ssh\/ssh_host_ecdsa_key\n\n# S\u00e9paration des privil\u00e8ges (s\u00e9curit\u00e9) en multipliant\n# les processus pour bloquer les gradiants de permissions\n# Original : prevent privilege escalation exploits\nUsePrivilegeSeparation yes\n\n# Permettre utilisation de cl\u00e9s publiques\nPubkeyAuthentication yes\n\n# Lieu de stockage des cl\u00e9s publiques de chaque utilisateur\nAuthorizedKeysFile      %h\/.ssh\/authorized_keys\n\n# Interdire les cl\u00e9s blacklistees\n# Liste provient d&#039;une vuln\u00e9rabilit\u00e9 OpenSSH\n# Testez vos cl\u00e9 (ssh-vulnkey)\nPermitBlacklistedKeys no\n\n#### Configuration des cl\u00e9s ####\n\n\n#### Authentification ####\n\n# Autorise que les utilisateurs suivant\nAllowUsers admin\n\n# Autorise que les utilisateurs du groupe suivant\n#AllowGroups sshusers\n\n# Temps pour taper la cl\u00e9 (moins de 30 secondes)\n# Au dela c&#039;est un echec de connexion\nLoginGraceTime 30\n\n# Emp\u00e8che le login de ROOT\nPermitRootLogin no\n\n# Verifie les permissions des dossiers et fichiers des cl\u00e9s\n# Dossier .ssh (700) et fichiers authorized_keys (600)\nStrictModes yes\n\n# Ne pas lire les fichiers  ~\/.rhosts and ~\/.shosts (utilisateurs) \nIgnoreRhosts yes\n\n# D\u00e9cide si \/etc\/hosts.equiv et une cle publique sont autoris\u00e9s\nHostbasedAuthentication no\n\n# Ne fait pas confiance au fichier ~\/.ssh\/known_hosts\nIgnoreUserKnownHosts yes\n\n# Ne pas permettre les mots de passes vides\nPermitEmptyPasswords no\n\n# Je ne sais pas a quoi ca sert. En anglais :\n# Disable challenger response authentication\n# Inutile puisque l&#039;on utilise des cl\u00e9s RSA\nChallengeResponseAuthentication no\n\n# Bloque utilisation des mots de passe\n# Limite le serveur aux cl\u00e9s RSA\nPasswordAuthentication no\n\n# Permet de lancer sshd sans privil\u00e8ges superutilisateur (root)\nUsePAM no\n\n# Ne pas utiliser le systeme traditionnel de login\nUseLogin no\n\n#### Authentification ####\n\n\n#### Divers ####\n\n# Defini le niveau de log de SSH (voir info LogLevel)\nSyslogFacility AUTH\nLogLevel INFO\n\n# Indique la date et l&#039;heure de derni\u00e8re connexion\nPrintLastLog yes\n\n# Nombre maxi d&#039;echec possible par connexion\n# Envoi une alerte log \u00e0 la moiti\u00e9 de la valeur\n# Si MaxAuthTries est d\u00e9pass\u00e9, vous \u00eates d\u00e9connect\u00e9s\n# Permet de ralentir les attaques de bruteforce mais\n# pas de banip ici. (voir fail2ban)\nMaxAuthTries 1\n\n# Nombre maxi de connexions permises sans authentification\n# Les 10 premi?res connections sont accept\u00e9es en attente \n# d&#039;authentification puis les suivantes (de 11 ? 60) sont\n# rejet\u00e9es avec une probabilit\u00e9 croissante lin\u00e9airement de\n# 30% pour la 11\u00e8me jusqu&#039;? 100% pour la 60\u00e8me.\nMaxStartups 10:30:60\n\n# Afficher la banni\u00e8re \u00e0 la connexion (arriv\u00e9e sur le prompt ssh)\nBanner \/etc\/issue.net\n\n# Affiche \/etc\/motd c\u00e0d la banni\u00e8re apr\u00e8s s&#039;\u00eatre loguer\n# Sur certains OS c&#039;est aussi demand? via \/etc\/profile ou le shell\nPrintMotd yes\n\n# Indique si SSH accepte les variables d&#039;environnement du client\nPermitUserEnvironment no\n\n# Indique les variables environnementales accept\u00e9es depuis le client\n# (dans le cas ou PermitUserEnvironment = yes)\nAcceptEnv LANG LC_*\n\n# Defini le subsystem pour SFTP (SecureFTP)\nSubsystem sftp \/usr\/lib\/openssh\/sftp-server\n\n#### Divers ####<\/code><\/pre><\/figure>\n<p>A ce stade, c&rsquo;est termin\u00e9. Si les modifications ont \u00e9t\u00e9 sauvegard\u00e9, relancer le service ssh-server pour tester :<\/p>\n<figure class=\"pc-legacy\"><pre><code class=\"language-bash\">\/etc\/init.d\/ssh restart\n# ou\nservices ssh off\nservices ssh on<\/code><\/pre><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Comme vous le savez (maintenant si), le compte root sur une machine Linux\/Unix est le compte utilisateur (enfin administrateur) le plus important. Et pour cause, il permet de faire absolument tout sur la machine, le meilleur comme le pire. Beaucoup de d\u00e9butants dans le monde des serveurs (je parle de personnes utilisant pour diverses raisons&#8230;<\/p>\n","protected":false},"author":1,"featured_media":44,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10,25,2],"tags":[17],"class_list":["post-31","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorial_linux","category-tutorial_server","category-tutorial","tag-niveau_moyen"],"_links":{"self":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/comments?post=31"}],"version-history":[{"count":20,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts\/31\/revisions"}],"predecessor-version":[{"id":49,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/posts\/31\/revisions\/49"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/media\/44"}],"wp:attachment":[{"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/media?parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/categories?post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.vincentcharles.ovh\/index.php\/wp-json\/wp\/v2\/tags?post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}