本文へ移動

ホーム / SRE / 第5部 インフラ・セキュリティ・性能・コスト

第5部 インフラ・セキュリティ・性能・コスト・第11章

セキュリティ

★★☆ 重要16トピック・面接 11問

AWSのセキュリティ(アカウント設計・IAM・ネットワーク・検知)、暗号化、コンテナセキュリティ、脆弱性管理をまとめます。

11.1セキュリティ

★★☆ 重要
テーマ要点
IAM最小権限、IAMロール利用、長期アクセスキーを作らない、OIDCでCIから認証
ネットワークプライベートサブネット、セキュリティグループの最小開放、WAF
秘密情報Secrets Manager / Parameter Store、ローテーション
監査と検知CloudTrail、GuardDuty、Config。誰が何をしたか追えること
脆弱性管理コンテナイメージのスキャン、依存ライブラリの更新、定期的な脆弱性診断
暗号化通信(TLS)と保存データ(KMS)
層対策
アカウントAWS Organizations、SCP、本番と開発のアカウント分離、ルートユーザーの封印
アイデンティティSSO(IAM Identity Center)、MFA、最小権限、一時認証情報
ネットワークプライベートサブネット、SG、VPCエンドポイント、WAF、Shield
アプリケーション脆弱性診断、依存ライブラリの更新、入力値の検証
データ暗号化(KMS)、バックアップの別アカウント保管
検知と対応CloudTrail、GuardDuty、Security Hub、インシデント対応手順
ひとことで

鍵が1つで暗号化も復号もするのが共通鍵、ペアの片方で閉じてもう片方で開けるのが公開鍵。公開鍵の仕組みは「暗号化」と「署名」の両方に使える。

暗号化は、鍵を使ってデータを第三者に読めない形(暗号文)にすること、復号はそれを元に戻すことです。共通鍵暗号(AESなど)は同じ鍵で暗号化と復号をし、高速ですが、相手に鍵を安全に渡すのが課題です。公開鍵暗号(RSA、楕円曲線暗号など)は、数学的に対になった公開鍵と秘密鍵を使います。公開鍵は誰に配ってもよく、秘密鍵は持ち主だけが持ちます。

使い方使う鍵目的例
暗号化相手の公開鍵で暗号化 → 相手の秘密鍵で復号相手にだけ読ませる鍵の受け渡し
署名自分の秘密鍵で署名 → 自分の公開鍵で検証本人が作った・改ざんされていないことの証明TLS証明書、JWT、コード署名、Gitのコミット署名
鍵交換お互いの公開情報から共通鍵を作る(ECDHE)通信のたびに使い捨ての共通鍵を作るTLS 1.3
関連する用語意味
ハッシュデータから固定長の値を作る一方向の計算(SHA-256)。元に戻せない。改ざん検知やパスワードの保存(bcryptなど遅いものを使う)
前方秘匿性秘密鍵が後で漏れても、過去の通信は解読できない性質。使い捨ての鍵交換で実現
SSHの鍵サーバーに公開鍵を登録し、手元の秘密鍵で本人であることを証明する
KMS・HSM秘密鍵を専用の装置やサービスの中に閉じ込め、外に出さずに使う
暗号化は「公開鍵で閉じ、秘密鍵で開ける」、署名は「秘密鍵で書き、公開鍵で確かめる」暗号化(相手にだけ読ませる)平文受信者の公開鍵暗号文受信者の秘密鍵平文暗号化復号デジタル署名(本人が書いた・改ざんなしを証明)文書送信者の秘密鍵文書+署名送信者の公開鍵正しいと確認署名検証秘密鍵は絶対に外に出さない。公開鍵は配ってよい。SSHの鍵、TLS証明書、JWTの署名、コードの署名はすべてこの仕組み
暗号化と署名での鍵の使い方

「どちらの鍵で何をするか」を逆に覚えないように、暗号化は相手の公開鍵、署名は自分の秘密鍵と覚える。

面接ではこう答える

共通鍵暗号は同じ鍵で暗号化と復号をし、速いですが鍵の受け渡しが課題です。公開鍵暗号は公開鍵と秘密鍵のペアを使い、相手の公開鍵で暗号化して相手の秘密鍵でしか復号できないようにしたり、自分の秘密鍵で署名して公開鍵で誰でも検証できるようにしたりします。TLSは鍵交換で使い捨ての共通鍵を作り、データは共通鍵で暗号化します。秘密鍵はKMSなどに閉じ込めて外に出しません。

11.4証明書の運用

用語★★☆ 重要
ひとことで

証明書は必ず期限が切れる。発行から更新・失効までを自動化し、期限の監視と棚卸しを続ける。有効期間は年々短くなっている。

公開されたWebサイトのTLS証明書の最長有効期間は、CA/Browser Forumの決定で段階的に短くなっています。2026年3月15日から200日、2027年3月15日から100日、2029年3月15日から47日になります。手作業での更新は現実的でなくなるので、自動更新が前提です。

方法内容注意点
AWS Certificate Manager(ACM)ALB・CloudFront・API Gatewayの証明書を無料で発行・自動更新DNS検証のCNAMEを消すと更新に失敗する。EC2に直接は入れられない
Let’s Encrypt(ACME)certbotなどで自動発行・更新更新処理が止まっていないかの監視
社内向け(プライベートCA)AWS Private CAなどで内部通信やmTLS用に発行ルート証明書の配布と、自分で決める有効期間
手動で購入した証明書EV証明書など更新忘れの事故が最も多い。期限の監視が必須
よくある事故防ぎ方
期限切れで全サービス停止期限30日前などのアラート、外部から証明書を確認する監視
一部の端末だけ繋がらない中間証明書の送り忘れ。チェーンを確認
自動更新が静かに失敗DNS検証用レコードの削除、権限の変更。更新の成否も監視
どこで使っているか分からない証明書の棚卸し(ドメイン、置き場所、期限、担当)
秘密鍵の漏えいすぐに失効させて再発行。秘密鍵は可能ならACMやKMSの中に
証明書は「発行・配置・更新・失効」を自動で回す公開証明書の最長有効期間は段階的に短くなり、2029年には47日になる予定1 鍵ペアとCSR作成秘密鍵はサーバー(またはACM)の中2 ドメイン検証DNSのレコードかHTTPで所有を証明3 発行・配置LB・CDNに中間証明書も含めて4 監視期限・チェーン・ホスト名の一致5 自動更新ACM・Let’s Encrypt(ACME)6 更新失敗の検知期限30日前などにアラート7 失効秘密鍵が漏れたらすぐ失効・再発行8 棚卸しどこに何の証明書があるかを一覧化
証明書のライフサイクル

有効期間が短くなるほど、自動化していない証明書が障害の原因になる。

面接ではこう答える

証明書は鍵とCSRを作り、ドメインの所有を検証して発行し、LBやCDNに中間証明書を含めて配置し、期限前に更新します。公開証明書の最長有効期間は2026年3月から200日になり、2029年には47日まで短くなるので、ACMやACMEによる自動更新が前提です。期限と更新の成否の監視、証明書の棚卸し、秘密鍵が漏れたときの失効手順を整えておきます。

