DevSecOpsによるマルウェア対策|セキュアな開発・運用パイプラインの構築

サプライチェーン攻撃やマルウェア混入のリスクが高まる中、開発段階からセキュリティを組み込むDevSecOpsの重要性が増しています。従来の「開発完了後にセキュリティチェック」では、脆弱性の発見が遅れ、修正コストも膨大になります。本記事では、CI/CDパイプラインへのセキュリティ統合、SAST/DAST/SCAの導入、コンテナセキュリティ、マルウェア混入防止策まで、セキュアな開発・運用パイプライン構築の実践方法を解説します。開発者とセキュリティ担当者が協働するための組織文化づくりにも触れています。

DevSecOpsとは - なぜ今重要なのか

従来の開発とセキュリティの課題

DevSecOpsとは、開発(Development)、セキュリティ(Security)、運用(Operations)を統合したアプローチです。従来のソフトウェア開発では、セキュリティは開発プロセスの最終段階で行われることが一般的でした。しかし、このアプローチには多くの課題があります。

後付けセキュリティの限界として、開発完了後にセキュリティテストを行うと、発見された脆弱性の修正に多大なコストと時間がかかります。設計段階に起因する脆弱性は、コードの大幅な書き換えが必要になることもあります。

リリース直前の脆弱性発見も深刻な問題です。リリース直前に重大な脆弱性が発見されると、スケジュールの大幅な遅延か、リスクを承知でのリリースかという厳しい選択を迫られます。いずれの選択もビジネスに悪影響を与えます。

開発スピードとセキュリティのトレードオフという認識も問題です。従来は「セキュリティを強化すると開発が遅くなる」と考えられていましたが、DevSecOpsはこのトレードオフを解消することを目指します。

観点 従来型アプローチ DevSecOpsアプローチ
セキュリティの位置付け 開発の最終段階でチェック 開発の全段階に組み込み
責任者 セキュリティチームのみ 開発者・運用者も含めた全員
脆弱性発見 リリース直前に集中 早期・継続的に発見
修正コスト 高い(手戻りが大きい) 低い(早期発見・早期修正)
リリース速度 セキュリティで遅延しがち セキュリティも自動化で効率化
フィードバック 遅い(週〜月単位) 速い(分〜時間単位)

マルウェア感染対策の観点からも、開発段階でのセキュリティ対策は重要です。サプライチェーン攻撃では、開発・ビルドプロセスへの侵入により、正規のソフトウェアにマルウェアが混入されるケースが増加しています。

シフトレフトの考え方

シフトレフトとは、セキュリティ活動を開発ライフサイクルの早い段階(左側)に移動させるという考え方です。従来、セキュリティテストは開発プロセスの右側(後半)で行われていましたが、これを左側(前半)にシフトさせます。

早期段階でのセキュリティ組み込み
設計段階でのセキュリティレビュー、コーディング段階での静的解析、ビルド段階での依存関係チェックなど、開発の各フェーズでセキュリティ活動を組み込みます。問題が発見されたら即座にフィードバックし、その場で修正します。
自動化による効率化
セキュリティチェックを自動化することで、開発者の負担を増やさずにセキュリティを強化できます。CI/CDパイプラインにセキュリティスキャンを組み込み、コードがプッシュされるたびに自動的にチェックが実行されます。
開発者のセキュリティ意識向上
セキュリティツールからのフィードバックを日常的に受けることで、開発者自身のセキュリティ意識が向上します。セキュリティはセキュリティチームだけの責任ではなく、全員の責任という文化が醸成されます。

シフトレフトの具体的なメリットとして、脆弱性修正コストの大幅削減(後工程で発見する場合の10分の1〜100分の1)、リリーススケジュールの安定化、セキュリティ品質の向上、開発者のスキルアップなどが挙げられます。

CI/CDパイプラインへのセキュリティ統合

パイプライン設計の原則

