【Security Hub修復手順】[ECS.19] ECS キャパシティプロバイダーはマネージド終了保護を有効にする必要があります
こんにちは!クラウド事業本部コンサルティング部の浅野です。
皆さん、お使いのAWS環境のセキュリティチェックはしていますか?
本記事では、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修復手順をご紹介します。
本記事の対象コントロール
[ECS.19] ECS キャパシティプロバイダーはマネージド終了保護を有効にする必要があります
[ECS.19] ECS capacity providers should have managed termination protection enabled
前提条件
本記事はAWS Security Hubで「AWS基礎セキュリティのベストプラクティススタンダード」を利用されている方向けの内容となります。
AWS Security Hubの詳細についてはこちらのブログをご覧ください。
対象コントロールの説明
このコントロールは、ECSキャパシティプロバイダーで「マネージド終了保護」が有効になっているかチェックします。
キャパシティプロバイダーのマネージド終了保護を有効にすると、このコントロールは成功します。
本コントロールはECS on EC2を利用する場合の設定を対象とします。EC2インスタンスをAuto Scalingグループ(以下、ASG)で管理するキャパシティプロバイダーが評価対象であり、Fargateを利用する場合は対象になりません。
関連する3つの設定の所属と役割
ECS on EC2の周辺には、似た名前の設定が3つ並びます。
それぞれ「EC2 Auto Scaling側の機能」か「ECS側の機能」かが分かれており、まずここを押さえると本コントロールの位置づけが理解しやすくなります。
| 設定名 | 所属サービス | 役割 |
|---|---|---|
| インスタンスのスケールイン保護 | EC2 Auto Scaling | スケールイン時にそのEC2を終了させないための保護フラグ |
| マネージドスケーリング | ECS | タスク需要に応じてEC2台数を自動で増減する |
| マネージド終了保護 | ECS | スケールイン時、稼働中タスクのないEC2のみを終了対象とする自動制御 |
「インスタンスのスケールイン保護」はEC2 Auto Scalingが汎用機能として提供しているもので、ECSを使わない環境でも利用できます。
「マネージドスケーリング」と「マネージド終了保護」はECS側の機能で、ECSのタスク稼働状況を踏まえてASGを扱うためのものです。
本コントロールが指摘しているのは
本コントロールが有効化を求めるのは、表3行目の マネージド終了保護(ECS側の機能)です。
マネージド終了保護がどのような仕組みかを、少し噛み砕いて説明します。
スケールイン(EC2の台数を減らす動作)が発生すると、ASGは「どのEC2を消すか」を選びます。しかしASG自身は、そのEC2で稼働中のECSタスクの有無を見ません。何も対策しなければ、処理中のタスクが載ったEC2が終了対象に選ばれ、タスクが予期せず中断される可能性があります。
これを防ぐためにEC2 Auto Scaling側で用意されているのが、「インスタンスのスケールイン保護」というフラグです。フラグがONになっているEC2は、スケールインで終了されません。
ただし、このフラグを「どのEC2に・いつ立てて・いつ外すか」は、本来ユーザー側で管理する必要があります。たとえばタスクの状態に応じて、アプリケーション側でAPIコールしてフラグを操作する、といった実装が求められます。
ECSの「マネージド終了保護」は、この管理をECSが肩代わりしてくれる機能です。具体的には、ECSが以下の動作を自動で行います。
- 新しくEC2が起動されるとき、保護フラグONの状態で立ち上げる
- そのEC2でECSタスクの稼働が無くなったタイミングで、保護フラグをOFFに変える
これにより「タスクが動いているEC2は守る、空のEC2だけ終了する」という挙動が自動で成立します。
ただし、この仕組みは前提として以下の2つの設定が揃って初めて意味を持ちます。
- マネージドスケーリング(ECS側): ECSがASGの台数増減を主導するモード。これが無効だとECSはスケールインのタイミングを把握しないため、保護フラグを操作する場面そのものが発生しません。
- インスタンスのスケールイン保護(ASG側): 操作の対象となるフラグ機能そのもの。ASG側でこの機能が有効でないと、ECSが操作する対象が存在しません。
すでに前提が揃っている環境では、ECSコンソールの1ステップで修復が完了します。前提のいずれかが無効な環境では、先に有効化が必要です。
本記事では、マネージドスケーリングが有効でASG側のスケールイン保護が無効、という状態から修復する流れ(2段階)を例に説明します。
対応しないとどうなるか
本コントロールの判定は、キャパシティプロバイダーの「マネージド終了保護」の設定値のみを評価します。マネージドスケーリングの状態は評価対象に含まれないため、マネージドスケーリングを利用していない環境でも、マネージド終了保護が無効ならFAILEDと検知されます。
一方、本コントロールが想定するリスク(スケールイン時の稼働中タスク中断)が実際に発生し得るかは、運用形態によって異なります。
マネージドスケーリングを利用している環境
ECSがスケールインを主導するため、マネージド終了保護が無効だと、稼働中タスクの載ったEC2も終了対象に選ばれます。
処理中のタスクが予期せず中断される可能性があるため、本コントロールへの対応は必須です。
マネージドスケーリングを利用していない環境(カスタムスケーリング、固定台数運用など)
ECSがスケールイン動作に関与しないため、マネージド終了保護を有効化しても本来の自動制御(タスクの稼働状況に応じた保護フラグの解除)はトリガーされません。AWS公式も「マネージドスケーリングと併用しなければマネージド終了保護は機能しない」と明記しており、本コントロールはマネージドスケーリング併用を前提とする仕組みです。
そのため、本コントロールが想定するリスク(スケールイン時の稼働中タスク中断)の発生有無を運用形態に照らして確認したうえで、検出結果の抑制や、運用形態の見直しを検討してください。
修復手順
コントロールの確認方法
- AWSマネジメントコンソールからSecurity Hub CSPMを開く
- 左メニューから「検出結果」を選択
- フィルターで
コンプライアンスセキュリティコントロールIDにECS.19を指定し、コンプライアンスのステータスがFAILEDの検出結果を確認する

