現在、ユーザー名/パスワード認証を使用し、どこからでもアクセスできる Web アプリケーション (Apache/PHP) があります。サーバー側 SSL が有効になっています。
当社のクライアント プログラムは、当社が変更し、ブランド名を変更した Firefox のバージョンです。この変更された Firefox クライアントは、当社の Web アプリケーション サーバーに接続するためだけのものです。ユーザーは、このクライアント プログラムを使用して Web サービスに接続する必要があります。
ユーザー認証に加えて、クライアント プログラム* を使用していないユーザーによるアクセスをサーバー レベルでブロックしたいと考えています。そのため、ユーザーが通常のブラウザーを使用して URI を入力した場合、そのアクセスは完全に拒否されます。
これを実現するには、クライアント プログラムがサーバーに対して自身を識別し、Web ブラウザーやボットではなくクライアント プログラムが使用されていることをサーバーが認識できるようにする必要があります。
* 本当の目的は、ログインを試みる前に、そのユーザーが当社の許可された従業員であることを確認することです。この「雇用証明」をクライアント プログラムに埋め込むことが、これを実現する最も簡単な方法であると思われます。なぜなら、アプリケーションは、それを使用する必要のあるユーザーにのみ提供されるからです。
これまでのところ、これを実現する方法についていくつかのアイデアがありました。
1.) クライアントがログインするときに送信されるトークンをクライアント アプリケーションに埋め込みます (ログインは Chrome/XUL インターフェイスによって処理されます)。これにより、サーバー レベルでブロックされるのではなく、アプリケーション レベルでブロックされます。キーはパスワードと同じくらい簡単に盗まれる可能性がありますが、長さや複雑さは自由であるため、ブルート フォース攻撃によって推測される可能性は低くなります。
1a.) すべてのリクエストのクライアント ブラウザー ヘッダーに特別なトークン パラメーターを追加します。これは、セキュリティを介した隠蔽に似ていますが、マジック ストリングがリクエストにない場合、ログインが常に失敗する (正しいパスワードを使用しても) 場合、パスワードをブルート フォースで解読しようとする攻撃者の速度を確実に低下させることができます。
2.) クライアント SSL 証明書をクライアント プログラムに埋め込みます。これは良い解決策のように思えますが、クライアント側の SSL に関する適切なドキュメントはほとんどありません。ユーザーごとに証明書に署名したり、ユーザーが証明書を作成したり、セキュリティ ダイアログに煩わされたりすることは望ましくありません。秘密キーはブラウザーに埋め込まれ、すべてのクライアント プログラムで共有される 1 つのキーとなり、カスタム ブラウザーにインストールされるたびに配布されます。
3.) ユーザー エージェント文字列を確認します。Apache はこれに基づいて制限できると思います。しかし、せいぜい弱い対策のように思えます。おそらく、他の対策に加えてこれを実行するでしょう。
これをどうやって行うかについて、もっと良いアイデアがあれば教えてください。
答え1
変更されたブラウザにクライアント SSL 証明書を含めるのが最も簡単で、おそらくより安全です。
全員に同じキーを使用している場合、クライアント証明書の利点の多くが失われますが、ユーザーエージェントを確認するよりはましです。また、ログインするにはユーザー名とパスワードが依然として必要になると思います。
答え2
VPN について考えたことはありますか? それはまさにあなたが本当に望んでいることのように思えます。