ひとことで

認証は「あなたが誰か」の確認、認可は「何をしてよいか」の判断。認証は複数の要素を組み合わせ、SSOでまとめると安全で運用も楽になる。

用語・方式内容
認証(Authentication)本人かどうかを確かめる(ログイン)
認可(Authorization)確認できた人に、何を許すかを決める(権限)
多要素認証(MFA)知っているもの(パスワード)・持っているもの(スマホ・鍵)・本人の特徴(生体)を組み合わせる
パスキー(FIDO2/WebAuthn)端末に保存した秘密鍵で署名してログイン。偽サイトでは使えないのでフィッシングに強い
SSO(シングルサインオン)1回のログインで複数のサービスを使う。退職時に1か所で止められる
SAML企業向けSSOで長く使われているXMLベースの方式
OpenID Connect(OIDC)OAuth 2.0の上に作られた、新しいSSO・ログインの方式
SCIMIDプロバイダからサービスへ、アカウントの作成・削除を自動同期

SREが関わる場面では、AWSやGitHub、監視ツールなどへのログインを、社内のIDプロバイダ(Google Workspace、Microsoft Entra ID、Oktaなど)にSSOでまとめ、MFAを必須にします。人の入退社やチーム異動のたびに各サービスの権限を手で直すのはミスの元なので、グループとSCIMで自動化します。アプリの利用者向けには、パスワードに加えてパスキーやMFAを提供します。

HTTPでの認証情報のやりとり(Cookie、セッション、トークン、OAuth)は認証と状態管理で解説しています。

面接ではこう答える

認証は本人の確認、認可は権限の判断です。認証はパスワードだけでなくMFAを組み合わせ、フィッシングに強いパスキーも使います。社内のツールはIDプロバイダにSSOでまとめてMFAを必須にし、SCIMで入退社に合わせてアカウントを自動で作成・削除します。SSOの方式にはSAMLとOpenID Connectがあります。

ひとことで

AWSが守るのは物理設備や基盤。その上で何をどう設定するかは利用者の責任。最初の設計で大事なのはアカウントの分け方。

責任共有モデルでは、データセンターや物理サーバー、仮想化の基盤などの「クラウドそのもの」はAWSが守り、その上に置くデータ、アクセス権、OSやアプリの設定などの「クラウドの中」は利用者が守ります。EC2ならOSのパッチまで利用者の責任ですが、RDSやLambdaのようなマネージドサービスではAWSの範囲が広がります。ただし、データと誰がアクセスできるか(IAM)は、どのサービスでも必ず利用者の責任です。

AWSのセキュリティ設計で最初に効くのがマルチアカウントです。AWSアカウントの境界は最も強い隔離なので、本番・開発・セキュリティ用などに分け、AWS Organizationsでまとめて管理します。ログを集める専用のアカウントを作り、本番の管理者でもログを消せないようにします。組織全体にはSCP(サービスコントロールポリシー)で「これだけは絶対にさせない」上限をかけます。

分ける理由内容
被害の範囲を限定する開発環境の認証情報が漏れても本番に届かない
権限を分けやすいアカウントごとに誰が入れるかを決められる
ログを守る監査ログは別アカウントに集め、改ざんや削除を防ぐ
コストを分けて見る請求をアカウント単位で見られる
最初にやること(ベースライン)内容
ルートユーザーの封印MFAを設定し、普段は使わない。アクセスキーを作らない
人のログインを一本化IAM Identity Center(SSO)で、一時的な認証情報でログインさせる
監査ログを全リージョンで取るCloudTrailを組織全体で有効にし、ログ専用アカウントへ
検知を有効にするGuardDuty、Security Hub、Configを組織全体で
公開を防ぐS3のブロックパブリックアクセス、EBSの既定の暗号化
ガードレールSCPで、ログの停止、許可外リージョンの利用などを禁止
AWSが守るのは「クラウドの」安全、利用者が守るのは「クラウドの中の」安全EC2RDSLambdaデータ・アクセス権(IAM)自社自社自社アプリのコード自社自社自社OSのパッチ・設定自社AWSAWSDBエンジンの更新自社AWSAWSネットワーク設定(SG など)自社自社一部自社ハイパーバイザー・物理設備AWSAWSAWSマネージドサービスほどAWSの範囲が広がる。ただしデータとアクセス権の管理は、どのサービスでも必ず自社の責任
責任共有モデル

マネージドサービスを選ぶことは、守る範囲をAWSに移すことでもある。

環境と役割ごとにアカウントを分け、組織全体のルールはSCPでかける管理アカウントOrganizations・請求のみセキュリティログ保管CloudTrail・Configを集約監査GuardDuty・Security Hub本番サービスA本番サービスB本番開発・検証ステージング開発サンドボックス個人の検証用予算上限つきアカウントの境界は最も強い隔離。1つが侵害されても被害が広がりにくく、コストも分けて見られるSCPの例:CloudTrailを止められない、許可したリージョン以外は使えない、ルートユーザーを使えない
マルチアカウントの構成例

アカウントの壁が一番強い。SCPで組織全体の「やってはいけないこと」を固定する。

面接ではこう答える

AWSでは責任共有モデルにより、物理設備や基盤はAWSが、データやアクセス権、OSやアプリの設定は利用者が守ります。設計の土台はマルチアカウントで、本番・開発・ログ・監査などのアカウントに分け、Organizationsで管理し、SCPで組織全体のガードレールをかけます。ルートユーザーの封印、SSO、CloudTrail・GuardDuty・Security Hubの組織全体での有効化が最初のベースラインです。

ひとことで

管理アカウントの下に、セキュリティ・インフラ・ワークロード・サンドボックスなどのOUを作り、ガードレールをかけるのが定番。Control Towerで始めるのが近道。

AWSが推奨するマルチアカウント構成では、管理アカウントは組織の管理と請求だけに使い、ワークロードを置きません。その下にOU(組織単位)を作り、アカウントを用途ごとにまとめます。AWS Control Towerを使うと、ログ用と監査用のアカウント、基本のガードレール、アカウントを作る仕組み(Account Factory)を、この構成でまとめて用意できます。

OU入れるアカウント目的
SecurityLog Archive、Audit(セキュリティツール)ログを改ざんされない場所に集め、セキュリティサービスを集中管理
Infrastructure共有ネットワーク(Transit Gateway など)、CI/CD、共有サービス複数のワークロードで共有する基盤
WorkloadsProd、Staging、Dev(さらにOUで分ける)環境ごとにガードレールを変える
Sandbox個人の検証用自由に試せるが、予算上限と本番への接続禁止
Suspended閉鎖予定のアカウントすべての操作をSCPで禁止して残す
Policy Stagingポリシーの試験用新しいSCPを本番のOUに入れる前に試す
ガードレールの種類役割例
SCP(サービスコントロールポリシー)アカウント内のIAMユーザーやロールができる上限CloudTrailの停止禁止、許可したリージョン以外の禁止
RCP(リソースコントロールポリシー)S3やKMSなどのリソースに、誰がアクセスできるかの上限組織外からのアクセスを一律に禁止
宣言型ポリシーサービスの設定を組織全体で固定IMDSv2の強制、パブリックAMIの共有禁止
検知のガードレールConfigやSecurity Hubで違反を見つける暗号化されていないボリューム