- 該当の検出結果を選択し、詳細パネルから対象リソース(キャパシティプロバイダー)のARNを確認する


ARNの形式例: arn:aws:ecs:<region>:<account-id>:capacity-provider/<capacity-provider-name>
ステークホルダーに確認
修復を行う前に、以下の点をステークホルダーに確認してください。
- 対象キャパシティプロバイダーを利用しているECSクラスター・サービス・タスクの稼働状況
- 対象キャパシティプロバイダーで利用しているASGの現在の設定(特に「インスタンスのスケールイン保護」の有効/無効)
- マネージドスケーリングの利用有無、および利用していない場合の対応方針(検出結果を抑制するか、運用形態の見直しを含めて検討するか)
- ASGに独自のスケーリングポリシーを併用している場合、ECSのマネージドスケーリング利用方針との整合
修復手順
本コントロールへの対応では、最終的にキャパシティプロバイダーの「マネージド終了保護」を有効化します。
前提として、ASG側の「インスタンスのスケールイン保護」が有効になっている必要があるため、現状を確認しながら以下の順で進めます。
なお、これらの設定の有効化に伴うサービスのダウンタイムや稼働中タスクの再起動は発生しません。
1. 現状の確認
ECSコンソールを開き、左メニューから「クラスター」を選択し、対象クラスターを開きます。

クラスター詳細画面で「インフラストラクチャ」タブを開き、利用しているキャパシティプロバイダーを確認します。

対象のキャパシティプロバイダーを選択して詳細画面を開き、「マネージドターミネーション保護」が「オフ」になっていることを確認します。
このあとの手順でこの設定を「オン」に変更します。

2. ECSコンソールで「スケールイン保護をオンにする」を試みる(前提エラーの確認)
キャパシティプロバイダー詳細画面の右上にある「更新」を選択し、「スケーリングポリシー - オプション」セクションを表示します。
「スケールイン保護をオンにする」にチェックを入れて「更新」を選択します。

ASG側のスケールイン保護が無効の場合、ここで以下のエラーが表示され、更新が中断されます。

キャパシティープロバイダーのスケーリング保護設定が有効ではありません。キャパシティープロバイダーのスケーリング保護を使用するには、Auto Scaling グループのインスタンス保護を有効にする必要があります。
このメッセージのとおり、先にAuto Scalingグループ側のスケールイン保護を有効化する必要があります。
3. Auto Scalingグループのスケールイン保護を有効化
キャパシティプロバイダー詳細画面の「Scaling ポリシー」セクションに表示されている「Auto Scaling グループ名」のリンクを選択し、対象のAuto Scalingグループに移動します。

Auto Scalingグループの「詳細」タブをスクロールし、「高度な設定」セクションの「インスタンスのスケールイン保護」が「保護なし スケールインから」になっていることを確認します。

「高度な設定」セクションの「編集」を選択し、「インスタンスのスケールイン保護を有効にする」にチェックを入れて「更新」を選択します。

更新が完了すると、「インスタンスのスケールイン保護」が「保護あり スケールインから」に変わります。

これで前提となる「インスタンスのスケールイン保護」が有効になりました。次にECSコンソールに戻り、マネージド終了保護を有効化します。
4. ECSコンソールでマネージド終了保護を有効化(再試行)
ECSコンソールに戻り、対象のキャパシティプロバイダーの更新画面を再度開きます。
「スケーリングポリシー - オプション」セクションで「スケールイン保護をオンにする」にチェックを入れて「更新」を選択します。

ASG側の前提が整っているため、今度はエラーなく更新が完了します。

キャパシティプロバイダー詳細画面で「マネージドターミネーション保護」が「オン」になっていれば、修復作業は完了です。
修復確認
数分後、Security Hubで検出結果が「PASSED」になることを確認します。

詳細を見ると、コンプライアンスが「PASSED」になっていることが確認できます。

履歴を見ると、コンプライアンスステータスが「FAILED」から「PASSED」に変わったことが記録されています。

注意: Security Hubの検出結果は更新までに時間がかかる場合があります(最大12時間程度)。
最後に
今回は、AWS Security HubによるAWS環境のセキュリティ状況スコアリングに該当する項目についての修正手順をご紹介しました。
コントロールを修正して、お使いのAWS環境のセキュリティをパワーアップさせましょう!
最後までお読みいただきありがとうございました!どなたかのお役に立てれば幸いです。
今回は以上です。