CI/CD(継続的インテグレーション/継続的デリバリー)パイプラインにセキュリティを統合する際には、いくつかの設計原則を守ることが重要です。

セキュリティゲートの配置として、パイプラインの各段階にセキュリティチェックポイント(ゲート)を設置します。ゲートを通過できない場合は、次の段階に進めないようにします。ただし、全てのチェックを必須にすると開発が停滞するため、重大な問題のみをブロックし、軽微な問題は警告として扱うなど、段階的なアプローチを取ります。

自動化と手動レビューの組み合わせも重要です。全てを自動化することは現実的ではありません。定型的なチェックは自動化し、設計レビューや重要な判断は手動で行うハイブリッドアプローチが効果的です。

フィードバックループの構築により、セキュリティスキャンの結果は、開発者に迅速かつ分かりやすく伝わるようにします。問題の発見から修正までの時間を短縮することが、DevSecOpsの効果を最大化します。

パイプラインステージ セキュリティチェック ツール例 アクション
コードコミット前 シークレット検出、リンター git-secrets、pre-commit hooks コミットブロック
コードレビュー セキュリティレビュー 手動、GitHub Security マージブロック
ビルド SAST、依存関係チェック SonarQube、Snyk ビルド失敗または警告
テスト DAST、セキュリティテスト OWASP ZAP、Burp Suite テスト失敗
デプロイ前 コンテナスキャン、IaCスキャン Trivy、Checkov デプロイブロック
本番環境 ランタイム保護、監視 Falco、RASP アラート/ブロック

静的解析(SAST)の導入

SAST(Static Application Security Testing)は、ソースコードを解析して脆弱性を検出する手法です。コードを実行せずに分析するため、開発の早い段階で問題を発見できます。

SASTの利点として、開発早期での脆弱性発見、コード行レベルでの問題特定、CI/CDパイプラインへの容易な統合が挙げられます。一方、課題として誤検知(False Positive)の多さ、言語・フレームワークごとのツール対応、チューニングの必要性があります。

主要なSASTツールとその特徴を以下に示します。

SonarQube
オープンソース(Community Edition)と商用版があり、多言語対応です。コード品質とセキュリティの両方を分析できます。DevOpsプラットフォームとの統合が容易で、ダッシュボードも充実しています。
Checkmarx
エンタープライズ向けの商用SASTツールです。高い精度と広い言語カバレッジが特徴です。コンプライアンス対応機能も充実しています。
Fortify
Micro Focus(現OpenText)の商用ツールです。大規模エンタープライズでの採用実績が豊富です。静的解析と動的解析の両方を提供しています。
Semgrep
オープンソースのセキュリティスキャナーです。カスタムルールの作成が容易で、多言語対応です。高速なスキャンが特徴です。

SAST導入のベストプラクティスとして、まずは重大な脆弱性(SQLインジェクション、XSSなど)のみを検出対象とし、徐々にルールを追加していきます。誤検知を放置すると開発者が結果を無視するようになるため、チューニングにより誤検知率を下げる努力が必要です。

動的解析(DAST)の活用

DAST(Dynamic Application Security Testing)は、実行中のアプリケーションに対して攻撃を模擬し、脆弱性を検出する手法です。SASTでは発見できない実行時の問題を検出できます。

DASTの利点として、実行環境での脆弱性検出、言語に依存しない分析、実際の攻撃に近い形でのテストが挙げられます。課題としては、実行環境が必要、スキャンに時間がかかる、認証が必要な画面のテストが難しい点があります。

DASTツール 特徴 ライセンス
OWASP ZAP オープンソースで広く使用、APIスキャン対応 オープンソース
Burp Suite 手動テストと自動スキャンの両方が可能 商用(Community版あり)
Acunetix 高速スキャン、豊富な脆弱性検出 商用
Qualys WAS クラウドベース、継続的スキャン 商用