人のアクセスはIAM Identity Centerにまとめ、どのアカウントにどの権限セットで入れるかをグループで管理します。GuardDutyやSecurity HubはAuditアカウントを委任管理者にして、組織の全アカウントで自動的に有効になるようにします。

定番は「セキュリティ・インフラ・ワークロード・サンドボックス」のOU構成管理アカウント(Organizations・Control Tower・請求)SecurityLog ArchiveAudit(委任管理者)Infrastructure共有ネットワークCI/CD・共有サービスWorkloadsProd OU:本番Staging OUDev OUSandbox個人の検証(予算上限つき)Suspended閉鎖予定のアカウントPolicy StagingSCPを試す場所ガードレール:SCP(主体側の上限)・RCP(リソース側の上限)・宣言型ポリシー。ログイン:IAM Identity Centerセキュリティ系サービスはAuditアカウントを委任管理者にして組織全体で有効化、ログはLog Archiveへ集約
AWS Organizationsの定番OU構成

OUは「組織図」ではなく「かけたいルールの違い」で分ける。

面接ではこう答える

管理アカウントは管理と請求だけに使い、その下にSecurity(Log ArchiveとAudit)、Infrastructure、Workloads(本番・ステージング・開発)、Sandbox、SuspendedなどのOUを作るのが定番で、Control Towerで始めるのが近道です。ガードレールはSCPで主体側の上限を、RCPでリソース側の上限をかけ、宣言型ポリシーで設定を固定します。人のログインはIAM Identity Centerに、セキュリティサービスはAuditアカウントを委任管理者にして組織全体で有効化します。

11.8IAM(権限管理)

用語★★☆ 重要
ひとことで

AWSで「誰が・何に対して・何をしてよいか」を決める仕組み。最小権限と、長期の鍵を持たないことが基本。

IAMでは、ユーザーやロールにポリシー(JSONで書いた許可・拒否のルール)を付けて権限を与えます。人もアプリも、長期間有効なアクセスキーではなく、ロールを引き受けて得る一時的な認証情報を使うのが基本です。EC2やLambda、ECSのタスク、EKSのPodにはロールを割り当て、GitHub ActionsなどのCIからはOIDCでロールを引き受けます。

ポリシーの評価にはルールがあります。どこかに明示的なDenyがあれば必ず拒否、SCPや権限境界の枠の外も拒否、そのうえでどこかにAllowがあれば許可、どこにもなければ暗黙的に拒否です。S3のバケットポリシーのように、リソース側に付けるポリシーもあります。

ポリシーの種類付ける場所役割
アイデンティティベースユーザー・ロール「このロールは何ができるか」
リソースベースS3バケット・KMSの鍵など「このリソースを誰が使えるか」。アカウントをまたぐ許可に使う
SCPOrganizationsのアカウント・OU組織としての上限。権限を与えはしない
権限境界ユーザー・ロール委任した人が作るロールの上限を決める
セッションポリシーロールを引き受けるときその一時的なセッションだけさらに絞る
よくある問題対策
「とりあえず管理者権限」IAM Access Analyzerで実際に使った操作からポリシーを作り、絞り込む
漏れたアクセスキーが悪用される長期キーを作らない。CIはOIDC、人はSSO。GitHubなどのシークレットスキャン
外部アカウントに意図せず公開IAM Access Analyzerで外部からアクセスできるリソースを検出
誰が何をしたか分からないCloudTrailで記録し、ロールのセッション名に人を特定できる情報を入れる
Denyが1つでもあれば拒否。どこにもAllowがなければ、それも拒否リクエスト明示的なDenyがどこかにある?SCP・境界で許されている?IAMポリシーでAllowされている?拒否拒否(暗黙)許可はいいいえいいえはいはいいいえSCP(組織の上限)や権限境界は「ここまでしか許さない」枠で、それ自体では権限を与えないS3バケットポリシーなどのリソース側ポリシーも評価に加わる。アカウントをまたぐ場合は両側でAllowが必要
IAMポリシーの評価の流れ

権限がないとき、まず「どこかにDenyがないか」、次に「SCPで止められていないか」を確認する。

面接ではこう答える

IAMはポリシーで「誰が、何に、何をしてよいか」を決めます。人もアプリも長期のアクセスキーではなくロールの一時的な認証情報を使い、CIはOIDCで連携します。評価では明示的なDenyが最優先で、SCPや権限境界の枠を超えるものは拒否、どこかにAllowがあれば許可、なければ暗黙的に拒否です。最小権限はAccess Analyzerで実際の利用から作って絞り込みます。

ひとことで

VPCの中は「サブネットの門(NACL)」と「サーバーごとの扉(セキュリティグループ)」で守り、外の玄関にはWAFを置く。

AWS の中のサーバーは、何重もの「関所」で守ります。サーバーのネットワークのつなぎ口(ENI)ごとのセキュリティグループ、サブネットの出入口のネットワークACL、HTTP の中身を見る WAF など、置く場所と見るものが違う仕組みを組み合わせます。

どれか1つの設定漏れで「つながらない」障害になり、逆に開けすぎると攻撃の入口になります。それぞれがどこで、何を基準に止めるかを知っておくと、つながらないときに疑う場所を順に切り分けられます。

仕組み守る場所特徴
セキュリティグループ(SG)インスタンス・ENI許可ルールのみ。ステートフル(返りの通信は自動で許可)。他のSGを送信元に指定できる
ネットワークACL(NACL)サブネット許可と拒否。ステートレス(返りも明示的に許可が必要)。番号の小さい順に評価
AWS WAFCloudFront・ALB・API GatewaySQLインジェクションなどの攻撃パターン、レート制限、IP制限
AWS ShieldCloudFront・ALBなどDDoS攻撃の緩和。Standardは自動で有効
VPCエンドポイントVPCとAWSサービスの間インターネットやNAT Gatewayを通らずにS3などへ。通信費の削減にも
プライベートサブネットアプリ・DBインターネットから直接届かない場所に置く

実務では、SGを主な防御にし、送信元をIPアドレスではなく「ALBのSGから」「アプリのSGから」のようにSGで指定すると、台数が増えても設定を変えずに済みます。NACLは、特定のIPからの通信をまとめて遮断したいときなど、補助的に使うことが多いです。SSHの22番ポートを全世界に開けるのは避け、サーバーへのログインはSession Managerを使います。

NACLはサブネットの門、セキュリティグループは各サーバーの扉VPCプライベートサブネットNACLサーバー1SGサーバー2SGサーバー3SG通信SG:インスタンス単位・許可ルールのみ・ステートフル(返りの通信は自動で許可)・他のSGを送信元に指定できるNACL:サブネット単位・許可と拒否・ステートレス(返りの通信も明示的に許可が必要)・番号順に評価
NACLとセキュリティグループ

「返りの通信が届かない」障害は、ステートレスなNACLの設定漏れが典型。

