私が働いている場所には、私が見た2つの実践があります。
データベースにアクセスする各エンティティ(人、物、またはビジネス(必要な粒度のレベルに応じて))には、独自の資格情報があります。これは、MSSQLおよびRocketUniverseデータベースで使用されていました。これは主に小売およびレガシーソフトウェアです。
私たちは自分たちでアプリケーションをホストし、ユーザー用に別の認証システムを使用しています。データベースのクレデンシャルは、アプリケーションがホストされているサーバーに保存されます。クライアントはバッキングデータベースについて何も知りません。これらは通常、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でラップし、役割ベースのシステムを使用して権限をきめ細かくします。
これは単なる提案であり、これが最善または唯一の方法であると言っているわけではありません。これは、私たちが仕事をしている場所でそれを行うことになった方法です。