セキュリティで保護されたソフトウェアの開発に役立つには、アプリケーションの開発時に次のベスト プラクティスを使用することをお勧めします。 詳細については、「Microsoft セキュリティ開発ライフサイクル」を参照してください。
セキュリティ開発ライフサイクル
セキュリティ開発ライフサイクル (SDL) は、セキュリティに重点を置いた一連のアクティビティと成果物をソフトウェア開発の各フェーズに合わせたプロセスです。 これらのアクティビティと成果物は次のとおりです。
- 脅威モデルの開発
- コード スキャン ツールの使用
- コード レビューとセキュリティ テストの実施
SDL の詳細については、Microsoft セキュリティ開発ライフサイクルを参照してください。
脅威モデル
脅威モデル分析を実行すると、コード内の潜在的な攻撃ポイントを検出するのに役立ちます。 脅威モデル分析の詳細については、「Howard、Michael、LeBlanc、David [2003]、Writing Secure Code、2d ed.、ISBN 0-7356-1722-8、Microsoft Press、Redmond、Washington を参照してください。 (このリソースは、一部の言語や国では利用できない場合があります。)
サービス パックとセキュリティ更新
ビルド環境とテスト環境では、対象となるユーザー ベースの同じレベルのサービス パックとセキュリティ更新プログラムを反映する必要があります。 ビルドおよびテスト環境の一部であるすべてのMicrosoft プラットフォームまたはアプリケーションの最新のサービス パックとセキュリティ更新プログラムをインストールし、完成したアプリケーション環境に対してユーザーに同じ操作を行うことをお勧めします。 サービス パックとセキュリティ更新プログラムの詳細については、「Update Windows および Microsoft Security を参照してください。
認可
最小限の特権を必要とするアプリケーションを作成する必要があります。 最小限の特権を使用すると、悪意のあるコードによってコンピューター システムが侵害されるリスクが軽減されます。 最小限の特権レベルでコードを実行する方法の詳細については、「特別な特権を使用した実行」を参照してください。
暗号化のベスト プラクティス
Windows アプリケーションで暗号化を実装する場合:
- すべての新しい開発に Cryptography API: Next Generation (CNG) を使用します。 CryptoAPI は下位互換性のためにのみ維持されます。
- 暗号化の機敏性を設計し、ポスト量子を計画します。 ハードコーディングされたアルゴリズム識別子やキー サイズをコード全体に分散させないでください。コードを分離して、書き換えなしでアルゴリズムをスワップできるようにします。 このプラットフォームは、署名用のキーの確立と ML-DSA (FIPS 204) 用の NIST ポスト量子標準、ML-KEM (FIPS 203) に移行するため、現在はアジャイル設計 (特に機密性の有効期間が長いデータの場合) を優先して、"harvest-now, decrypt-later" 攻撃に対抗します。
- 認証済み暗号化 (AEAD) を優先します。 暗号化によって改ざんも検出されるように、AES-GCM を使用します。 CBC などの認証されていないモードを使用する必要がある場合は、別の整合性チェック (encrypt-then-MAC) とペアリングします。機密性だけでは変更から保護されません。
- AES-GCM で同じキーを持つ nonce (IV) を再利用しないでください。 GCM での Nonce の再利用は致命的です。認証キーを公開し、メッセージ フォージェリを有効にすることができます。 増分カウンターや新しいランダム 96 ビット値など、暗号化操作ごとに一意の nonce を生成します。
- ECB ブロック暗号モードは使用しないでください。 ECB はブロックを個別に暗号化し、プレーンテキスト データのパターンをリークします。
- ソース コードで暗号化キーをハードコーディングしないでください。 ローカル キー保護には DPAPI を使用し、永続的 キーには CNG キー ストレージ プロバイダー を使用します。
- 使用後は、メモリからシークレットを消去してください。 キー マテリアル、パスワード、およびその他の機密バッファーを SecureZeroMemory で上書きします。
memsetとは異なり、コンパイラによって最適化されません。 - AES には 256 ビットのキー長、RSA には 2048 ビット (3072 以上優先)、ECDSA には 256 以上のビットを使用します。
- ハッシュには SHA-256 以上を使用 します。 セキュリティ目的で MD5 または SHA-1 を使用しないでください。
- 暗号化関数からの戻り値は常に確認してください。 サイレントモードで失敗した暗号化呼び出しでは、データがプレーンテキストで格納されている可能性があります。
-
BCryptGenRandom (CNG) を使用して乱数を生成します。
rand()やその他の非暗号化 PRNG ではありません。BCRYPT_USE_SYSTEM_PREFERRED_RNG渡して、アルゴリズム ハンドルを管理せずにシステム優先ジェネレーターを使用します。
その他の情報
ベスト プラクティスの詳細については、次のトピックを参照してください。
| トピック | 説明 |
|---|---|
|
特別な権限での実行 |
特権のセキュリティへの影響について説明します。 |
|
バッファー オーバーランの回避 |
バッファー オーバーランの回避に関する情報を提供します。 |
|
制御フロー ガード (CFG) |
メモリ破損の脆弱性について説明します。 |
|
DACL の作成 |
Security Descriptor Definition Language (SDDL) を使用して随意アクセス制御リスト (DACL) を作成する方法について説明します。 |
|
パスワードの処理 |
パスワードを使用した場合のセキュリティへの影響について説明します。 |
|
動的アクセス制御 開発者の拡張性 |
新しい動的アクセスコントロールソリューションにおける開発者向け拡張機能のいくつかの基本的な説明。 |