AWS CloudHSM
AWS CloudHSMは、業界標準のAPIや規格に準拠したクラウドベースのハードウェアセキュリティモジュールで、これを用いることでクラウドで安全に 暗号化キーを生成、保管 できる。AWSのサービスの中では、AWS KMS(Key Management Service)と似た機能を有するが、CLoudHSMはシングルテナント構成で、共通鍵だけでなく 秘密鍵も保管できる 。また、AWS KMSのCMK(カスタマーキー)をCloudHSMで保管することも可能である。
AWS CloudHSMは、業界標準のAPIや規格に準拠したクラウドベースのハードウェアセキュリティモジュールで、これを用いることでクラウドで安全に 暗号化キーを生成、保管 できる。AWSのサービスの中では、AWS KMS(Key Management Service)と似た機能を有するが、CLoudHSMはシングルテナント構成で、共通鍵だけでなく 秘密鍵も保管できる 。また、AWS KMSのCMK(カスタマーキー)をCloudHSMで保管することも可能である。
AWS Organizationsは、 複数のAWSアカウントを統合 するためのアカウント管理サービス。アカウント管理1や 一括請求 機能をはじめとした、以下の機能が備わっている。
これらの機能を実現するために、AWS Organizationsは以下のAWSサービスと連携している。
サービス名 | 有効化 | 実現できること |
---|---|---|
AWS IAM | 不要 | サービスアクティビティ による 最終アクセス時間の確認 |
AWS Artifact | 必要 | 組織契約 による 契約の受諾 |
AWS CloudTrail | 必要 | 組織の証跡 による 証跡の組織への適用 |
AWS CloudWatch Events | 不要 | |
AWS Config | 必要 | アグリゲータ による 集約ビュー の表示 |
AWS Control Tower | 不要 | |
AWS Directory Service | 必要 | |
AWS Firewall Manager | 必要 | AWS Firewall Manager による WAFルールの管理 |
AWS ライセンスマネージャー | 必要 | |
AWS RAM | 必要 | |
AWS Service catalog | 必要 | |
Service Quotas | 不要 | |
AWS シングルサインオン | 必要 | |
AWS System Manager | 必要 | Systems Manager Explorer によるデータの同期 |
タグポリシー | 必要 |
AWS Organizationsを有効化すると、複数のAWSアカウントを一括管理することができる。それぞれのアカウントは、ルートを親として 組織単位 (OU)ごとに分類することができる。アカウントは、 マスターアカウント (=ルート)と メンバーアカウント に分かれ、マスターアカウントにはメンバーアカウントを管理するための様々な権限が付与される。AWS Organizationsの全ての機能を有効化することも、 一括請求機能のみを有効化 することもできる。各OUもしくはアカウント単位に、 サービスコントロールポリシー と呼ばれる各アカウントが持つ権限を明示したポリシーを適用することができる。 サービスコントロールポリシーとタグポリシーは、デフォルトでは無効化されている ので、利用する場合は有効化する。
AWS Organizationsが持つことのできるマスターアカウントは1つのみである。マスターアカウントでOrganizationsを有効化し、その後参加するアカウントを招待することで、メンバーアカウントを追加することができる。 マスターアカウントはサービスコントロールポリシーの影響を受けない 。Organizationsを削除すると復元できず、またポリシーも削除される。削除する際には、 全てのメンバーアカウントを消去する必要 がある。
Organizationsに参加したメンバーアカウントでは、サービスコントロールポリシーやタグポリシーが即座に適用され、またサービスの信頼を有効化している場合は、そのサービスからメンバーアカウントに対してアクションを実行することが許可される。また、Organizations内で新規のメンバーアカウントを作成することもできる。
サービスポリシーは、 最大で使用できるアクセスの権限を各アカウントに対して指定できる機能 。アカウントのルートユーザにも適用され、アカウントに与える影響が非常に大きいため適用する際には詳細のテストが必要である。IAMのサービスアクティビティに表示される、各アカウントの最終アクセス時刻を参考にポリシーの内容を決定することが望ましい。
サービスポリシーは以下のタスクには影響しない。
サービスポリシーは、IAMポリシーとほぼ同じ構文を使用する。複数のポリシーが適用されている場合は、明示的なDenyがAllowよりも優先される。ポリシーの例は、 サービスコントロールポリシーの例 を参照のこと。
タグポリシーを用いることで、タグキーおよびタグ値の大文字と小文字の処理方法の設定などを規定することができる。デフォルトでは、タグポリシーへのコンプライアンスの強制はされない。強制をサポートするAWSサービスは 強制をサポートするサービスとリソースタイプ を参照のこと。
AWS Shieldは、 DDoS攻撃 に対する保護を行う。 AWS Shield Standard
は、追加料金なしで全てのユーザが使用できるサービスで、ウェブサイトやアプリケーションを標的とする、一般的かつ頻繁に発生するネットワークおよび転送レイヤーの DDoS 攻撃を防御する。
AWS Shield Advanced
は、Amazon Elastic Compute Cloud、Elastic Load Balancing (ELB)、Amazon CloudFront、Amazon Route 53、AWS Global Acceleratorなどに対して行われる 高度な攻撃に対応する拡張保護を提供する 。AWS Shield Advanced を利用中にDDoS攻撃を受けた際には、 DDoS response team (DRT) にサポートを依頼できる。また、AWS Shield Advancedには、 AWS WAFが無償で付帯 されている。なお、DRTのサポートを受けるためには、 ビジネスサポートプラン以上の契約 が必要である。
多くの場合は、 AWS Shield Standard
のみで対処可能である。
DDoS攻撃は、一般的に以下のようなタイプに分類される。 AWS Shield Advanced は、これらのDDoS攻撃にも対応可能である。
名称 | 内容 |
---|---|
UDP反射型攻撃 | リクエストの発生元を偽装し、UDP を使用してサーバーから大量のレスポンスを引き出す |
SYN フラッド | 接続を半開状態にして、システムの利用可能なリソースを枯渇させる |
DNS クエリフラッド | DNS クエリを使用して DNS サーバーのリソースを枯渇させる |
レイヤー 7攻撃 | ウェブアプリケーションの実際のユーザーからのように見せかけて多数の HTTP リクエストを送信する |
AWS WAFは、Amazon API Gateway
、Amazon CloudFront
、Application Load Balancer
に転送される HTTP および HTTPS リクエストをモニタリングできるWAF。
ことができる。これらを設定する際には、
などを条件として指定できる。また、 DDoS攻撃の影響を最小限に抑えることが可能な AWS Shield
と組み合わせて使用することもでき、これらのサービスを簡単に管理可能な AWS Firewall Manager
が用意されている。WAFは、ルールの複雑性が加味された Web ACl Capacity Unit 単位で課金される。
CloudFrontと併用する際には、WAFが返却したレスポンスに応じてカスタムエラーページを表示 したり、 CloudFrontの地理的ブロッキング機能と同時に使用する ことができる。
Web ACLは、表示された リスト順に評価 され、ルールに一致するリクエストを 許可 , ブロック , カウント することができる。また、どのルールにも一致しないリクエストをどのように処理するかを定める デフォルトアクション を指定することができる。
WEB ACLに追加可能なルールセットである、ルールグループ を規定することができ、あらかじめAWSやベンダーが作成した、マネージドルールグループ を使用/購入することもできる。ルールグループにはデフォルトアクションが設定されておらず複数のWEB ACLに同一のルールグループを適用することができる。
グループ名 | WCU | 内容 | 利用シーンと効果 |
---|---|---|---|
Admin protection | 100 | 公開されている管理ページへの外部アクセスをブロックするためのルール | サードパーティーのソフトウェアを実行している場合や、悪意のあるアクターがアプリケーションへの管理アクセスを得るリスクを軽減したい場合 |
Amazon IP reputation list | 25 | ボットやその他の脅威に関連付けられている IP アドレスをブロック | ボットを軽減したい場合 |
Core rule set | 700 | ウェブアプリケーションに一般的に適用可能なルール | |
Known bad inputs | 200 | 脆弱性の悪用または発見に関連するリクエストパターンをブロックするルール | 悪意のあるアクターが脆弱なアプリケーションを発見するリスクを軽減 |
Linux operating system | 200 | Linux 固有の脆弱性の悪用に関連するリクエストパターンをブロック | 攻撃者がアクセスしてはならないファイルの内容を公開したり、コードを実行したりする攻撃を防ぐ |
PHP application | 100 | 安全でない PHP 関数のインジェクションなど、PHP プログラミング言語の使用に固有の脆弱性の悪用に関連するリクエストパターンをブロックするルール | 攻撃者が許可されていないコードまたはコマンドをリモートで実行できる脆弱性の悪用を防ぐ |
POSIX operating system | 100 | POSIX および POSIX と同等のオペレーティングシステムに固有の脆弱性の悪用に関連するリクエストパターンをブロックするルール | アクセスしてはならないファイルの内容を公開したり、コードを実行したりする攻撃を防ぐ |
SQL database | 200 | SQL Database ルールグループには、SQL インジェクション攻撃などの SQL データベースの悪用に関連するリクエストパターンをブロックするルール | 不正なクエリのリモートインジェクションを防ぐ |
Windows operating system | 200 | PowerShell コマンドのリモート実行など、Windows 固有の脆弱性の悪用に関連するリクエストパターンをブロックするルール | 悪意のあるコードを実行したりする脆弱性の悪用を防ぐ |
WordPress application | 100 | WordPress サイト固有の脆弱性の悪用に関連するリクエストパターンをブロックするルール |
ログ記録を有効化することで、WEB ACLで分析されるトラフィックの詳細情報を取得することができる。ログ記録を有効化すると Kinesis Firehose経由で指定した場所にログが保存される 。
また、CloudWatchアラームで特定のメトリクスをモニタリング することができるほか、CloudTrailによるアクションレコードの保存にも対応している。
FireWall Managerを用いることで、AWS WAF Classic ルール、AWS Shield アドバンスド 保護、 Amazon VPC セキュリティグループ を有効化することができ、これにより組織全体の保護を行ったり、リソースの頻繁な追加に対応し、組織全体のDDoS攻撃を一元的に監視することができる。 FireWall Managerを使用するためには、AWS Organizationのメンバーである必要 がある。
AWS System Manager は、統合インタフェースでインフラを可視化し、EC2のみならず オンプレミス上のサーバ を含めたさまざまなリソース( マネージドインスタンス )を管理し表示することができる。これによりモニタリングやトラブルシューティング、リソースとアプリケーションの管理などを迅速に行うことができる。
これらのリソースは、リソースグループ と呼ばれるグループごとに分類でき、状態をダッシュボード上から俯瞰することができるため、アプリケーションに影響を当てる可能性のあるリソースをすばやく特定することができる。また、OSのパッチレベルやソフトウェアのインストール状況なども簡単に確認することができる。
また、インスタンスの停止や再起動などの 運用タスクの自動化 や、リモートからのパッチの適用や設定の変更などができるため、ヒューマンエラーや運用負荷の軽減を図ることが可能である。
なお、System Managerは、過去に Simple Systems Manager と呼ばれていたため、現在も略して SSMと呼称される。
System Managerを用いることで、以下を行うことができる。
カテゴリ | サービス名 | 内容 |
---|---|---|
運用管理 | Explorer | 運用データ(OpsData)を集約して表示するダッシュボード |
運用管理 | OpsCenter | 運用作業項目(OpsItems)の表示と調査 |
運用管理 | CloudWatch Dashboards | メトリクス の表示 |
運用管理 | Trusted Advisor & Personal Health Dashboard (PHD) | プロビジョニングとヘルスイベントの表示 |
アプリケーション管理 | Resource Groups | AWSリソースの グループ化 |
アプリケーション管理 | AWS AppConfig | アプリケーション設定 を作成、管理、迅速にデプロイ |
アプリケーション管理 | Parameter Store | 設定データ 管理と 機密管理 のための安全な階層型ストレージ |
アクションと変更 | Automation | メンテナンスとデプロイの自動化 |
アクションと変更 | Maintenance Window | タスクのスケジュール を設定 |
インスタンスとノード | 設定コンプライアンス | パッチと設定の不一致を確認 |
インスタンスとノード | インベントリ | ソフトウェア インベントリの収集 |
インスタンスとノード | マネージドインスタンス | インスタンスの セットアップ |
インスタンスとノード | アクティベーション | オンプレミス上のノードの承認 |
インスタンスとノード | Session Manager | ブラウザベースの シェルでアクセス |
インスタンスとノード | Run Command | リモートから コマンドを実行 |
インスタンスとノード | State Manager | インスタンスを 定義された状態 に保つ |
インスタンスとノード | Patch Manager | パッチ の適用 |
インスタンスとノード | Distributor | パッケージの作成 |
共有リソース | ドキュメント | Systems Manager が実行する アクションを定義 |
SSM Agentは、EC2 や オンプレミスサーバ にインストールすることのできるソフトウェアで、System Managerはこのソフトウェアを介して、これらのリソースの更新や管理、設定を行うことができる。 EC2上で提供されているWindows ServerやAmazon Linux、 Ubuntu ServerのAMIには、あらかじめSSM Agentがインストールされている。Systems Manager エンドポイントとの間でHTTPS通信を確立する必要があり、HTTP Proxy経由で通信する設定にすることもできる。なお、このエージェントの動作ログは以下の場所に格納されている。
SSM Agentの実行にはroot権限が付与 されていることから、このSSM Agentを用いて SendCommand や StartSession コマンドを行うことが可能なAWS上のIAM ユーザ等の管理や権限付与には注意する必要がある。SSM Agentをリリースのたびに更新し最新のバージョンを保持するためには、マネージメントコンソール上のマネージメントインスタンスのページから、Agent auto update (エージェントの自動更新)を選択する。
Explorerは、AWSリソースの情報を表示するダッシュボード。AWSアカウント全体もしくは当該リージョンの Amazon EC2 、 Systems Manager OpsCenter 、 Systems Manager Patch Manager などから運用データを取得し、これを一覧で確認することができる。
Explorerでは、 タグで情報をフィルタリング したり、 リソースデータの同期 機能を用いて、 複数のアカウントの情報を横断的に閲覧する こともできる。
OpsCenterは、運用データを表示・調査・解決するための場所である。これを用いることで、各事象に対して迅速な対応が可能。
パラメータストアは、設定データ 管理と 機密管理 のための安全な階層型ストレージを提供し、パスワードや認証情報などを安全に保存できる。これらの情報には、作成時に定義した一意の名前を用いてアクセスできる。また、以下のAWSサービスと接続し、パラメータストアの情報を提供する。
パラメータストアは、 String と String List ,、Secure String をサポートしている。Secure Stringは、KMS-CMK (カスタマーマスターキー)を用いて暗号化される。また、パラメータには、デフォルトパラメータと アドバンストパラメータ が用意されている。前者から後者への移行は可能であるが、 その逆はできない 。アドバンスパラメータは、許可される パラメータ数やデータサイズが緩和 され、かつ パラメータポリシーが規定できる が 課金 される。
パラメータは 階層状 に管理できる。階層構造にすることで管理がしやすく、また 同一階層のデータを一括して取得することもできる 。パラメータポリシーを付加することで、 有効期限や失効期限 などを定めることができる。
パラメータにはタグを付与できる。また、更新されるたびに バージョン がインクリメントされる。パラメータラベル と呼ばれるエイリアスを指定することもできる。
AWSが提供しているパブリックパラメータを使うことで、AMIやリージョンの最新の情報を取得できる。
コンプライアンスは、マネージドインスタンスをスキャンして、パッチコンプライアンスと設定の不一致を確認することができる 。具体的には、Patch Manager によるパッチ適用 と State Manager による Association に関するコンプライアンスデータ が表示される。また、 設定変更履歴をConfigから取得 したり、コンプライアンスをカスタマイズして 独自のルールを作成 したり、Run Command や State Manager を使って問題を修復 できる。
Resource Data Sync を用いることで、全てのマネージドインスタンスからのコンプライアンスをS3に蓄積/集約することができる。これらのデータは、Amazon Athena および Amazon QuickSight で可視化することもできる。データを蓄積するS3には、System Managerからのデータ書き込みを許可する Bucket Policy の作成が必要。
インベントリを使用することで、 マネージドインスタンスからメタデータを収集 することができる。収集できるメタデータは、以下の通り。
カテゴリ | 内容 |
---|---|
アプリケーション | アプリケーション名、発行元、バージョンなど |
AWS コンポーネント | EC2 ドライバ、エージェント、バージョンなど |
ファイル | 名前、サイズ、バージョン、インストール日、変更および最新アクセス時間など |
ネットワーク設定の詳細 | IP アドレス、MAC アドレス、DNS、ゲートウェイ、サブネットマスクなど |
Windows 更新 | Hotfix ID、インストール者、インストール日など |
インスタンスの詳細 | システム名、オペレーティングシステム (OS) 名、OS バージョン、最終起動、DNS、ドメイン、ワークグループ、OS アーキテクチャなど |
サービス | 名前、表示名、ステータス、依存サービス、サービスのタイプ、起動タイプなど |
タグ | インスタンスに割り当てられるタグ |
Windows レジストリ | レジストリキーのパス、値の名前、値タイプおよび値 |
Windows ロール | 名前、表示名、パス、機能タイプ、インストール日など |
カスタムインベントリ | カスタムインベントリの操作 に説明されるようにマネージドインスタンスに割り当てられたメタデータ |
これらのデータも、上述の Resource Data Sync でS3に保存することができる。インベントリのセットアップは、SSMドキュメントの AWS-GatherSoftwareInventory を Association で実行することによって実現できる。
Run Commandを使用することで、マネージドインスタンスにログインすることなく安全に、管理タスクを実行することができる。Run Commandを実行するためには、コマンドを発行するIAM ユーザに実行権限を付与する必要がある。また、対象のインスタンスに対しても、 IAMインスタンスプロファイルを作成して適用する 必要がある。
State Managerは、EC2等を定義された状態に保つプロセスの自動化を行う。例えば、起動時に特定のソフトウェアをインストールする、ネットワークを構成する、ソフトウェアの更新を行うなどのタスクを行う。
Patch Managerは、セキュリティ関連などのパッチをマネージドインスタンスに対して適用するプロセスの自動化を行う。 ベースライン と呼ばれるパッチの適用ルールには、 リリースから数日以内に自動承認されるルール と、 承認済みおよび拒否済みパッチのリスト が含まれている。サポートされるOSは、 パッチマネージャーの前提条件 を参照のこと。各OSには、パッチ適用用のリポジトリが用意されており、これを指定するか、 代替パッチソースリポジトリ を指定することもできる。
AWSによってあらかじめ用意されている定義済みパッチベースラインの場合、
などのルールが事前に定められている。これらのパッチを適用する対象のインスタンスをグループ化するために、 パッチグループ を作成することができる。パッチグループは、 1 つのパッチベースラインにのみ登録できる。また、SSMドキュメントの AWS-RunPatchBaseline を適用する際に、対象のインスタンス等を指定することもできる。 パッチが適用されるとインスタンスは再起動される 。
SSMドキュメントは、マネージドインスタンスで実行するアクションを定義するスクリプト。SSMドキュメントには、以下のタイプが用意されている。使用可能なスキーマバージョンやフォーマット等が定められているため、利用する際には ドキュメントを参照のこと。AWSが提供する Automation ドキュメントの名称や挙動は、Systems Manager Automation ドキュメントの詳細リファレンスを参照する。また、公式ドキュメントは存在しないが、AWSが提供する Command ドキュメントも多数存在する。
タイプ | 内容 | Schema | Run Command | State Manager | Automation | Maintenance Window | Distributor | Session Manager | Change Calendaer |
---|---|---|---|---|---|---|---|---|---|
Command | 設定の適用 | 1.2, 2.0, 2.2 | ○ | ○ | ○ | ||||
Automation | タスクの実行 | 0.3 | ○ | ○ | ○ | ||||
Package | ソフトウェア | ○ | |||||||
Session | セッションの定義 | ○ | |||||||
Policy | AWS-GatherSoftwareInventory を使用したインベントリデータの取得 | 2.0- | ○ | ||||||
Change Calendaer | カレンダーエントリ | ○ |
AWS CloudFormationは、AWSのリソースのモデル化およびセットアップを行うことができるサービスで、テンプレートを作成すれば、CloudFormationがこのテンプレートに沿ってリソースのプロビジョニング等を行う。CloudFormationを使用することで以下のようなメリットが生じる。
CloudFormationの テンプレート はAWSリソースを作成する際の設計図の機能を持ち、JSONもしくはYAML形式で記述することができる。YAML形式のみコメント機能が使用できる。このテンプレートを元にプロビジョニングされたAWSリソースは、スタック と呼ばれる単一ユニットとして管理される。スタックは、作成や変更、削除が可能で、変更時には変更概要を示した 変更セット が作成される。変更前に変更セットを確認することで、この変更がリソースに与える影響を事前に検証することができる。
CloudFormationはCloudTrail
と統合されており、CloudFormation内でのアクションをログに記録する。
CloudFormationを実行する際にリソースタグを付与することができるが、当該スタックに含まれるリソース全てに対してこのタグが伝搬する訳ではない。また、リソースによってはリソースタグの付与自体ができないことに注意が必要である。
入力パラメータ、マッピングなど、テンプレート内部で使用するパラメータの数には上限値が存在する。また、テンプレート自体のファイルサイズの上限も存在するため、上限を超過する場合には、S3バケットに対して事前にテンプレートをアップロードする か、 複数のネステッドスタックにテンプレートを分割 する必要がある。
CloudFormationが作成できるAWSリソースは、CloudFormationを実行したユーザが持つアクセス権限に含まれるもののみ である。もしくは、AWS CloudFormation サービスロール
と呼ばれるCloudFormationにリソースの作成や更新、削除を許可するIAMロールを割り当てることもできる。なお、特定の機能が含まれるテンプレートについては、実行時に以下を了承する必要がある。
機能 | 内容 |
---|---|
CAPABILITY_IAM | IAMリソースが含まれている場合 |
CAPABILITY_NAMED_IAM | 自身で命名したIAMリソースが含まれている場合 |
CAPABILITY_RESOURCE_POLICY | リソースポリシーが含まれている場合 |
CAPABILITY_AUTO_EXPAND | ネストされたアプリケーションが含まれている場合 |
IAMロールでは、リソースタイプやテンプレートURLなどを 限定 して、CloudFormationスタックの作成や削除を許可したり拒否したりすることもできる。
CloudFormationテンプレートには、作成や設定したいAWSリソースを宣言することができ、以下のセクションが用意されている。
セクションタイプ | 設定内容 |
---|---|
AWSTemplateFormatVersion | 形式バージョン |
Conditions | 制御条件 |
Description | テンプレートを説明するテキスト文字列, AWSTemplateFormatVersionの後に記述する |
Mappings | プロビジョニング先のリージョンなどの条件に合わせて参照先が変更可能なパラメータ |
Metadata | 追加情報, AWS::CloudFormation::Designerはデザイナーのレイアウト情報を含む |
Outputs | 出力パラメータ |
Parameters | 入力パラメータ |
Resources | AWSリソースの指定 |
Transform | テンプレートを処理するマクロを指定 |
設定変更するプロパティによっては、既存のリソースに影響が発生する可能性がある。例えば、アップデート中に リソースが一旦停止 する場合や、変更自体ができないリソースも存在 する。
Parameters
セクションで入力パラメータを定義することができ、入力パラメータを指定してテンプレートを実行することで、 各種パラメータをカスタマイズ することができる。デフォルト値を持つ入力パラメータは、ユーザが別の値を入力しない限りデフォルト値が適用される。一方で、プロビジョニング済みのリソースで、かつマネージメントコンソールから操作をする場合は、ユーザが別の値を入力しない限り 現在の設定値が適用 される。入力パラメータには、以下の項目で値に制約を与えることができる。
指定できるパラメータのデータ型は、String
, Number
, List<Number>
, CommaDelimitedList
, AWS 固有のパラメーター型
, SSM パラメータータイプ
の6タイプがサポートされている。機密データには、 NoEcho
属性を指定するとよい。
型 | 制約タイプ |
---|---|
String | MinLength, MaxLength, Default, AllowedValues, AllowedPattern |
Number | MinValue, MaxValue, Default, AllowedValues |
Mappings
セクションは、キーと名前付き一連データとかが対応付けられる。これを用いることで、リージョンごとに異なるリソースの設定値を一括して管理することができる。これらの値は、FindInMap
関数で取得することができる。
Mappings
セクションでは、リソースを設定するか否かを判定する条件を定義することができ、この値が true
の場合のみ、当該のリソースを作成することができる。なお、スタック更新時に、Conditions のみを単独で更新することはできず 、リソースの追加や変更などが存在する場合に、 Conditions も再評価される。
Resources
セクションでは、スタックに含めるAWSリソースを宣言する。conditionsセクションと組み合わせることで、条件付きでリソースを作成 できる。
他のスタックにインポートする値、もしくはCloudFormationコンソールに表示する出力値を宣言する。 Exports
属性を追加して、 クロススタック参照 に対応することもできる。
Resources
にリソース属性 を指定することで、リソースの追加や削除の際の挙動を制御することができる。
指定数の成功シグナルやタイムアウトが過ぎるまでは作成完了とならないようにする
プロパティ | 内容 |
---|---|
AutoScalingCreationPolicy | いくつのインスタンスが成功すると更新を続行するか |
ResourceSignal | 関連リソースを作成する際に必要なシグナル数 |
スタックが削除されたときやリソースを置き換える際の動作を規定する。スナップショットが有効なリソースは、EC2ボリューム 、 Elasticache 、 Neptureクラスタ 、 RDSクラスタ/インスタンス 、Redshiftクラスタ である。
プロパティ | 内容 |
---|---|
Delete | 削除する( DBクラスタ以外のデフォルト ) |
Retain | スタックを削除してもリソースを削除しない |
Snapshot | 削除する前にスナップショットを作成する(DBクラスタのデフォルト) |
AutoScalingGroup、Lambdaエイリアス、ElastiCacheレプリケーショングループの更新方法を指定する。
他のリソースに続けて作成されるように指定する。 Ref関数でリソースを参照する場合などは、暗黙的に依存関係が構築されるので記述の必要はない 。
構造化データを関連づける。
CloudFormationには、スタックの管理に役立つ組み込み関数があらかじめ用意されている。
関数名 | 実行内容 |
---|---|
Fn::Base64 | Base64エンコード |
Fn::Cidr | CIDR アドレスブロックの配列を返す |
Fn::FindInMap | Mappings セクションから値を返す |
Fn::GetAtt | 属性の値を返す |
Fn::GetAZs | 指定されたリージョンのアベイラビリティーゾーンを含んだ配列を返す |
Fn::ImportValue | 別のスタックの出力値を返す |
Fn::Join | 複数の値を連結する |
Fn::Select | リストから1つのオブジェクトを返す |
Fn::Split | 文字列を分割する |
Fn::Sub | 変数を文字列に組み込む |
Fn::Transform | テンプレートをカスタム処理するマクロを指定する |
Ref | 指定したパラメータまたはリソースの値を返す |
Fn::Sub
や Ref
で取得した値に対して四則演算等を行うことはできない。また、CloudFormationテンプレートのキー値に対して、 Fn::Sub
や Ref
などを用いて値を代入することもできないl。
条件付きでリソースを作成する場合に使用する。Fn::If以外は、Conditions
セクションで使用する。
関数名 | 相当する演算子 |
---|---|
Fn::And | and |
Fn::Equals | == |
Fn::If | if |
Fn::Not | != |
Fn::Or | or |
擬似パラメータと呼ばれる事前に定義されたパラメータを使用することができる。
パラメータ名 | 内容 |
---|---|
AWS::AccountId | スタックが作成されているアカウントの AWS アカウント ID |
AWS::NotificationARNs | 現在のスタックの通知 Amazon リソースネーム (ARN) のリスト |
AWS::NoValue | 指定なし |
AWS::Partition | AWSパーティション |
AWS::Region | AWSリージョン |
AWS::StackId | スタックID |
AWS::StackName | スタック名 |
AWS::URLSuffix | ドメインのサフィックス |
AWS SAMは、サーバレスアプリケーションを構築するための オープンソース フレームワークであり、数行の設定のみで、必要なアプリケーションを定義できる。AWS SAMは、CloudFormation拡張テンプレート仕様 および AWS SAM CLI コンポーネントから構成される。
AWS SAMを使用することで、関連するコンポーネントとリソースの整理、操作が単一のスタックで管理できる。また、メモリやタイムアウト値などの設定値をリソース間で共有することも可能である。また、CloudFormationの拡張機能 であるため、 CloudFormationに対応するリソースと組み合わせてリソースを管理することができる。
AWS SAMには、ローカルの開発環境でLambda実行環境と同等の機能を提供する。これを用いることで、AWS上にデプロイする前に、ローカルの開発環境で動作や問題等を確認することができる。
また、Lambdaを安全にデプロイするために、 一定期間の間に段階的に新しいバージョンをデプロイすることも可能 である。
プロジェクト名として指定したディレクトリの下に、sam-app
ディレクトリと、SAMプロジェクトおよびサンプルテンプレートを作成する。
SAMテンプレートが有効であるかどうか検証する。AWS CLI Configureにてデフォルトリージョンを設定していない場合には、以下のように環境変数を与える必要がある。
env AWS_DEFAULT_REGION=ap-northeast-1 sam validate
sam-app
ディレクトリ直下に .aws-sam
を作成し、この下に、指定した実行環境をターゲットとする デプロイメントアーティファクト を作成する。例えば、LambdaをPythonで記述した場合に、 requirements.txt
にて依存関係のあるライブラリを指定することができるが、 sam build
はこれらの依存関係を適切に処理する。
デプロイメントアーティファクト を圧縮してS3にアップロードする。また、パッケージ化されたSAMテンプレート(packaged.yaml
)を作成する。パッケージ化されたSAMテンプレートには、S3にアップロードした デプロイメントアーティファクト へのリンク先が記述されている。sam deploy
コマンドは、 sam package
コマンドを暗黙的に実行するため、本来は sam deploy
コマンドを実行するだけでよい。
アプリケーションのデプロイを行う。 --guided
パラメータを付与することで、インタラクティブモードを起動することができる。
Lambdaが生成するログを確認することができる。
SAMテンプレートには、 Globals
セクションが設けられており、ランタイムやメモリなどの共通設定をこれに格納することができる。なお、以下のプロパティはサポートされていない。
Function:
Role:
Policies:
FunctionName:
Events:
Api:
StageName:
DefinitionBody:
SAMテンプレートでは、以下のリソースタイプがサポートされている。AWS :: Serverless :: LayerVersion
のみ DeletionPolicy
をサポートしている。また、 AWS :: Serverless :: Api
内で記述するOpenAPIドキュメントは、 一部のAPI Gateway拡張(x-amazon-apigateway-) のみサポートしていることに注意が必要である。
タイプ | 作成されるリソース | 備考 |
---|---|---|
AWS :: Serverless :: Api | API Gateway | OpenAPIを使用してAPIを定義する |
AWS :: Serverless :: Application | SAM | Serverless Application Repositoryのリソースをデプロイ可能 |
AWS :: Serverless :: Function | Lambda, IAM Role | |
AWS :: Serverless :: HttpApi | API Gateway Http Api | |
AWS :: Serverless :: LayerVersion | Lambda Layer Version | |
AWS :: Serverless :: SimpleTable | DynamoDB | プライマリキーのみのテーブルを作成 |
SAMでは、Lambdaのアクセス許可をポリシーテンプレートという形で指定することができる。ポリシーテンプレートは、あらかじめAWSが用意したポリシーパターンである。
sam local
コマンドを用いることでローカルで、API GatewayやLambdaを実行させることができ、開発環境でアプリケーションの動作を検証することができる。
Amazon Inspectorは自動化されたセキュリティ評価サービスで、AWS上にデプロイされた アプリケーションに脆弱性やベストプラクティスからの逸脱などがないかを自動的に評価 し、重大性の順に項目を並べた結果リストの作成を行う。このサービスを利用することで、EC2への意図しないネットワークアクセスや脆弱性をチェックすることができ、アプリケーションのセキュリティとコンプライアンスを向上することができる Inspectorを使用することで、システムの脆弱性診断を自動化できる。
Inspectorを使用する前に、サポートしているOS, リージョン等を確認する。また、対象のEC2インスタンスにInspectorエージェントをインストールする。インストールの際にはroot権限が必要で、System Managersの AmazonInspector-ManageAWSAgent ドキュメントを実行することで、リモートからエージェントをインストールすることも可能である。また、エージェントをインストールしたインスタンスは、テレメトリデータのやりとりのために、Inspectorのエンドポイントと通信できるようにする必要がある。なお、エージェントプログラムに更新が発生する場合は、自動的に適用されるため、手動による管理は不要 。
Inspectorが評価を行う対象のインスタンスは、評価ターゲット で規定する。タグベースで指定 することも、 全てのインスタンスを指定 することもできる。
Amazon Inspectorは、指定されたターゲット内のリソースから動作や設定データを収集し、これらの情報と指定されたルールパッケージとの比較を行う。ターゲットのEC2にエージェントをインストールすることで、これらの動作を実行することが可能となる。また、ネットワーク到達可能性ルールパッケージに関しては、エージェントレスで評価を実行することができる。
指定したルールには重要度が規定されており、重要度の大きな順から、 High , Medium , Low , Informational の4つのレベルが定められている。ルールパッケージは、
の4つのルールパッケージに分類されており、どのパッケージを適用するか指定することができる。これらのルールは、 CloudWatch Eventsなどから指定した時刻に起動 することも、手動で評価を開始することもできる。
評価後の結果には、奨励される対応策 も記述される。何らかの理由で対処できない問題については、結果から除外することもできる。
CloudRrailはCloudFormationに対応しているため、CloudFormation経由でAmazon Inspectorをセットアップすることができる。
Amazon Inspector
で使用する Service-Linked Role
と IAM Role
を作成する。
Resources:
ServiceLinkedRoleForInspector:
Type: AWS::IAM::ServiceLinkedRole
DeletionPolicy: Retain
Properties:
AWSServiceName: inspector.amazonaws.com
Description: A service-linked role required for Amazon Inspector to access your resources.
IAMRoleForInspectorEvents:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: events.amazonaws.com
Action: 'sts:AssumeRole'
Description: A role required for CloudWatch Events to access Inspector.
Policies:
- PolicyName: !Sub 'DefaultSecuritySettings-AWSEventsInspectorPolicy-${AWS::Region}'
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- 'inspector:StartAssessmentRun'
Resource: '*'
RoleName: !Sub 'DefaultSecuritySettings-InspectorEvents-${AWS::Region}'
Amazon Inspector
の Assessment Target
と Assessment Template
を作成する。
本テンプレートは、上記の4つのルールパッケージに対応する。なお、AWSが公開しているルールパッケージのURLがリージョンごとに異なることから、本テンプレートは、Amazon Inspector
に対応しているリージョンのうち、一部のリージョンのみに対応していることに留意する。
Resources:
InspectorAssessmentTarget:
DependsOn:
- ServiceLinkedRoleForInspector
Type: AWS::Inspector::AssessmentTarget
Properties:
AssessmentTargetName: DefaultSecuritySettings-Assessment-Target-All-Instances-All-Rules
InspectorAssessmentTemplate:
Type: AWS::Inspector::AssessmentTemplate
Properties:
AssessmentTargetArn: !GetAtt InspectorAssessmentTarget.Arn
DurationInSeconds: 3600
AssessmentTemplateName: DefaultSecuritySettings-Assessment-Template-Default-All-Rules
RulesPackageArns:
# Asia Pacific (Tokyo)リージョンの場合
- arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-gHP9oWNT
- arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-7WNjqgGu
- arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-YI95DVd7
- arn:aws:inspector:ap-northeast-1:406045910587:rulespackage/0-bBUQnxMq
Amazon Inspector
は、CloudWatch Events
を用いてAssessment Template
を定期実行することができる。本テンプレートでは毎週月曜日午前9時になると、CloudWatch Events
がAmazon Inspector
を定期実行する。
Resources:
CloudWatchEventsForInspector:
Type: AWS::Events::Rule
Properties:
Description: !Join
- ''
- - Scheduled Inspector Assessment for
- !GetAtt InspectorAssessmentTemplate.Arn
- running every 7 day(s)
Name: Amazon_Inspector_Assessment
# Every Monday 9AM
ScheduleExpression: cron(0 9 ? * 1 *)
State: ENABLED
Targets:
- Arn: !GetAtt InspectorAssessmentTemplate.Arn
Id: CloudWatchEventsForInspector
RoleArn: !GetAtt IAMRoleForInspectorEvents.Arn
以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。
作成されるAWSサービス | CloudFormationテンプレート |
---|---|
セキュリティサービス全般 | |
Inspector のみ |
CIS AWS Foundations Benchmark というセキュリティガイドラインが公開されており、このガイドラインは、AWSアカウントをセキュアに保つために必要なAWSのセキュリティ設定を集めたベストプラクティス集として活用できる。
この CIS AWS Foundations Benchmark
では、CloudTrailによって検知された特定のイベントに対して以下のような対応を求めている。
上述のログメトリクスフィルタとアラームを設定し、CIS AWS Foundations Benchmark
に 準拠するために以下の設定を行う。
Resources:
# CIS 3.1 a log metric filter and alarm exist for unauthorized API calls
CloudWatchLogsMetricFilterCloudTrailUnauthorizedAPICalls:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.errorCode="*UnauthorizedOperation") || ($.errorCode="AccessDenied*")}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: UnauthorizedAPICalls
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailUnauthorizedAPICalls:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *不正なAPIコールを検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-Unauthorized-API-Calls'
ComparisonOperator: GreaterThanOrEqualToThreshold
DatapointsToAlarm: 6
EvaluationPeriods: 60
MetricName: UnauthorizedAPICalls
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.2 a log metric filter and alarm exist for AWS Management Console sign-in without MFA
CloudWatchLogsMetricFilterCloudTrailLoginWithoutMFA:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName="ConsoleLogin") && ($.additionalEventData.MFAUsed !="Yes")}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: LoginWithoutMFA
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailLoginWithoutMFA:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *MFAなしのログインを検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-Login-Without-MFA'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: LoginWithoutMFA
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.3 a log metric filter and alarm exist for usage of "root" account
CloudWatchLogsMetricFilterCloudTrailForRootAcount:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{$.userIdentity.type="Root" && $.userIdentity.invokedBy NOT EXISTS && $.eventType !="AwsServiceEvent"}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: ForRootAcount
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailForRootAcount:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ルートアカウントに対する変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-For-RootAcount'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: ForRootAcount
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.4 a log metric filter and alarm exist for IAM policy changes
CloudWatchLogsMetricFilterCloudTrailIamPolicyChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=DeleteGroupPolicy) || ($.eventName=DeleteRolePolicy) || ($.eventName=DeleteUserPolicy) || ($.eventName=PutGroupPolicy) || ($.eventName=PutRolePolicy) || ($.eventName=PutUserPolicy) || ($.eventName=CreatePolicy) || ($.eventName=DeletePolicy) || ($.eventName=CreatePolicyVersion) || ($.eventName=DeletePolicyVersion) || ($.eventName=AttachRolePolicy) || ($.eventName=DetachRolePolicy) || ($.eventName=AttachUserPolicy) || ($.eventName=DetachUserPolicy) || ($.eventName=AttachGroupPolicy) || ($.eventName=DetachGroupPolicy)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: IamPolicyChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailIamPolicyChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *IAMポリシーの変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-IamPolicy-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: IamPolicyChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.5 a log metric filter and alarm exist for CloudTrail configuration changes
CloudWatchLogsMetricFilterCloudTrailCloudTrailConfigurationChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateTrail) || ($.eventName=UpdateTrail) || ($.eventName=DeleteTrail) || ($.eventName=StartLogging) || ($.eventName=StopLogging)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: CloudTrailConfigurationChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailCloudTrailConfigurationChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *CloudTrailの設定変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-CloudTrailConfiguration-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: CloudTrailConfigurationChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.6 a log metric filter and alarm exist for AWS Management Console authentication failures
CloudWatchLogsMetricFilterCloudTrailAuthenticationFailuresDetected:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=ConsoleLogin) && ($.errorMessage="Failed authentication")}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: AuthenticationFailuresDetected
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailAuthenticationFailuresDetected:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ログイン認証失敗を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-AuthenticationFailures-Detected'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: AuthenticationFailuresDetected
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.7 a log metric filter and alarm exist for disabling or scheduled deletion of customer created CMKs
CloudWatchLogsMetricFilterCloudTrailCustomerCreatedCMKsChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventSource=kms.amazonaws.com) && (($.eventName=DisableKey) || ($.eventName=ScheduleKeyDeletion))}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: CustomerCreatedCMKsChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailCustomerCreatedCMKsChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *カスタマー作成CMKの無効化もしくは削除を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-CustomerCreatedCMKs-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: CustomerCreatedCMKsChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.8 a log metric filter and alarm exist for S3 bucket policy changes
CloudWatchLogsMetricFilterCloudTrailS3BucketPolicyChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventSource=s3.amazonaws.com) && (($.eventName=PutBucketAcl) || ($.eventName=PutBucketPolicy) || ($.eventName=PutBucketCors) || ($.eventName=PutBucketLifecycle) || ($.eventName=PutBucketReplication) || ($.eventName=DeleteBucketPolicy) || ($.eventName=DeleteBucketCors) || ($.eventName=DeleteBucketLifecycle) || ($.eventName=DeleteBucketReplication))}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: S3BucketPolicyChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailS3BucketPolicyChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *S3のバケットポリシーの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-S3BucketPolicy-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: S3BucketPolicyChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.9 a log metric filter and alarm exist for AWS Config configuration changes
CloudWatchLogsMetricFilterCloudTrailConfigConfigurationChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventSource=config.amazonaws.com) && (($.eventName=StopConfigurationRecorder) || ($.eventName=DeleteDeliveryChannel) || ($.eventName=PutDeliveryChannel) || ($.eventName=PutConfigurationRecorder))}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: ConfigConfigurationChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailConfigConfigurationChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *Configの設定変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-ConfigConfiguration-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: ConfigConfigurationChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.10 a log metric filter and alarm exist for changes to Security Group
CloudWatchLogsMetricFilterCloudTrailSecurityGroupChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=AuthorizeSecurityGroupIngress) || ($.eventName=AuthorizeSecurityGroupEgress) || ($.eventName=RevokeSecurityGroupIngress) || ($.eventName=RevokeSecurityGroupEgress) || ($.eventName=CreateSecurityGroup) || ($.eventName=DeleteSecurityGroup)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: SecurityGroupChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailSecurityGroupChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *セキュリティグループの変更を検知* しました。'
AlarmName: !Sub 'Warning-${AWS::StackName}-CloudTrail-SecurityGroup-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: SecurityGroupChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.11 a log metric filter and alarm exist for changes to Network Access Control Lists (NACL)
CloudWatchLogsMetricFilterCloudTrailNACLChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateNetworkAcl) || ($.eventName=CreateNetworkAclEntry) || ($.eventName=DeleteNetworkAcl) || ($.eventName=DeleteNetworkAclEntry) || ($.eventName=ReplaceNetworkAclEntry) || ($.eventName=ReplaceNetworkAclAssociation)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: NACLChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailNACLChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *NACLの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-NACL-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: NACLChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.12 a log metric filter and alarm exist for changes to network gateways
CloudWatchLogsMetricFilterCloudTrailNetworkGatewayChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateCustomerGateway) || ($.eventName=DeleteCustomerGateway) || ($.eventName=AttachInternetGateway) || ($.eventName=CreateInternetGateway) || ($.eventName=DeleteInternetGateway) || ($.eventName=DetachInternetGateway)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: NetworkGatewayChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailNetworkGatewayChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ネットワークゲートウェイの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-NetworkGateway-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: NetworkGatewayChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.13 a log metric filter and alarm exist for route table changes
CloudWatchLogsMetricFilterCloudTrailRouteTableChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateRoute) || ($.eventName=CreateRouteTable) || ($.eventName=ReplaceRoute) || ($.eventName=ReplaceRouteTableAssociation) || ($.eventName=DeleteRouteTable) || ($.eventName=DeleteRoute) || ($.eventName=DisassociateRouteTable)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: RouteTableChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailRouteTableChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *ルートテーブルの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-RouteTable-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: RouteTableChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
# CIS 3.14 a log metric filter and alarm exist for VPC changes
CloudWatchLogsMetricFilterCloudTrailVpcChanges:
Type: 'AWS::Logs::MetricFilter'
Properties:
FilterPattern: '{($.eventName=CreateVpc) || ($.eventName=DeleteVpc) || ($.eventName=ModifyVpcAttribute) || ($.eventName=AcceptVpcPeeringConnection) || ($.eventName=CreateVpcPeeringConnection) || ($.eventName=DeleteVpcPeeringConnection) || ($.eventName=RejectVpcPeeringConnection) || ($.eventName=AttachClassicLinkVpc) || ($.eventName=DetachClassicLinkVpc) || ($.eventName=DisableVpcClassicLink) || ($.eventName=EnableVpcClassicLink)}'
LogGroupName: !Ref CloudWatchLogsGroupForCloudTrail
MetricTransformations:
- MetricName: VpcChanges
MetricNamespace: LogMetrics
MetricValue: '1'
CloudWatchAlarmMetricFilterCloudTrailVpcChanges:
Type: 'AWS::CloudWatch::Alarm'
Properties:
ActionsEnabled: true
AlarmActions:
- !Ref SnsTopicARN
AlarmDescription: '*CloudTrail* が *VPCの変更を検知* しました。'
AlarmName: !Sub 'Notice-${AWS::StackName}-CloudTrail-Vpc-Changes'
ComparisonOperator: GreaterThanOrEqualToThreshold
EvaluationPeriods: 1
MetricName: VpcChanges
Namespace: LogMetrics
OKActions:
- !Ref SnsTopicARN
Period: 60
Statistic: Maximum
Threshold: 1
TreatMissingData: notBreaching
また、これらのメトリクスのアラーム通知先となる、Amazon SNS
と Topic Policy
を作成する。
Resources:
SNSAlert:
Type: 'AWS::SNS::Topic'
Properties:
DisplayName: !Sub 'System Notifications from ${AWS::StackName}'
TopicName: !Sub '${AWS::StackName}-system-notifications'
SNSAlertTopicPolicy:
Type: 'AWS::SNS::TopicPolicy'
Properties:
Topics:
- !Ref SNSAlert
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
# All AWS Services
Principal:
AWS: '*'
Resource: '*'
Action: 'SNS:Publish'
CloudTrailは、AWS アカウントの ガバナンス、コンプライアンス、運用監査、リスク監査を行うためのサービス。AWSマネージメントコンソールやAWS CLI、SDK、APIで実行されたアクションを、ログに記録する。API アクティビティに特化した機能であり、パフォーマンスのモニタリングとシステムの正常性をモニタリングできるCloudWatchとは用途が異なる。
CloudTrailは、AWSアカウントを作成した際に自動的に有効になる。イベントとして記録された証跡と呼ばれるこれらのデータは、過去90日分を表示、検索、ダウンロード、アーカイブ、分析等を行うことができる。
証跡はサーバサイド暗号化を使用してS3バケットへ配信、およびAmazon CloudWatch Logs 、Amazon CloudWatch Eventsなどを用いて配信や分析を行うことができる。ログは、 1時間に複数回、約5分ごとに発行され、イベント発生から15分以内に配信される。CloudTrailには、設定変更などを含む管理イベントと情報の取得などを含むデータイベントの2つの種類のイベントが保存できるが、標準では管理イベントのみが保存される。設定により、S3およびLambdaのデータイベントを証跡に含ませることができる。なお、CloudTrailは全てのリージョンに適用可能であるが、イベントをログに記録するリージョンのみで表示することができる。
以下の手段を用いることで、CloudTrailが生成した証跡を適切に保全し、インシデント発生時のフォレンジックを正常に遂行することができる。
CloudRrailはCloudFormationに対応しているため、CloudFormation経由でCloudTrailをセットアップすることができる。
CloudTrailにCloudWatch Logsへのアクセス権限を付与する。
Resources:
IAMRoleForCloudTrail:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action: 'sts:AssumeRole'
Description: A role required for CloudTrail to access CloudWatch Logs.
Policies:
- PolicyName: !Sub '${AWS::StackName}-AWSCloudTrailCloudWatchLogsPolicy-${AWS::Region}'
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- 'logs:PutLogEvents'
- 'logs:CreateLogStream'
Resource:
- !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
RoleName: !Sub '${AWS::StackName}-CloudTrail-${AWS::Region}'
証跡を保存するS3バケット
と、CloudTrailからS3バケットへのアクセスを許可する、バケットポリシー
を作成する。適切なバケットポリシーを設定しないと、 InsufficientS3BucketPolicyException
エラーが発生する。
Resouces:
S3ForCloudTrail:
Type: 'AWS::S3::Bucket'
DeletionPolicy: Retain
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
BucketName: !Sub defaultsecuritysettings-cloudtrail-${AWS::Region}-${AWS::AccountId}
LifecycleConfiguration:
Rules:
- Id: ExpirationInDays
ExpirationInDays: 60
Status: Enabled
LoggingConfiguration:
DestinationBucketName: !Ref LogBacketName
LogFilePrefix: CloudTrail/
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
S3BucketPolicyForCloudTrail:
Type: 'AWS::S3::BucketPolicy'
Properties:
Bucket: !Ref S3ForCloudTrail
PolicyDocument:
Version: 2012-10-17
Id: !Ref S3ForCloudTrail
Statement:
- Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action:
- 's3:GetBucketAcl'
Resource:
- !GetAtt S3ForCloudTrail.Arn
- Effect: Allow
Principal:
Service: cloudtrail.amazonaws.com
Action:
- 's3:PutObject'
Resource:
- !Join
- ''
- - !GetAtt S3ForCloudTrail.Arn
- /AWSLogs/
- !Sub ${AWS::AccountId}
- /*
Condition:
StringEquals:
s3:x-amz-acl: bucket-owner-full-control
CloudWatch Logs の Log Group
を作成する。
Resources:
CloudWatchLogsGroupForCloudTrail:
Type: 'AWS::Logs::LogGroup'
Properties:
LogGroupName: !Sub '/aws/cloudtrail/${AWS::StackName}'
RetentionInDays: 365
CloudTrail
を有効化する。先ほど作成したS3バケットとCloudWatch Logsを証跡の出力先に指定する。通常は、データイベントの保存は行わないが、以下のテンプレートでは、S3とLambdaのデータイベントも保存している。
Resources:
CloudTrail:
DependsOn:
- S3BucketPolicyForCloudTrail
Condition: CreateCentralizedResources
Type: 'AWS::CloudTrail::Trail'
Properties:
CloudWatchLogsLogGroupArn: !GetAtt CloudWatchLogsGroupForCloudTrail.Arn
CloudWatchLogsRoleArn: !GetAtt IAMRoleForCloudTrail.Arn
EnableLogFileValidation: true
EventSelectors:
- DataResources:
# All S3 buckets
- Type: AWS::S3::Object
Values:
- arn:aws:s3
# All Lambda functions
- Type: AWS::Lambda::Function
Values:
- arn:aws:lambda
IncludeGlobalServiceEvents: true
IsLogging: true
IsMultiRegionTrail: true
S3BucketName: !Ref S3ForCloudTrail
SnsTopicName: !Ref SnsTopicName
TrailName: !Sub ${AWS::StackName}
以下のボタンから上のCloudFormationテンプレートを実行することが可能である。ソースコードは、aws-cloudformation-templates/security – GitHub にて公開。
作成されるAWSサービス | CloudFormationテンプレート |
---|---|
セキュリティサービス全般 | |
CloudTrailのみ |