Ceci est une question canonique sur la sécurisation d'une pile LAMP
Quelles sont les directives absolues pour sécuriser un serveur LAMP?
La réponse de David est une bonne base de référence des principes généraux du renforcement du serveur. Comme David l'a indiqué, c'est une énorme question. Les techniques spécifiques que vous prenez peuvent dépendre fortement de votre environnement et de la façon dont votre serveur sera utilisé. Attention, cela peut prendre beaucoup de travail dans un environnement de test pour se développer et se faire correctement. Suivi par beaucoup de travail pour s'intégrer dans votre environnement de production, et plus important encore, les processus métier.
Cependant, vérifiez d'abord si votre organisation a des politiques de renforcement, car celles-ci pourraient être les plus directement pertinentes. Sinon, selon votre rôle, ce pourrait être le moment idéal pour les développer. Je recommanderais également d'aborder chaque composant séparément de bas en haut.
Le L
Il existe de nombreux bons guides pour vous aider. Cette liste peut ou non vous aider selon votre distribution.
Le A
Apache peut être amusant à sécuriser. Je trouve plus facile de durcir le système d'exploitation et de maintenir la convivialité qu'Apache ou PHP.
Le M
Le P
Cela va à l'encontre de l'idée de Secure Programming Practices, qui est une discipline à part entière. SANS et OWASP ont une quantité ridicule d'informations sur le sujet, donc je n'essaierai pas de les reproduire ici. Je vais me concentrer sur la configuration d'exécution et laisser vos développeurs s'inquiéter du reste. Parfois, le "P" dans LAMP fait référence à Perl, mais généralement à PHP. J'assume ce dernier.
Vous avez posé une question qui, franchement, mérite quelques livres sur le sujet. Mais il existe des directives de base générales qui fonctionnent bien:
J'espère que cela vous aidera à démarrer.
Voici une bonne liste de contrôle avec laquelle j'aime commencer.
Ajoutant à ce que David suggère, plus votre installation est modulaire, je veux dire restreindre l'accès à certains utilisateurs/groupes créés spécifiquement pour une tâche et limiter leur portée, plus votre pile LAMP est sécurisée: un exemple de cela est d'avoir un utilisateur Apache pour les fichiers/dossiers Apache avec des autorisations définies en conséquence et non dans les groupes pouvant accéder aux fichiers/dossiers système critiques. Un utilisateur qui peut accéder aux tables MySql associées à vos sites Web que vous allez servir et uniquement à ces tables. De plus, vous pouvez restreindre leur accès pour donner le minimum d'accès à partir d'un appel PHP. Assurez-vous également que le nom d'utilisateur MySQL utilisé/exposé via le PHP = le fichier n'est pas le même nom d'utilisateur ou mot de passe utilisé pour un autre utilisateur.
Ce que cela signifie: si l'utilisateur Apache ou l'utilisateur MySql sont compromis, ils ne peuvent pas faire de mal en dehors de la portée des dossiers auxquels Apache a accès (dans le cas de l'utilisateur Apache) et en dehors de la table ( s)/base (s) de données (dans le cas de l'utilisateur de la base de données MySQL).
Si l'utilisateur MySQL devait être compromis d'une manière ou d'une autre, il ne pourrait pas, par exemple, accéder à la base de données et supprimer toutes les bases de données de MySQL et ruiner toutes vos données. Ils POURRAIENT dans certaines circonstances être en mesure de supprimer des tables ou d'insérer des informations dans certaines tables d'une base de données isolée, c'est pourquoi il est important de n'accorder l'accès aux tables que lorsque cela est absolument nécessaire et d'accorder uniquement les autorisations nécessaires ... si vous ne le faites pas '' t besoin d'avoir des privilèges de tables de dépôt ou de mise à jour, alors ne les donnez pas à cet utilisateur.
De plus, si pour une raison quelconque, le nom d'utilisateur et le mot de passe de votre compte administratif sont découverts pour MySQL, si vous utilisez un nom d'utilisateur différent de tout nom d'utilisateur sur votre système, ils doivent d'abord briser la sécurité de votre système avant d'entrer dans votre base de données pour faire des dégâts. Il en va de même pour l'utilisateur Apache et l'accès aux fichiers.
Exemple de temps! Je vais donner un exemple de système pour simplifier en quelque sorte l'idée.
disons que vous avez des utilisateurs sur votre système (root doit être désactivé pour des raisons de sécurité via quelque chose comme umod -l ou passwd -l, etc.): john, barney, terence et Lisa.
vous pouvez créer un utilisateur dans MySQL avec le nom de bigbird (assurez-vous d'utiliser un mot de passe haché). Bigbird n'a que certains privilèges et privilèges de mise à jour, mais pas supprimer ou créer, et certainement pas . En outre, vous créez un autre utilisateur MySQL administratif avec le nom garfield pour travailler sur la base de données MySQL et vous supprimez l'utilisateur root à partir de la base de données MySQL afin qu'il ne puisse pas être compressé. garfield a obtenu les privilèges . dans MySQL (en fait, il s'agit simplement de renommer root).
maintenant, vous créez un groupe Apache ou un utilisateur et nous l'appellerons apweb2. Appweb2 n'est pas membre d'autres groupes et tous les fichiers/dossiers pour Apache sont stockés dans/home/apweb2 /. Chaque hôte virtuel aurait son propre sous-dossier et chacun de ces hôtes aurait la racine du document définie sur ce sous-dossier. Les liens symboliques seraient désactivés afin de ne pas fournir accidentellement l'accès au reste du système.
De plus, vous pouvez restreindre l'accès ssh à certains utilisateurs uniquement (ou à certains groupes, j'aime les mettre dans le groupe ssh, et en faire la seule chose capable d'utiliser ssh).
De plus, vous pouvez choisir quels utilisateurs ont les privilèges Sudo pour restreindre encore plus les choses. Une autre étape que vous pouvez aller plus loin est de rendre les utilisateurs ssh incapables de Sudo, vous pouvez créer des utilisateurs spéciaux qui peuvent utiliser Sudo qui ne peuvent pas utiliser ssh, de sorte qu'une fois que vous vous connectez, vous devez vous connecter à un autre utilisateur pour avoir accès à Sudo.
Ainsi, en modularisant chaque segment, si l'un est compromis, la pile entière ne sera pas compromise et vous pouvez résoudre le problème 1 au lieu d'avoir à tout recommencer à zéro.
J'ai trouvé ce document de SANS.org vraiment utile http://www.sans.org/score/checklists/linuxchecklist.pdf
À l'heure actuelle, ne négligez pas la virtualisation de conteneurs, à savoir Docker, systemd-nspawn et les mécanismes de virtualisation de conteneurs sur lesquels ils sont construits (espaces de noms, cgroups). L'utilisation de la virtualisation de conteneurs vous permet d'isoler les processus, par exemple, si l'un des services est compromis, un attaquant n'aura pas accès aux autres services.
Dans le cas de LAMP, il est possible d'utiliser, par exemple, quatre conteneurs Docker avec serveur SSH, Apache, MySQL, PHP-FPM/Python/Perl/etc.