非k8s环境Docker Compose部署Falco获取AWS实例元数据报错如何解决
问题原因
jevt.value是Falcosidekick处理事件时的内部JSON对象字段,仅可用于Falcosidekick的配置逻辑中,不能直接写在Falco的规则output字段里。Falco自身的规则解析器不识别该类token,所以抛出格式错误。
解决方案
根据你的部署场景(Docker Compose、无K8s),可以选择以下两种方案实现需求:
方案1:直接在Falco规则输出中注入AWS元数据
通过环境变量把AWS实例元数据传入Falco容器,直接在规则中引用:
- 调整
docker-compose.yml的Falco服务配置,注入需要的元数据字段:
services: falco: image: falcosecurity/falco:latest # 保留你原有Falco配置(privileged、volume挂载等) environment: # 适配IMDSv1的元数据获取方式 - AWS_REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/region) - AWS_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) # 如使用IMDSv2,替换为以下写法 # - AWS_REGION=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600" | curl -s -H "X-aws-ec2-metadata-token: $(cat -)" http://169.254.169.254/latest/meta-data/placement/region)
- 修改Falco规则的output字段,用Falco原生支持的
%env()语法引用环境变量:
output: > command=%proc.cmdline awsRegion=%env(AWS_REGION) instanceId=%env(AWS_INSTANCE_ID)
重启Falco服务即可生效,不会再出现格式报错。
方案2:在Falcosidekick侧统一追加元数据
如果不需要元数据出现在Falco原生输出,只需要在Falcosidekick转发的下游事件中携带,可以直接在Falcosidekick配置自定义字段,无需修改Falco规则:
- 和方案1一致,先在
docker-compose.yml中给Falcosidekick服务注入AWS元数据相关的环境变量。 - 给Falcosidekick添加启动参数,配置全局自定义字段:
services: falcosidekick: image: falcosecurity/falcosidekick:latest # 保留原有配置 command: --customfield="awsRegion:${AWS_REGION}" --customfield="instanceId:${AWS_INSTANCE_ID}"
所有经Falcosidekick转发的事件都会自动携带上述自定义字段。
注意事项
- 确保EC2实例的IMDS服务已开启,容器网络可以访问
169.254.169.254的80端口。 - 所有
jevt.开头的字段仅可用于Falcosidekick的内部配置(如输出模板、过滤规则),不可写入Falco规则文件。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