下の「ブラウザで試す」の図では、パブリックとプライベートのサブネットに分けた VPC で、アプリが NAT ゲートウェイを通って外へ出られても外からは入れないところ、DB のセキュリティグループに許可がないと SYN が捨てられてタイムアウトになるところ(「Connection refused」との違い)、S3 へはゲートウェイ型の VPC エンドポイントで NAT を通らずに届くところを順に見られます。表のうち SG・プライベートサブネット・VPC エンドポイントが出てくるので、パケットがどこで止まるかに注目してください(NACL と WAF はこの図には出てきません)。

面接ではこう答える

セキュリティグループはインスタンス単位の許可ルールでステートフル、NACLはサブネット単位の許可と拒否でステートレスです。SGを主な防御にし、送信元をSGで指定して構成の変化に強くします。外部向けにはWAFで攻撃パターンやレート制限を、Shieldで DDoSを緩和し、AWSサービスへの通信はVPCエンドポイントでインターネットを通さないようにします。

別のページで開く →

ネットワーク図を読み込んでいます…

11.10WAFとその置き場所

用語★★☆ 重要
ひとことで

WAFはWebアプリへの攻撃パターンを入口で止める。置き場所は「できるだけ外側」で、WAFを素通りする裏口を塞ぐことが同じくらい大事。

WAF(Web Application Firewall)は、HTTPのリクエストの中身を見て、SQLインジェクションやクロスサイトスクリプティングなどの攻撃パターン、悪質なボット、特定の国やIPからのアクセス、短時間の大量アクセスを止めます。AWS WAFは、CloudFront、ALB、API Gateway、AppSyncなどに付けられます。

置き場所長所短所
CloudFront世界中のエッジで止めるので、攻撃がオリジンに届かない。DDoS対策(Shield)とも相性がよいCloudFrontを通さない裏口があると無意味
ALBリージョン内の通信も守れる。CloudFrontを使わない構成でも使えるALBまでは攻撃のトラフィックが届く
API GatewayAPIごとに細かく設定できるAPI Gateway以外の入口は別に守る
両方外側で大まかに、内側で細かくルールの管理とコストが増える
運用のポイント内容
裏口を塞ぐALBのSGをCloudFrontのマネージドプレフィックスリストだけに絞り、秘密のカスタムヘッダーも確認する。またはCloudFrontのVPCオリジンでALBを非公開にする
マネージドルールから始めるAWSやベンダーが保守するルールセットを使い、自前のルールは最小限に
まずCountモード新しいルールは止めずに数えるだけにして、誤検知がないか確認してからBlockに
レート制限IPなどの単位で一定時間あたりの回数を制限。ログイン画面などは厳しめに
ログと監視WAFのログを保存し、ブロック数の急増や誤検知の問い合わせに対応できるようにする
WAFに頼りすぎないアプリ側の入力検証、パラメータ化したクエリ、出力のエスケープが本来の対策
WAFは「できるだけ外側」に置き、裏口からの直接アクセスを塞ぐ利用者CloudFront + WAF世界中のエッジで止めるALB(+WAF)内側の追加ルールアプリ裏口:ALBに直接アクセスされるとWAFを素通り裏口の塞ぎ方・ALBのSGでCloudFrontのマネージドプレフィックスリストだけ許可+秘密のカスタムヘッダーを確認・ALBをプライベートにしてCloudFrontのVPCオリジンでつなぐ ・新しいルールはまずCountモードで誤検知を確認
WAFの置き場所と裏口の塞ぎ方

WAFを入れたら、「WAFを通らずにオリジンに届く経路がないか」を必ず確認する。

面接ではこう答える

WAFはHTTPの中身を見て攻撃パターンやボット、大量アクセスを止めます。置き場所は、攻撃をオリジンに届かせないためにできるだけ外側のCloudFrontが基本で、必要ならALBでも内側のルールをかけます。同時に、ALBに直接アクセスされる裏口を、CloudFrontのプレフィックスリストとカスタムヘッダー、またはVPCオリジンで塞ぎます。ルールはマネージドルールから始め、まずCountモードで誤検知を確認してからBlockにします。

別のページで開く →

ネットワーク図を読み込んでいます…

ひとことで

踏み台は、内側のサーバーに入るための「中継用のサーバー」。今はSSHの穴を開けずに入れるSession Managerを使うのが標準。

踏み台サーバー(Bastion)は、インターネットから直接入れないプライベートなサーバーやDBに入るために、公開側に1台だけ置く中継用のサーバーです。運用者はまず踏み台にSSHで入り、そこから内側に入ります。ただし、SSHの22番ポートを公開し続けることになり、鍵の配布と回収、誰が何をしたかの記録が課題でした。

AWSではSystems ManagerのSession Managerを使うと、サーバー側のエージェントが内側からAWSに接続するので、受信のポートを開けずにシェルに入れます。権限はIAMで管理でき、MFAやSSOと組み合わせられ、操作のログをS3やCloudWatch Logsに残せます。

用途方法
EC2のシェルに入るSession Manager(SSMエージェント+IAM)
RDSやRedisに接続するSession Managerのポートフォワーディング(リモートホスト指定)で、手元のクライアントから接続
SSHのまま使いたいEC2 Instance Connect Endpointで、公開IPなしにSSH
ECSのコンテナに入るECS Exec
EKSのPodに入るkubectl exec(クラスタのAPIへのアクセスはIAMで制御)

どの方法でも、本番に入る操作は「誰が、いつ、何のために」を記録し、必要なときだけ一時的に権限を与える(Just-In-Timeアクセス)運用にすると、事故や不正を防げます。

踏み台サーバーをやめて、Session Managerで「穴を開けずに」入る従来:踏み台(Bastion)運用者踏み台SSH 22番を公開サーバー・22番が攻撃にさらされる ・SSH鍵の配布と回収・誰が何をしたかの記録が難しい今:Session Manager運用者IAMで認証Systems ManagerサーバーSSMエージェント内側から接続・受信ポートを開けない ・IAMで権限管理・MFA・操作ログをS3やCloudWatchに残せるRDSなどへの接続はポートフォワーディングで。EC2 Instance Connect Endpointも選択肢。ECSはECS Exec
踏み台とSession Managerの比較

「22番を開けない」「鍵を配らない」「操作を記録する」の3つを同時に満たせる。

面接ではこう答える

踏み台は、プライベートなサーバーに入るために公開側に置く中継用のサーバーですが、SSHのポートを公開し続け、鍵の管理や操作の記録が課題でした。今はSession Managerを使い、エージェントが内側から接続するので受信ポートを開けずに入れ、権限はIAMで管理し、操作ログを残せます。DBへの接続はポートフォワーディング、コンテナにはECS Execを使います。

ひとことで

防ぎきれない前提で、記録し、異常を検知し、1か所に集めて、すぐ動ける仕組みを作る。

