亚马逊AWS官方博客

通过 FluentBit 收集 Nitro Enclaves 日志

背景

AWS Nitro Enclaves 使客户能够创建隔离的计算环境来进一步保护和安全地处理高度敏感的数据,例如其 Amazon EC2 实例中的个人身份信息 (PII)、医疗保健、金融和知识产权数据。Nitro Enclaves 使用为 EC2 实例提供 CPU 和内存隔离的相同 Nitro 管理程序技术。

AWS Nitro Enclaves 在给用户提供安全可信的运行环境的同时,也会引入一些其他的风险,例如用户无法真正登录到应用运行环境中进行错误排查。如何收集 AWS Nitro Enclaves 中应用程序的日志是开发者首先要考虑的。

FluentBit 是一款非常轻量级的高性能高扩展性的的开源日志收集器,可以帮助用户在云端快速构建日志收集,处理,转发能力。

这里我们可以通过 FluentBit 或其他日志收集器收集 AWS Nitro Enclaves 应用日志。

部署 AWS Nitro Enclaves 应用

1、创建一台EC2 用作 Nitro Enclaves partner instance:“`

aws ec2 run-instances —image-id <image-id> —count 1 —instance-type <instance-type> —key-name <key-name> —enclave-options 'Enabled=true'

2、登录 EC2

以后内容均在 partner instance 上执行

3、按照文档安装Nitro Enclaves CLI

https://docs.aws.amazon.com/zh_cn/enclaves/latest/user/nitro-enclave-cli-install.html

4、构建应用程序

安装完成后,示例应用程序源文件会保存在/usr/share/nitro_enclaves/examples/hello目录下

从应用程序构建一个 docker 映像。以下命令构建一个名为 hello 的 Docker 镜像,其标签为 latest。

docker build /usr/share/nitro_enclaves/examples/hello -t hello

使用 nitro-cli build-enclave 命令将 Docker 映像转换为 enclave 映像文件。以下命令构建名为 hello.eif 的 enclave 映像文件。

nitro-cli build-enclave —docker-uri hello:latest —output-file hello.eif

会得到类似下文的返回

Start allocating memory...
Started enclave with enclave-cid: 16, memory: 512 MiB, cpu-ids: [1, 3]
{
    "EnclaveID": "i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE",
    "ProcessID": 7077,
    "EnclaveCID": 16,
    "NumberOfCPUs": 2,
    "CPUIDs": [
        1,
        3
    ],
    "MemoryMiB": 512
}

使用 nitro-cli run-enclave 命令。指定 vCPU、内存和 enclave 映像文件的路径,以 Debug 模式部署应用

nitro-cli run-enclave —cpu-count 2 —memory 512 —enclave-cid 16 —eif-path hello.eif —debug-mode

会得到类似下文的返回

Start allocating memory... 
Started enclave with enclave-cid: 16, memory: 512 MiB, cpu-ids: [1, 3] 
{
    "EnclaveID": "i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE", 
    "ProcessID": 7077, 
    "EnclaveCID": 16, 
    "NumberOfCPUs": 2, 
    "CPUIDs": [ 1, 3 ], 
    "MemoryMiB": 512 
}

现在您已经创建了 enclave,您可以使用 nitro-cli describe-enclaves 命令来验证它是否正在运行。

nitro-cli describe-enclaves

会得到类似下文的返回

{
    "EnclaveID": "i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE",
    "ProcessID": 7077,
    "EnclaveCID": 16,
    "NumberOfCPUs": 2,
    "CPUIDs": [
        1,
        3
        ],
    "MemoryMiB": 512,
    "State": "RUNNING",
    "Flags": "DEBUG_MODE"
}

由于我们在调试模式下创建了 Nitro Enclaves 应用,因此可以使用 nitro-cli console 命令查看 Nitro Enclaves 应用的只读控制台输出。

nitro-cli console --enclave-id i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE

部署 FluentBit

在 EC2 上安装 FluentBit:

curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh

复制如下配置到 FluentBit Config /etc/fluent-bit/fluent-bit.conf

[INPUT]
    Name          exec
    Tag           exec_enclave
    Command       nitro-cli console --enclave-id i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE
    Interval_Sec  1
    Interval_NSec 0
    Buf_Size      8mb
    Oneshot       false

[OUTPUT]
    Name cloudwatch_logs
    Match   *
    region us-east-1
    log_group_name fluent-bit-cloudwatch-enclave
    log_stream_prefix from-fluent-bit-enclave-
    auto_create_group On
    workers 1

FluentBit 的输入是通过命令的方式读取 Nitro Enclaves 日志数据,并持续写入到Cloudwatch中。OUTPUT 可根据实际需求调整为ElasticSearch, S3, Kinesis Data Stream 等平台

在启动 FluentBit 之前,需要为 EC2 赋予一个角色,让 FluentBit 有权限写入日志到 Cloudwatch Logs。

完成了以上的操作之后,可以启动 FluentBit:

service fluent-bit start

在一段时间后,就可以在 Cloudwatch Logs 中对应的 log group 里看到 Nitro Enclaves 应用的日志了:

总结

Nitro Enclaves 是一个非常易用的安全运行环境,可以和 AWS 多个服务紧密集成,实现业务快速开发。

引用资料

Nitro Enclaves 安装:

Installing the Nitro Enclaves CLI on Linux – AWS (amazon.com)

FluentBit:

Fluent Bit v1.9 Documentation – Fluent Bit: Official Manual

本篇作者

王逸飞

AWS解决方案架构师,负责基于 AWS 的云计算方案的咨询与架构设计,同时致力于 AWS 云服务知识体系的传播与普及。在微服务,容器等领域拥有多年经验。