Fournissant des utilisateurs MySQL avec juste le minimum de privilèges
Pour une application web, lors de la création de l'utilisateur qui se connecte à la base de données MySQL, vous avez le choix de privilèges. En supposant que les seules actions qui doit être fait par l'utilisateur sont SELECT/INSERT/UPDATE/DELETE, il semble logique de ne fournir que ces privilèges, cependant je n'ai jamais vu que recommandé de n'importe où - quelles sont les raisons pour et contre cette méthode?
Vous devez vous connecter pour publier un commentaire.
Il y a d'autres privilèges que l'utilisateur pourrait avoir besoin lors d'une application ordinaire, par exemple:
Il y a aussi la possibilité que minimale privilèges pourrait signifier SÉLECTIONNER uniquement sur certains tableaux, et seulement de SÉLECTIONNER et de mise à JOUR sur d'autres tables, etc. C'est l'objet de modifier à tout moment la fonctionnalité de l'application est renforcée. Et il y a de bizarre cas, comme la nécessité de disposer de droits de sélection sur une table, vous n'avez jamais question, parce qu'elle est référencée par la clé étrangère dans une table à mettre à JOUR. Donc, le suivi minimale privilèges est une douleur royale.
Ce que vous essayez de restreindre à l'aide de SQL privilèges? Vous êtes la personne qui a écrit tout le code, de sorte que la gestion de SQL privilèges à une granularité fine ne devrait pas être nécessaire. Franchement, si vos utilisateurs sont en mesure de télécharger et d'exécuter des instructions SQL que vous n'avez pas validée, vous avez de plus gros problèmes:
Le réel de tâches que vous voulez gouverner ne sont pas au niveau base de données, ils sont à l'application au niveau des entreprises. Par exemple, un CMS a des opérations comme la création d'une page, modifier une page, d'administrer les commentaires, etc. Ces tâches sont de plus haut niveau que SQL privilèges. On pouvait imiter avec des rôles SQL (qui sont des groupes de privilèges), mais des rôles SQL ne sont pas largement soutenue.
Je ne connais personne qui les cartes de leurs les utilisateurs de l'application à différents utilisateurs MySQL. Ils sont utilisateurs de vous authentifier à votre demande, après l'application se connecte à la base de données (les utilisateurs sont juste des lignes de données dans la base de données).
Alors, vous êtes probablement mieux d'avoir votre web app, un seul utilisateur MySQL avec tous les privilèges.
ROLES
ont été conçus pour résoudre. Ce sont des groupes de privilèges que l'utilisateur peut adopter pour la session en cours, à condition que votre utilisateur a été accordé à ce rôle par le DBA. Voir download-west.oracle.com/docs/cd/B19306_01/server.102/b14200/... Malheureusement, MySQL ne supporte pas les rôles SQL.Je suis en désaccord avec le projet de Loi d'ici et d'Atomix de la ligne de pensée est plus approprié. Sauf s'il peut être démontré le contraire, le projet de Loi de réponse augmente fortement le risque de la base de données est compromise.
Peut-être pour des développeurs très expérimentés il y a d'autres sécurité en place, mais pour les autres développeurs de donner un script complet, un accès sans entrave à faire ~tout~ à une base de données est d'avoir des ennuis, quand il n'est pas nécessaire d'.
Le principe du moindre privilège devrait être en usage ici. Pour MySQL, ont un super utilisateur avec tous les privilèges qui est utilisé pour la création de tables, de baisse de la base de données, et ainsi de suite. Idéalement, ce nom d'utilisateur et le mot de passe est jamais vu dans un fichier PHP ou n'importe quel fichier sur le serveur web. (Je suis à l'aide de PHP, comme un exemple, mais il s'applique à d'autres applications web). Vous ne utiliser ce nom d'utilisateur et mot de passe avec quelque chose comme PHPMyAdmin ou MySQL Workbench.
Ensuite, pour les scripts PHP, avoir un avec le minimum requis, comme par exemple INSERT, SELECT, UPDATE, peut-être même pas SUPPRIMER, en fonction de votre script PHP. Ce serait dans les fichiers PHP, qui est, en réalité UN seul fichier en DEHORS de la racine du document, comme il est recommandé par la plupart.
La raison est donc: oui, vous n'avez pas besoin d'un utilisateur MySQL pour chaque utilisateur des applications web. Mais le principe du moindre privilège ( http://en.wikipedia.org/wiki/Principle_of_least_privilege ) devrait s'appliquer. Si d'une certaine façon votre MySQL super utilisateur est compromis parce que vous avez accidentellement nommé MySQL connect script .txt au lieu de .php, ou quelqu'un, de l'accès aux fichiers de serveur web, au moins le "pire" qu'ils peuvent faire est SELECT, UPDATE et INSERT... Qui, tout peut causer de gros problèmes de toute façon, n'est pas aussi mauvais que de leur donner CHUTE de BASE de données, supprimer des TABLES et des choses bien pires que.
En outre, dans mon projet actuel, en raison de développement agile pratiques (je ne travaille pas pour vous mais recommandons http://www.agilealliance.org/), un ou deux "non-tech", les membres de l'équipe sont directement à l'aide de PHPMyAdmin pour modifier directement la base de données MySQL. C'est parce que la création d'un CMS simple pour l'entrée directe de données n'est pas nécessaire. Dans ce cas, un troisième utilisateur MySQL avec raisonnable mais encore une fois, "juste assez" de privilèges est approprié pour eux. Nous ne voulons pas nous paralyser les membres de l'équipe avec trop peu de privilèges, mais bien sûr, ils ne devraient pas être en mesure de supprimer accidentellement ou changer les choses.
Depuis MySQL n'a pas de RÔLES (comme du temps de la question initiale a été posée, et en vertu du projet de Loi) permettant ensuite de tout script web pour simplement accéder à MySQL avec un seul Super-Utilisateur est très risqué.
UNION
couramment utilisés? Il est important dans certains types d'attaques, donc c'est peut-être un bon candidat pour le blocage?Une application web utilise habituellement juste un utilisateur pour accéder à la DB, plutôt que d'un utilisateur par compte d'utilisateur réel. L'application minimale de privilèges est une bonne pratique. Le nom d'utilisateur et le mot de passe va être codé dans votre script (personne ne obscurcir ce?) donc il n'y a de place pour un compromis si vos scripts ne sont pas gérés correctement.
Dans mon expérience, j'ai très, très rarement l'app supprimer des lignes - beaucoup mieux pour marquer une ligne comme supprimé, comme vous avez alors une vérification de ce qui est, plutôt que de ne pas savoir ce qui était il y! Cette approche permet également de maintenir les tables et les index optimisé.
Par conséquent, je suggère permettant seulement d'INSERTION, de mise à JOUR et SÉLECTIONNEZ - il deviendra vite évident si des parties de votre application doivent être assouplies un peu!
Permettant plus de privilèges peut qu'élargir la possibilité pour les attaques par déni de service par l'émission de ressources commandes, ou de permettre à des données malveillantes attaques.