Back to Checks
aws_instance should activate session tokens for Instance Metadata Service.
AWS-0028
Service: ec2Severity: high
OfficialBuilt-inVerified
IMDS v2 (Instance Metadata Service) introduced session authentication tokens which improve security when talking to IMDS.
By default <code>aws_instance</code> resource sets IMDS session auth tokens to be optional.
To fully protect IMDS you need to enable session tokens by using <code>metadata_options</code> block and its <code>http_tokens</code> variable set to <code>required</code>.
Run this check with Prowler
Run in Prowler CloudRun
prowler iac --checks AWS-0028Recommendation
Enable HTTP token requirement for IMDS
Check Code
# METADATA
# title: aws_instance should activate session tokens for Instance Metadata Service.
# description: |
# IMDS v2 (Instance Metadata Service) introduced session authentication tokens which improve security when talking to IMDS.
#
# By default <code>aws_instance</code> resource sets IMDS session auth tokens to be optional.
#
# To fully protect IMDS you need to enable session tokens by using <code>metadata_options</code> block and its <code>http_tokens</code> variable set to <code>required</code>.
# scope: package
# schemas:
# - input: schema["cloud"]
# related_resources:
# - https://aws.amazon.com/blogs/security/defense-in-depth-open-firewalls-reverse-proxies-ssrf-vulnerabilities-ec2-instance-metadata-service
# custom:
# id: AWS-0028
# long_id: aws-ec2-enforce-http-token-imds
# aliases:
# - AVD-AWS-0028
# - enforce-http-token-imds
# - aws-ec2-enforce-http-token-imds
# provider: aws
# service: ec2
# severity: HIGH
# recommended_action: Enable HTTP token requirement for IMDS
# input:
# selector:
# - type: cloud
# subtypes:
# - service: ec2
# provider: aws
# examples: checks/cloud/aws/ec2/enforce_http_token_imds.yaml
package builtin.aws.ec2.aws0028
import rego.v1
import data.lib.cloud.metadata
import data.lib.cloud.value
deny contains res if {
some instance in input.aws.ec2.instances
tokens_is_not_required(instance)
endpoint_is_not_disabled(instance)
res := result.new(
"Instance does not require IMDS access to require a token.",
metadata.obj_by_path(instance, ["metadataoptions", "httptokens"]),
)
}
tokens_is_not_required(instance) if value.is_not_equal(instance.metadataoptions.httptokens, "required")
tokens_is_not_required(instance) if not instance.metadataoptions.httptokens
endpoint_is_not_disabled(instance) if value.is_not_equal(instance.metadataoptions.httpendpoint, "disabled")
endpoint_is_not_disabled(instance) if not instance.metadataoptions.httpendpoint