サービス役割例
CloudTrail誰が、いつ、どこから、何のAPIを呼んだかの記録「このSGを開けたのは誰か」を調べる
AWS Configリソースの設定と変更履歴、ルール違反の検出暗号化されていないボリュームを検出
GuardDutyログや通信から不審な動きを検知不審なIPからのAPI呼び出し、仮想通貨のマイニング、認証情報の不正利用
InspectorEC2・コンテナイメージ・Lambdaの脆弱性スキャンECRのイメージにある既知のCVE
IAM Access Analyzer外部から使える権限や、使われていない権限の検出他アカウントに公開されたS3バケット
Security Hub上記の結果を集めて、優先度をつけて一覧にするベストプラクティスとの差分を点数で確認
EventBridge検知結果を条件で振り分けて通知や自動処理へ重大な検知だけSlackとPagerDutyへ

どれも組織全体で有効にして、監査用のアカウントに結果を集めるのが基本です。検知したら何をするかを手順書にしておき、たとえば「認証情報の漏えいが疑われたら、キーを無効化し、そのキーで行われた操作をCloudTrailで洗い出す」といった初動を決めておきます。誤検知が多いと誰も見なくなるので、通知する重要度を絞ることも大事です。

記録し、検知し、1か所に集めて、通知・自動対応につなげるCloudTrail誰がいつ何のAPIを呼んだかAWS Config設定の変化と違反GuardDuty不審な動きの検知Inspector脆弱性スキャンIAM Access Analyzer外部に公開された権限Security Hub結果を集約・優先度づけEventBridge条件で振り分けSlack・PagerDuty人に通知Lambdaなど自動で隔離・修正組織全体で有効化し、監査アカウントに集める
AWSの検知と対応の流れ

「集めて、絞って、すぐ動ける」形にしておかないと、検知しても誰も気づかない。

面接ではこう答える

CloudTrailでAPIの操作を記録し、Configで設定の変化を、GuardDutyで不審な動きを、Inspectorで脆弱性を検知し、Security Hubに集約して優先度をつけます。重要なものはEventBridgeで通知や自動対応につなげます。組織全体で有効にして監査アカウントに集め、検知後の初動を手順書にしておきます。

ひとことで

「通信中」はTLSで、「保存中」はKMSなどの鍵で暗号化する。どこで復号されるかと、鍵を誰が使えるかを管理するのが本質。

通信中の暗号化(in transit)は、ネットワーク上の盗聴や改ざんを防ぎます。HTTPSはHTTPをTLSで包んだものです。TLSは1.2以上を使い、古い1.0・1.1は無効にします。ロードバランサやCDNでTLSを終端すると、その先はいったん平文になるので、その区間も暗号化するか(再暗号化)、閉じたネットワークで守るかを決めておきます。ブラウザに「このサイトは必ずHTTPSで」と覚えさせるHSTSヘッダーも使います。

mTLS(相互TLS)は、サーバーだけでなくクライアントも証明書を出して、お互いを確認する方式です。サービス同士の通信で「相手が本当にそのサービスか」を確かめたいとき(サービスメッシュやゼロトラスト)に使います。

保存時の暗号化(at rest)は、ディスクやバックアップが盗まれても読めないようにします。AWSではEBS、S3、RDSなどで、KMSの鍵を使って暗号化できます。KMSはエンベロープ暗号化という方式で、データはデータキーで暗号化し、そのデータキーをKMSのマスターキーで暗号化して一緒に保存します。マスターキーはKMSの外に出ず、使える人をIAMで絞り、使用履歴はCloudTrailに残ります。

確認すべきこと内容
TLSのバージョンと暗号方式1.2以上、弱い暗号方式を無効化。LBのセキュリティポリシーで設定
証明書の期限ACMやLet's Encryptで自動更新し、それでも期限を監視する
復号される場所LBやプロキシで復号するなら、その後ろの区間の守り方を決める
鍵の権限KMSの鍵を使えるIAMロールを最小限に。鍵ポリシーでも制限
鍵のローテーション定期的な自動ローテーションを有効にする
秘密情報パスワードやAPIキーはSecrets Managerなどに置き、コードや環境変数の直書きを避ける
「通信中」と「保存中」の両方を暗号化して、どこで平文になるかを把握する利用者CDN / ALBアプリDBTLSTLS(任意)TLSここで一度復号される保存時の暗号化KMSの鍵で通信中(in transit):TLSで盗聴・改ざんを防ぐ。LBで復号するなら、その先をどうするか決めておく保存中(at rest):ディスク・S3・バックアップを暗号化。鍵の管理と権限がいちばん重要
通信中と保存中の暗号化の範囲

暗号化されていない区間がどこかを、構成図の上で説明できるようにしておく。

mTLSでは、サーバーだけでなくクライアントも証明書を出すマイクロサービス間やゼロトラストで使うサービスAサービスBClientHelloサーバー証明書+「あなたの証明書も見せて」クライアント証明書お互いに相手の証明書を検証して、相手が誰かを確認暗号化された通信
mTLSの流れ

通常のTLSは「サーバーが本物か」だけを確かめる。mTLSは両方向。

エンベロープ暗号化:データは「データキー」で、データキーは「マスターキー」で暗号化KMSマスターキー外に出ない利用はIAMで制御・CloudTrailに記録データキーデータごとに作る発行データを暗号化大きなデータも高速保存するもの:暗号化データ + 暗号化されたデータキーデータキーの平文はメモリ上で使ったら捨てる大きなデータをKMSに送らずに済み、マスターキーを無効にすれば全データを読めなくできる
KMSのエンベロープ暗号化

マスターキーを外に出さずに大量のデータを速く暗号化できる。

面接ではこう答える

通信中はTLSで、保存中はKMSなどの鍵で暗号化します。LBでTLSを終端するならその先の区間をどう守るかを決め、TLSは1.2以上にします。保存時はエンベロープ暗号化で、データはデータキーで、データキーはKMSのマスターキーで暗号化し、マスターキーの利用はIAMで制限してCloudTrailで記録します。サービス同士で相手を確認したいときはmTLSを使います。

ひとことで

rootの万能な権限を、細かい「能力」に分けたもの。必要な能力だけを渡し、rootで動かさないことが、コンテナでもサーバーでも基本。

Linuxでは、昔はroot(UID 0)かそれ以外かの2択でした。capabilitiesは、rootの権限を約40の能力に分け、プロセスに必要なものだけを与えられるようにした仕組みです。たとえば1024未満のポートで待ち受けるだけならCAP_NET_BIND_SERVICEだけを渡せば、rootで動かす必要はありません。

権限を絞る仕組み内容
一般ユーザーで動かすアプリ専用のユーザーを作り、rootで動かさない。コンテナもUSERで指定
capabilities必要な能力だけ渡す。コンテナは全部削ってから必要なものを足す
no_new_privileges実行中に権限を増やせないようにする(setuidのプログラムなどで昇格させない)
seccomp使えるシステムコールを制限する
AppArmor・SELinuxプロセスがアクセスできるファイルなどを強制的に制限する
読み取り専用のファイルシステム書き換えられないので、改ざんやマルウェアの設置を防ぐ
sudoの最小化人に与えるsudoはコマンドを限定し、記録を残す
# Kubernetesの例:rootで動かさず、能力を全部削ってから必要なものだけ足す
securityContext:
  runAsNonRoot: true
  allowPrivilegeEscalation: false
  readOnlyRootFilesystem: true
  capabilities:
    drop: ["ALL"]
    add: ["NET_BIND_SERVICE"]
  seccompProfile:
    type: RuntimeDefault