DASTはテスト環境で実施することが基本です。本番環境でのスキャンは、サービスへの影響やデータの改変リスクがあるため、慎重に計画する必要があります。

依存関係スキャン(SCA)

SCA(Software Composition Analysis)は、ソフトウェアが使用しているオープンソースコンポーネントとその脆弱性を検出する手法です。現代のソフトウェアは多数のオープンソースライブラリに依存しており、そのセキュリティ管理は不可欠です。

サプライチェーン攻撃対応で解説した通り、Log4jのような広く使われるライブラリに脆弱性が発見されると、影響は甚大です。SCAにより、自社のソフトウェアが影響を受けるかどうかを迅速に特定できます。

SCAの機能は主に3つあります。オープンソースの脆弱性検出として、使用しているライブラリに既知の脆弱性(CVE)がないかをチェックします。SBOM生成として、ソフトウェアを構成するコンポーネントの一覧(SBOM: Software Bill of Materials)を自動生成します。ライセンスコンプライアンスとして、使用しているオープンソースのライセンス条件を確認し、違反がないかをチェックします。

SCAツール 特徴 対応言語/パッケージマネージャー
Snyk 開発者フレンドリー、修正提案機能 多言語対応(npm、Maven、pip等)
Dependabot GitHub標準機能、自動PR作成 GitHub対応言語
OWASP Dependency-Check オープンソース、CI統合可能 Java、.NET、Node.js等
Black Duck エンタープライズ向け、包括的分析 広範な言語対応
Trivy コンテナイメージも対応、高速 多言語、コンテナ

コンテナ・クラウドネイティブセキュリティ

コンテナイメージのセキュリティ

コンテナ技術の普及に伴い、コンテナイメージのセキュリティが重要になっています。マルウェアや脆弱性を含むイメージがデプロイされると、本番環境が危険にさらされます。

ベースイメージの選定
信頼できる公式イメージを使用し、必要最小限の機能を持つイメージ(Alpine、Distroless等)を選択します。不要なパッケージやツールが含まれていると、攻撃対象面が広がります。
脆弱性スキャン
コンテナイメージに含まれるOSパッケージやライブラリの脆弱性をスキャンします。Trivy、Clair、Anchorなどのツールを使用し、CI/CDパイプラインに組み込んで自動的にスキャンします。
最小権限イメージの作成
root権限での実行を避け、必要なファイルとバイナリのみを含むイメージを作成します。マルチステージビルドを活用して、ビルドツールを最終イメージに含めないようにします。

コンテナセキュリティチェックリストとして、以下の項目を確認します。

  1. 公式または信頼できるベースイメージを使用しているか
  2. ベースイメージは定期的に更新されているか
  3. 脆弱性スキャンを実施し、重大な脆弱性がないか
  4. 非rootユーザーで実行する設定になっているか
  5. 不要なパッケージ、ツール、シェルが含まれていないか
  6. 機密情報(APIキー等)がイメージに埋め込まれていないか
  7. イメージは署名されているか

Kubernetes/オーケストレーションセキュリティ

Kubernetesなどのコンテナオーケストレーション環境では、追加のセキュリティ対策が必要です。

ポッドセキュリティについては、特権コンテナの禁止、hostNetwork/hostPIDの制限、読み取り専用ファイルシステムの強制などを行います。Pod Security Standards(旧Pod Security Policies)により、これらのセキュリティ基準を強制できます。

ネットワークポリシーでは、デフォルトで全通信を拒否し、必要な通信のみを許可するホワイトリスト方式を採用します。Pod間の不要な通信を制限することで、横展開のリスクを低減します。

シークレット管理として、Kubernetes Secretsの適切な管理、外部シークレット管理サービス(HashiCorp Vault、AWS Secrets Manager等)との連携を行います。シークレットをGitリポジトリにコミットしないことは基本中の基本です。

IaC(Infrastructure as Code)セキュリティ

Terraform、CloudFormation、AnsibleなどのIaCツールで定義されたインフラ設定にも、セキュリティチェックが必要です。

