概要

  • 今回は、IAM Userやアクセスキーを利用する際に、IAM User に対して、アクセス元のIPアドレス制限を行うIAM ポリシーを追加して、セキュリティリスクを軽減する方法を紹介します。
  • クラウドサービスの利用が拡大する中、セキュリティリスクへの懸念も高まっております。AWS を利用する際に、IAM Userやアクセスキーを適切に管理しなければ、不正アクセスやデータ漏洩のリスクに晒される可能性があります。先ず、以下の2つの背景からIPアドレス制限に重要性があると考えています。今回は、アクセスキーへのアクセス制限を例に記事を記載しております。
    • マネジメントコンソールへのアクセス制限:特定のIPアドレスからのみマネジメントコンソールへのアクセスを許可することで、不正アクセスを防止する。
    • アクセスキーへのアクセス制限:アクセスキーが漏洩した場合でも、特定のIPアドレスからのアクセスのみを許可することで、被害を最小限に抑える。
  • アクセスキーの利用については、一時的に権限を付与する Assume Roleなどのより安全な方法に切り替えることが推奨されます。しかし、既存システムの改修など、移行に時間がかかるケースも多いかと思います。IPアドレス制限は、根本的なセキュリティ対策を行うまでの間、既存の運用を変更することなく、すぐにセキュリティ対策を強化できる効果的な方法です。
  • 本記事では、IPアドレス制限を行った後、動作確認を行い、CloudTrail に記録されたイベント履歴についても紹介しています。

 

IAM UserやアクセスキーにIPアドレス制限のポリシーを追加する

  • 先ずマネジメントコンソールからIAM にアクセスし、左ペインの「ポリシー」を選択します。
  • 「ポリシーの作成」を選択し、ポリシーエディタから以下のJSON を貼り付けます。
    • 例として、128.1.1.1 のIPアドレスを使用しています。ポリシーでは、128.1.1.1 以外のIPアドレスからのアクセスを拒否を行っています。
    • IAMでは、明示的な許可(Allow ステートメント)や暗黙的な許可より、明示的な拒否(Deny ステートメント)が優先されるため、Deny ステートメントを使用して記述を行います。

 

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "128.1.1.1"
                    ]
                }
            }
        }
    ]
}

 

  • 「次へ」を選択し、ポリシー名を入力します。
  • 「ポリシーの作成」を選択します。
  • ポリシーが作成されました。ポリシー名は、便宜上「AllowIPaddress-policy」のように付けていますが、実際には特定のIPアドレス以外を拒否するポリシーとなります。

  • 次に、左ペインの「ユーザー」を選択します。
  • 対象ユーザーを選択し、許可の「許可を追加」→「許可を追加」を選択します。
  • 「ポリシーを直接アタッチする」を選択し、先ほど作成したポリシーを選択します。続けて、「次へ」を選択します。
  • 「許可を追加」を選択します。
  • IAMユーザーへIPアドレス制限のポリシーが追加されました。

 

 

動作確認およびCloudTrail のイベント履歴

  • ターミナルから動作確認を行います。(割愛しますが、事前にアクセスキーを設定しています)
  • 仮に、操作するクライアントのパブリックIPアドレスは、133.1.1.1 とします。(以下のコマンドにて確認可)

 

niikawa@niikawa2:~$ curl inet-ip.info
133.1.1.1

 

  • aws ec2 describe-instances コマンド、dateコマンドを実行します。結果は、UnauthorizedOperation となり、アクセスは拒否されました。

 

niikawa@niikawa2:~$ aws ec2 describe-instances --region ap-northeast-1;date

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation. User: arn:aws:iam::11111111111:user/niikawa is not authorized to perform: ec2:DescribeInstances with an explicit deny in an identity-based policy
Fri Jan 24 00:08:48 JST 2025

 

  • aws s3api create-bucket コマンド、dateコマンドを実行します。結果は、AccessDenied となり、アクセスは拒否されました。

 

niikawa@niikawa2:~$ aws s3api create-bucket --bucket niikawa-test-bucket1 --region ap-northeast-1 --create-bucket-configuration LocationConstraint=ap-northeast-1;date

An error occurred (AccessDenied) when calling the CreateBucket operation: User: arn:aws:iam::11111111111:user/niikawa is not authorized to perform: s3:CreateBucket on resource: "arn:aws:s3:::niikawa-test-bucket1" with an explicit deny in an identity-based policy
Fri Jan 24 00:08:59 JST 2025

 

  • aws s3 cp コマンド、dateコマンドを実行します。結果は、403 となり、アクセスは拒否されました。

 

niikawa@niikawa2:~$ aws s3 cp s3://niikawa-test/index.html /tmp;date
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
Fri Jan 24 00:09:14 JST 2025

 

  • aws s3 ls コマンド、dateコマンドを実行します。結果は、AccessDenied となり、アクセスは拒否されました。

 

niikawa@niikawa2:~$ aws s3 ls;date

An error occurred (AccessDenied) when calling the ListBuckets operation: User: arn:aws:iam::11111111111:user/niikawa is not authorized to perform: s3:ListAllMyBuckets with an explicit deny in an identity-based policy
Fri Jan 24 00:09:24 JST 2025

 

  • CloudTrail のイベント履歴を確認します。1つ目、2つ目の操作について、イベント履歴が記録されていることが確認出来ました。クライアントのパブリックIPアドレス、エラーコードも確認出来ました。
  • 3つ目、4つ目の操作については、イベント履歴は記録されませんでした。デフォルトでは、CloudTrail は管理イベントのみ記録し、データイベントは記録されないためです。管理イベントは、S3バケットの作成などAWSリソースに対する操作です。データイベントは、S3 のオブジェクトレベルのアクティビティ(GetObject、DeleteObject、PutObject) が該当します。