3

NTLMプロトコルを使用してユーザーを認証するWebアプリケーションを作成しています。

クライアントからパスワードのNTハッシュとLMハッシュを正常に取得しました。パスワードが正しいことを確認するためにActiveDirectoryに対してそれらを検証する方法。

私はC#を使用していますが、ネイティブライブラリを呼び出すことも可能だと思います。

編集:反対票の理由がわかりません。NTLM(v2)プロトコルは古くなっているため、その処理方法に関する相対的な情報を見つけるのは非常に困難です。特にC#のような現代語の中から。

しかし、私は2つの可能なアプローチを見つけました。

  • WindowsのネイティブSSPI呼び出し(Microsoftでは推奨されていません)を使用しますが、適切にラップすることで可能になります。幸いなことに、例があります。http: //pinvoke.net/default.aspx/secur32/InitializeSecurityContext.htmlこのアプローチは機能しているようです。アカウントを確認できました。しかし、まだいくつかの質問が残っています。クライアントのHTTPリクエスト間でサーバーのセキュリティコンテキストに関する情報を転送する、安全でないコードを呼び出す、他のシステムでそのような操作を実行できないなど。
  • を介して行われたアンラップ呼び出しを試行しますSystem.Net.Security.NegotiateStream。アイデアは素晴らしいですが、これを達成する方法の手がかりはありません。
4

1 に答える 1

3

この質問がより多くの反対票を集める前に、いくつかの調査を行うことを強くお勧めします-他の質問への回答からそのドキュメントを読むことは良いスタートです.

実装しようとしているもの - パスワードの検証 - はセキュリティに敏感です。つまり、基盤となるテクノロジと最新のセキュリティの概念を正しく理解することが重要です。

最新のセキュリティ アーキテクチャの重要な設計上の側面の 1 つは、いわゆるリプレイ アタックに対する耐性です。クライアントとサーバー間の接続を盗聴している誰かが認証チャレンジを記録し、後でそれを再生するのを防ぎます。

NTLMv2 / NTLMv2 セッションはこの手法を使用しますが、従来の NT/LM (最近は非常に推奨されていません) は使用しません。

生成したチャレンジに対するクライアントの応答を取得して、検証用のツールに 1 対 1 で渡すことはできません。これは、リプレイ攻撃耐性の目的を完全に失うことになるためです。あなたが得るか、彼自身を生成した応答?

これがどのように機能するかというと、ユーザーを認証する Web サーバーではなく、パスワードを検証しているエンティティ (つまり、Active Directory) がチャレンジを生成します。

Web サーバーに従来の NT/LM を実装して、それを「セキュリティ」と呼ばないでください。実際には、プレーン テキストでパスワードを送信することに対する保護はほとんどありません。今日の最新のハードウェアを使用した、いわゆる「暗号化」。そのdavenportドキュメントを読んでください。レガシーNT / LMの問題がリストされています。

本当に NTLM (より安全なバージョン) が必要な場合は、使用できる外部ヘルパー プログラムがいくつかあります。たとえば、Samba、Apache、Squid を見てください。Squid は、Samba のツールに基づいていると思われる NTLM を処理するために、いくつかの外部ツールを使用します。

Samba のように積極的にメンテナンスされている外部ツールを使用することは、セキュリティ アップデートを取得することも意味します。独自のツールを作成する場合は、コードを記述するだけでなく、メンテナンスも必要であり、セキュリティの問題に注意する必要があるためです。それらを修正します。

于 2012-12-13T17:26:08.870 に答える