1

ユーザーが「プロセス」と対話する JSP/MySQL Web サービスがあります。ユーザーは、特定のプロセスのデータのアップロード、構成、レポートの表示などを行うことができます。また、新しいプロセスを作成したり、複数のプロセスを比較するレポートを実行したりすることもできます。

現在、プロセス ID は URL (GET パラメーター) で指定されているため、すべてのユーザーが任意のプロセスと対話できます。 このサービスにセキュリティとマルチテナンシーを追加するよう依頼されました。 簡単にするために、各テナントが一連のプロセスに完全にアクセスできるとしますが、複数のテナントがプロセスにアクセスできる場合があります。

私の好みのアプローチ:

  • ユーザーテーブルを追加します (PK_User_Id、password_hash、名前など)
  • アクセス テーブル (FK_User_Id、FK_Process_Id) を追加します。
  • セッションに Tenant_Id を格納する SSL ログイン ページ
  • アクセスできる Process_Id を選択し、それをセッションに保存できるプロセス選択ページ
  • ほとんどすべてのページは、セッションの Process_Id に基づいて SQL クエリを作成します。
  • Create、Select、Compare などの「クロスプロセス」ページは、代わりにセッションの User_Id から機能します。

私の上司は、これは外部コード監査を満たすのに「十分」安全ではないと考えています。彼は、気まぐれな開発者が、ある顧客のデータを別の顧客に公開するクエリなどを作成できるのではないかと心配しています。

彼は、ANSI SQL のビルトイン ROLES (アプリは DB に依存しない必要があります) を使用して、各ユーザーの db ロールを作成することも望んでいます。ロールは、ロールがアクセスできるテーブル、共有テーブルのどの行などの詳細を示します。このようにして、ログイン時に接続が「安全」になり、開発者のミスが問題を引き起こす可能性がなくなります。

  • これは可能ですか?
  • MySQL で動作する DB に依存しない「ロール」などはありますか?
  • 主キーが「foo」の場合、テーブルに行を追加できることをロールで指定できますか?
  • 私のシステムは業界標準で「十分に安全」ですか?
4

3 に答える 3

0
  1. MySQL とは異なり、実際のスキーマをサポートするため、代わりに PostgreSQL を使用してください。

  2. MySQL を使用する必要がある場合は、次の手順を実行します。

    • テナントごとに 1 つの mysql ユーザーを作成する
    • 各テーブルにインデックス付きの列を追加、tenantVARCHAR(16) NOT NULL
    • テナントをmysql接続ユーザー名にON BEFORE INSERTに設定する各テーブルにトリガーを追加します
    • WHERE テナント = mysql 接続ユーザー名を設定する各テーブルのビューを作成します。選択リストにテナント列を含めないでください
    • テナント ユーザーにビューのアクセス許可を付与しますが、テーブルのアクセス許可は付与しません

これで、ユーザーは自分のテナント情報のみを表示できるようになりました。

于 2012-04-01T18:54:59.273 に答える
0

マルチテナンシーのセキュリティとso questionのリクエストの処理についても同様の議論がありました。しかし要するに、tenantID をセッションに保存することは大きなセキュリティ リスクだと思います。ユーザーはあるテナントから別のテナントに移動でき、tenantID は同じままです。また、tenantID を URL 経由で送信しないでください。

于 2012-04-23T13:48:33.197 に答える