ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

AWS CLI:IAMで管理者権限を使ってる場合、せめて送信元IPの制限をかける。

f:id:toyokky:20211016161834p:plain

検証用や個人用のAWSアカウントで、IAMユーザーのIAMポリシーに管理者権限のAdministratorAccessを使用している人は多いのではないでしょうか。・・・・僕もその一人です(汗)

クラスメソッドさんの記事でも注意を促していますが、アクセスキーの流出で多額の費用請求されることがまだまだあるようです。

dev.classmethod.jp


また、他の方からは「不正利用された場合、以前は個人なら免除もあったが最近はそうでもなくなってきた。」ということも伺いました。
どちらにせよ、アクセスキーの流出で借金負うわけにはいかないです。。。


アクセスキーの流出で痛い目を見ないための方法としては、「アクセスキーを使わない」が凄く有効だと思います。

  • AWS CloudShell を利用する。
  • AWS Cloud9 を利用する。
  • CLI用のEC2へIAMロールを付与して利用する。

ただ、、、個人的にはCloudShellへ移行していくことを考えていますが、これまでの方法を急には変えられないって事情がある場合もありますよね。(僕例:・・・職場のCLIコマンド、PowerShellガチガチで作ってしもうた・・・。)


本記事では、これまで通りアクセスキーを使用したAWS CLIの利用をする場合、少しでもセキュリティレベルを上げるために、管理者権限のIAMポリシーで送信元IPアドレスを制限する方法について記載します。
ただしこの手順は、グローバルIPアドレスが変わると接続できなくなりますの注意と自己責任でお願いします。


この記事を読むことで出来ること

  • アクセスキーを使用する場合の送信元IPアドレスを制限する。
    • グローバルIPアドレスが変わらない環境を推奨。
    • グローバルIPアドレスが変わる場合は、IAMポリシーの修正が出来る別IAMユーザー等を用意した方が良いです。
  • AWS CLIでIAMポリシー(カスタマ管理ポリシー)を作成する。
  • AWS CLIでIAMグループへIAMポリシーをアタッチする。
  • AWS CLIでIAMユーザーへIAMポリシーをアタッチする。

目次

検証環境

  • 検証日: 2021/10/16
  • PC環境:
    • Windows10 Home バージョン 21H1
      • AWS CLI: aws-cli/2.1.34 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
        • -- profile default : 読み取り専用
        • -- profile aws_RW : 書き込み権限あり
          • ※ 誤操作防止のため、変更操作時のみ-- profileオプションを付けてます。
      • PowerShell: Ver7.1.5

注意事項

  • 本記事の内容はWindows PowerShellで検証しています。
  • AWS CLIはバージョン2を使用しています。
    • 本記事のコマンド出力でYAMLを使用してますが、これはバージョン2からの機能です。
  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。ご自身の環境に合わせ、書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。
  • セキュリティ関連のため、本記事の利用時は必ず事前の検討・検証をお願いします。
  • グローバルIPアドレスがコロコロ変わる環境では、本記事の内容はオススメしません。
  • AWS CLI専用のIAMユーザーまたはグループでの利用を推奨。


1. 事前確認

1.1. 自己PCのグローバルIPアドレス

自己PCが使用しているグローバルIPアドレスは以下のサイトなどへ接続すると見ることができます。

あなたの情報(安全な確認くん)

ただ、本記事ではグローバルIPアドレスを変数へ格納して利用したいため以下のコマンドを利用します。

curl.exe ifconfig.me

1.2, アクセスキーを発行するIAMユーザーについて

本記事ではIAMユーザーの作成は行いませんので、IAMユーザーは別途用意してください。
本記事で作成するIAMポリシーを、既存のIAMユーザーまたはIAMグループへアタッチすることを想定しています。


2. IAMポリシーの作成(送信元IPを制御した管理者権限)

IAMポリシー名: AdministratorAccess_SourceIPを作成します。
ポリシーの中身はAWS管理ポリシー: AdministratorAccessと権限自体は同じで、送信元IPアドレスの指定だけを追加しています。

# --- PowerShell ---  ※変数部分は自分用に修正してください。
# 作業フォルダの作成
${date} = Get-Date -Format yyyy-MM-dd
${work_dir} = "C:\#temp\awscli\${date}"
New-Item "${work_dir}" -itemType Directory -Force

# (参考)作成した作業フォルダを開くコマンド
Invoke-Item "${work_dir}"



# IAMポリシーを記載したJSONファイルを出力
${policy_name} = "AdministratorAccess_SourceIP"
${global_ip} = curl.exe ifconfig.me ; ${global_ip}

${json_content} = @"
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "${global_ip}/32"
                }
            }
        }
    ]
}
"@
Write-Output ${json_content} | Out-File -Encoding ascii ${work_dir}\${policy_name}.json



# IAMポリシー`AdministratorAccess_SourceIP`の作成
${profile} = "aws_RW"

aws iam create-policy `
    --profile ${profile} `
    --policy-name ${policy_name} `
    --description "This policy specifies the source IP to AdministratorAccess." `
    --policy-document file://${work_dir}\${policy_name}.json `
    --tags "Key=Name,Value=${policy_name}"