IaCセキュリティスキャンでは、設定ミス(セキュリティグループの過剰な許可、暗号化の未設定など)を検出します。Checkov、tfsec、KICS、Bridgecrewなどのツールが利用可能です。

クラウド設定ミス検出として、AWSやAzure、GCPの設定がセキュリティベストプラクティスに準拠しているかをチェックします。パブリックに公開されたS3バケット、未暗号化のデータベースなど、よくある設定ミスを検出します。

ポリシーアズコード(Policy as Code)では、セキュリティポリシーをコードとして定義し、自動的に適用・監視します。Open Policy Agent(OPA)などを使用して、組織のセキュリティ要件を強制できます。

マルウェア混入防止策

ソースコード管理のセキュリティ

マルウェアが開発パイプラインに混入する経路の一つがソースコードリポジトリです。リポジトリのセキュリティを強化することで、不正なコード混入を防止します。

設定項目 推奨設定 目的
ブランチ保護 mainブランチへの直接プッシュ禁止 レビューを経ないコード混入を防止
必須レビュー 1名以上のレビュー承認必須 悪意あるコードの検出機会を確保
署名付きコミット GPG署名を必須化 なりすましコミットを防止
アクセス制御 最小権限の原則を適用 不正アクセスを防止
監査ログ 全操作のログを記録 インシデント調査に活用
二要素認証 全メンバーに必須化 アカウント乗っ取りを防止

リポジトリアクセス制御では、開発者には必要最小限のリポジトリへのアクセス権のみを付与します。退職者のアクセス権は速やかに削除します。外部コントリビューターには、フォーク&プルリクエスト方式でのみ貢献を許可します。

コードレビューの必須化により、全てのコード変更が他の開発者のレビューを経るようにします。レビューアーは、機能面だけでなくセキュリティ面もチェックします。セキュリティに精通した開発者をセキュリティチャンピオンとして任命し、重要な変更のレビューに参加させることも有効です。

ビルドパイプラインの保護

ビルドプロセス自体がセキュリティリスクとなる可能性があります。SolarWinds事件では、ビルドプロセスへの侵入により、正規のソフトウェアにバックドアが混入されました。

ビルド環境の分離
ビルドサーバーは、開発環境や本番環境から分離し、アクセスを厳格に制限します。ビルドごとにクリーンな環境を使用(エフェメラルビルド環境)することで、環境の汚染を防ぎます。
アーティファクト署名
ビルドされたアーティファクト(バイナリ、コンテナイメージ等)に電子署名を付与します。デプロイ時に署名を検証することで、改ざんされたアーティファクトの使用を防止します。Sigstore/Cosignなどのツールが利用可能です。
再現可能ビルド
同じソースコードから常に同じビルド成果物が生成されるようにします。これにより、ビルドプロセスでの不正な変更を検出しやすくなります。

サプライチェーン攻撃対策

開発に使用するサードパーティのライブラリやツールからのマルウェア混入を防止します。

依存関係の固定として、package-lock.json、yarn.lock、Pipfile.lockなどのロックファイルを使用し、依存関係のバージョンを固定します。予期しない自動アップデートにより悪意あるバージョンが混入することを防ぎます。

プライベートレジストリの活用では、組織内で検証済みのパッケージのみを格納するプライベートレジストリを構築し、外部リポジトリへの直接アクセスを制限します。新しいパッケージの追加時にはセキュリティレビューを必須とします。

署名検証の自動化として、パッケージの署名を検証し、改ざんされていないことを確認します。npm、Maven、pip等でパッケージ署名の検証を有効化します。

組織的マルウェア対策の一環として、サプライチェーンセキュリティを開発プロセスに組み込むことが重要です。

セキュリティ自動化の実装

セキュリティテストの自動化

DevSecOpsの効果を最大化するためには、セキュリティテストを可能な限り自動化することが重要です。

