迁移至 AES-256 GCM 加密

Looker 使用 AES-256 伽罗瓦/计数器模式 (GCM) 加密来加密内部存储的敏感数据,包括:

  • Looker 内部数据库的备份
  • 数据库和服务连接信息
  • 用户身份验证信息
  • 用户属性值
  • 已缓存或准备传送的客户数据

如需查看 Looker 加密数据的详细列表,请提交支持请求

数据使用唯一的数据密钥加密,并包含一个已签名且版本化的加密信封以保证验证。此模式需要使用外部客户主密钥 (CMK)。CMK 用于派生、加密和解密密钥加密密钥 (KEK),而密钥加密密钥 (KEK) 又用于派生、加密和解密数据密钥。

加密仅适用于 Looker 的内部数据库和缓存。客户数据库不会受到 Looker 加密的影响。此外,只有静态数据(存储在磁盘上的数据)会以这种方式加密。

客户托管的安装可以使用自己的 AWS KMS 帐号或自定义密钥管理系统。所有数据密钥和 KEK 均会加密,并在客户托管的 Looker 安装内部使用。如果未使用 AWS KMS,则应安全地保留外部 CMK。

如果客户托管的现有安装想要使用 GCM 加密,则需要从旧版加密迁移到新的 GCM 加密。新的客户托管的安装需要额外配置 GCM 加密。

请按顺序遵循以下部分中的流程。

停止 Looker 并创建完整备份

如果您要从现有 Looker 实例迁移到 GCM 加密,请务必创建完整备份,以防加密迁移出现问题。如果您要安装新的 Looker 实例,请跳过此部分。

如果您使用的是 Looker 的内部数据库:

cd looker
./looker stop
tar -zcvf /tmp/looker-pre-encrypt.tar.gz  /home/lookerops/looker --exclude=.cache --exclude=log --exclude=.tmp --exclude=.snapshots --exclude=looker.jar --exclude=authorized_keys --exclude=dr-log --exclude=core

如果您运行外部 MySQL 数据库来存储 Looker 应用数据,请单独备份该数据库。如果数据库是 MySQL 实例,请截取快照。数据库相对较小,因此只需几分钟时间。然后停止 Looker。

如果 Looker 已进行聚类,请务必先停止每个节点,然后再继续操作:

cd looker
./looker stop

如果您稍后发出迁移命令时有任何节点仍在运行,该命令将失败并显示以下消息:“还有其他活动节点已连接到此后端 Looker 数据库。如果 Looker 是在最后一分钟内关停的,请稍后重试,否则请验证集群中的所有节点均已关停。”

生成 CMK

如果您使用的是 AWS KMS,请使用 AWS 管理控制台或 API 创建 CMK

如果您未使用 AWS KMS,请生成 Base64、32 字节的 CMK。您可以将 CMK 存储在环境变量或文件中。

  • 如需生成 CMK 并将其存储在环境变量中,您可以使用以下命令生成 CMK:

    openssl rand -base64 32
    

    生成 CMK 后,请复制它,然后使用以下命令将该 CMK 存储在 LKR_MASTER_KEY_ENV 环境变量中(其中 <CMK_value> 是您使用上一个命令生成的 CMK):

    export LKR_MASTER_KEY_ENV=<CMK_value>
    

    如果 Looker 已进行聚类,请在集群中的每个节点上运行上一个命令。

  • 如需生成 CMK 并将其存储在文件中,您可以使用以下命令(其中 <path_to_CMK_file> 是存储 CMK 的路径和文件名):

    openssl rand -base64 32 > <path_to_key_file>
    

生成 CMK 文件后,将密钥文件权限设置为当前用户只读:

chmod 0400 <path_to_key_file>

生成 CMK 后,请务必将其存储在安全且永久的位置,然后再继续操作!在加密内部数据库后丢失 CMK 可能会导致您的实例丢失。

创建 AWS IAM 角色

如果您未使用 AWS KMS,请跳过此部分。

如果您使用的是 AWS KMS,Looker 建议您创建一个新的 IAM 角色,该角色是您的 CMK 独有的,并将其与您的 Looker 实例关联

以下是包含 CMK 所需的最低权限的 IAM 角色示例:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "kms:GenerateRandom",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:Generate*",
            ],
            "Resource": "arn:aws:kms:*:*:key/*"
        }
    ]
}

设置环境变量

如果您使用的是 AWS KMS,请将 AWS_REGION 环境变量设置为您的 AWS 区域,并将 LKR_AWS_CMK 环境变量设置为您的 CMK 的别名:

export AWS_REGION=<AWS_region>
export LKR_AWS_CMK=alias/<CMK_alias>

(可选)您还可以设置 LKR_AWS_CMK_EC 环境变量以设置自定义 AWS 加密上下文。如果您未设置此环境变量,Looker 将使用默认加密上下文,即字符串 Looker_Encryption_Context

export LKR_AWS_CMK_EC=<My_Encryption_Context>

如果您未使用 AWS KMS,并且将 CMK 存储在文件中,请将 LKR_MASTER_KEY_FILE 环境变量设置为 CMK 文件的路径:

export LKR_MASTER_KEY_FILE=<path_to_key_file>

如果您未使用 AWS KMS,并且将 CMK 存储在环境变量中,请将 LKR_MASTER_KEY_ENV 环境变量设置为 CMK 的值:

export LKR_MASTER_KEY_ENV=<CMK_value>

如果 Looker 已进行聚类,请在集群中的每个节点上运行上一个命令。

加密内部数据库

如果要将现有 Looker 实例迁移到 GCM 加密,请迁移 Looker 的内部数据库并启动 Looker:

java -jar looker.jar migrate_encryption
./looker  start

如果您的 Looker 实例以 -d <db.yaml>--internal-db-creds=<db.yaml> 启动选项开头(这些选项提供了包含您的数据库凭据的 YAML 文件的路径),则需要在 java -jar looker.jar migrate_encryption 命令中包含相同的选项。

例如 java -jar looker.jar migrate_encryption -d /path/file

如果您要安装新的 Looker 实例,加密过程会在启动新的 Looker 实例时开始。

加密过程通常不到一分钟即可完成。Looker 启动后,您可以通过在 Looker 日志中搜索 GCM 来验证新的加密:

grep GCM log/looker.log

2018-10-29 22:42:20.279 +0000 [INFO|007d0|crypt] :: Starting migration from AES-128-CBC Legacy to AES-GCM-256
2018-10-29 22:42:20.468 +0000 [INFO|007d0|db:looker] :: (0.000152s) INSERT INTO "SETTING" ("KEY", "VALUE") VALUES

问题排查

本部分列出了一些常见错误以及针对这些错误的解决方法:

  • 找不到任务“migration_encryption”:将您的 Looker 实例更新到 Looker 6.4。

  • Looker 无法启动,因为:缺少后备密钥库:Looker 找不到 CMK。检查 LKR_MASTER_KEY_FILE 环境变量中的 CMK 路径是否正确。

  • Looker 无法启动,因为:主密钥的大小无效,它必须是 32 个字节,但却是 X:CMK 的长度必须正好为 32 个字节。

  • Looker 无法启动,因为:后备密钥文件的权限必须为 0400,但为 XXX:CMK 文件必须是只读文件,chmod 值为 0400