概要
- 今回は、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) が該当します。
- CloudTrail の管理イベント、データイベントについては、以下ドキュメントを参照ください。