AWSでのDevSecOps~セキュリティ運用/実装~

広告事業本部でリードデータエンジニアを行なっている大窄 直樹 (おおさこ)です. 前回は, AWSでのログ設計/実装に焦点を当てたブログを書きました. 今回は, AWSでのセキュリティ運用/実装に関する内容をお届けしようと思います!

セキュリティ運用は難しいですよね. 日々新たな脆弱性が次々と発見されており, 脆弱性自体に気づくのも一苦労です. それに加えて, 対応してもお金を生み出すわけではないため, 過剰な対応をするわけにもいかず, 悩ましいところです(笑)

概要

このブログでは, セキュリティの考え方, 及びAWSでDevSecOpsを行う一手法を紹介します. 利用するサービスは以下のとおりです.

  • Security Hub
  • Amazon Inspector
  • Snyk

これらのサービスを使うことで, 開発, セキュリティ, 運用を密接に結びつけ, 効率的なセキュリティ運用を試みます.

準備

セキュリティの考え方

システムにおけるセキュリティを, 下記の3層(インフラ, サーバー, コード)で考えます.

  • AWS(インフラ)
    • VPC, S3など
  • サーバー
    • OS, パッケージなど
  • コード
    • IaC, アプリケーションコードなど

基本的には, どこかに脆弱性が存在すると全体として機能しなくなりますが, 各層での責任範囲を小さくすることで影響範囲を抑えることができます. 具体的には, 各層で下記のように責任範囲を最小化することで, 一部機能が乗っ取られたとしても影響範囲を抑えることができます.

  • AWS: 各インスタンスに付与するIAM権限を最小化
  • サーバー: システムユーザーを作り権限を最小化
  • コード: クラス設計を適切に行い各クラスの権限を最小化

また, 完璧にセキュアにするためには, 日々新たに出る脆弱性について全てに対応する必要がありますが, それら全てに対応するのは現実的に厳しいです. 付け加えて, セキュアにするだけに焦点を当ててしまうと, コストがかかるだけでなく, 足を引っ張り新規開発を行いにくくなることもあります. したがって, 完璧を目指すのではなくバランスよく適切にセキュリティ対策を行うのが重要になってきます.

効率的にセキュリティ対策を行う手法: シフトレフト, DevSecOps

シフトレフトとは, システム開発の工程「企画→要件定義→設計→実装→テスト→リリース」において, 上流でセキュリティ対策を組み込むという考え方です. 機能リリース後に脆弱性対応を行うのではなく, 開発段階でセキュリティ対策を行うことで効率的に施策を行うことができます.

DevSecOpsは, 従来のDevOpsの流れにシフトレフトを組み込んだ手法です. すなわち開発(Development), 運用(Operations)に付け加え, セキュリティ (Security)も統合したものがDevSecOpsになります. この手法を用いることで, 効率的にセキュリティ対応ができ, 安全で信頼性の高いシステムを提供することができます.

DevSecOpsの具体例としては, CI/CDパイプラインに自動化されたセキュリティテストを組み込こむことが挙げられます.

脆弱性に関する重要な用語: CVE, CVSS

CVE (Common Vulnerabilities and Exposures)とは, ソフトウェアやシステムの脆弱性を一意に識別し, 標準化された情報を提供するためのデータベースです. これにより, 複数の企業が脆弱性を発表しても, 一箇所を見るだけで現在発表されている脆弱性一覧を見ることができます.

CVSS (Common Vulnerability Scoring System) は, CVEに対するオープンで汎用的な評価手法です. 脆弱性の影響を定量的に評価し, リスク管理や優先順位付けに役立てることを目的としています.

また, CVSSは, 以下の3つのメトリクスグループで構成されています.

  • 基本評価基準 (Base Metrics):
    • 脆弱性の深刻度を評価するための基準
  • 現状評価基準 (Temporal Metrics):
    • 脆弱性の現状を評価するための基準
  • 環境評価基準 (Environmental Metrics):
    • 環境やシステムにおける脆弱性の影響を評価すための基準

これらのメトリクスからCVSSスコアは算出され, 0.0から10.0までの範囲で表されます. 一般的にこのスコアが, 脆弱性対応の緊急度を表しています.

AWSでのDevSecOps

