4

会社用のアプリケーションを作成する必要があります。彼らは、さまざまなタスクを実行するためのさまざまな権限を持つように、人々にアプリケーションにログインしてもらいたいと考えています。

私の最初のアイデアは、MySQLデータベースを作成し、資格情報をアプリケーションにハードコードして、アプリケーションをMySQLデータベースに接続することでした。MySQLデータベースには、ユーザー名、パスワード、およびアクセス許可を格納する「users」というテーブルがあります。次に、アプリケーションはサーバーにクエリを実行し、認証を実行します。

これに関する最大の問題は、MySQLクレデンシャルがアプリケーションにハードコードされていることです。アプリケーションが悪用された場合、クレデンシャルを探してテーブルを削除し始めると、MySQLデータベースに多くの損害を与える可能性があります。

そこで、MySQLデータベースのインターフェースとして機能するサーバーを開発することを考えました。たとえば、クライアントアプリケーションはTCP経由でサーバーに接続し、サーバーはMySQLデータベースに接続します。そうすれば、MySQLクレデンシャルがエンドユーザーに公開されることはありません。ただし、これは、a)顧客のために保守と展開が困難になるサーバーアプリケーションを開発する必要があることを意味します(MySQLサーバーをセットアップするだけではありません)。b)追加のシステムがあるため、より多くのバグが発生する可能性があります。作成する必要があります(これは、バグ修正などを展開するためのポイントに関連しています)

そのため、データベースにユーザーのテーブルを作成し、アプリケーションをハードコードされた資格情報を使用してMySQLサーバーに直接接続する代わりに、エンドユーザーに実際のMySQLユーザー資格情報を提供して接続するためにアプリケーションに入力することを考えていました。 MySQLサーバー。つまり、誰かがアプリケーションを手に入れても、MySQLデータベースに損害を与えることはできませんが、エンドユーザーが間違った人に資格情報を与えるリスクは残ります。

デスクトップアプリケーションをMySQLデータベースに接続するための最良の方法は何ですか?私が考えた3つ以外の解決策はありますか、または私の解決策について何か考えがありますか?

4

3 に答える 3

3

@Perceptionが指摘したように。ここでの最善の策は、MySQLの前にWebサービスを実装することです。不明なIPアドレスからの不明な数のクライアントがすべてデータベースにアクセスできるようにする必要はありません。

MySQL接続を接続することで、DOS攻撃を行うのは非常に簡単です。言うまでもなく、間にWebサービスを配置せずに、増加するクライアントベースの要求を満たすためにバックエンドサービスを拡張する能力を非常に厳しく制限します。

Webサービスは、さまざまな方法(ユーザー/パスの組み合わせ、トークンベースのアクセス、OAuthアクセスなど)でユーザーの認証と承認を制御する機能も提供します。

于 2013-03-19T00:37:10.767 に答える
2

私が働いている場所には、私が見た2つの実践があります。

  1. データベースにアクセスする各エンティティ(人、物、またはビジネス(必要な粒度のレベルに応じて))には、独自の資格情報があります。これは、MSSQLおよびRocketUniverseデータベースで使用されていました。これは主に小売およびレガシーソフトウェアです。

  2. 私たちは自分たちでアプリケーションをホストし、ユーザー用に別の認証システムを使用しています。データベースのクレデンシャルは、アプリケーションがホストされているサーバーに保存されます。クライアントはバッキングデータベースについて何も知りません。これらは通常、WebアプリとWebサービスです。

私たちが行ったことでできることは、私たちのアプリケーションの多くが、ある意味でデータベースをエミュレートするRESTfulサービスを介して実際に通信することです。アプリケーション自体はデータベースにアクセスできません。詳細については、RESTfulサービスに関するウィキペディアの記事を読みます。私たちの認証は、NonceでエンコードされたHMAC要求を使用して行われ、各ユーザーには、資格情報に関連付けられた独自のキーが与えられます。

データベースをWebサービスでラップすると、いくつかの利点が得られます。

  • 同じ情報を維持しながらデータベース構造を変更する場合は、クライアントアプリケーションを更新する必要はなく、サービスだけを更新する必要があります。
  • クレデンシャルがサーバーを離れることはありません。誰もサーバーにアクセスできない限り、クレデンシャルは安全なままです。一般的にセキュリティが強化されます。
  • サービスを十分に巧妙に行うと、通常はクライアント側である内部ロジックの多くをサーバーに転送して、更新とバグ修正をクライアントに対して実質的にシームレスにすることができます。

