こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。
先日、下記のアップデート記事を執筆しました。もしまだ見ていない方は先に下記記事を見た上で本記事の内容をご覧ください。
本記事は、上記記事の誤った内容を訂正するものです。
先にまとめ
- Amazon GuardDutyのLambda ProtectionはVPC内Lambda(VPC Lambda)だけでなく、よく使うVPC外のLambda(non-VPC Lambda)も検知対象である
- VPC Lambdaの場合、検出結果にVPCの情報が含まれる。non-VPC Lambdaの場合は含まれない。
- VPCフローログを見ているとのことだったのでnon-VPC Lambdaの場合はAmazon所有のVPC情報が表示されるのかと思ったが、もちろんそんなことは無い
懺悔
先日のアップデート記事(上記)を執筆時、私は確かにTwitter上で「Lambda ProtectionはVPC内LambdaにもVPC外のLambdaにも対応してるよ」というニュアンスのツイートを見ていたんですが、ツイート主が本物かどうか分からず真偽が不明でした。
そこで記事執筆前に念の為検証したんですが、その時はVPC内Lambdaでだけ目的の検出項目が検知されました。
しかし今日、私の元に一つのリプライが。
ということで、半信半疑ながらも再検証を行うことにしてみた結果。。。
Amazon GuardDutyのLambda ProtectionはVPC内のLambdaにもVPC外のLambdaにも対応していることが分かりました!!!!最高の神機能でした!!ごめんなさい!!
前回VPC外のLambdaで検知されなかった理由は明確になっていませんが、恐らく私が追加したGuardDutyのカスタム脅威リストが検証時にまだアクティブになっていなかったことが原因ではないかと思っています。
ここからは再度確認した際の手順、それぞれの検出結果の比較です。
確認手順
検証方法は前回同様、Pythonでカスタム脅威リストに追加したIPアドレスにgetリクエストを送るだけです。
前回使用したLambdaをVPC外に出し、そのまま検証を行いました。本当にそれだけのコードですが、念の為記載します。
142.250.196.99
import requests
def lambda_handler(event, context):
# カスタム脅威リストのIPアドレスにGETリクエストを送信する
response = requests.get("http://142.250.196.99")
print(response)
今回は上記のカスタム脅威リストをアクティブ後、念の為10分ほど置いてPythonのコードを実行しました。
検出結果(json)の比較
上記手順を行い、無事にVPC外のLambdaでも検知されました。
以下は、VPC内のLambdaとVPC外のLambdaの検出結果(json)です。矢印部分をクリックするとjsonの内容が表示されるので、興味のある方は開いて見てみて下さい。
VPC内のLambdaの検出結果(json)
[
{
"AccountId": "123456789012",
"Arn": "arn:aws:guardduty:ap-northeast-1:123456789012:detector/f94d11c7b9554a1b9181384f284c91d5/finding/38c3d6b2cfb45cf0fddb730a7dd2b225",
"CreatedAt": "2023-04-23T09:15:31.048Z",
"Description": "Lambda function test is communicating with a disallowed IP address 142.250.196.99 on the list hoge.",
"Id": "38c3d6b2cfb45cf0fddb730a7dd2b225",
"Partition": "aws",
"Region": "ap-northeast-1",
"Resource": {
"ResourceType": "Lambda",
"LambdaDetails": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test",
"FunctionName": "test",
"Description": "",
"LastModifiedAt": "2023-04-23T09:10:02.000Z",
"RevisionId": "5ea676c9-b312-465e-bed5-4f0c5adb3b98",
"FunctionVersion": "$LATEST",
"Role": "arn:aws:iam::123456789012:role/service-role/test-role-i8isogfd",
"VpcConfig": {
"SubnetIds": [
"subnet-*************"
],
"VpcId": "vpc-*************",
"SecurityGroups": [
{
"GroupId": "sg-*************",
"GroupName": null
}
]
},
"Tags": []
}
},
"SchemaVersion": "2.0",
"Service": {
"Action": {
"ActionType": "NETWORK_CONNECTION",
"NetworkConnectionAction": {
"Blocked": false,
"ConnectionDirection": "OUTBOUND",
"Protocol": "TCP",
"RemoteIpDetails": {
"Country": {
"CountryName": "United States"
},
"GeoLocation": {
"Lat": 37.751,
"Lon": -97.822
},
"IpAddressV4": "142.250.196.99",
"Organization": {
"Asn": "15169",
"AsnOrg": "GOOGLE",
"Isp": "Google Servers",
"Org": "Google Servers"
}
},
"RemotePortDetails": {
"Port": 80,
"PortName": "HTTP"
}
}
},
"Evidence": {
"ThreatIntelligenceDetails": [
{
"ThreatListName": "hoge",
"ThreatNames": [
"Customer Threat Intel"
]
}
]
},
"Archived": false,
"Count": 2,
"DetectorId": "f94d11c7b9554a1b9181384f284c91d5",
"EventFirstSeen": "2023-04-23T09:12:40.000Z",
"EventLastSeen": "2023-04-23T09:16:38.000Z",
"ResourceRole": "TARGET",
"ServiceName": "guardduty",
"AdditionalInfo": {
"Value": "{\"threatName\":\"Customer Threat Intel\",\"threatListName\":\"hoge\"}",
"Type": "default"
}
},
"Severity": 5,
"Title": "Lambda function test communicating with disallowed IP address.",
"Type": "UnauthorizedAccess:Lambda/MaliciousIPCaller.Custom",
"UpdatedAt": "2023-04-23T09:18:29.124Z"
}
]
VPC外のLambdaの検出結果(json)
[
{
"AccountId": "123456789012",
"Arn": "arn:aws:guardduty:ap-northeast-1:123456789012:detector/f94d11c7b9554a1b9181384f284c91d5/finding/46c3e04136785b91811ba1f87b5b1e9a",
"CreatedAt": "2023-04-27T02:19:45.776Z",
"Description": "Lambda function test is communicating with a disallowed IP address 142.250.196.99 on the list hoge.",
"Id": "46c3e04136785b91811ba1f87b5b1e9a",
"Partition": "aws",
"Region": "ap-northeast-1",
"Resource": {
"ResourceType": "Lambda",
"LambdaDetails": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:test",
"FunctionName": "test",
"Description": "",
"LastModifiedAt": "2023-04-27T02:17:33.000Z",
"RevisionId": "a571b4b7-1c28-4fba-ae5f-c1d9ddf275f8",
"FunctionVersion": "$LATEST",
"Role": "arn:aws:iam::123456789012:role/service-role/test-role-i8isogfd",
"VpcConfig": {
"SubnetIds": [],
"VpcId": "",
"SecurityGroups": []
},
"Tags": []
}
},
"SchemaVersion": "2.0",
"Service": {
"Action": {
"ActionType": "NETWORK_CONNECTION",
"NetworkConnectionAction": {
"Blocked": false,
"ConnectionDirection": "OUTBOUND",
"Protocol": "TCP",
"RemoteIpDetails": {
"Country": {
"CountryName": "United States"
},
"GeoLocation": {
"Lat": 37.751,
"Lon": -97.822
},
"IpAddressV4": "142.250.196.99",
"Organization": {
"Asn": "15169",
"AsnOrg": "GOOGLE",
"Isp": "Google Servers",
"Org": "Google Servers"
}
},
"RemotePortDetails": {
"Port": 80,
"PortName": "HTTP"
}
}
},
"Evidence": {
"ThreatIntelligenceDetails": [
{
"ThreatListName": "hoge",
"ThreatNames": [
"Customer Threat Intel"
]
}
]
},
"Archived": false,
"Count": 8,
"DetectorId": "f94d11c7b9554a1b9181384f284c91d5",
"EventFirstSeen": "2023-04-27T02:18:16.000Z",
"EventLastSeen": "2023-04-27T02:47:53.000Z",
"ResourceRole": "TARGET",
"ServiceName": "guardduty",
"AdditionalInfo": {
"Value": "{\"threatName\":\"Customer Threat Intel\",\"threatListName\":\"hoge\"}",
"Type": "default"
}
},
"Severity": 5,
"Title": "Lambda function test communicating with disallowed IP address.",
"Type": "UnauthorizedAccess:Lambda/MaliciousIPCaller.Custom",
"UpdatedAt": "2023-04-27T02:51:24.213Z"
}
]
"VpcConfig": {
"SubnetIds": [
"subnet-*************"
],
"VpcId": "vpc-*************",
"SecurityGroups": [
{
"GroupId": "sg-*************",
"GroupName": null
}
]
},
"VpcConfig": {
"SubnetIds": [],
"VpcId": "",
"SecurityGroups": []
},
内容はほぼ同じですが、VPC内のLambdaには VpcConfig
というKeyの中にサブネットID、VPC ID、セキュリティグループのID、Nameが記載されています。
一方、VPC外のLambdaでは該当箇所に値が含まれていません。
まとめ
ということで謝罪兼訂正の記事でした。
Lambda Protection、AWSを触っている方にとっては本当に待望の機能だったのではないでしょうか。これは皆さん有効化すべき機能ですね。
本記事がどなたかのお役に立てれば幸いです。
以上、べこみんでした。