

# 安全性和权限
<a name="microvms-security"></a>

本节介绍 AWS Lambda MicroVMs 的 IAM 角色、身份验证令牌和访问控制。

## IAM 角色
<a name="microvms-security-iam-roles"></a>

### 构建角色
<a name="microvms-security-build-role"></a>

此角色将在映像创建期间使用。该角色需要以下权限以检索源构建和生成日志：`s3:GetObject`、`logs:CreateLogGroup`、`logs:CreateLogStream` 和 `logs:PutLogEvents`。如果引用私有 ECR 映像，则还需要添加 `ecr:GetAuthorizationToken` 权限。

构建角色是可选的。如果不提供构建角色，Lambda 将无法将构建日志写入 CloudWatch。

### 执行角色
<a name="microvms-security-execution-role"></a>

此角色将在 MicroVM 运行时使用，提供将日志写入 CloudWatch 以及使用其他 AWS 服务的访问权限。

执行角色是可选的。如果不提供执行角色，则 Lambda 不会向 CloudWatch 发送运行时日志，并且您的 MicroVM 也无法访问其他 AWS 服务。

生命周期挂钩在与其阶段相关的角色下执行。构建时钩子（`/ready` 和 `/validate`）在构建角色下执行。运行时钩子（`/run`、`/resume`、`/suspend` 和 `/terminate`）在执行角色下执行。

### 信任策略
<a name="microvms-security-trust-policies"></a>

这两个角色都需要一个允许 Lambda 服务主体 `lambda.amazonaws.com` 执行 `sts:AssumeRole` 和 `sts:TagSession` 操作的信任策略。

## 身份验证令牌
<a name="microvms-security-auth-tokens"></a>

令牌用于控制对正在运行的 MicroVM 的入站访问权限。令牌会限定端口范围；每个令牌都指定了其授予访问权限的端口。

```
# Token granting access to all ports
aws lambda-microvms create-microvm-auth-token \
  --microvm-identifier <id> \
  --expiration-in-minutes 30 \
  --allowed-ports '[{"allPorts":{}}]'

# Token granting access to port 8080 only
aws lambda-microvms create-microvm-auth-token \
  --microvm-identifier <id> \
  --expiration-in-minutes 30 \
  --allowed-ports '[{"port":8080}]'
```

## Shell 访问令牌
<a name="microvms-security-shell-tokens"></a>

Shell 访问需要使用单独的令牌 API。目标 MicroVM 必须使用 `SHELL_INGRESS` 网络连接器 (`arn:aws:lambda:{{us-east-1}}:aws:network-connector:aws-network-connector:SHELL_INGRESS`) 运行。如果 MicroVM 不是使用该连接器启动的，则 `create-microvm-shell-auth-token` 会失败并返回 `ValidationException` 错误：

```
aws lambda-microvms create-microvm-shell-auth-token \
  --microvm-identifier <id> \
  --expiration-in-minutes 30
```

有关连接到 MicroVM Shell 的完整演示，请参阅[Shell 访问权限](microvms-troubleshooting.md#microvms-troubleshooting-shell)。

## 标注资源
<a name="microvms-security-tagging"></a>

Lambda MicroVM 资源（映像、MicroVM）支持用于组织和成本分配的AWS资源标签。在创建映像时使用 `--tags` 参数添加标签，也可在创建后显式添加标签。您还可以按如下所示列出和删除标签：您还可以通过在 IAM 策略条件中引用标签来控制对 MicroVM 资源的访问权限。

```
# Add tags when creating an image
aws lambda-microvms create-microvm-image \
  --name my-app-image \
  --code-artifact '{"uri":"s3://my-bucket/app.zip"}' \
  --base-image-arn arn:aws:lambda:{{us-east-1}}:aws:microvm-image:al2023-1 \
  --build-role-arn arn:aws:iam::123456789012:role/MicrovmBuildRole \
  --tags '{"Environment":"production","Team":"platform"}'

# List tags on a resource
aws lambda-microvms list-tags \
  --resource arn:aws:lambda:us-east-1:123456789012:microvm-image:my-app-image

# Add tags to an existing resource
aws lambda-microvms tag-resource \
  --resource arn:aws:lambda:us-east-1:123456789012:microvm-image:my-app-image \
  --tags '{"CostCenter":"12345","Project":"sandbox-platform"}'

# Remove tags by key
aws lambda-microvms untag-resource \
  --resource arn:aws:lambda:us-east-1:123456789012:microvm-image:my-app-image \
  --tag-keys '["CostCenter","Project"]'
```

## IAM 权限参考
<a name="microvms-security-iam-reference"></a>

Lambda MicroVMs 定义了以下 IAM 操作。可在 IAM 策略中使用这些操作来控制对 MicroVM 操作的访问权限。


| 处理建议 | 说明 | 
| --- | --- | 
| lambda:CreateMicrovmImage | 创建一个新 MicroVM 映像。 | 
| lambda:UpdateMicrovmImage | 更新某个现有的 MicroVM 映像。 | 
| lambda:DeleteMicrovmImage | 删除某个 MicroVM 映像。 | 
| lambda:GetMicrovmImage | 获取 MicroVM 映像详细信息。 | 
| lambda:ListMicrovmImages | 列出账户中的 MicroVM 映像。 | 
| lambda:RunMicrovm | 运行一个新 MicroVM。 | 
| lambda:GetMicrovm | 获取 MicroVM 状态和详细信息。 | 
| lambda:ListMicrovms | 列出账户中的 MicroVM。 | 
| lambda:SuspendMicrovm | 暂停某个正在运行的 MicroVM。 | 
| lambda:ResumeMicrovm | 恢复某个已暂停的 MicroVM。 | 
| lambda:TerminateMicrovm | 终止某个 MicroVM。 | 
| lambda:CreateMicrovmAuthToken | 为某个 MicroVM 生成身份验证令牌。 | 
| lambda:CreateMicrovmShellAuthToken | 生成一个 Shell 访问令牌。 | 

## 资源 ARN 格式
<a name="microvms-security-resource-arns"></a>

```
# MicroVM image
arn:aws:lambda:<region>:<account>:microvm-image:<image-name>
# MicroVM instance
arn:aws:lambda:<region>:<account>:microvm:<microvm-id>
# Network connector
arn:aws:lambda:<region>:<account>:network-connector:<connector-id>
```

## 示例：操作者的最低权限策略
<a name="microvms-security-least-privilege"></a>

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:RunMicrovm",
        "lambda:GetMicrovm",
        "lambda:ListMicrovms",
        "lambda:SuspendMicrovm",
        "lambda:ResumeMicrovm",
        "lambda:TerminateMicrovm",
        "lambda:CreateMicrovmAuthToken"
      ],
      "Resource": "arn:aws:lambda:*:123456789012:microvm:*"
    },
    {
      "Effect": "Allow",
      "Action": ["lambda:GetMicrovmImage", "lambda:ListMicrovmImages"],
      "Resource": "arn:aws:lambda:*:123456789012:microvm-image:*"
    }
  ]
}
```