web-dev-qa-db-fra.com

Meilleures pratiques pour le stockage des informations d'identification utilisées par le code

Actuellement, j'ai de nombreux scripts qui doivent se connecter en tant que superutilisateur pour automatiser de nombreuses tâches. (Par exemple, créer des tables dans des bases de données, créer d'autres utilisateurs, etc.)

Au lieu d'avoir les informations d'identification (en particulier les mots de passe) stockées directement dans le script, je les lis à partir d'un fichier (appelez-le pwds.txt), auquel seuls les utilisateurs root peuvent accéder.

Certains de mes collègues disent qu'une approche plus sécurisée consiste à chiffrer le mot de passe dans pswds.txt, à cacher la clé quelque part et à déchiffrer les données chiffrées dans le script avant de l'utiliser.

Je prétends que cela réduit simplement le problème à trouver où se trouve la clé, ce qui ne semble pas difficile du tout à un adversaire capable de lire le script. Je pense que ce processus ne fait que compliquer la programmation sans réellement fournir une véritable couche de protection.

Deux questions:

  1. Qui est le plus correct, moi ou eux? (et pourquoi)
  2. Je sais que la sécurité à 100% n'existe pas, mais quelles sont les meilleures pratiques pour mon problème?
14
sel

1) Vous avez raison à 100%, pourquoi? Si la machine est compromise, l'attaquant pourra toujours récupérer la clé de déchiffrement car il est nécessaire d'être un chiffrement symétrique pour déchiffrer par application et le fichier de clé doit avoir les mêmes autorisations de lecture que l'application pour que l'application puisse la lire.

Je veux dire que l'application doit toujours avoir un répertoire de clés de déchiffrement secret codé en dur, donc l'attaquant le cherche: D, même si l'application est un attaquant exécutable binaire, il peut facilement vider des chaînes de répertoires de fichiers et des fichiers à partir de celui-ci.

Je sais parce que je l'ai fait à partir d'un programme de langue Go que je devais déboguer et que je n'avais pas de code source (une des applications client hébergée sur le serveur) :)

Le débordement de la mémoire tampon et ainsi de suite les attaques fonctionneront si un trou est présent alors que l'application ether stocke les données en mémoire pour les réutiliser par exemple pour l'authentification de la base de données.

2) La meilleure solution est d'avoir un coffre-fort central où chaque application demande ses secrets et les loue. Une solution de ce type est https://www.vaultproject.io/ et plus de détails à ce sujet https://www.vaultproject.io/docs/internals/architecture.html

La meilleure pratique générale consiste à minimiser les droits d'accès et de contrôle de chaque rôle pour chaque ressource d'application. Exemple: si une application utilise uniquement une base de données, ne donnez pas à cet utilisateur le droit d'en afficher une autre ou d'exécuter DML sur d'autres, supprimez les droits de table de dépôt si l'application ne fait pas de migrations, etc.

Si vous n'utilisez pas le coffre-fort si le script est exécuté par un utilisateur root d'exemple, ne stockez pas de secrets appartenant à des utilisateurs moins privilégiés. Laissez le propriétaire être le même utilisateur, utilisez les autorisations de lecture, d'écriture et d'exécution uniquement pour ce dont vous avez vraiment besoin.

Utilisez TLS lorsque vous le pouvez pour vos ressources car un vidage TCP fuit les données si l'attaquant parvient à obtenir la phase d'authentification, mais vous stockez les données secrètes.

10
Hrvoje Milković