1

私は長年のプログラマーですが、データベースの設計はほとんど行ったことがありません。そのため、開発中のソリューションに関するフィードバックを求めています。

説明

リモートサーバーに機密データを保存している数人 (10 人から 20 人) の顧客がいます。顧客は、ユーザーを持つ組織です。アクセスは、MySQL サーバーにアクセスするサーバー上で実行されている Java ソフトウェアを介して行われます。別のクライアント Java プログラムがサーバーにアクセスし、交換を行います。

データのプライバシーは非常に重要であるため、顧客ごとに個別の DB (スキーマ) を計画しています。各データベース内には、input、query、および admin の 3 つのユーザー レベルがあります。ユーザーはこれらのレベルのいずれかに該当し、DB に対するさまざまな権限を取得します。私はストアド プロシージャを使用してすべてを行うことを計画しているので、実際には特定の DB の一連のストアド プロシージャにアクセスしています。

最大の課題は、顧客の管理者ユーザーが、顧客のデータベースにのみアクセスできるユーザーを追加 (または削除) できる必要があることです。ユーザーは DB に対して一意である必要がありますが、MySQL インスタンスに対しては一意ではありません。たとえば、各顧客には「bob」という名前のユーザーがいるはずです。

質問

したがって、現在、これにアプローチする方法は2つあります。私が現在好んでいるのは、各ユーザーを、付与された権限を持つことができる実際の MySQL ユーザーにすることです。これにより、ロールが MySQL レベルで正しく指定したものだけを実行できるようになります。問題は、MySQL ユーザー名がすべての DB に対してグローバルであるため、名前の衝突です。ユーザーのcustomerID(各ユーザーではなく各顧客に固有)をDBにマップする「ルート」テーブルを作成し、そのDBのテーブルがユーザーの名前をユーザーIDにマップすることで解決しました。これが実際のMySQLユーザーです. Java サーバー ソフトウェアは、マップされたユーザー ID とユーザーのパスワードを使用して DB に接続し、処理を開始します。これを行うにはかなりの労力とフープジャンプが必要ですが、セキュリティの観点からは気に入っています。

もう 1 つの方法は、Java ソフトウェアが接続する DB に数人のベース ユーザーを配置し、各顧客の DB にユーザー名とパスワードを保存して独自の認証を作成することです。MySQL ではそれを防ぐことはできないため、適切な DB のみが変更され、適切な関数のみが呼び出されることなどを確認するのはソフトウェア次第です。基本ユーザーは、すべてのユーザー タイプに対してすべての権限を持っている必要があるため、Java ソフトウェアのソフトウェアの不具合や侵害が DB に悪影響を与える可能性があります。DB は簡単になりますが、ソフトウェアはやや複雑になります。

フィードバック

では、DB のベテランからこれについてフィードバックはありますか? このような問題をより良い方法で解決した人はいますか? 何かにコミットする前に、いくつかのアイデアを得ようとします。

ありがとう、マット

4

1 に答える 1

1

もう 1 つの方法は、Java ソフトウェアが接続できるように DB に 2 人のベース ユーザーを配置することです。

LDAP を使用して、ユーザー、スキーマの関連付け、権限、役割、承認などを保存します。

適切な DB のみが変更され、適切な関数のみが呼び出されることなどを確認するのは、常にソフトウェア次第です (承認規則を介して)。

基本ユーザーには、特定のユーザー タイプに適切な権限が必要です。

そのため、Java ソフトウェアのソフトウェアの不具合や侵害が DB に悪影響を与える可能性があります。

それは常に真実です。したがって、テストを使用して、この不可解な「グリッチ」を防止してください。

データベースは、魔法のように「より安全」でも、魔法のように「ソフトウェアの不具合の影響を受けにくい」わけでもありません。DB セキュリティは、アプリケーション セキュリティと同じくらい信頼できます。どちらも、行政手続きや人的要因と同じくらい信頼できます。

アプリケーション レベルの承認を使用します。LDAP を使用します。

RDBMS 承認スキームに魔法の力を当てはめないでください。それらは「より良い」または「より信頼できる」ものではありません。

ほとんどの言語とフレームワークでのアプリケーション認証チェックは、どのユーザー グループが機能にアクセスできるかを明示的に定義する 1 行のコード デコレーター (または if ステートメント) です。難しくありません。「グリッチ」の影響を受けません。

于 2011-09-22T22:12:44.390 に答える