ユニットテストでのセキュリティ
入力値検証、認証・認可ロジック、暗号化処理などについて、セキュリティ観点のユニットテストを作成します。開発者が日常的に実行するテストスイートに含めることで、回帰を防ぎます。
統合テストでの脆弱性検証
認証バイパス、権限昇格、セッション管理などの脆弱性を検証する統合テストを作成します。APIエンドポイントに対するセキュリティテストも含めます。
E2Eセキュリティテスト
本番に近い環境で、エンドツーエンドのセキュリティテストを実施します。DASTツールを使用した自動スキャンもここに含まれます。

監視とアラート

セキュリティ対策は予防だけでなく、検知と対応も重要です。本番環境での監視を自動化します。

ランタイム保護として、RASP(Runtime Application Self-Protection)やFalcoなどのツールを使用して、実行時の異常な動作を検知します。予期しないシステムコール、ファイルアクセス、ネットワーク通信などを監視します。

異常検知では、正常な動作パターンを学習し、逸脱した動作を検知します。機械学習ベースの異常検知システムや、ルールベースの監視システムを活用します。

インシデント自動対応として、検知した脅威に対して自動的に対応するプレイブックを整備します。例えば、不正なコンテナを自動的に隔離する、疑わしい通信をブロックするなどの対応を自動化します。ただし、自動対応による誤動作リスクも考慮し、重要な判断は人間が行う設計とします。

組織文化とスキル開発

開発者のセキュリティスキル

DevSecOpsの成功には、開発者自身がセキュリティ知識を持つことが不可欠です。

セキュアコーディング教育
OWASP Top 10、CWE Top 25などの代表的な脆弱性について、その原因と対策を学ぶ研修を実施します。座学だけでなく、実際に脆弱性を含むコードを修正するハンズオン形式が効果的です。
脆弱性修正のトレーニング
SASTやDASTツールが報告した脆弱性を、開発者自身が修正できるようにトレーニングします。ツールの結果の読み方、修正の優先順位付け、適切な修正方法を学びます。
セキュリティチャンピオン制度
各開発チームにセキュリティチャンピオン(セキュリティに詳しい開発者)を任命します。チャンピオンはセキュリティチームと開発チームの橋渡し役となり、日常的なセキュリティの質問に対応したり、コードレビューでセキュリティ観点のチェックを行ったりします。

ユーザー意識向上と同様に、開発者へのセキュリティ教育は継続的に行う必要があります。

DevとSecの協働

DevSecOpsは、開発チームとセキュリティチームが対立するのではなく、協働することを目指します。

共通言語の確立として、セキュリティチームは開発者が理解しやすい言葉で脆弱性を説明し、開発チームはセキュリティチームに技術的な背景を共有します。相互理解を深めるための勉強会や交流の場を設けることも有効です。

責任共有モデルでは、セキュリティはセキュリティチームだけの責任ではなく、開発者、運用者を含めた全員の責任という認識を共有します。ただし、最終的なセキュリティリスクの判断やポリシーの策定はセキュリティチームがリードします。

成功指標の共有として、セキュリティ指標(脆弱性数、修正時間等)と開発指標(リリース頻度、リードタイム等)の両方をチームで共有します。セキュリティと開発速度がトレードオフではなく、両立できることを示す指標を追跡します。

よくある質問(FAQ)

