Quelles mesures prenez-vous pour sécuriser un serveur Debian? [fermé]

66

J'installe un serveur Debian connecté directement à Internet. Évidemment, je veux le rendre aussi sécurisé que possible. Je voudrais que vous, les gars, ajoutiez vos idées pour le sécuriser et quels programmes vous utilisez pour cela.

Je veux qu'une partie de cette question couvre ce que vous utilisez comme pare-feu? Juste iptables configuré manuellement ou utilisez-vous un logiciel quelconque pour vous aider? Quel est le meilleur moyen? Bloquer tout et ne permettre que ce qui est nécessaire? Existe-t-il de bons tutoriels pour les débutants sur ce sujet?

Est-ce que vous changez votre port SSH? Utilisez-vous un logiciel comme Fail2Ban pour prévenir les attaques par force brute?

Peter Mortensen
la source
1
Il y a beaucoup de chevauchement avec serverfault.com/questions/42/securing-a-fresh-ubuntu-server et
Zoredache
1
Ubuntu a ufw pas Debian;) Je me demandais si les gens configuraient eux-mêmes iptables ou utilisaient des logiciels tels que fireHOL
Thomaschaaf
J'ai toujours eu tendance à écrire moi-même les règles iptables. J'ai une plaque de chaudière qui fait des choses comme déposer tous les fragments, les paquets de Noël, etc. Tout ce qui est au-delà est spécifique au système, et généralement assez petit. Je ne saurais trop insister sur le fait de laisser tomber des fragments lors de l'utilisation d'iptables, d'ailleurs. Pour une raison quelconque, je n'ai pas encore fait de recherche, iptables ne vérifie que le premier fragment et passe aveuglément le reste sans vérification. À mon avis, cela fait des fragments un handicap.
Scott Pack
3
Uhm ... Debian a ufw. packages.debian.org/ufw
womble

Réponses:

50

Obligatoire:

  • installation du système en mode expert, uniquement les paquets dont j'ai besoin
  • pare-feu écrit à la main avec la politique par défaut sur iptables'input: déposer, autoriser l'accès à SSH, HTTP ou à tout autre serveur donné fonctionnant
  • Fail2Ban pour SSH [et parfois FTP / HTTP / autre - en fonction du contexte]
  • désactiver les connexions root, forcer avec l'utilisateur normal et sudo
  • noyau personnalisé [juste vieille habitude]
  • mise à niveau programmée du système

En fonction du niveau de paranoïa en plus:

  • déposer la politique sur la sortie sauf quelques destinations / ports autorisés
  • integritpour vérifier si certaines parties du système de fichiers n'ont pas été modifiées [avec une somme de contrôle conservée en dehors de la machine], par exemple Tripwire
  • analyse planifiée au moins avec nmap du système de l'extérieur
  • vérification automatique des journaux pour rechercher des modèles inconnus (mais cela sert principalement à détecter un dysfonctionnement matériel ou des plantages mineurs)
  • exécution planifiée de chkrootkit
  • attribut immuable pour l' /etc/passwdajout de nouveaux utilisateurs est donc un peu plus difficile
  • / tmp monté avec noexec
  • le heurteur de port ou un autre moyen non standard d'ouvrir les ports SSH [par exemple, la visite d'une page Web 'secrète' sur un serveur Web permet la connexion SSH entrante pendant une période limitée à partir d'une adresse IP ayant consulté la page. Si vous êtes connecté, -m state --satete ESTABLISHEDveille à autoriser le flux de paquets tant que vous utilisez une seule session SSH]

Les choses que je ne fais pas moi-même mais qui ont du sens:

  • grsecurity pour le noyau
  • syslog distant afin que les journaux ne puissent pas être écrasés lorsque le système est compromis
  • alerte sur les connexions SSH
  • configurez rkhunter et configurez-le pour s'exécuter de temps en temps