3. 作成したIAMポリシーをIAMユーザーまたはIAMグループへ適用する

作成したIAMポリシー: AdministratorAccess_SourceIPを適用(アタッチ)します。

元々、IAMユーザーまたはIAMグループへAWS管理ポリシーAdministratorAccessを適用してる場合、それを外す(デタッチ)コマンドも記載しています。

3.1. IAMユーザーへIAMポリシーの適用

# --- PowerShell ---  ※変数部分は自分用に修正してください。
# IAMポリシーのARNを変数に格納
${profile} = "aws_RW"
${policy_name} = "AdministratorAccess_SourceIP"

${policy_arn}=aws iam list-policies `
    --profile ${profile} `
    --scope Local `
    --max-items 1000 `
    --query "Policies[?PolicyName=='${policy_name}'].Arn" `
    --output text `
    ; ${policy_arn}



# IAMユーザーへIAMポリシーを適用(アタッチ)
${iamuser_name} = "toyo-iur-cli-rw"

aws iam attach-user-policy `
    --profile ${profile} `
    --user-name ${iamuser_name} `
    --policy-arn ${policy_arn}



# IAMユーザーからAWS管理ポリシー: `AdministratorAccess`を外す(デタッチ)
aws iam detach-user-policy `
    --profile ${profile} `
    --user-name ${iamuser_name} `
    --policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"

3.2. IAMグループへIAMポリシーの適用

# --- PowerShell ---  ※変数部分は自分用に修正してください。
# IAMポリシーのARNを変数に格納
${profile} = "aws_RW"
${policy_name} = "AdministratorAccess_SourceIP"

${policy_arn}=aws iam list-policies `
    --profile ${profile} `
    --scope Local `
    --max-items 1000 `
    --query "Policies[?PolicyName=='${policy_name}'].Arn" `
    --output text `
    ; ${policy_arn}



# IAMグループへIAMポリシーを適用(アタッチ)
${iamgroup_name} = "toyo-igr-adm"

aws iam attach-group-policy `
    --profile ${profile} `
    --group-name ${iamgroup_name} `
    --policy-arn ${policy_arn}



# IAMグループからAWS管理ポリシー: `AdministratorAccess`を外す(デタッチ)
aws iam detach-group-policy `
    --profile ${profile} `
    --group-name ${iamgroup_name} `
    --policy-arn "arn:aws:iam::aws:policy/AdministratorAccess"


4. 要検討(未完成):IAMポリシーの修正(送信元IPの変更)

グローバルIPアドレスが変動する環境でも利用できるように、っとIAMポリシーの修正方法を考えていたのですが、現状では方法がまとまらず・・・。本項は今後の課題とします。


課題

  • このコマンドを実行する時はIPアドレスが変わってる時だから、それ用の権限が必要。
  • 以下コマンドを変更するために必要な権限の洗い出し
    • aws iam create-policy-version
    • aws iam set-default-policy-version
  • ↓は読み取りなのでarn:aws:iam::aws:policy/IAMReadOnlyAccessをIP制限せずに付与する?
    • 否!IAMの情報を見られると仕組みがバレる。
    • 下のコマンドActionを許可して、対象リソースを絞る。
    • aws iam list-policies
    • aws iam list-policy-versions
# --- PowerShell ---  ※変数部分は自分用に修正してください。
# 作業フォルダの作成
${date} = Get-Date -Format yyyy-MM-dd
${work_dir} = "C:\#temp\awscli\${date}"
New-Item "${work_dir}" -itemType Directory -Force

# (参考)作成した作業フォルダを開くコマンド
Invoke-Item "${work_dir}"



## IAMポリシーを記載したJSONファイルを出力
${policy_name} = "AdministratorAccess_SourceIP"
${global_ip} = curl.exe ifconfig.me ; ${global_ip}

${json_content} = @"
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "${global_ip}/32"
                }
            }
        }
    ]
}
"@
Write-Output ${json_content} | Out-File -Encoding ascii ${work_dir}\${policy_name}.json



# IAMポリシーのARNを変数に格納
${policy_name} = "AdministratorAccess_SourceIP"
${profile} = "aws_RW"

${policy_arn}= aws iam list-policies`
    --profile ${profile} `
    --scope Local `
    --max-items 1000 `
    --query "Policies[?PolicyName=='${policy_name}'].Arn" `
    --output text `
    ; ${policy_arn}



# IAMポリシーの修正
aws iam create-policy-version `
    --profile ${profile} `
    --policy-arn ${policy_arn} `
    --policy-document file://${work_dir}\${policy_name}.json



# IAMポリシーの最新バージョンを変数へ格納する
${policy_version}=aws iam list-policy-versions `
    --profile ${profile} `
    --policy-arn ${policy_arn} `
    --query "reverse(sort_by(Versions, &CreateDate))[:1].VersionId" `
    --output text `
    ; ${policy_version}



# IAMポリシーのバージョンを変更したものにする(最新にする)
aws iam set-default-policy-version `
    --profile ${profile} `
    --policy-arn ${policy_arn} `
    --version-id ${policy_version}


5. AWS CLI v2 リファレンスガイド