Devrais-je héberger mes données sur la même boîte que je sert mes pages Web?

J'étais à l'écoute de Hanselminutes un jour et cette question est apparue. Dans quelles circonstances une donnée séparée doit-elle être codée? Par exemple, dans l'un des systèmes sur lesquels je travaille sur la database est sur la même boîte que le contenu Web des servers. Dans un autre scénario, nous les avons séparés. Quelle est la meilleure façon pourquoi vous sentez-vous de cette façon?

Personnellement, je pense que la séparation est bonne si vous pouvez vous le permettre.

Les données sont mieux protégées contre un intrus. La séparation permet un meilleur contrôle de basculement. et Séparation vous permet de gérer et de réparer le trafic de l'équilibre mieux.

Lorsque cela devient problématique, les time d'access aux données sont importants. La latence sur la boîte lorsque les deux sont set est considérablement réduite vs sur le réseau.

Quelles sont vos pensées?

Il existe plusieurs raisons pour lesquelles vous envisageriez de séparer la database et le server Web, et certains écho à ce qui a déjà été mentionné.

Premièrement, il y a le problème de performance potentiel. Généralement, un server de database aime la memory. Le plus de memory qu'il peut allouer à la caching des données, less l'access qu'il faut lire à partir du disque. Il y a donc un avantage à avoir de la memory. Par conséquent, vous pouvez avoir un problème de contention de memory entre le server Web et le server de database. Cela dit, il existe de nombreux cas où les servers de database fonctionnent sur la même boîte que le server Web, par exemple avec MySQL ou SQL Server Express ou même SQL Server avec SQL Server 2005 Reporting Services.

Deuxièmement, le cas où votre application peut utiliser certaines, mais pas toutes, datatables. Cela est particulièrement vrai si les systèmes internes touchent également la database. Ce n'est pas un scénario probable dans un environnement d'hébergement Web, ce que je suppose que vous regardez en fonction de vos balises. Mais dans ce cas, vous pouvez limiter l'access au server Web à la database uniquement à ce qui est nécessaire. Oui, si le server Web est compromis, ils peuvent get cet access, mais s'il s'agit d'un nombre limité d'permissions, ils ne peuvent tout get. Accédez-le sur le même server web et c'est une histoire totalement différente.

Troisièmement, vous pouvez comprendre si votre server Web est compromis ou non en examinant le trafic réseau entre le server Web et le server de database à l'aide d'IDS / IPS. Par exemple, si nous parlons, SQL Server et xp_cmdshell sont envoyés au server de database, ou sp_configure, cela devrait indiquer à l'IDS / IPS que quelque chose soit terminé. Et cela vous donne l'avertissement immédiat que le server web est compromis.

La quasortingème est la séparation des tâches. Si vous avez des responsables du deployment de l'application Web, ils ont probablement besoin de droits accrus sur le server Web pour le faire. Quel genre de droits dépend de ce que vous faites, quel operating system, quel server Web, etc., mais vous avez l'idée. Si ces personnes n'avaient pas access à tout ce qui se trouve dans le server de database et que les mises à jour du server de database sont traitées par un set différent de personnes (comme les DBA), ils peuvent mieux protéger l'entreprise en utilisant différents servers.

Très mauvaise idée pour le less. J'ai eu une configuration avant où nous avions Apache + MySQL sur le même server et il irait régulièrement sur 10 carrés de moyenne et les pages prendraient une éternité à charger. Nous partageons les deux services et mettons MySQL sur un server plus petit. Les deux servers ne dépasseraient jamais 0,35 de moyenne de charge.

Faites les calculs … Il y a beaucoup de perte pour mettre le server Web + server DB sur le même server.

Evan a également un bon point. Fusionner les choses dans une machine a tendance à conduire à de nombreux raccourcis qui rendent la mise à l'échelle beaucoup plus difficile. Un service = un operating system est une bonne règle de base (aurait déclaré un service = une machine mais maintenant il y a une virtualisation).

La première pensée qui m'avait pensé était de ne pas mettre sur pied une solution.

Il est normal de mettre tout sur une boîte. Le tout-puissant Déploiement de stack a commencé ainsi.

Lorsque vous avez une request suffisante (et des ressources) pour justifier plusieurs boîtes, faites-le. La création de l'installation parfaite n'arrivera pas la première fois.

Conservez d'excellentes sauvegardes indépendamment de quoi et comment vous l'installez pour une récupération et une restauration rapides. Répliquez votre database hors site afin que vous puissiez la rebuild et la restaurer n'importe où (dans le nuage, les autres hôtes, etc.)

