コード セキュリティとは、コードの最初の 1 行を書くときから展開時やランタイムまでにわたる保護を、ソフトウェアおよびコードとしてのインフラストラクチャ (IaC) に組み込んでおく手法です。これは、開発時に持ち込まれたリスクによって構成の誤り、リソースの露出、クラウド環境におけるワークロードの脆弱性が生まれる可能性があるという意識に基づいて実践されます。脆弱性や構成のリスクを早い段階で減らすことは、攻撃パスを制限するのに役立ち、アプリケーション規模拡大に応じてより強力なクラウド セキュリティ態勢を実現するための助けになります。
コード セキュリティとは?
- コード セキュリティは、クラウド環境に影響を及ぼす脆弱性や構成の誤りなどのリスクを、ソフトウェア ライフサイクル全体にわたって軽減します。開発時に脆弱性を解決すると、組織は、展開後に修正することが困難で高コストになるような問題を未然に防止できる可能性があります。
- 安全なコーディングは、モダンなクラウド アプリケーションにとって欠かせない基本事項です。安全でないコードが攻撃者の標的になるケースが増えている中、ソフトウェアに保護を組み込むことは、アプリケーション、データ、サービスに対するセーフガードを大規模に確保するために役立ちます。
- セキュリティの諸原則は、より安全性の高い開発の指針となります。露出を制限し、攻撃発生時の潜在的な影響を軽減するには、最小特権、セキュリティ確保された既定状態、多層防御などといったプラクティスが役立ちます。
- 自動化は DevSecOps ワークフローを強化します。継続的インテグレーションと継続的デリバリー (CI/CD) のパイプラインにセキュリティ テストを組み込むと、チームが早い段階で脆弱性を見つけやすく、デリバリーが遅れにくくなります。
- コード セキュリティは、コンプライアンスと信頼をサポートします。コーディング プラクティスにおいて一貫したセキュリティが確保されていると、組織はガバナンス要件を満たしやすく、長期にわたって顧客の安心を守り続けやすくなります。
コード セキュリティの定義
コード セキュリティは、ソフトウェアおよびコードとしてのインフラストラクチャ (IaC) に最初から保護を組み込んでおくことでリスクを軽減する考え方です。セキュリティを最終チェック項目として扱うのではなく、攻撃者に悪用されがちなアプリケーション コード内や構成定義内の問題を予防することを重視します。これは、開発環境と展開先クラウド環境の両方において露出を減らすために役立ちます。 クラウド ネイティブ環境におけるリスクには、IaC テンプレートやコンテナー構成に由来するリスクと、ランタイムの露出に直接影響するサービス定義由来のリスクも含まれます。
コード セキュリティには、ID、インフラストラクチャ、データの保護と並んでアプリケーション セキュリティおよびリスク管理の一環として機能し、サイバー脅威の影響を限定する働きがあります。リスクへの対処を早い段階で行うと、侵害の可能性を小さくし、修復コストを抑え、アプリケーションの規模拡大に応じて全体的なサイバーセキュリティ態勢を強化することができます。
コード セキュリティは、以下のようなリスクへの対策を講じてアプリケーションとクラウド環境を保護するために役立ちます。
技術的な脆弱性
- 信頼できない入力を実行可能コードとして処理させるインジェクション攻撃。
- バッファー オーバーフロー。メモリの取り扱いが安全に行われておらず攻撃者によるメモリ上書きが可能な場合に発生します。
- 不適切な認証および認可による、機密性の高い機能やデータの露出。
- 既知の脆弱性を含んだライブラリなど、リスクがあるサードパーティ依存関係。
クラウドと構成のリスク
- コードとしてのインフラストラクチャ (IaC) におけるセキュリティ不備。ストレージ、ネットワーク、ID 設定の構成の誤りをクラウド環境に持ち込む原因になります。
- 横移動のリスクを高める、過度に寛容な ID 構成やアクセス構成。
- 開発ワークフローとクラウド セキュリティ ワークフローの不整合。コード由来の脆弱性がランタイム環境に永続的に残る原因になります。
- コード チームとクラウド セキュリティ チームのツールがサイロ化により分断された状況。修復の遅れや、開発時由来の脆弱性がランタイムに永続的に残ることの原因になります。
コード セキュリティにおいては、ソフトウェア展開後の検出に頼って脆弱性を防ぐことに留まらず、コードの整合性 (ソフトウェアに変更や改ざんがない状態の維持) から脆弱性を防止することも重視されます。
ソフトウェア開発ライフサイクル全体にコード セキュリティが統合されると、チームは、コードの記述、テスト、リリース作業を進めながらリスクを見つけ、対処しやすくなります。つまり、コード内やパイプライン内の問題がランタイムのリスクとしてクラウド環境内で再発覚するような事態を防ぎやすくなります。この予防的アプローチには、セキュリティを設計段階から確保するという強力な基盤を維持しつつ、クラウドでの迅速なイノベーションをサポートできる働きがあります。
コード セキュリティが重要である理由
安全でないコードは、アプリケーションが運用環境に到達するタイミングのはるか以前にリスクを生み出します。ソフトウェアに入り込んだ脆弱性は、機密データの露出、運用の中断、イノベーションの速度低下を引き起こす要因になります。こうしたリスクは、クラウド環境ではコードまたは構成定義に由来して発生することが多く、ストレージの露出、ID の権限過剰、誰でもサービスにアクセスできる状態などといった形でランタイムに発覚しがちです。コードと IaC の脆弱性は、ランサムウェア、データ侵害、不正アクセスなどの脅威に対する露出増大の原因になります。特に、構成の誤りがクラウド ワークロードに入り込むことは深刻な事態につながります。
同じく重要なこととして、多くのチームが日々のワークフローの中で感じている悩みがあります。セキュリティ チームは問題を発見しても開発者に修正を任せるしかなく、しかもその際、実行時の露出やビジネス的な影響に関するコンテキスト情報はなかなか十分に伝わらないのが実情です。プロセスのサイロ化は、修復を遅らせ、コード内のリスクを延命させて展開後のクラウド ワークロード内に残してしまう元です。コード セキュリティがクラウド セキュリティ ワークフローと統合された場合に最も効果を発揮するのは、この分断を解消する働きがあるからです。
- ビジネスを保護する: 脆弱性を早い段階で減らすと、データ漏洩、金銭的損失、コンプライアンス上のペナルティ、法的リスクの発生を防ぎやすくなります。
- 技術的なリスクを限定する: 安全なコードは、攻撃者が安全でない依存関係を悪用することや、複数の脆弱性を連鎖的に悪用して環境の深層部に侵入することを防ぐために役立ちます。
- DevOps の作業進行を維持する: セキュリティの問題を早い段階で解決すると、納品直前の修正による CI/CD パイプラインの混乱、リリースの遅延、手戻りの増加を回避できます。
- 長期的にコストを抑制する: 開発時の脆弱性修正にかかるコストは、リリース後のインシデント対応に比べてはるかに低く抑えられます。
- 信頼と評判を維持する: 安全なソフトウェアは、顧客の信頼を守り、ブランドの信用を長期的にサポートします。
コード セキュリティのベスト プラクティス
効果的なコード セキュリティを実現するには、展開したクラウド リソースに影響を及ぼすような脆弱性や構成の誤りを含めさまざまなリスクを早い段階で軽減しながら、開発中は常にアプリケーションの強度を高め、運用中は保護を維持することが重要です。以下のベスト プラクティスは、チームが脆弱性を防止し、露出を限定させ、ソフトウェアの進化に応じて安全なイノベーションをサポートしていくために役立ちます。
強力なコード セキュリティ プラクティスには、以下の事項を重視した方策が含まれます。
- 入力を安全に取り扱う。ユーザーやシステムからの入力を検証してサニタイズすることは、インジェクション攻撃やその他の悪用をアプリケーション ロジックに到達させず未然に防ぐために役立ちます。
- 信頼できるコンポーネントを構築の基盤にする。セキュリティが確かで適切に維持されているライブラリ、コンテナー イメージ、インフラストラクチャ モジュールを使い、非推奨扱いやサポート外になったコンポーネントを除外すると、既知の脆弱性や構成の誤りにさらされる可能性を減らすことができます。
- テストは、時々ではなく継続的に実施する。自動セキュリティ テスト (静的および動的アプリケーション セキュリティ テスト (SAST、DAST) とソフトウェア構成分析を含む) は、開発ライフサイクルの初期段階と全期間において、問題の発見に役立ちます。
- アクセスの制限を最初から設計に組み込む。最小権限とセキュリティ確保された既定状態を採用すると、アプリケーションの露出を必要最小限のみに抑え、脆弱性が悪用された場合の影響を小さくすることができます。
- 障害発生時のセキュリティを考慮して設計する。アプリケーションを設計する際、エラー発生時には既定の安全な状態に戻って動作するようにします。セキュリティを確保したエラー対応は、機密情報の漏洩を防ぎ、新たな攻撃パスが生まれることを防ぐために役立ちます。
- シークレットと資格情報を保護する。API キー、トークン、資格情報をハードコーディングせず安全な方法で保存すると、意図しない露出や不正アクセスを防ぎやすくなります。
- リリース後もセキュリティを維持する。運用環境内でアプリケーションを監視し、新たに発覚した脆弱性にパッチを適用することは、脅威や環境の変化に応じて継続的なリスク管理を行うために役立ちます。
コード セキュリティの原則
コード セキュリティの考え方の根本は、モダンなアプリケーションの全体にわたってリスクの低減、露出の限定、ガバナンスのサポートを行うために役立つ、確立されたセキュリティ原則です。それらの原則を開発に当てはめると、ソフトウェアの設計、構築、保守のあり方を示す指針になります。
コード セキュリティの主要な 5 原則
- 最小特権。 コードにおけるアクセス許可の付与は、機能するために絶対必要な範囲のみにします。ユーザー、サービス、API のアクセス許可を制限することは、侵害されたコンポーネントが機密データやシステムに到達できる可能性を最小限に抑えるために役立ちます。
- 多層防御。 ソフトウェアのセキュリティ確保には複数の保護レイヤーを使います。入力の検証、認証チェック、暗号化、監視を組み合わせ、1 つの障害によってアプリケーション全体が露出することはないようにします。
- エラー時のセキュリティ確保。 エラーが発生した場合、アプリケーションが既定の安全な状態に戻って動作するようにします。セキュリティを確保したエラー対応によって、機密情報の漏洩を防ぎ、エラーの状況下で新たな攻撃パスが生まれることを防ぎます。
- 既定状態のセキュリティ確保。 後付けではなく既定状態でセキュリティが有効になっているようにします。構成を限定する前提でコードを記述し、たとえば、明示的に変更されない限り最初から制限されたアクセス許可、強力な認証、暗号化された接続を適用します。
- シンプルさ。 シンプルで整然とした構造を持つコードは、セキュリティ保護と保守が容易です。複雑さを減らすと、脆弱性が隠れている可能性が小さくなり、セキュリティ レビューの効果が上がります。
API に最小特権を適用する
最小特権は、とりわけ API とサービスに適用することが重要です。特定のアクションやデータに対するアクセスをどのユーザーやオブジェクトに許可するかを定義するには、ゼロ トラストと ID およびアクセス管理 (IAM) の制御が役立ちます。API エンドポイントにおいては、そこで提供する具体的な機能のために必要なデータとアクションのみを露出させ、バックエンド システムへの広範なアクセスを許可しないようにします。そうすると、資格情報が侵害された場合の影響を限定でき、侵害を封じ込めやすくなります。
最小特権が実際にどのように機能するかを理解しやすいよう、いくつかの一般的な API シナリオを以下に示します。
- ユーザー プロファイルの読み取り専用アクセス。 ユーザー プロファイル情報を取得する API には、基本的なプロファイル データを読み取るためのアクセス許可を付与しますが、レコードの更新や機密フィールドへのアクセスは許可しません。そうすると、資格情報が侵害された場合にも不要なデータを露出させることなく API 機能を提供できます。
- サービスのタスクに特化したアクセス許可。 注文を処理するバックグラウンド サービスには、注文レコードの作成と更新を許可しますが、支払いの詳細や顧客 ID データへのアクセスは許可しません。アクセス許可を限定すると、潜在的な侵害を単一機能のみの範囲に封じ込めやすくなります。
- スコープを限定した管理アクション用アクセス権。 管理タスク用の API には、たとえば資格情報の再設定など特定の操作のみに限定したアクセス許可を付与し、完全なシステム アクセスは許可しません。そうすると、悪用や構成エラーの影響を軽減できます。
- 内部 API と外部 API に与えるアクセス権の分離。 外部向けパブリック API への露出は外部ユーザーに必要なエンドポイントのみに限定し、内部 API には、信頼できるサービス用のより広範なアクセスを許可します。このように分けると、内部ワークフローの速度を低下させずに攻撃面を小さくすることができます。
コード セキュリティと各種セキュリティ分野との結びつき
コード セキュリティは、孤立的に単体で機能するわけではありません。リスクをその発生源で減らし、アプリケーション、クラウド環境、ネットワーク、エンドポイントを含めた全体のセキュリティ制御にサポートと強化をもたらすものです。
- アプリケーション セキュリティ: インジェクション攻撃、安全でない認証、ロジック上の欠陥などといった脆弱性をコードベース内で直接防ぎます。
- クラウド セキュリティ: 構成の誤りや脆弱性を展開前の段階で減らし、クラウドネイティブ アプリケーションの保護を助けます。
- ネットワーク セキュリティ: ネットワーク制御と並行して機能し、不要なサービスやポートの露出がアプリケーションによって発生することを防ぎます。
- エンドポイント セキュリティ: 安全でないコードによってユーザー デバイスや接続されたシステムに脅威が持ち込まれることを防ぎ、リスクを軽減します。
ガバナンス、コンプライアンス、信頼
安全なコーディングのプラクティスは、ソフトウェア開発ライフサイクル全体にわたって一貫した制御を適用するものであるため、コンプライアンスとガバナンスの要件を満たすのに役立ちます。最小特権や既定状態のセキュリティ確保といった原則を適用することにより、組織の活動を規制基準に沿わせ、デュー デリジェンスの履行を示し、監査リスクを減らすことが容易になります。また、これらのプラクティスには、機密情報のアクセス、処理、保護が適切に行われる状態を保ち、より広範なデータ セキュリティ戦略をサポートする働きがあります。
さらに、コード セキュリティは顧客の信頼を守るという点も同じく重要です。早い段階で脆弱性を防止することにより、高コストのインシデント対応を回避し、機密データを保護し、ユーザーにとって必要なアプリケーションへの信頼を保つことができます。
コード セキュリティの標準と管理策
コード セキュリティは、モダンな開発環境全体のリスク軽減に役立つさまざまな管理策とプラクティスをまとめたものです。単一のセーフガードに依存するのではなく複数の保護策を組み合わせて、コードによる実行可能な処理内容や通信方法を限定し、以後のリスク発見およびリスク管理作業の発生量を抑えます。
コード アクセス セキュリティ は、.NET 環境において、アプリケーション、ライブラリ、サービスによるリソース アクセスを制御する重要な役割を担います。アクセス許可を限定することが、脆弱性や侵害されたコンポーネントの影響軽減に役立ちます。
アプリケーション コード内のネットワーク セキュリティ制御は、プロトコル、暗号化、検証ロジックを適用し、通信の保護について重要な役割を担います。トランスポート プロトコルを安全に取り扱うことは、システム間を移動するデータの傍受、改ざん、不正アクセスを防ぐのに役立ちます。
安全なコーディング標準は、より安全なソフトウェアの構築に関する一貫したガイダンスです。Open Web Application Security Project (OWASP) や ISO/IEC 27034 などのフレームワークでは、脆弱性の識別、セキュリティ制御の適用、保護の埋め込みを開発プロセス全体にわたって行うためのプラクティスが概説されています。 クラウド環境ではそれらの標準が IaC にも適用されるため、ID、ネットワーク、ストレージが既定でセキュリティ確保された構成になっていることを展開前に確認するために役立ちます。
脅威モデリング は、アプリケーションの露出がどこに発生する可能性があるかをチームが事前に知るために役立ちます。攻撃パスと潜在的な弱点を早い段階で評価することにより、組織は、脆弱性が運用環境に到達しない段階でリスクに対処しやすくなります。
シークレットと資格情報の安全な取り扱いは、アプリケーションを保護するために不可欠です。キー、トークン、資格情報の保存、ローテーション、アクセスを安全に行うことは、意図しない露出や悪用の防止に役立ちます。
コード セキュリティへの統一的なアプローチ
コード セキュリティは、統合的なクラウド セキュリティ戦略の中で早い段階のライフサイクル管理策として扱うと最も有効に機能し、最初のコード行を書くときから展開時、ランタイムまでアプリケーションを保護し続ける効果を発揮します。
Microsoft のセキュリティは、単体のタスクとしてではなくソフトウェアの設計、開発、テスト、展開に組み込まれた形で実践されるため、イノベーションの速度を低下させることなく容易にリスクを軽減できます。
コード セキュリティをライフサイクル保護に結びつける
クラウド環境においては、アプリケーション コードや IaC に由来する問題はそれだけで孤立的に存在してはおらず、ランタイムの露出とクラウドのセキュリティ態勢を直接的に左右します。コードまたは IaC で導入された脆弱性や構成の誤り (安全でない ID アクセス許可、露出したサービスなど) は、展開後のワークロードに入り込み、ランタイムの露出を作り出す可能性があります。コード セキュリティをより広範なライフサイクル保護と結びつけると、チームは開発時の問題が実際のクラウド リスクに及ぼす影響を理解しやすくなります。つまり、重要度が高い事項の優先度を上げて迅速に修復することができ、アプリケーション ライフサイクルの中で同じ問題が繰り返し発生する状況を防ぎやすくなります。
設計時からのセキュリティ確保を開発ライフサイクル全体に適用する
計画やコーディングから展開、継続的運用までを含む安全な開発ライフサイクル (SDL) の全体にセキュリティが組み込まれ、チームは、リスクを早い段階で見つけて対処しやすくなります。これは、事後対応的な修正ではなく予防的なリスク削減を重視したアプローチです。
実際のリスクの優先順位付けと修復 (コードからランタイムのコンテキストまで)
コード セキュリティにおいては、検出することだけでなく、結果として生じる影響が重視されます。コードからランタイムまでのワークフローには、セキュリティ チームと DevOps チームとのコンテキスト的な断絶を埋めることで、どの問題が実際の運用リスクを生んでいるかの理解、明確な所有権の割り当て、脆弱性の修復を発生源で行いやすくし、リスクがランタイム環境にまで存続することを防ぐ役割があります。
DevOps および CI/CD パイプラインにセキュリティを埋め込む
セキュリティ チェックが DevOps パイプラインに直接統合されて、リリース サイクルを乱すことなく自動テストの実施とポリシーの適用が可能になります。CI/CD にセキュリティを埋め込むと、チームは問題を早い段階で特定し、再作業を減らして、デリバリーへの進行を続けやすくなります。しかも、早期に見つけた問題が展開時やランタイムに再度発覚するリスクは小さくなります。
ガバナンス、コンプライアンス、アカウンタビリティをサポートする
安全なコーディング プラクティスではソフトウェア ライフサイクル全体に一貫した制御が適用されるため、ガバナンスとコンプライアンスをサポートする効果があります。つまり、組織が規制要件を満たし、デュー デリジェンスを示し、アプリケーション リスクの可視性を維持するために役立ちます。
実証済みのプラクティスを大規模に適用する
これらの安全なコーディング原則は、Microsoft のプラットフォームおよびサービスに横断的に適用され、大規模なクラウドネイティブ環境の中で引き続き改良されています。その非常に大規模な現実の経験が、より強力なコード セキュリティ プラクティスを組織全体にわたってサポートするガイダンスとツールの策定に役立てられています。
コード セキュリティの新たなトレンド
アプリケーションの分散化、クラウドネイティブ化、AI 活用が進む状況下で、コード セキュリティは進化し続けています。新しいアプローチにおいて重視されているポイントは、リスク見極めのさらなる早期化、保護の自動化と、ソフトウェア ライフサイクル全体にわたる継続的なセキュリティの維持です。
AI は、コード パターンの分析、脆弱性の特定、高リスクな挙動の大規模検出にますます活用されています。AI 主導のツールは、チームがより迅速に問題を見つけ、静的なルールだけでなく現実のリスクに基づいて修正の優先順位を付けるための助けとなります。
セキュリティを DevSecOps パイプライン内の上流に移すシフト レフト
セキュリティはシフト レフト プラクティスによって開発のより早い段階へと移り、テストが CI / CD パイプラインに直接統合されつつあります。コーディングと構築の段階で脆弱性を特定することにより、チームは再作業を減らし、リリースの遅延を避け、修復コストを抑えることができます。
安全なコーディングにおける自動化と機械学習
安全なコーディング標準の適用、依存関係のスキャン、構成の検証において、自動化はますます重要な役割を担いつつあります。機械学習は、過去の脆弱性から学習することで精度を改善し、重要度の高いリスクにチームの力を集中させやすくしています。
継続的なセキュリティとゼロ トラスト コーディング環境
コード セキュリティの将来像においては、一度限りのレビューではなく継続的評価が重視されています。コードの整合性検証、最小特権の適用、開発からランタイムまでにわたるアプリケーション監視を行うと、ゼロ トラスト原則の対象を開発にまで広げることができます。
Microsoft とクラウド セキュリティ ソリューション
コード セキュリティは、クラウドネイティブの AI 対応アプリケーションを構築するモダンなビジネスにとって必要不可欠です。より広範なクラウド セキュリティ戦略の一環としてソフトウェア開発ライフサイクルにセキュリティを組み込むことは、組織がリスクを減らし、大きなコストを発生させる脆弱性を回避し、信頼を保護しながら規模を拡大するための助けとなります。
安全なコーディングのベスト プラクティス (入力の検証、最小特権の適用、セキュリティ テストの自動化など) に従うと、チームが問題を早い段階で把握でき、運用の安心を確保しやすくなります。実証済みの原則 (既定状態でのセキュリティ確保、多層防御など) は、長期的なレジリエンスを実現するための強力な基盤になります。
コード レイヤーのセキュリティを強化すると、組織は、クラウド セキュリティ態勢を全体的に改善し、開発時の判断を展開時とランタイムにおける保護に結びつけることができます。そうした統合アプローチを導入すると、リスクを増大させずにチームのイノベーションを迅速化しやすくなります。つまり、コード セキュリティはモダンなクラウド アプリケーションのセキュリティを確保するための重要な基盤になります。
よく寄せられる質問
- ソース コード脆弱性とはアプリケーション コードの弱点の一種です。攻撃者はこれを悪用して不正なアクセス権の獲得、システムの停止、データの窃取を行うことがあります。この種の脆弱性は、多くの場合、安全でないロジック、入力の不適切な取り扱い方、古くなった依存コンポーネントや、セキュリティ管理策の不足が原因となって発生します。ソース コード脆弱性を未解決のままにしておくと、その問題が運用環境に入り込み、データ侵害や運用中断のリスクを高めることにつながります。
- コード セキュリティとは、ソフトウェアの開発ライフサイクル内でリスクを見つけて軽減するものであり、ソース コードのセキュリティ確保に役立ちます。安全なコーディングのプラクティス (入力の検証、最小特権の適用、信頼できるライブラリの使用など) を実践すると、脆弱性が発生する可能性を抑えることができます。さらに、セキュリティ テストとコード分析を自動化すると、チームが早い段階で問題を見つけ、安全でないコードが運用に到達することを防ぎやすくなります。
- ソース コードのセキュリティを確保するための方策としては、安全なコーディング プラクティスの遵守、入力の検証、信頼できるライブラリの使用、最小特権の適用や、開発パイプラインに自動化セキュリティ テストを組み込むことが挙げられます。
- バッファー オーバーフロー攻撃は、アプリケーションが入力のサイズを適切に検証していない場合に発生するのが一般的です。攻撃者は、アプリケーションが安全に保持できる量を超えるデータをバッファーに書き込ませてメモリを上書きし、マルウェアを実行させることがあります。この種の脆弱性は、アプリケーション コード内で境界チェックをしていない場合や、安全でない方法でメモリを取り扱っている場合に結果として発生することがよくあります。
- インジェクション攻撃脆弱性は、たいていの場合、ユーザー入力の検証やサニタイズを実行していないことが原因で発生します。アプリケーションがデータベース クエリ、コマンド、スクリプトなどから得た入力を直接処理する際、適切な検証をしていないと、攻撃者によってマルウェアを挿入される可能性があります。インジェクション攻撃を防ぐには、安全な方法で入力を取り扱い、強力な検証策を適用することが不可欠です。
Microsoft Security をフォロー