web-dev-qa-db-fra.com

Comment puis-je sécuriser les mots de passe stockés dans web.config?

J'ai ajouté les paramètres suivants dans mon fichier web.config pour lancer un appel d'API vers un système externe. Je stocke donc l'URL API + nom d'utilisateur + mot de passe comme suit: -

<appSettings>
    <add key="ApiURL" value="https://...../servlets/AssetServlet" />
    <add key="ApiUserName" value="tmsservice" />
    <add key="ApiPassword" value="test2test2" /> 

Ensuite, à l'intérieur de ma méthode d'action, je ferai référence à ces valeurs lors de la construction du client Web comme suit: -

public ActionResult Create(RackJoin rj, FormCollection formValues)
        {
           XmlDocument doc = new XmlDocument();
           using (var client = new WebClient())
                {
                    var query = HttpUtility.ParseQueryString(string.Empty);
                    foreach (string key in formValues)
                    {
                        query[key] = this.Request.Form[key];
                    }

                    query["username"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiUserName"];
                    query["password"] = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiPassword"];

                    string apiurl = System.Web.Configuration.WebConfigurationManager.AppSettings["ApiURL"];

Mais dans ce cas, je vais exposer le nom d'utilisateur et le mot de passe et ceux-ci peuvent être capturés par les utilisateurs, donc ma question est de savoir comment je peux sécuriser le nom d'utilisateur et le mot de passe de l'API?

28
john Gu

Généralement, web.config est un fichier sécurisé et IIS ne le sert pas, il ne sera donc pas exposé aux utilisateurs qui font des requêtes au serveur Web. Le serveur Web ne sert qu'un type spécifique de fichiers et web.config n'en fait sûrement pas partie.

Très souvent, vous y enregistrez votre chaîne de connexion à la base de données qui comprend le mot de passe. Imaginez maintenant un scénario où web.config n'était pas sécurisé. Vous avez créé une menace de sécurité majeure pour votre application.

Par conséquent, spécialement tant que votre projet n'est pas trop grand, vous ne devriez pas vous en préoccuper.

Pourtant, vous pouvez avoir une meilleure approche mais créer un projet appelé "Ressources" et y enregistrer toutes les informations critiques telles que les paramètres, les consts, les énumérations, etc. Ce serait une approche simple et organisée.

Si vous transmettez le nom d'utilisateur/mot de passe sur le câble (par exemple dans le cas d'un appel d'API sécurisé), vous pouvez utiliser https pour vous assurer que les informations qui voyagent sont cryptées, mais cela n'a rien à voir avec la sécurité de Fichier web.config.

13
JC Lizard

Vous pouvez crypter le web.config avec aspnet_regiis . Il s'agit d'empêcher les personnes ayant accès à votre serveur de lire des informations sensibles.

Soit dit en passant, je mettrais vos paramètres de configuration dans une classe, qui peut ensuite être injectée dans vos contrôleurs - cela facilitera les tests unitaires.

24
Joe Ratzer

Le fichier web.config est juste un fichier sur le système de fichiers et vous devez donc (principalement) considérer sa sécurité de la même manière que vous le feriez pour tout autre fichier. Il ne sera pas servi par IIS (sauf si vous effectuez un changement de configuration franchement fou en IIS - facile à vérifier, essayez simplement de le demander avec un navigateur) )

Il est recommandé de sécuriser le répertoire de votre site Web (c:/sites/mon site-ici ou autre) en utilisant les autorisations de dossier uniquement à l'utilisateur du domaine d'application du site Web pour lire les fichiers (et l'utilisateur de déploiement si nécessaire) à l'aide du fichier Windows normal autorisations

Il peut donc ne pas être nécessaire de chiffrer si vous avez confiance en la sécurité du serveur Web. Cependant, si vous parlez d'hébergement mutualisé, ou si vous vendez le code du site Web ou si le code source est public, il peut être judicieux de le chiffrer. c'est un peu compliqué cependant.

3
alastairtree

Pourquoi utiliser Web.config?

L'un des avantages d'avoir des données dans Web.config par rapport à leur stockage dans Constants, Enums, etc ... est que vous pouvez facilement changer les données pour différents environnements.

Protection des données

La meilleure façon de sécuriser les données dans Web.config est de les crypter. Au lieu de crypter des sections entières dans le fichier de configuration comme suggéré par Joe et ser1089766 vous pouvez simplement crypter la chaîne de mot de passe et la stocker dans la config.

Récupération des données

Vous pouvez utiliser une fonction d'assistance telle que celle ci-dessous pour déchiffrer les clés.

private const readonly string decryptKey = "";
public string GetFromConfig(string key)
{
   var encryptedText = System.Web.Configuration.WebConfigurationManager.AppSettings[key];
   var plainText = Decrypt(encryptedText, decryptKey);
   return plainText;
}

De cette façon, la clé de déchiffrement sera à l'intérieur du projet commune à tous les environnements. Mais vous pouvez facilement modifier les données du web.config sans recompiler votre application.

[~ # ~] ps [~ # ~] : Vous pouvez modifier la clé de déchiffrement et les données correspondantes avec chaque version pour améliorer la sécurité.

2
Kolappan Nathan