Bonne chance!

Du sharepoint vue de la security, il devrait s'agir de boîtes séparées. Cependant, selon le budget, il devrait s'agir d'une décision commerciale d'accepter le risque ou non.

Pourquoi donc? Premièrement, les meilleures pratiques recommandnt:

  • Défense en profondeur.
  • Le less de privilège et la séparation de données

Si votre database est sur une machine séparée, elle nécessitera une étape supplémentaire pour l'attaquer. Si vous suivez la défense en profondeur, le server Web ne pourra accéder à rien d'autre sur la boîte db en plus du db (donc, pas de shell, pas de scripts en cours d'exécution, etc.). C'est pourquoi un pare-feu est bon pour le contrôle interne aussi.

Si vous réalisez vraiment bien la security, votre user Web-2-db aura des privilèges minimum sur le db, ne pouvant accéder ni modifier ce qu'il a vraiment besoin (donc, pas de table de repository, etc.). C'est drôle combien de fois nous voyons GRANT * sur un db, pour un user qui ne doit que sélectionner et mettre à jour à partir de quelques tables.

Donc, juste parce que beaucoup de gens exécutent db + server web + server de messagerie + DNS sur une seule boîte, cela ne signifie pas que c'est la meilleure décision de security, juste un risque accepté basé sur le $$.

Une chose importante à garder à l'esprit est que lorsque vous passez d'une machine à l'autre, vos chances de time d'arrêt double – c'est-à-dire si votre site dépend de la DB pour fonctionner. Si le time de disponibilité est important pour vous, vous pouvez regarder 4 (ou plus) servers – et vous êtes doré.

Je ne pense pas que vous devez vous soucier de la vitesse de la DB communiquant avec le server web. La puissance de la CPU que vous gagnez en ajoutant une machine accélérera les requêtes DB elles-mêmes, et la transmission entre les servers même à 100Mb devrait être négligeable par rapport à la vitesse que vous pouvez sur les pages Web du server sur Internet en direct.

Je ne pense pas que la security soit significativement meilleure avec une boîte distincte. Si un attaquant compromet la boîte qui fait le service Web, cela mènera probablement à un compromis db indépendamment. Les arguments de basculement et de balance de charge / évolutivité sont bien meilleurs.

Mais si vous avez juste une boîte Web, je préférerais absolument garder datatables sur la même boîte.

S'ils ont access à votre machine Web, ils peuvent tirer les détails de la database à partir de vos files de configuration, charger un shell php et décharger datatables à partir de là. L'avantage de security est si vous avez plus d'un DB sur la même machine.

Cependant, il vous permet de répartir la charge, et si vous devez le faire pour la performance, c'est bon, aussi longtime que vous avez une connection rapide, comme indiqué.

Si vous vous inquiétez au sujet de la redondance, il serait bon d'avoir toutes datatables sur une seule case et une sauvegarde de l'autre.

Je suis d'accord, la séparation est meilleure si elle peut être accordée.

Si la boîte peut gérer la CPU / RAM de chargement – alors les avoir sur la même boîte pourrait être mieux pour des raisons de performance car il n'y aurait pas de latence de réseau entre le server Web et le server de database.

Je n'ai pas une opinion forte d'une manière par rapport à l'autre. Toutefois, si vous prévoyez de «déployer une échelle», vous pourriez envisager de rendre le (s) server (s) web (s) aussi apasortingde (s) que possible pour permettre la mise à l'échelle sans ré-architecturer la design.

Si vous disposez d'une database petite, relativement statique, accédée fréquemment, elle la stocke sur le même server que le server Web peut être bénéfique (car vous profiterez de la caching de données en memory). Cependant, pour tout autre scénario, il est préférable de split les deux rôles si vous pouvez vous procurer un supplément de $ 2K pour un autre server.

Je pense que la séparation de la database et du server Web avec les différentes machines pourrait append une autre couche pour l'intrus, mais très mince.

Si vous souhaitez "piéger" les intrus de cette façon, vous pouvez utiliser un proxy inverse ou un cache Web sur une machine distincte. L'intrus goto cette machine et ne finda pas de données ainsi que pas de détails sur l'access à la machine de database. Seul le server Web sera défini sur le proxy inverse et peut être bloqué hors du port, il dessert les pages Web.

Sécurité: le server proxy peut fournir une couche supplémentaire de défense en séparant ou masquant le type de server derrière le proxy inverse. Cette configuration peut protéger les servers plus loin dans la string – principalement à travers l'obscurité.

http://fr.wikipedia.org/wiki/Reverse_proxy