rootの万能な権限を「小分け」にして、必要なものだけ渡すroot何でもできるCAP_NET_BIND_SERVICE1024未満のポートで待ち受けCAP_NET_ADMINネットワーク設定の変更CAP_SYS_ADMINマウントなど何でも(ほぼroot)CAP_SYS_PTRACE他のプロセスを覗くCAP_CHOWNファイルの所有者変更CAP_DAC_OVERRIDE権限を無視して読み書きコンテナでは全部落としてから必要なものだけ足す(drop: ALL → add: NET_BIND_SERVICE)。SYS_ADMINや特権は渡さないさらにseccomp(使えるシステムコールを制限)、AppArmor・SELinux(アクセスできる場所を制限)で多層に守る
rootの権限とcapabilities

CAP_SYS_ADMINや特権モードは「ほぼroot」。コンテナに渡すと、ホストへの脱出の足がかりになる。

面接ではこう答える

capabilitiesは、rootの万能な権限を細かい能力に分けた仕組みで、たとえば1024未満のポートで待ち受けるだけならCAP_NET_BIND_SERVICEだけを渡せます。アプリは専用の一般ユーザーで動かし、コンテナでは全部の能力を削ってから必要なものだけ足し、権限昇格を禁止し、seccompで使えるシステムコールを、AppArmorやSELinuxでアクセスできる場所を制限します。

ひとことで

コンテナは「作る(イメージ)」「置く(レジストリ)」「動かす(実行環境)」のそれぞれに守るべき点がある。カーネルを共有している分、権限を削ることが特に大事。

イメージ:ベースイメージは必要最小限のもの(distroless、slim、Alpineなど)を使い、入っている部品を減らして脆弱性の数そのものを減らします。依存ライブラリはバージョンを固定し、ビルドのたびに脆弱性スキャンとSBOMの作成を行います。パスワードやAPIキーをイメージに焼き込んではいけません(イメージを持っている人は誰でも取り出せます)。

レジストリ:ECRなどの非公開レジストリに置き、タグを不変(同じタグで上書きできない)にして、本番で動くイメージが勝手に差し替わらないようにします。プッシュ時と定期的なスキャンで、後から見つかったCVEにも気づけるようにします。可能ならイメージに署名し、デプロイ時に署名を確認します。

実行:コンテナはホストのカーネルを共有しているので、コンテナから抜け出されるとホスト全体が危険になります。そのため、rootで動かさない、特権モード(privileged)を使わない、Linuxのcapabilityを削る、ファイルシステムを読み取り専用にする、seccompで使えるシステムコールを絞る、といった方法で権限を最小にします。KubernetesではPod Security Standards(restricted)や、Kyverno・OPA Gatekeeperなどで危険な設定をデプロイ時に拒否します。

観点対策
AWSの権限Pod・タスクごとにIAMロールを分ける(EKS Pod Identity・IRSA・ECSタスクロール)。ノードのロールに頼らない
ノードの認証情報IMDSv2を必須にし、応答のホップ数を1にしてコンテナから取れないようにする
秘密情報Secrets Managerなどから実行時に渡す。環境変数で渡す場合は閲覧権限に注意
ネットワークKubernetesのNetworkPolicyや、ECSならタスクごとのSGで必要な通信だけ許可
クラスタRBACで最小権限、APIエンドポイントを非公開、監査ログを有効に
実行時の監視GuardDutyのランタイムモニタリング、Falcoなどで、シェルの起動や不審な通信を検知
更新ベースイメージとノードのAMIを定期的に更新し、作り直してデプロイする
コンテナのセキュリティは「作る・置く・動かす」の各段階で守る1 ビルド最小のベースイメージ依存ライブラリを固定2 スキャン・署名脆弱性スキャン・SBOMイメージに署名3 レジストリECRで非公開・タグを不変に4 デプロイ時の検査署名と設定を確認危険な設定は拒否5 実行時の制限非root・読み取り専用権限を最小に6 権限Pod・タスクごとにIAMロールを分ける7 ネットワークNetworkPolicyやSGで通信を絞る8 実行時の監視GuardDutyなどで不審な動きを検知
コンテナのライフサイクルごとの対策

「スキャンして終わり」ではなく、デプロイ時の検査と実行時の制限・監視までつなげる。

1枚破られても次で止める。内側ほど細かく権限を削るクラウドIAM最小権限・GuardDuty・CloudTrailクラスタRBAC・NetworkPolicy・監査ログ・APIを非公開ノード(ホスト)カーネル更新・IMDSv2・最小OSPod・タスクseccomp・読み取り専用ファイルシステム・特権なしコンテナ非root・capabilityを削る・秘密情報を焼き込まないアプリ
コンテナの多層防御

どこか1枚が破られても、次の層で被害を止める。

ノードの権限を全Podで共有せず、Podごとに必要なIAMロールだけを渡す避けたい形決済Pod画像Pod管理画面PodノードのIAMロール全部の権限を足したもの1つのPodが乗っ取られると、全部の権限が使える望ましい形:Podごとに専用ロール決済Pod決済用ロール画像PodS3読み書きロール管理画面Pod読み取り専用ロールEKS Pod Identity・IRSA・ECSタスクロール被害はそのPodの権限の範囲にとどまるあわせて IMDSv2 を必須にし、応答のホップ数を1にして、コンテナからノードの認証情報を取れないようにする
Podごとの権限の分け方

ノードのロールを全Podで共有すると、1つの侵害が全権限の漏えいになる。

面接ではこう答える

コンテナのセキュリティは、作る・置く・動かすの段階ごとに考えます。イメージは最小のベースを使い、ビルド時にスキャンとSBOM作成を行い、秘密情報を焼き込みません。レジストリではタグを不変にして継続的にスキャンします。実行時はホストのカーネルを共有しているので、非root、特権なし、capabilityの削減、読み取り専用のファイルシステムで権限を最小にし、IAMロールはPodやタスクごとに分け、IMDSv2でノードの認証情報を守ります。最後にGuardDutyなどで実行時の不審な動きを監視します。

11.16CVEと脆弱性管理

用語★★☆ 重要
ひとことで

CVEは公開された脆弱性につける世界共通の番号。深刻度はCVSSで点数化し、実際の対応順は悪用状況と自社での露出も合わせて決める。

CVE(Common Vulnerabilities and Exposures)は、公開された脆弱性を世界中で同じ名前で呼ぶための識別番号です。MITREが運営するCVEプログラムのもと、ベンダーや研究機関などのCNA(採番機関)が番号を割り当てます。米国NISTのNVDや日本のJVNが、CVEに詳細や深刻度の情報を付けて公開しています。CVEは「何の脆弱性か」を特定する番号であって、危険度そのものではありません。

危険度はCVSS(共通脆弱性評価システム)で0.0〜10.0の点数にします。攻撃がネットワーク越しにできるか、認証が要るか、利用者の操作が要るか、機密性・完全性・可用性にどれだけ影響するか、などから計算します。ただしCVSSは「最悪の場合の深刻さ」なので、点数の高い順に全部すぐ直すのは現実的ではありません。