私が見る不利な点:

  • 維持することがもう1つあります
  • アプリケーションはサービス拒否攻撃に対して脆弱ですが、データベースであるため、とにかく問題が発生する可能性があります
  • サーバーがダウンすると、すべてのクライアントアプリケーションがダウンしますが、それでも問題が発生します。

RESTfulアーキテクチャ: http: //en.wikipedia.org/wiki/Representational_state_transfer

HMAC: http: //en.wikipedia.org/wiki/Hash-based_message_authentication_code

私たちのHMACシステムは次のように機能します。

  • ユーザーは、ユーザー名とパスワードを使用してローカルアプリケーションにログインします。
  • ローカルアプリケーションは認証サービスと通信し、そのユーザー名とパスワードの「セッションキー」と共有シークレットを取得します。
  • アプリケーションは、セッションキー(短時間で有効期限が切れます)を使用して、APIキー(長時間持続します)を作成し、それをコンピューターに保存します。ユーザーが毎回ログインする必要がある場合は、APIキーの代わりにセッションキーを使用できます。一部のプログラムの便宜のために、主にこの方法で行いました。コンピューターが安全でない場合は、セッションキーのみを使用する必要があり、APIキーはローカルマシンに保存されません。ユーザーがログインするたびに、新しいセッションキーを取得します。
  • データベースサービスへの各要求には、アプリケーションがAPIキーに基づいて認証サービスから取得するHMAC署名付きナンスが付随します。ナンスを取得した後、アプリケーションは共有シークレットを使用してナンスに署名します。これらの署名された要求は、Webサービス(ユーザーは何も知らない)が要求を認証するため、一度だけ使用できます。署名されたナンスがサーバー側で認証され、その特定のAPI /セッションキーの共有シークレットを使用してナンスをハッシュすると同じダイジェストが生成されるかどうかを確認すると、ナンスは期限切れとマークされ、リクエストが許可されます。

上記は、HTTPSが使用されていない場合、man-in-the-middle攻撃に対して脆弱であるため、多くの場合、タイムスタンプとともに要求されているナンスとURLに基​​づいてメッセージを作成し、その上でHMACを計算します。次に、サーバーはURLに基​​づいてメッセージを再作成し、タイムスタンプが一定の範囲内(+/- 4分程度)にあるかどうかを確認し、その情報に基づいてユーザーを承認します。

操作をさらに細かくするために、Session/APIキーを所有するユーザーに要求しているものを要求する許可が与えられているかどうかを確認する役割システムもあります。適切な役割を持っている場合、リクエストは許可されます。

概要:資格情報はユーザーごとに作成され、エンドユーザーはデータベースに関する知識がなく、WebサービスがデータベースをRESTful APIでラップし、役割ベースのシステムを使用して権限をきめ細かくします。

これは単なる提案であり、これが最善または唯一の方法であると言っているわけではありません。これは、私たちが仕事をしている場所でそれを行うことになった方法です。

于 2013-03-19T00:39:22.680 に答える
0

データベースを扱う2つの方法を見てみましょう。

  • クライアントはデータベースに直接接続し、データベースを操作します
  • サーバーはデータベースに接続し、クライアントが使用するためのインターフェースを提供します

ユースケースを考慮して:

有効な有効なシリアル番号、または特定のユーザーに関する情報を保存/読み取るため

セキュリティを提供するために、次のように設計できます。(私はこれの専門家ではありません)

  • クライアントはデータベースに直接接続し、データベースを操作します
    • データベースにアクセスするために管理者を使用する必要はありません。代わりに、クライアント専用のユーザーを作成し、ユーザーのアクセス権限を表示(特定のデータ)のみに制限します。また、このユーザーの権限を変更することで、データベースにセキュリティポリシーを適用できます。
    • 詳細については、 MySQL ::MySQL5.1リファレンスマニュアル::6Securityを参照してください。
      • 6.2MySQLアクセス特権システム
      • 6.3MySQLユーザーアカウント管理
  • サーバーはデータベースに接続し、クライアントが使用するためのインターフェースを提供します
    • HTTPを使用して、使用するクライアントへのインターフェースを提供できます。そして、バックエンドのみがデータベースに接続します。
    • RESTful APIのようなもので、認証と承認を提供する使いやすいフレームワークがたくさんあります。

あなたの場合、クライアントがデータベースに直接アクセスできるようにするのは良い考えではないと思います。したがって、可能であれば、2番目のオプションの方が適しています。

また、パスワードベースの認証は理想的ではないことに注意してください。

于 2014-05-17T08:55:05.283 に答える