IAMユーザーにおけるパスワードポリシーの設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、IAMアカウントのパスワードポリシー設定に関するセキュリティ要件について解説します。

ポリシーの説明

[IAM.7] IAM ユーザーのパスワードポリシーには強力な設定が必要です

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/iam-controls.html#iam-7

このコントロールは、IAM ユーザーのアカウントパスワードポリシーが強力な設定を使用しているかどうかをチェックします。パスワードポリシーが強力な設定を使用していない場合、コントロールは失敗します。カスタムパラメータ値を指定しない限り、Security Hub は前の表に記載されているデフォルト値を使用します。PasswordReusePrevention パラメータおよび MaxPasswordAge パラメータにはデフォルト値がないため、これらのパラメータを除外した場合、Security Hub はこのコントロールを評価する際にパスワードローテーションの回数とパスワードの有効期間を無視します。

一般的に推奨される(または特定のコンプライアンス要件で求められる)設定内容は以下の通りです。

  • パスワードの最小文字数:
    • 8文字以上を強制(より安全なのは14文字以上)
  • パスワードの複雑性要件:
    • 少なくとも1つの大文字アルファベット(A-Z)の使用
    • 少なくとも1つの小文字アルファベット(a-z)の使用
    • 少なくとも1つの数字の使用
    • 少なくとも1つの特殊文字(!@#$%^&*()_+-=[]{}|’)の使用
  • その他のオプション:
    • その他のオプション: パスワードの有効期間(例: 90日以内)、パスワード履歴(再利用禁止数、例: 24回)など。

ただし、パスワードの複雑性や有効期限の強制だけでは十分なセキュリティとは言えず、多要素認証(MFA)の利用がより重要であるという議論もあります。

https://www.itmedia.co.jp/news/spv/2410/07/news054.html

一方で、CISベンチマークや各種コンプライアンス要件に対応するためには、これらのポリシー設定が必要となる場合があります。本記事ではその設定方法について解説します。

修復方法

IAMパスワードポリシーの変更方法には、主に2つのアプローチがあります。

  1. 個別アカウントでのIAMパスワードポリシー変更: aws iam update-account-password-policy コマンドやAWSコンソール、Terraform (aws_iam_account_password_policy) を使用して、パスワードの最小長、複雑性要件、有効期限などを直接指定できます。
  2. AWS Organizationsを使用したService Control Policy (SCP)による変更: この方法は、組織内の複数のアカウントに対して一貫したパスワードポリシー(の下限)を強制するのに適しています。ただし、SCPは直接パスワードポリシーを設定するのではなく、要件を満たさないパスワード設定操作を拒否する形で機能します。

それぞれの修復方法について試してみます。

1.修復方法: 個別アカウントでのIAMパスワードポリシー変更

Terraformでの修復手順

利用するTerraformのリソース自体は非常にシンプルですね。

# IAMアカウントパスワードポリシーの設定
resource "aws_iam_account_password_policy" "strict" {
  minimum_password_length        = 14
  require_lowercase_characters   = true
  require_uppercase_characters   = true
  require_numbers                = true
  require_symbols                = true
  allow_users_to_change_password = true
  max_password_age               = 90
  password_reuse_prevention      = 24
  hard_expiry                    = true
}

# パスワードポリシーの設定を出力
output "password_policy" {
  value = aws_iam_account_password_policy.strict
}

Terraformコードのポイント:

  • aws_iam_account_password_policy リソースを使用して、アカウントのパスワードポリシーを直接定義します。
  • 各属性 (minimum_password_length, require_lowercase_characters など) を true または適切な値(最小長14、最大有効期間90日、再利用禁止24回など)に設定することで、強力なパスワードポリシーを適用できます。
  • hard_expiry = true は、パスワード有効期限切れ時に管理者の介入なしにユーザーが自身でパスワード変更できるか(false)/できないか(true)を指定します。false (デフォルト) の方が運用上便利な場合がありますが、セキュリティ要件によります。

2.修復方法: AWS Organizationsを使用したService Control Policy (SCP)による変更

Terraformでの修復手順

# SCPの内容を定義
locals {
  scp_content = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Sid    = "IAMPasswordPolicy"
        Effect = "Deny"
        Action = [
          "iam:CreateLoginProfile",
          "iam:UpdateLoginProfile"
        ]
        Resource = "*"
        Condition = {
          NumericLessThan = { "iam:PasswordLength" : 14 }
          Bool = {
            "iam:RequireUppercaseCharacters" = false
            "iam:RequireLowercaseCharacters" = false
            "iam:RequireSymbols"             = false
            "iam:RequireNumbers"             = false
          }
          NumericGreaterThan = {
            "iam:PasswordReusePrevention" = 24
            "iam:MaxPasswordAge"          = 90
          }
        }
      }
    ]
  })
}

# SCPの作成
resource "aws_organizations_policy" "iam_password_policy" {
  name        = "IAMPasswordPolicySCP"
  description = "SCP to enforce IAM password policy across the organization"
  content     = local.scp_content
  type        = "SERVICE_CONTROL_POLICY"
}

# 組織のルートIDを取得
data "aws_organizations_organization" "org" {}

# SCPを組織のルートに適用
resource "aws_organizations_policy_attachment" "root_attachment" {
  policy_id = aws_organizations_policy.iam_password_policy.id
  target_id = data.aws_organizations_organization.org.roots[0].id
}

# 出力
output "scp_id" {
  value       = aws_organizations_policy.iam_password_policy.id
  description = "The ID of the created SCP"
}

output "root_id" {
  value       = data.aws_organizations_organization.org.roots[0].id
  description = "The ID of the organization's root"
}

Terraformコードのポイント:

  • aws_organizations_policy リソースでSCPを定義します。
  • Effect = "Deny"Action (iam:CreateLoginProfile, iam:UpdateLoginProfile) を組み合わせ、Condition ブロックでパスワードポリシーの要件(長さ、複雑性、有効期間、再利用禁止など)を指定します。
  • このSCPは、指定された条件を満たさないパスワード設定(UpdateLoginProfile)や、パスワード設定を伴うユーザー作成(CreateLoginProfile)を拒否することで、ポリシーを強制します。
  • 作成したSCP (aws_organizations_policy_attachment) を組織のルートや特定のOUにアタッチして適用します。

最後に

今回は、IAMパスワードポリシーへの対処方法についてご紹介しました。 セキュリティ対策全体から見ると、パスワードポリシーの強化よりも多要素認証(MFA)の強制化の方が不正アクセス防止にはより効果的であると考えられます。可能であればMFAの適用も併せて検討・実施しましょう。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る