そこで実務では、実際に悪用が確認されているかを米国CISAのKEV(Known Exploited Vulnerabilities)カタログで、今後30日以内に悪用される確率をFIRSTのEPSSで確認し、さらに自社でその機能を使っているか、外部に露出しているかを合わせて優先度を決めます。どのライブラリのどのバージョンを使っているかを把握するために、SBOM(ソフトウェア部品表)を整備し、依存ライブラリやコンテナイメージを継続的にスキャンします。

用語意味
CVE脆弱性の識別番号(例:CVE-2021-44228)
CNACVE番号を割り当てる権限を持つ組織(ベンダーなど)
NVD・JVNCVEの詳細情報や深刻度を公開しているデータベース
CVSS深刻度を0.0〜10.0で表す評価方法。基本値に、悪用状況や環境の評価を加えられる
KEV実際に悪用が確認された脆弱性の一覧(CISA)
EPSS近い将来に悪用される確率の予測値(FIRST)
ゼロデイ修正パッチが出る前に悪用されている脆弱性
SBOM使っているソフトウェア部品とバージョンの一覧
CWE脆弱性の「種類」の分類(例:SQLインジェクション)。CVEは個別の事例
CVE番号は「脆弱性の背番号」。中身の深刻度はCVSSで表すCVE-2021-44228共通の識別子採番された年連番(4桁以上)この例はLog4jの脆弱性(通称 Log4Shell)。同じ脆弱性を世界中で同じ番号で呼べる
CVE番号の読み方

CVEは「どの脆弱性か」を指す番号。危険度はCVSSで別に表す。

CVSSは0〜10点。7.0以上が「高」、9.0以上が「緊急」低中高緊急0.04.07.09.010.0点数は「最悪の場合の深刻さ」。実際の優先度は、悪用が確認されているか(CISA KEV)・悪用される確率(EPSS)・自社でその機能が外部に露出しているか、を合わせて決める
CVSSの深刻度区分

点数は最悪の場合の深刻さ。自社の状況で優先度は変わる。

脆弱性が公開されてから、自社で直すまでの流れ1 発見・報告研究者やベンダーが見つけて報告2 CVE採番CNA(採番機関)が番号を割り当て3 公開NVD・ベンダーのアドバイザリで公開4 パッチ提供修正版や回避策が出る5 検知スキャナや通知で自社の該当を把握6 評価深刻度×悪用状況×自社での露出7 対応更新・回避策・WAFで緩和8 確認再スキャンで解消を確認
脆弱性の公開から対応完了までの流れ

5〜8が自社の仕事。検知を自動化し、評価の基準を事前に決めておく。

CVSSの高さだけで決めず、悪用されやすさと露出を掛け合わせるCVSS 高(7.0以上)CVSS 中〜低悪用されている外部に露出悪用なし内部のみすぐ対応緊急パッチ・回避策・WAF早めに対応次の定期作業を待たない計画的に対応期限を決めて更新定期更新で対応依存更新のサイクルで解消悪用状況はCISAのKEVカタログ、悪用確率はEPSSで確認できる
脆弱性対応の優先度の決め方

「CVSSが高い順」ではなく「悪用されやすく、外部に出ている順」に直す。

面接ではこう答える

CVEは公開された脆弱性につける共通の識別番号で、深刻度はCVSSで0〜10の点数で表します。CVSSは最悪の場合の評価なので、実際の優先度は、KEVで悪用が確認されているか、EPSSで悪用確率はどうか、自社でその機能が外部に露出しているかを合わせて決めます。SBOMで使っている部品を把握し、スキャンを自動化して、緊急度ごとに対応期限を決めて運用します。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • AWSのセキュリティを、アカウント設計・IAM・ネットワーク・検知の4つの層で語れるようにする
  • コンテナを作る・置く・動かすの各段階で、何を守るかを言えるようにする
  • CVEとCVSSの違い、実務での脆弱性対応の優先度の決め方を言えるようにする
  • 暗号化と復号、公開鍵と秘密鍵:鍵が1つで暗号化も復号もするのが共通鍵、ペアの片方で閉じてもう片方で開けるのが公開鍵。公開鍵の仕組みは「暗号化」と「署名」の両方に使える。
  • 証明書の運用:証明書は必ず期限が切れる。発行から更新・失効までを自動化し、期限の監視と棚卸しを続ける。有効期間は年々短くなっている。
  • 認証の種類と強化(MFA・SSO・パスキー):認証は「あなたが誰か」の確認、認可は「何をしてよいか」の判断。認証は複数の要素を組み合わせ、SSOでまとめると安全で運用も楽になる。
  • AWSセキュリティの全体像(責任共有・マルチアカウント):AWSが守るのは物理設備や基盤。その上で何をどう設定するかは利用者の責任。最初の設計で大事なのはアカウントの分け方。
  • AWS Organizationsのデファクト構成:管理アカウントの下に、セキュリティ・インフラ・ワークロード・サンドボックスなどのOUを作り、ガードレールをかけるのが定番。Control Towerで始めるのが近道。
  • IAM(権限管理):AWSで「誰が・何に対して・何をしてよいか」を決める仕組み。最小権限と、長期の鍵を持たないことが基本。
  • ネットワークの守り(SG・NACL・WAF・VPCエンドポイント):VPCの中は「サブネットの門(NACL)」と「サーバーごとの扉(セキュリティグループ)」で守り、外の玄関にはWAFを置く。
  • WAFとその置き場所:WAFはWebアプリへの攻撃パターンを入口で止める。置き場所は「できるだけ外側」で、WAFを素通りする裏口を塞ぐことが同じくらい大事。
  • 踏み台サーバーとSession Manager:踏み台は、内側のサーバーに入るための「中継用のサーバー」。今はSSHの穴を開けずに入れるSession Managerを使うのが標準。
  • 検知と対応(CloudTrail・GuardDuty・Security Hub):防ぎきれない前提で、記録し、異常を検知し、1か所に集めて、すぐ動ける仕組みを作る。
  • 暗号化通信と保存時の暗号化:「通信中」はTLSで、「保存中」はKMSなどの鍵で暗号化する。どこで復号されるかと、鍵を誰が使えるかを管理するのが本質。
  • Linux capabilitiesとプロセスの権限:rootの万能な権限を、細かい「能力」に分けたもの。必要な能力だけを渡し、rootで動かさないことが、コンテナでもサーバーでも基本。
  • コンテナセキュリティ:コンテナは「作る(イメージ)」「置く(レジストリ)」「動かす(実行環境)」のそれぞれに守るべき点がある。カーネルを共有している分、権限を削ることが特に大事。
  • CVEと脆弱性管理:CVEは公開された脆弱性につける世界共通の番号。深刻度はCVSSで点数化し、実際の対応順は悪用状況と自社での露出も合わせて決める。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1S3バケットからの情報漏えいをどう防ぎますか?

模範回答