pQd
la source
4
Après avoir fait tout cela, lancez BASTILLE sur le système pour chercher autre chose. Je recommanderais également de procéder à un contrôle complet et dangereux du système. corrigez ensuite ce qu'il alerte.
Scott Pack
13
La compilation d'un noyau personnalisé n'apporte aucun avantage en matière de sécurité, à moins que vous ne sachiez vraiment ce que vous faites. Vous allez également négliger de le garder à jour à moins que vous ne le mettiez dans le système de gestion des paquets, ce qui aurait pour conséquence une dégradation de la sécurité.
Adam Gibbins
3
-1 pour la sécurité par l'obscurité. Sinon, réponse décente.
DWC
@Adam - oui, je sais que, je préfère tout de même avoir un noyau monolithique composé uniquement de parties dont j'ai besoin. c'est probablement très en arrière, mais pourtant je le fais. @dwc - c'est juste une étape supplémentaire qui est juste un glaçage ou comme on dit cerise sur le dessus d'une pile de choses malodorantes désagréables.
PQd
1
Et vous voulez dire pas su su -
LapTop006
18

Juste une note sur le pare-feu de votre machine ...

  • Utilisez une liste blanche, pas une liste noire - c’est-à-dire que vous bloquez tout et que vous ne permettez que ce dont vous avez besoin, vous refusez tout le reste.
  • N'utilisez pas d'interface graphique / ncurses ou tout autre logiciel essayant de créer le pare-feu pour vous. Si vous le faites, vous autoriserez le logiciel à émettre des hypothèses - vous n'avez pas à prendre ce risque et vous ne devriez pas le faire. Configurez-le vous-même. Si vous n'êtes pas sûr, désactivez-le - vous le saurez assez tôt si cela est nécessaire. S'il s'agit déjà d'un système opérationnel et que vous ne pouvez pas interrompre le trafic (en le bloquant accidentellement), exécutez tcpdump (dump to file) et prenez des échantillons - étudiez-les plus tard, puis déterminez ce qui est valide et ce qui ne l'est pas.
  • Personnellement, je ne vois pas l'intérêt d'exécuter un service sur un port non standard, les outils ne sont plus aussi stupides de supposer que, par exemple, quelque chose tourne sur le port 22, alors il doit s'agir de ssh, et non autrement - car exemple amap, et nmapl' -Aoption de. Cela dit, vous pouvez (et devriez probablement si cela vous inquiète) modifier vos services pour vous protéger des regards indiscrets. Par exemple, les informations suivantes permettraient à l'attaquant de connaître la version exacte de OpenSSHcelle que vous utilisez, il peut alors rechercher des exploits pour cette version exacte. Si vous cachez de telles choses, vous leur rendrez la tâche plus difficile.
    [root @ ud-olis-1 uhtbin] # telnet localhost 22
    Essayer 127.0.0.1 ...
    Connecté à localhost.localdomain (127.0.0.1).
    Le caractère d'échappement est '^]'.
    SSH-2.0-OpenSSH_3.9p1
  • Gardez tous vos services publics à jour et corrigés avec les derniers correctifs de sécurité.
  • Ne stockez aucune donnée sur le serveur de passerelle lui-même; au moins, vous gagnerez du temps quand ils réussiront à pénétrer sur cette machine, et vous perdrez un service ou deux, et du temps, mais pas des données.

En bout de ligne, vous ne réussirez jamais à sécuriser quoi que ce soit à 100% - ce n'est tout simplement pas possible - le but est de le rendre aussi sécurisé que possible - si vous devez faire un effort supplémentaire pour casser votre système, c'est assez bon, et la plupart des lecteurs les script-kiddies passeront au système suivant.

  • iptables est la voie à suivre pour n’importe quel système Linux - mais configurez-le vous-même.

N'utilisez jamais un "logiciel de sécurité" qui ne soit pas basé sur des normes ouvertes - ils sont condamnés à être mal écrits et seront piratés (pas une question de "si", mais de "quand"). Les protocoles open source et ouverts sont ouverts à la consultation du public et convergent pour devenir un produit mature et fiable; Les logiciels à code source fermé reposent principalement sur la confiance en soi des auteurs quant à la qualité / à la sécurité d'un produit qu'ils pensent être - c'est-à-dire un petit nombre d'yeux par rapport à une terre pleine d'yeux.

