Méthode recommandée pour connecter ASP.NET à SQL Server

Nous avons une application Web ASP.NET 4.0 qui se connecte à un server SQL sur une machine distincte sur un réseau local. J'utilise un ConnectionSsortingng (avec l'authentification SQL Server) stocké dans mon Web.config pour ce faire. Fondamentalement, c'est une stratégie Web-Server-to-SQL assez traditionnelle.

Cependant, un de nos clients soutient que cette stratégie n'est pas sécurisée. Ce client indique que nous ne devrions nous connecter au SQL Server qu'à travers une couche distincte de services Web.

Je ne veux vraiment pas réécrire cette application juste pour satisfaire ce client. Que devrais-je lui dire? Est-ce que quelqu'un sait comment je pourrais le mieux réfuter cela?

Merci d'avance…

La security est toujours un compromis. De quoi le client a-t-il vraiment peur?

Avoir des informations d'identification de database "en clair"? J'ai vu des auditeurs signaler cela comme une vulnérabilité potentielle, mais vraiment, si quelqu'un a compromis votre server Web, il peut exécuter du code arbitraire contre la database, donc le encryption des informations d'identification de la database ne vous achète pas vraiment.

Votre application Web doit utiliser un user disposant de droits minimaux pour se connecter à la database, de sorte que compromettre le server Web ne devrait vous donner que les droits de lecture et de mise à jour des données. Comment cela changerait-il si tout passait par une couche de services Web? Encore une fois, il y a un coût très réel – en complexité et en performance – en allant vers une couche de services Web. Seul le client peut répondre si oui ou non ce coût en vaut la peine.

S'il s'agit d'un projet Web, vous devez modifier les servers IIS exécutant l'user sur un user de domaine et accorder l'autorisation sur le server SQL à cet user. Que vous pouvez utiliser SSPI sur votre string de connection comme ci-dessous. Comme ceci, vous n'avez pas besoin de garder votre nom d'user ou mot de passe clairement sur web.config.

<configuration> <system.web> <identity impersonate="true"/> </system.web> 

et votre connectionSsortingng

"Integrated Security=SSPI;Initial Catalog=TestDb;Data Source=10.10.10.10"

Il y a beaucoup de clients qui discutent le travail d'un professionnel de l'informatique, tout comme il y a beaucoup de gens qui consultent le médecin pour requestr le médicament au lieu de la maladie, car ils connaissent déjà la réponse depuis qu'ils l'ont lu sur Internet.

Je veux dire, ils vous requestnt de build l'application et vous en tant que professionnel de l'informatique devrait savoir le mieux quand votre application fonctionne comme prévu. Vous en tant que professionnel devriez avoir des boules pour dire à votre client que s'il pense pouvoir aller mieux ailleurs, il devrait y aller ou peut-être build lui-même l'application; c'est ce qui a fait dans le passé avec des résultats positifs 🙂

Concernant la security peut-être pour leur confiance que vous pouvez chiffrer le web.config et les montrer, mais en réalité cela ne signifie rien; Si quelqu'un peut accéder au server, ils peuvent le décoder. D'un autre côté, quelqu'un qui veut s'introduire dans votre database devrait passer par beaucoup d'obstacles. C'est difficile à percer, peut-être impossible. Une autre option consiste simplement à bloquer les connections du réseau extérieur au réseau ou à la plage IP ou autre. Je pense que cela ne devrait pas être quelque chose à craindre.

Il y a beaucoup plus de soucis plus réalists à s'inquiéter, tels que la prévention des scripts inter-sites et des friandises communes.

Le client a tort d'introduire un autre niveau qui n'améliorerait pas automatiquement la security.

En un mot, utilisez les rôles de server SQL pour l'access aux données, par exemple les rôles embeddeds data_reader et data_writer sont un bon sharepoint départ. Utilisez toujours le count de moindre privilège le plus approprié pour l'application. Si vous avez seulement besoin de lire des données, utilisez un count qui a seulement access à lire.

Utilisez l'authentification Windows si possible, si cela n'est pas possible, cryptez au less la string de connection.

Plus d'informations sur comment faire ce que j'ai décrit peuvent être trouvées à http://msdn.microsoft.com/en-us/library/ff650037.aspx#pagpractices0001_dataaccess

Une possibilité est de crypter la section dans le web.config. Ainsi, seul l'user qui peut accéder directement au server Web peut déchiffrer cette section.

Voici comment cela fonctionne avec l'aide de l'outil iisreg: http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx

Vous pouvez activer les connections cryptées dans votre database et indiquer au client que les connections sont cryptées de manière totalement sécurisée?

Pour le rendre plus sûr et satisfaire votre client, vous pouvez utiliser Tunneling entre vos ordinateurs.

Vous installez un programme de tunneling de server où la database existe et des programmes de tunnel client sur l'ordinateur client. Vous connectez l'un à l'autre via le tunneling, et la connection à la database se fait par tunnel.

Et tout est sécurisé haute security (et compressé si le tunnel le supporte).

http://en.wikipedia.org/wiki/Tunneling_protocol

http://en.wikipedia.org/wiki/HTTP_tunnel

Ps Je me connecte à mon server uniquement via un tunnel pour tout ce que je fais.

Je n'ai jamais aimé utiliser la configuration web. Le registre est plus sécurisé.

Les meilleures pratiques consistent à:

  • Masquer les éléments importants de la string de connection dans le registre
  • Crypter les éléments importants dans la connection comme les noms d'user, les passwords et le nom du server dans le registre
  • Accéder au registre via une class
  • Construire la string de connection à la volée et seulement si nécessaire par page
  • Erreur gérer chaque page afin que la string de connection ne s'affiche pas, en cas d'erreur
  • Fermez toujours les connections une fois terminé. Évitez les memory leaks
  • Toujours fermer et réinitialiser DataReaders

Pour plus de security

  • Vous pouvez créer un programme distinct pour créer la string de connection et referencer ce projet en tant que bibliothèque dans la solution
  • Si vous voulez être vraiment en security votre client est correct. Envoyer les informations à une DLL qui communiquera avec la database. c'est beaucoup de travail

Sources:

De ScottGu @ http://msdn.microsoft.com/en-us/library/Aa302406

Évolutivité

En ce qui concerne l'évolutivité: La création / modification de keys de registre à travers une ferme Web peut être accomplie très facilement, avec un logiciel d'administration personnalisé.

http://weblogs.asp.net/scottgu/archive/2010/09/08/introducing-the-microsoft-web-farm-framework.aspx

Sur une note finale à tous les gens qui m'ont rejeté. La security hors de la boîte ne suffit pas. La security est un art et non pas la science.

Les pirates savent où le mot de passe est stocké par défaut ……

Ventilateurs ASP.NET 4.0

Microsoft facilite le deployment des parameters de registre sur les sites Web asp.net 4.0:

http://msdn.microsoft.com/en-us/library/dd394698.aspx