ユーザー名とパスワードの資格情報は、証明書、生体認証、パスキーなどのより強力な方法が普及している場合でも、認証に一般的なままです。 暗号化キーやその他のシークレットにも保護が必要です。 ソフトウェア システムでは、資格情報の盗難、リプレイ攻撃、攻撃者による横移動を防ぐには、これらの資格情報を安全に処理する必要があります。
Warning
パスワード、API キー、接続文字列、またはその他のシークレットをソース コードにハードコーディングしないでください。 ハードコーディングされたシークレットは、逆コンパイル、メモリ検査、またはソース コード リークを使用して攻撃者によって簡単に抽出されます。 これは、野生で悪用された最も一般的な資格情報の脆弱性の 1 つです。
Important
メモリ内のパスワードまたはシークレットの使用が完了したら、 SecureZeroMemory を呼び出してすぐにバッファーを上書きします。
memsetとは異なり、コンパイラはSecureZeroMemoryを最適化できないため、シークレットが実際にクリアされます。
最新の資格情報管理
Windowsの新しい開発では、次の方法を優先順に使用します。
- 可能な限りパスワードを削除します。 パスワードを完全に処理しないようにするには、Windows Hello、パスキー (FIDO2/WebAuthn)、または証明書ベースの認証を使用します。
- Windows資格情報マネージャーを使用します。 CredWrite と CredRead を呼び出して、OS 資格情報コンテナーに資格情報を格納および取得し、ユーザーのログオン セッション キーで暗号化します。
- ローカル シークレット ストレージには DPAPI を使用します。 ローカルに永続化する必要があるシークレットを暗号化するには、 CryptProtectData を呼び出します。 DPAPI は暗号化をユーザー アカウントまたはマシンに関連付け、多層防御を提供します。
- サービスの資格情報には、マネージド ID または Key Vault を使用してください。 Azureで実行されているサービスでは、マネージド ID を使用する必要があります。 オンプレミス サービスでは、構成ファイルに格納するのではなく、実行時にセキュリティで保護されたコンテナーからシークレットを取得する必要があります。
パスワード処理の原則
コードでパスワードを処理する必要がある場合:
- できるだけ遅くパスワードを収集し、できるだけ早く破棄します。 シークレットがメモリ内に存在するウィンドウを最小限に抑えます。
- パスワードやシークレットをログに記録しないでください。 診断ログ、イベント ログ、およびクラッシュ ダンプに資格情報マテリアルが含まれていないことを確認します。
- プレーンテキストでパスワードを送信しないでください。 TLS/HTTPS または同等の暗号化チャネルを常に使用します。
- 安全にプロンプトを表示します。 CredUIPromptForWindowsCredentials を使用して、セキュリティで保護されたデスクトップ分離を適用する標準のWindows資格情報ダイアログを使用して資格情報を収集します。
脅威と軽減策の詳細については、以下を参照してください。