J'espère que ça t'as aidé :)

Xerxes
la source
"... un petit nombre d'yeux vs une terre pleine d'yeux." - Je souhaite que suffisamment de "sociétés" se rendent compte de cela, mais la tendance la plus suivie semble être celle de la sécurité par l'obscurité. Oui, exécuter un service, comme ssh, sur un port non standard ne gardera pas un attaquant déterminé. Cela empêchera toutefois les enfants de script de partir: quelqu'un qui attaque par un dictionnaire sur une plage d'adresses IP sur le port 22.
L0neRanger
12
  • désactiver la connexion root
  • désactiver la connexion par mot de passe (autoriser uniquement la connexion par clé publique)
  • changer de port SSH
  • utilisez denyhosts (ou similaire)

  • écrivez votre propre script iptbles (pour que vous contrôliez exactement ce qu'il faut autoriser et que vous puissiez tout laisser tomber)

  • forcer l'utilisation des communications sécurisées SSL / TLS et s'assurer d'avoir des certificats valides, non expirés et signés

  • activer la vérification de certificat stricte pour tous les services externes (par exemple, lors de l'authentification d'utilisateurs avec un serveur LDAP sur une autre machine)
X-way
la source
Vous obtenez un vote positif pour la désactivation de l'authentification par mot de passe.
derobert
6

Comme point de départ général, je me base sur les repères / guides du Center for Internet Security , qui sont des compilations complètes des meilleures pratiques de sécurité. Il ne semble pas que leur test de performance Debian ait été mis à jour depuis un certain temps, mais voici un aperçu général de la procédure:

  • Appliquer les derniers correctifs / packages de système d'exploitation
  • Activer la comptabilité système / noyau / processus.
  • Activer MAC (par exemple, SELinux ou AppArmor).
  • Activer le pare-feu basé sur l'hôte (iptables).
  • Vérifiez APT sources.list (les clés sont correctes, les sources sont fiables).
  • Minimisez les services réseau, désactivez tout ce qui n’est pas requis et pare-feu.
  • Utilisez TCPWrappers pour restreindre davantage l'accès au système.
  • Utilisez uniquement les protocoles réseau chiffrés et désactivez les services non chiffrés (telnet, ftp, etc.).
  • Configurez l'accès à distance à SSH uniquement.
  • Désactivez les mots de passe de connexion utilisateur et exigez une authentification par clé.
  • Désactivez le partage de système de fichiers (NFS, SMB).
  • Activez la journalisation du système à distance / centralisée (et consultez régulièrement les journaux!).
  • Définissez un mot de passe de niveau BIOS / firmware.
  • Définissez un mot de passe pour le chargeur de démarrage.
  • Configurez les sauvegardes du système, disposez d'un plan de récupération d'urgence et vérifiez que les sauvegardes sont correctes et que le personnel connaît les procédures de récupération d'urgence!

Il existe de nombreuses ressources sur tous ces paramètres, y compris les commandes spécifiques et les fichiers de configuration à implémenter sur le système dans les tests d'évaluation de CISecurity.

jtimberman
la source
5

Je suggérerais de ne pas connecter une machine directement à Internet. Placez une sorte de pare-feu entre la machine et Internet. Cela vous permet de surveiller le réseau et la sécurité sans mettre plus de charge sur le serveur. Personnellement, je trouve que la segmentation du réseau et des fonctions simplifie souvent le dépannage du réseau, même si parfois la complexité supplémentaire rend l’analyse plus difficile.

La stratégie de pare-feu la plus sûre, mais la plus ennuyeuse à gérer, consiste à tout refuser et à n'autoriser explicitement que le trafic que vous devez autoriser. Ceci est gênant, car il est souvent nécessaire de mettre à jour la stratégie de pare-feu lorsque le réseau doit être modifié.

Je suggérerais également d’utiliser une sorte de pare-feu d’interface sur le serveur - la clé de la défense en profondeur. L'utilisation de ports non standard pour des services liés à l'administration ne fait pas de mal. fail2ban va bien. Répondez aux questions plus spécifiques sur les applications de sécurité sur Serverfault pour trouver plus d’idées.

La sécurité, c'est comme la blague sur les deux randonneurs et l'ours - bien qu'un ne puisse jamais atteindre une sécurité parfaite, il est utile d'être une cible plus difficile que les autres gars.

pcapademic
la source
+1 pour une bonne réponse. Je dois souligner que le refus par défaut n'est pas ennuyeux à gérer si vous l'abordez correctement. Vous devez sûrement savoir ce que vous autorisez, non? En fait, cela devrait être écrit en langage clair sous forme d'énoncé de politique. Si vous ne le faites pas comme une routine normale, vous ne faites pas votre travail en tant qu'administrateur. Si c'est le cas, il est simple de mettre à jour les règles du pare-feu.
DWC
Très bons points. Chaque organisation doit avoir une déclaration de politique de sécurité en langage clair. À mesure que les besoins de l'organisation changent, l'énoncé de politique devrait être mis à jour. Ne serait-ce que pour que l'administrateur planifie la mise en œuvre des règles de pare-feu et CYA, un administrateur intelligent maintiendrait une telle déclaration de stratégie, même si la direction de l'entreprise ne pouvait pas se préoccuper de la sécurité.
pcapademic
4

Certaines personnes ont pointé du doigt le manuel Sécuriser Debian . Cela devrait parfaitement convenir à tout sauf aux exigences militaires.

Beaucoup de gens pensent qu'être ridiculement paranoïaque est cool ou professionnel. Ce n'est pas , c'est simplement ennuyeux pour les autres administrateurs et purement répressif pour vos utilisateurs. La plupart des choses que vous recommanderez sont simplement des faux travaux pour vous sentir utiles à l’administrateur paranoïaque, mais ce n’est vraiment pas utile, car la véritable faille de sécurité sera probablement causée par un système insuffisamment mis à jour et / ou par une source interne.

Cela dit, j’estime que l’un de mes principes est de ne faire confiance à rien sur le réseau local, pas plus qu’à partir d’Internet. Par conséquent, je configure tout pour exiger une authentification même sur le réseau local. Je crypte et authentifie tout le trafic entre chaque ordinateur utilisant IPsec.

Je suis en train de convertir le chiffrement sur disque intégral pour tous mes serveurs.

J'installe uniquement les services que j'utilise. Je n'ai pas de pare-feu; Je configure les services pour lesquels je dois exiger une authentification ou les limite (par la configuration propre du programme ou par TCP-wrappers) à certaines IP. La seule chose que j’ai jamais eu besoin de bloquer avec iptables était memcached, puisqu’il n’avait pas de fichier de configuration et n’utilisait pas de wrappers TCP.

J'utilise de bons mots de passe générés de manière aléatoire pour mes comptes et je fais confiance à mon serveur SSH (et à tous les autres services) pour empêcher ceux qui ne connaissent pas le mot de passe de sortir. fail2banest réservé aux personnes disposant d'un espace limité pour les fichiers journaux, IMO. (Vous devriez avoir assez de mots de passe pour pouvoir leur faire confiance.)

Nounours
la source
3

Suivez ce tutoriel sur www.debian.org/doc/manuals/securing-debian-howto/

Personnellement, je change le port ssh et utilise fail2ban + denyhosts. Et je bloque tout ce qui n'est pas nécessaire. Plus vous bloquez, moins vous devez vous inquiéter.

Vihang D
la source
4
Pouah. Vous m'avez eu jusqu'à "changer de port SSH". Il est inutile. Surtout pas quand joe schmoe, qui a suffisamment de temps, peut scanner le port et découvrir instantanément le port sur lequel SSH fonctionne. Il déclare le nom du service (et la version du serveur) dès que vous vous connectez.
Matt Simmons
3
Oui, je sais que tout le monde peut vous scanner le port et trouver le bon port. Mais la plupart des attaques sont sur le port par défaut. Essayez juste d’obtenir des statistiques en changeant le port.
Vihang D