概要

AWS MCP Server が一般提供(GA)を開始、AI コーディングエージェントから AWS への安全なアクセスが可能になりました | DevelopersIO

上記の通り、AWS MCP ServerがGAとなり、Claude Codeなどから、IAM経由でのAWS環境への安全なアクセスが可能になりました
今回は、AWS MCP Serverからのアクセスを制御するためのポリシーを作成した際のメモです

結論 (Terraformコード)

作成したポリシーの aws_iam_policy_documentです。本題は「3」のStatementになります

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
data "aws_iam_policy_document" "deny_sensitive_access_via_mcp" {

# 1. SecretsManager, SSMへはデフォルトで全てのアクセスをDenyする
statement {
sid = "DenySecretViaMCP"
effect = "Deny"
actions = [
"secretsmanager:*",
"ssm:*",
]
resources = ["*"]
condition {
test = "Bool"
variable = "aws:ViaAWSMCPService"
values = ["true"]
}
}

# 2. IAMの更新系操作もDenyする
statement {
sid = "DenyIamMutationViaMCP"
effect = "Deny"
actions = [
"iam:Create*",
"iam:Delete*",
"iam:Update*",
"iam:Put*",
"iam:Attach*",
"iam:Detach*",
"iam:Add*",
"iam:Remove*",
"iam:Set*",
"iam:Tag*",
"iam:Untag*",
"iam:PassRole",
"iam:Upload*",
"iam:ChangePassword",
"iam:Enable*",
"iam:Deactivate*",
"iam:Resync*",
"iam:Reset*",
]
resources = ["*"]
condition {
test = "Bool"
variable = "aws:ViaAWSMCPService"
values = ["true"]
}
}

# 3. タグ「MCPAccess: Deny」というタグを持つリソースにはアクセスをDenyする
statement {
sid = "DenyMCPTaggedResourceViaMCP"
effect = "Deny"
actions = ["*"]
resources = ["*"]
condition {
test = "Bool"
variable = "aws:ViaAWSMCPService"
values = ["true"]
}
condition {
test = "StringEqualsIgnoreCase"
variable = "aws:ResourceTag/MCPAccess"
values = ["Deny"]
}
}
}

詳細

1.SecretsManager, SSMへはデフォルトで全てのアクセスをDenyする
文字通り、機密情報を保管する、SessionManagerやParameterStoreには、あらかじめ全てのアクセスをDenyしておきます

2.IAMの更新系操作もDenyする
こちらも、MCPによるIAMの改ざんはあらかじめDenyしておきます

3.タグ「MCPAccess: Deny」というタグを持つリソースにはアクセスをDenyする
こちらが標題のABACタグベースポリシー制御で、リソース側に「MCPAccess: Deny」というタグを付けたリソースに関しては、MCP経由によるアクセスをDenyします
このポリシーをMCPが利用するIAMロールに適用し、MCPによる機密情報へのアクセスや、アクセスされたくないリソースに対するアクセス制御が可能になりました

使用したIAMコンテキストキー

Document: AWS グローバル条件コンテキストキー - AWS Identity and Access Management

aws:ViaAWSMCPService というコンテキストキーを使用する事で、MCP Serverを経由したアクセスである事を判別しています
他にも、aws:CalledViaAWSMCP といったコンテキストキーもあり、特定のMCPサーバを指定したアクセス制御も可能です

参考: S3オブジェクトのABACタグベースアクセス制御

Document: タグ付けとアクセスコントロールポリシー - Amazon Simple Storage Service

S3オブジェクトのABACタグベースアクセス制御は、s3:ExistingObjectTagを利用します
※aws:ResourceTagでは制御出来ないため注意

1
2
3
4
5
condition {
test = "StringEqualsIgnoreCase"
variable = "s3:ExistingObjectTag/MCPAccess"
values = ["Deny"]
}