これまでに, 権限の最小化が重要, シフトレフトが重要, 各脆弱性に対して優先度をつけることが重要と記述してきましたが, これを愚直に運用に乗せるのは難しいです.

そこで, 便利なサービスをたくさん用いましょう!!

今回は私の所属するチームで用いている, 下記の3サービスについて紹介します.

  • AWSのセキュリティ管理サービス: Security Hub
  • サーバーの脆弱性スキャンツール: Amazon Inspector
  • コードの脆弱性スキャンツール: Snyk

Security Hubを用いてAWSのセキュリティ運用

AWSのセキュリティ運用にSecurity Hubを用いています. Security Hubは, AWSが提供するセキュリティ管理サービスで, AWSのセキュリティ状態を包括的に把握しセキュリティ業界標準とAWSのベストプラクティスを満たしているかを評価することができます.

Security Hubには, Security基準としていくつか指標がありますが, 私のチームではAWS 基礎セキュリティのベストプラクティス v1.0.0の指標を追ってます. この指標は, AWSをAWSが推奨した通りに使えてるか, すなわちベストプラクティスに則って利用できているかを下記画像のように確認できます.

Security Hubのスコア画面

AWS 基礎セキュリティのベストプラクティス v1.0.0項目の例として, 下記のようなものがあります. 現時点では, このような項目が256項目存在しています.

私たちのチームでは, 定期的にこのスコア及び違反項目を確認し対応することで, セキュリティスコア100%を維持することを目標にしています. 対応方法については, AWSがこのリンクにまとめてくれています. もちろん, プロダクトの性質により満たせない項目, 料金のかかる項目もあります. そのような項目の場合は, 無理に対応を行うのではなく, 抑制対応をしましょう. また, スコアも100%を目指すのではなく, 重要度がHIGH以上, CRITICAL以上のみ対応のようなルールでも良いと思います.

Amazon Inspectorを用いてサーバの脆弱性運用

EC2インスタンスのセキュリティ運用にAmazon Inspectorを用いてます. Amazon Inspector は, EC2インスタンスのネットワーク到達性や, プラットフォームの脆弱性を診断し, 潜在的なセキュリティ上の問題を発見するための脆弱性管理サービスです.

下記画像のようにEC2の脆弱性を検知してくれます. 私たちのチームでは, 詳細は言えないですが一定期間ごとにCVSSスコアが何点以上のものは対応するといったルールを設け対応しています.

脆弱性対応自体は, 基本的にパッケージのバージョンアップがほとんどで容易いのですが, その後のテストが少々難しいです.

パッケージのバージョンアップにより, メモリ使用率が上がる, CPU使用率が上がる, 動作仕様が変わり正しく動かないなどの可能性もあるので エンドツーエンドテスト, 各指標の確認項目, 切り戻し手順の確認を行ってから対応しましょう.

Inspectorでの脆弱性検出

Snykを用いてコードの脆弱性運用

Snykは, アプリケーションコード, IaCから脆弱性を検出して修正することが可能なツールです. 非常に便利なツールでコードの脆弱性検出から, 脆弱性対応したコードの提示, gitでのPR作成まで行ってくれます. また, 各種エディタのプラグインにも対応しているため使い勝手が良いです.

口頭だとどのような機能かイメージしづらいと思うのでサンプルコードを用意し, Snykでスキャンを行い一部機能を紹介します. 下記画像のように, Dockerfile, Terraform, アプリケーションコードなど幅広い範囲で脆弱性を検出してくれます.

Snykのtop画面

下記画像のように自動で, 脆弱性対応したPRを作成することも可能です.

SnykでのPR作成

下記画像のようにVS Codeにも導入が可能でコードを書きながら自身のコードにセキュリティ上問題がないかスキャンしてくれます.

VSCodeにSnykのプラグインを導入

このように, Snykを用いることで脆弱性が入りにくいコードを書くことが可能です. また, 新たに出た脆弱性に対しても自動でPRを作成してくれるため日々の運用が楽になります.

まとめ

今回のブログではセキュリティの考え方, 及びAWSでDevSecOpsを行う一手法を紹介しました.

Security HubでAWSアカウントをセキュアに保ち

Amazon Inspectorでサーバーをセキュアに保ち,

Snykでコードをセキュア保つことで

脆弱性に強いシステムを構築しましょう !