アカウント全体でブロックパブリックアクセスを有効にし、SCPでその解除を禁止します。公開が必要な配信はバケットを非公開のままCloudFront経由にし、アップロードやダウンロードは署名付きURLで期限つきの権限だけを渡します。バケットポリシーとIAMで最小権限にし、IAM Access Analyzerで外部に公開されたバケットを検出します。CloudTrailのデータイベントで誰が何を読んだかを記録できるようにしておきます。

深掘りされたら

  • 誤って公開してしまった場合の初動は?

見られているポイント予防・検知・記録の3段構え

Q2AWSのアカウント設計はどうしていますか?

模範回答

Organizationsで管理し、本番・ステージング・開発・サンドボックス、そしてログ保管と監査用のセキュリティアカウントに分けます。CloudTrailやConfigのログはログ保管アカウントに集め、本番の管理者でも消せないようにします。GuardDutyやSecurity Hubは監査アカウントを委任管理者にして組織全体で有効化し、SCPでログの停止や許可外リージョンの利用を禁止します。人のログインはIAM Identity Centerにまとめます。

深掘りされたら

  • アカウントを分けるデメリットは?
  • SCPとIAMポリシーの違いは?

見られているポイント隔離・ログ保全・ガードレール

Q3アクセスが拒否されたとき、IAMのどこから調べますか?

模範回答

エラーメッセージに含まれる拒否の種類(明示的なDenyか、SCPか、権限境界か、単にAllowがないのか)をまず確認します。そのうえで、明示的なDenyがどこかにないか、SCPや権限境界で止められていないか、アイデンティティ側とリソース側のどちらかにAllowがあるかを順に見ます。アカウントをまたぐ場合は両側でAllowが必要です。IAMのポリシーシミュレーターやCloudTrailのエラー記録も使います。

深掘りされたら

  • Denyが最優先になるのはなぜですか?

見られているポイント評価ロジックを理解しているか

Q4コンテナのセキュリティで、何をしていますか?

模範回答

イメージは最小のベースイメージを使い、CIでスキャンとSBOMの作成を行い、重大な脆弱性があればデプロイを止めます。ECRでタグを不変にし、継続的にスキャンします。実行時は非root、特権なし、読み取り専用のファイルシステムにし、Pod Security Standardsで危険な設定を拒否します。AWSの権限はPodやタスクごとにロールを分け、IMDSv2でノードの認証情報を守ります。GuardDutyのランタイムモニタリングで不審な動きを検知します。

深掘りされたら

  • ベースイメージにCVEが見つかったが、修正版がまだない場合は?

見られているポイント作る・置く・動かすの全段階を語れるか

Q5CIからAWSにデプロイするときの認証はどうしますか?

模範回答

長期のアクセスキーをCIのシークレットに保存せず、GitHub ActionsならOIDCでIAMロールを引き受けて一時的な認証情報を使います。ロールの信頼ポリシーで、リポジトリやブランチ、環境を限定し、本番用のロールは保護されたブランチや承認つきの環境からしか引き受けられないようにします。権限はデプロイに必要な操作だけに絞ります。

深掘りされたら

  • 信頼ポリシーの条件を緩くするとどんな危険がありますか?

見られているポイント長期キーを持たない設計

Q6データの暗号化について、どこまでやっていますか?

模範回答

通信は外部との間をTLS 1.2以上で暗号化し、LBで終端した後の区間も方針を決めています。保存データはEBS、S3、RDS、バックアップをKMSの鍵で暗号化し、鍵を使えるIAMロールを最小限にして、利用履歴をCloudTrailで確認できるようにしています。秘密情報はSecrets Managerで管理し、証明書は自動更新に加えて期限を監視しています。

深掘りされたら

  • 鍵が漏れた・不正に使われた場合はどうしますか?

見られているポイント通信・保存・鍵管理の3点

Q7公開鍵と秘密鍵の使い方を説明してください。

模範回答

公開鍵と秘密鍵は対になっていて、公開鍵は誰に配ってもよく、秘密鍵は持ち主だけが持ちます。相手にだけ読ませたいときは、相手の公開鍵で暗号化すれば、相手の秘密鍵でしか復号できません。本人が作ったことを証明したいときは、自分の秘密鍵で署名し、誰でも公開鍵で検証できます。TLS証明書やJWT、SSHの鍵はこの仕組みを使っています。実際のデータの暗号化は、速い共通鍵暗号を使い、その鍵の受け渡しに公開鍵の仕組みを使います。

深掘りされたら

  • 前方秘匿性とは何ですか?

見られているポイント暗号化と署名で鍵の向きが逆になることを理解しているか

Q8WAFはどこに置きますか?

模範回答

攻撃をオリジンに届かせないために、できるだけ外側のCloudFrontに置くのが基本です。CloudFrontを使わない構成やリージョン内の通信も守りたい場合はALBにも置きます。重要なのは、WAFを通らない裏口を塞ぐことで、ALBのセキュリティグループをCloudFrontのマネージドプレフィックスリストだけにし、CloudFrontが付ける秘密のヘッダーを確認するか、VPCオリジンでALBを非公開にします。ルールはマネージドルールから始め、まずCountモードで誤検知を確認してからBlockにします。

深掘りされたら

  • WAFだけでSQLインジェクションを防げますか?

見られているポイント置き場所と裏口の両方

Q9本番のサーバーやDBに入る必要があるとき、どうしていますか?

模範回答

踏み台サーバーは使わず、Session Managerを使っています。受信ポートを開けずに入れて、権限はIAMとSSOで管理し、操作のログを残しています。DBへの接続はSession Managerのポートフォワーディングで行い、コンテナにはECS Execを使います。本番への権限は普段は持たせず、必要なときに理由を記録して一時的に付与するようにしています。

深掘りされたら

  • 操作ログに秘密情報が残る場合はどうしますか?

見られているポイント穴を開けない・鍵を配らない・記録する

Q10証明書の期限切れによる障害を防ぐには?

模範回答

ACMやACMEで発行と更新を自動化し、自動化できない証明書を減らします。そのうえで、外部から実際の証明書の期限を確認する監視と、期限の一定日数前のアラートを設定します。自動更新も、DNS検証用のレコードが消されるなどで静かに失敗することがあるので、更新の成否も監視します。どのドメインの証明書がどこにあり、誰が担当かを棚卸ししておきます。公開証明書の有効期間は段階的に短くなっていて、2029年には47日になるので、手動更新は前提にできません。

深掘りされたら

  • 中間証明書の問題はどう見つけますか?

見られているポイント自動化と監視と棚卸し

Q11コンテナでrootで動かしてはいけないのはなぜですか?

模範回答

コンテナはホストのカーネルを共有しているので、アプリの脆弱性を突かれたとき、rootで動いていると、カーネルの脆弱性や設定の不備と組み合わせてホストに抜け出される危険が大きくなります。専用の一般ユーザーで動かし、capabilitiesを全部削ってから必要なものだけ足し、権限昇格を禁止し、ファイルシステムを読み取り専用にすることで、侵入されたときの被害を小さくします。

深掘りされたら

  • 1024未満のポートで待ち受けたい場合は?

見られているポイント多層防御の考え方