私が設計した認証システムに関するフィードバックを期待しています。
要件は、クローズドなシングル サインオン Web 環境を作成することです。従業員の 1 人が Web アプリケーションの 1 つにアクセスすると、LDAP によってバックアップされた資格情報でサインインするよう求められます。サインインすると、設定された期間またはブラウザー セッションの間、およびすべての Web アプリケーションでこのログインを保持します。Google のウェブ プロパティが Google アカウントで機能するのとほとんど同じですが、Google の内部システムが対象です。
ユーザー自身は Windows、Mac、Linux から操作し、一部はタブレットのみで操作するため、この認証環境はオンラインのみで存在する必要があり、mod_auth_kerb を使用した kerberos などでは対応できません。
現在のすべての Web アプリケーションは PHP を使用しています。
私がこれまでに持っているシステムは、以下のように機能します。
認証ハンドラーまたは略して「ハンドラー」と呼ぶ 1 つの中央認証システムと、認証リクエスターまたは略して「リクエスター」と呼ぶ 1 つ以上の認証「クライアント」Web アプリが存在します。ユーザーとそのブラウザーを単に「ユーザー」と呼びます。
requestor_id
また、それが機能するためには、その ID の固有の戻り URL を使用して、ハンドラーでリクエスターを事前構成する必要があります。ハンドラーの秘密鍵が生成され、事前にすべてのリクエスターにも公開鍵が与えられます。
ユーザーがリクエスタにアクセス
- ユーザーがリクエスタの URL を入力します。
- リクエスターにはこのユーザーのセッションが存在しないため、リクエスターは
SESSION_ID
PHP で (組み込みのセッション ハンドラーと を使用してsession_start
) 新しいセッションを作成します。 - セッションには認証がないため、リクエスターは、
authrequest
トークンとenvelope
.session_regenerate_id
リクエスターはまず、クライアントのこの認証リクエストに対して新しい session_id (PHP で) を再生成します。- リクエスターは、この場合は PHP を使用してランダムなパスワードを生成し、
openssl_random_pseudo_bytes
これをセッション データに保存します。 - 次に、リクエスタは PHP の usingのランダム パスワードで
SESSION_ID
usingを暗号化します。AES256
authrequest
openssl_encrypt
- 次にリクエスタは、一意
requestor_id
の ':' と base64 でエンコードされたランダム パスワードを連結して、エンベロープ データを生成します。 openssl_public_encrypt
次に、リクエスターのエンベロープ データは、PHP で使用するハンドラーの事前共有公開鍵を使用して暗号化されます。
- 次に、リクエスター
location:
は、暗号化された URL パラメーターを含むヘッダーをユーザーにenvelope
送信し、authrequest
URL パラメーターをハンドラーに送信します。 - ハンドラは、秘密鍵を使用してエンベロープを復号化し、clientID とパスワードを分離します。
- ハンドラーは、
requestor_id
これが構成されているかどうかを確認し、構成されていない場合は、リクエスターが認識されなかったことをユーザーに通知します。 - ハンドラーはユーザーを認証します (この場合、ユーザー名とパスワードを要求し、LDAP に対してチェックすることによって、および/または事前認証されたセッションを介して)
- ハンドラーは
authtoken
リクエスターへのリターンを 生成します- ハンドラーは、エンベロープから復号化およびデコードされたパスワードを使用して、
SESSION_ID
fromを復号化します。authrequest
SESSION_ID
ハンドラーは、エンベロープから復号化およびデコードされたパスワードを使用して、ログイン資格情報の ID (ユーザー名、GUID など) を含む新しい文字列を暗号化します。
- ハンドラーは、エンベロープから復号化およびデコードされたパスワードを使用して、
- 次に、ハンドラーは、 as URL パラメーターを
location:
含むヘッダーをユーザーに送信し、 this の事前構成された URL に送信します。authtoken
requestor_id
- requestor はリクエストを受け取り、ユーザー セッションでパスワードを使用してトークンを復号化します。
- リクエスタは
SESSION_ID
、ユーザーの現在のセッションと一致することを確認します。そうでない場合は、認証を再開します。 - リクエスターは、返された crednetialID を使用して、ローカル ユーザーが認証済みであることを識別できます。
このプロセスを異なるシステム間で繰り返すことで、シングル サインオンの動作を実現できます。
だから、質問:
- 上記と同様の要件とプリフォームを満たす、既存の標準化された認証システムを知っている人はいますか?
- そうでない場合、そして私がセキュリティの専門家ではないことを考えると、それ以上に壊れる可能性のあるものはありますか? つまり、この方法の弱点は何ですか?