科目B対策へ戻る

クラウド業務システムの脅威分析・IaCレビュー・リリース判定

オリジナル1問3答目安 18分

R社は,経費精算システム(以下,Eシステムという)を開発している。開発はJ主任のチームが担当し,情報処理安全確保支援士のKさんが支援している。

インフラはAWS上にTerraformのテンプレート(以下,IaCテンプレートという)で構築する。ソースコード等はGitHubのプライベートリポジトリ(以下,Eリポジトリという)で管理し,GitHub Actionsでデプロイする。

〔Eシステムの概要〕

  • 社員は,社内外からインターネット経由でWebアプリケーション(以下,Eアプリという)にログインして経費を申請する。承認できるのは申請者の上長だけである。
  • 領収書画像はAmazon S3のバケット(以下,領収書バケットという)に保存し,Eアプリが取り出して表示する。申請データはAmazon RDSのデータベース(以下,DBという)に保存する。

〔脅威分析〕

Kさんは,設計段階でデータフロー図(DFD)を作成し,STRIDEを用いて脅威を洗い出した(表1)。

表1 脅威分析の結果(抜粋)

項番DFDの要素想定した脅威分類主な対策
T1Eアプリ承認者が承認を後から否定し,誰が承認したのかを示せない否認承認操作の記録,記録の改ざん検知
T2DB承認済みの申請の金額が書き換えられる改ざん接続元の限定,更新履歴
T3上長(外部エンティティ)一般社員が,離席中の上長のPCに残るログイン済みの画面を操作し,自分の申請を承認する【 a 】承認時の再認証,画面の自動ロック
T4領収書バケット社外の第三者が領収書画像を閲覧する情報漏えい公開の禁止,暗号化
T5Eアプリ一般社員が,自分のIDでログインしたまま承認用APIを直接呼び出し,自分の申請を承認する【 b 】API側での権限の検査

〔IaCテンプレートのレビュー〕

表2 インフラのセキュリティ要件

項番要件
R1領収書バケットはインターネットに公開しない。画像はEアプリ経由でだけ閲覧させる。
R2EアプリのIAMロールには,領収書バケットのオブジェクトの読み書きに必要な権限だけを与える。
R3DBにはEアプリのサーバからだけ接続でき,インターネットからは接続できない。
R4AWSの操作を記録し,記録の変更・削除を検知できるようにする。
R5社外からも利用するので,ロードバランサはインターネットからのHTTPS(443)を受け付ける。

Kさんは,IaCテンプレート(図1)をレビューした。

# ① 領収書バケット
resource "aws_s3_bucket_public_access_block" "rcpt" {
  block_public_acls       = true
  ignore_public_acls      = true
  block_public_policy     = false
  restrict_public_buckets = false
}
resource "aws_s3_bucket_policy" "rcpt" {
  policy = jsonencode({ Statement = [{ Effect = "Allow",
    Principal = "*", Action = "s3:GetObject",
    Resource = "arn:aws:s3:::r-rcpt/*" }] })
}
# ② EアプリのIAMロール
resource "aws_iam_role_policy" "app" {
  policy = jsonencode({ Statement = [{ Effect = "Allow",
    Action = "s3:*", Resource = "*" }] })
}
# ③ DB
resource "aws_db_instance" "db" {
  publicly_accessible = false
}
resource "aws_security_group_rule" "db_in" {
  from_port                = 5432
  to_port                  = 5432
  source_security_group_id = aws_security_group.app.id
}
# ④ 操作の記録
resource "aws_cloudtrail" "trail" {
  enable_log_file_validation = true
}
# ⑤ ロードバランサ
resource "aws_security_group_rule" "alb_in" {
  from_port   = 443
  to_port     = 443
  cidr_blocks = ["0.0.0.0/0"]
}

図1 IaCテンプレート(抜粋)

注記1 一部の引数は省略している。aws_security_group.appはEアプリのサーバ用である。

注記2 各設定の意味は次のとおり。

  • パブリックアクセスブロックの4項目は互いに独立している。block_public_aclsとignore_public_aclsはACLによる公開だけに作用する。block_public_policyをtrueにすると公開を許すバケットポリシーの設定が拒否され,restrict_public_bucketsをtrueにすると公開を許すポリシーをもつバケットへのアクセスがAWSサービスプリンシパルと,バケット所有アカウント内の許可された利用者に限られる。アカウント単位のパブリックアクセスブロックは設定していない。
  • ポリシー中の"*"は,全ての主体,操作又はリソースを表す。
  • publicly_accessibleがfalseのDBはパブリックIPアドレスをもたない。source_security_group_idを指定した規則は,そのセキュリティグループのサーバからの通信だけを許可する。
  • enable_log_file_validationをtrueにすると,ハッシュ値を含む署名付きのダイジェストファイルが作成され,ログファイルの変更・削除を検証できる。

〔CI/CDとリリース判定〕

J主任のチームは当初,デプロイ用のIAMユーザー(管理者権限をもつ)のアクセスキーをワークフロー定義ファイルに直接記述してコミットしていた。J主任は,最新のコミットでその記述を削除し,GitHubのシークレットから参照する方式に変えた。アクセスキーそのものは変更していない。Eリポジトリには委託先2社を含む約30名がアクセスでき,多くが手元に複製している。

なお,GitHub ActionsはOpenID Connect(OIDC)に対応しており,AWS側で信頼関係を設定すると,ジョブがGitHubから受け取ったトークンを提示してAWSの認証情報を取得できる。

表3 リリース判定基準

項番基準
C1IaCテンプレートの検査及び静的解析で検出された重大度「高」以上の指摘が全て解消されている。ただし,シークレット検査の指摘はC2で判定し,C1の対象にしない。
C2有効なシークレットが,リポジトリ(過去のコミット及び利用者の手元の複製を含む)に含まれていない。
C3基準を満たさない項目を例外とするときは,情報セキュリティ責任者が承認する。ただし,C2は例外にできない。

表4 検査結果(静的解析の指摘は全て解消済み)

指摘重大度状態
領収書バケットが公開されている(①)高解消済み
IAMロールの権限が過大である(②)高解消済み
領収書バケットのアクセスログが無効である中未解消
過去のコミットにアクセスキーが含まれている(シークレット検査)高最新のコミットからは削除済み

リリース判定会議で,Kさんは表3に照らして,【 c 】と意見を述べた。

設問1

表1中の【 a 】,【 b 】に入れる字句の適切な組合せを,解答群のうちから選べ。

解答群

ab
ア権限昇格なりすまし
イ権限昇格権限昇格
ウなりすまし権限昇格
エなりすまし改ざん
オなりすましなりすまし
カ否認権限昇格

設問2

図1中の①〜⑤のうち,表2の要件を満たしていない箇所だけを全て挙げたものはどれか。解答群のうち,最も適切なものを選べ。

解答群

設問3

本文中の【 c 】に入れる意見はどれか。解答群のうち,最も適切なものを選べ。

解答群

正解 0 / 解答 0(全3設問)

クラウド業務システムの脅威分析・IaCレビュー・リリース判定 | 行政書士AI学習