Q: DevSecOps導入で開発スピードは落ちませんか?
A: 初期導入時は一時的に遅くなる可能性がありますが、長期的には向上します。後工程での手戻りが減少し、リリース直前のセキュリティ問題による遅延がなくなるためです。自動化されたセキュリティチェックは数分で完了し、手動レビューより大幅に効率的です。最初は重大な脆弱性のみをブロック対象とし、徐々に範囲を広げることで、開発チームの負担を段階的に増やすアプローチが効果的です。
Q: どのセキュリティツールから導入すべきですか?
A: 一般的には、依存関係スキャン(SCA)から始めることを推奨します。導入が比較的容易で、サプライチェーン攻撃対策として即効性があります。次に静的解析(SAST)、その後動的解析(DAST)という順序が典型的です。ただし、組織のリスク状況や開発環境によって最適な順序は異なります。まずは無料/オープンソースのツールで試験導入し、効果を確認してから商用ツールを検討するのも良いアプローチです。
Q: SASTツールの誤検知が多くて開発者が結果を無視してしまいます。どうすればよいですか?
A: 誤検知の多さは一般的な課題です。対策として、まずは重大な脆弱性カテゴリのみを有効化し、誤検知の少ないルールから始めます。誤検知のパターンを分析し、カスタムルールで抑制します。どうしても誤検知が多い場合は、別のツールへの変更も検討します。また、開発者からのフィードバックを収集し、継続的にチューニングする体制を作ることが重要です。セキュリティチームと開発チームが協力してチューニングを行うことで、両者の関係構築にも寄与します。
Q: 小規模なチームでもDevSecOpsは導入できますか?
A: 可能です。むしろ小規模チームの方が導入しやすい面もあります。GitHubやGitLabに組み込みのセキュリティ機能(Dependabot、Secret Scanning、SAST等)を活用すれば、追加コストなしで基本的なセキュリティチェックを導入できます。専任のセキュリティ担当者がいなくても、開発者がセキュリティチャンピオンの役割を兼務することで対応可能です。全てを一度に導入しようとせず、最も効果の高い施策から段階的に取り入れていくことをお勧めします。
Q: コンテナイメージのスキャンで大量の脆弱性が報告されます。全て対応すべきですか?
A: 全ての脆弱性に対応することは現実的ではありません。リスクベースで優先順位を付けます。まず、Critical/Highレベルの脆弱性を優先します。次に、実際に悪用可能か(Exploitability)、ネットワーク経由でアクセス可能か、機密データにアクセス可能かなどを考慮します。ベースイメージ由来の脆弱性は、ベースイメージの更新で対応します。また、使用していないパッケージの脆弱性は、パッケージを削除することで解消できます。定期的にベースイメージを更新し、最小構成のイメージを使用することで、脆弱性の総数を減らす努力も重要です。

まとめ

DevSecOpsは、開発のスピードを維持しながらセキュリティを強化するための効果的なアプローチです。シフトレフトの考え方に基づき、開発の早期段階からセキュリティを組み込むことで、脆弱性の早期発見・修正、コスト削減、リリーススケジュールの安定化を実現できます。

CI/CDパイプラインへのセキュリティ統合、SAST/DAST/SCAの活用、コンテナセキュリティ、ビルドパイプラインの保護など、技術的な施策に加えて、開発者のセキュリティスキル向上、DevとSecの協働という組織文化の変革も重要です。

マルウェア感染対策、特にサプライチェーン攻撃対策として、DevSecOpsの実践は不可欠となっています。開発プロセス自体を攻撃から守り、安全なソフトウェアを提供するために、組織全体での取り組みを推進してください。

組織的マルウェア対策の一環として、DevSecOpsを開発プロセスに組み込むことを推奨します。


重要なお知らせ

  • 本記事は一般的な情報提供を目的としており、個別の状況に対する助言ではありません。
  • セキュリティツールの選定は各組織の環境、要件に応じて検討してください。
  • 商用ツールの価格は変動する可能性があります。最新情報はベンダーにご確認ください。
  • オープンソースツールを使用する場合は、ライセンス条件を確認してください。
  • 記載内容は作成時点の情報であり、ツールや手法は日々進化しています。

更新履歴

初稿公開

京都開発研究所

システム開発/サーバ構築・保守/技術研究

CMSの独自開発および各業務管理システム開発を行っており、 10年以上にわたり自社開発CMSにて作成してきた70,000以上のサイトを 自社で管理するサーバに保守管理する。