Amazon Web Services 資料一覧

CloudWatch Logsの特定のロググループを特定のIPからのみ参照可能にする

2019/03/06更新

セキュリティ要件などでCloudWatch Logsの特定のロググループを特定のIPからのみ参照可能にしたい場合は、IAMの以下の2つのポリシーを対象となるユーザやグループにアタッチすればよい。

※ ただしAWSの他のサービスからアクセスが必要な場合はこの方法は使えないので注意が必要

1. CloudWatchLogsFullAccessやCloudWatchLogsReadOnlyAccessのようなCloudWatch Logsにアクセスできるポリシー、あるいはそれに類するポリシー

2. 指定したロググループに対して特定のIPからのみアクセス可能とするポリシー(新規作成)

例) 「ng」というロググループに対してSourceIpで指定したIPからのみアクセス可能とする

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "logs:DescribeLogStreams",
            "Resource": "arn:aws:logs:<リージョン>:<AWSアカウント>:log-group:ng:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "xxx.xxx.xxx.xxx"
                }
            }
        },
        {
            "Effect": "Deny",
            "Action": "logs:FilterLogEvents",
            "Resource": "arn:aws:logs:<リージョン>:<AWSアカウント>:log-group:ng:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "xxx.xxx.xxx.xxx"
                }
            }
        }
    ]
}

実行例

例えば以下の2つのロググループ/ログストリームが存在する状態で上記のポリシーを適用する。

ok/ok_test
ng/ng_test

この状態でロググループの一覧表示とログストリームの参照・検索を行うと以下のような挙動となる。

ロググループ一覧表示(両方表示される)
$ aws logs describe-log-groups
{
    "logGroups": [
        {
            "arn": "arn:aws:logs:xxxxxxxxxxxx:xxxxxxxxxxxx:log-group:ng:*", 
            "creationTime": 1551426635634, 
            "metricFilterCount": 0, 
            "logGroupName": "ng", 
            "storedBytes": 0
        }, 
        {
            "arn": "arn:aws:logs:xxxxxxxxxxxx:xxxxxxxxxxxx:log-group:ok:*", 
            "creationTime": 1551426626316, 
            "metricFilterCount": 0, 
            "logGroupName": "ok", 
            "storedBytes": 0
        }
    ]
}
ログストリーム参照(どのIPからでも参照可能)
$ aws logs describe-log-streams --log-group-name ok
{
    "logStreams": [
        {
            "creationTime": 1551426648336, 
            "arn": "arn:aws:logs:xxxxxxxxxxxx:xxxxxxxxxxxx:log-group:ok:log-stream:ok_test", 
            "logStreamName": "ok_test", 
            "storedBytes": 0
        }
    ]
}
ログストリーム参照(特定のIPからのみ参照可能)
$ aws logs describe-log-streams --log-group-name ng
An error occurred (AccessDeniedException) when calling the DescribeLogStreams operation: User: arn:aws:iam::xxxxxxxxxxxx:user/xxxx is not authorized to perform: logs:DescribeLogStreams on resource: arn:aws:logs:xxxxxxxxxxxx:xxxxxxxxxxxx:log-group:ng:log-stream: with an explicit deny
ログストリーム検索(どのIPからでも参照可能)
$ aws logs filter-log-events --log-group-name ok
{
    "searchedLogStreams": [], 
    "events": []
}
ログストリーム検索(特定のIPからのみ参照可能)
$ aws logs filter-log-events --log-group-name ng
An error occurred (AccessDeniedException) when calling the FilterLogEvents operation: User: arn:aws:iam::xxxxxxxxxxxx:user/xxxx is not authorized to perform: logs:FilterLogEvents on resource: arn:aws:logs:xxxxxxxxxxxx:xxxxxxxxxxxx:log-group:ng:log-stream: with an explicit deny

参考サイト