質問

Webアプリケーションの場合、MySQLデータベースに接続するユーザーを作成するときに、権限を選択できます。そのユーザーが行うことを意図したアクションはSELECT / INSERT / UPDATE / DELETEだけであると仮定すると、それらの特権のみを提供することは理にかなっているように見えますが、どこでも推奨されるものを見たことはありません-この理由と反対メソッド?

役に立ちましたか?

解決

通常のアプリケーション中にユーザーが必要とする可能性のある他の特権があります。例:

  • 一時テーブルの作成
  • EXECUTE(ストアドプロシージャ)
  • FILE(SELECT INTOおよびLOAD DATA用)
  • テーブルのロック

最小特権は、特定のテーブルではSELECTのみを意味し、他のテーブルではSELECTおよびUPDATEのみを意味する可能性もあります。これは、アプリケーションの機能が拡張されるたびに変更されます。また、UPDATEするテーブル内の外部キーによって参照されるため、クエリしないテーブルに対するSELECT特権が必要になるなど、奇妙なケースがあります。そのため、最小限の特権を追跡することは王室の痛みです。

SQL特権を使用して何を制限しようとしていますか?すべてのコードを作成したのはあなたであるため、SQL特権をきめ細かく管理する必要はありません。率直に言って、ユーザーが確認していないSQLステートメントをアップロードして実行できる場合、より大きな問題が発生します。

SELECT * FROM mytable, mytable, mytable, mytable, mytable ORDER BY 1;

管理したい実際のタスクは、データベースレベルではなく、アプリケーションビジネスレベルです。たとえば、CMSには、ページの作成、ページの編集、コメントの管理などの操作があります。これらのタスクは、SQL特権よりも高いレベルです。 SQLロール(特権のグループ)でそれらを模倣できますが、SQLロールは広くサポートされていません。

アプリケーションユーザーを個別のMySQLユーザーにマッピングする人は誰も知りません。アプリケーションで認証したユーザーは、アプリがデータベースに接続した後 です(ユーザーはデータベース内のデータの単なる行です)。

したがって、Webアプリに完全な権限を持つ単一のMySQLユーザーを使用させる方がよいでしょう。

他のヒント

私はここでビルに同意せず、Atomixの考え方がより適しています。特に説明できる場合を除き、Billの回答はデータベースが危険にさらされるリスクを大幅に増加させます。

おそらく非常に経験豊富な開発者には他のセキュリティがありますが、データベースに〜何でも〜を行うための完全で自由なアクセスをスクリプトに与える他の開発者は、必要がないときに問題を求めています。

ここでは、最小特権の原則を使用する必要があります。 MySQLの場合、テーブルの作成、データベースの削除などに使用されるすべての特権を持つスーパーユーザーが必要です。理想的には、このユーザー名とパスワードは、PHPファイルやWebサーバー上のファイルには表示されません。 (例としてPHPを使用していますが、他のWebアプリケーションにも適用されます)。このユーザー名とパスワードは、PHPMyAdminやMySQL Workbenchなどでのみ使用します。

次に、PHPスクリプトの場合、PHPスクリプトによっては、INSERT、SELECT、UPDATEのみ、またはDELETEでさえないなど、最低限必要なものがあります。これはPHPファイルにあります。つまり、実際にはドキュメントルートの外側にあるファイルは1つだけです。ほとんどの場合に推奨されています。

その理由は次のとおりです。はい、すべてのWebアプリケーションユーザーにMySQLユーザーは必要ありません。ただし、最小特権の原則( http://en.wikipedia.org/wiki/Principle_of_least_privilege )は適用します。誤ってMySQL接続スクリプトに.phpではなく.txtという名前を付けたためにMySQLスーパーユーザーが危険にさらされた場合、または誰かがWebサーバーファイルにアクセスした場合、少なくとも「最悪」 SELECT、UPDATE、およびINSERTを実行できます。いずれにしても大きな問題を引き起こす可能性がありますが、DROP DATABASE、DROP TABLES、およびさらに悪いことを与えるほど悪くはありません。

さらに、現在のプロジェクトではアジャイル開発プラクティスのために(私は働いていませんが、 http:// wwwをお勧めします。 agilealliance.org/ )、1つまたは2つの「非技術」チームメンバーはPHPMyAdminを直接使用して、MySQLデータベースに直接変更を加えています。これは、単純な直接データ入力用のCMSを作成する必要がないためです。この場合、3番目のMySQLユーザーは合理的であるが、「十分」である。特権はそれらに適しています。チームメンバーをあまりにも少ない特権で不自由にしたくないのですが、もちろん、誤って物を削除したり変更したりしてはいけません。

MySQLにはROLESがないため(元の質問が行われた時点で、Billによる)、すべてのWebスクリプトが1人のスーパーユーザーのみでMySQLにアクセスできるようにすることは非常に危険です。

Webアプリは通常、実際のユーザーアカウントごとのユーザーではなく、1人のユーザーのみを使用してDBにアクセスします。最小限の特権を適用することをお勧めします。ユーザー名とパスワードはスクリプトにコード化されるため(誰かがこれを難読化しますか?)、スクリプトが適切に管理されていないと、妥協の余地があります。

私の経験では、アプリで行を削除することはほとんどありません。行に何があったのかわからないのではなく、何があったのかを監査するので、行に削除済みのフラグを立てることをお勧めします!このアプローチは、テーブルとインデックスを最適化するのにも役立ちます。

したがって、INSERT、UPDATE、およびSELECTのみを許可することをお勧めします。アプリの一部を少しリラックスする必要がある場合、すぐに明らかになります!

より多くの特権を許可しても、リソースを集中的に使用するコマンドを発行したり、悪意のあるデータ攻撃を許可したりすることで、DoS攻撃の可能性を広げることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top