迁移到 AES-256 GCM 加密

robots: noindex

Looker 使用 AES-256 Galois/Counter 模式 (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

如果您稍后发出迁移命令时有任何节点仍在运行,则该命令将失败,并显示消息“Your Connect are other live nodes added to thisbackend Looker database。如果 Looker 在最后一分钟内关停了,请稍后重试,否则请验证集群中的所有节点是否均已关停。

生成 CMK

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

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

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

    openssl rand -base64 32
    

    生成 CMK 后,请复制该 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 建议您创建一个适用于您的 CMK 的新 IAM 角色,并将其与您的 Looker 实例关联

以下是一个 IAM 角色示例,其包含您的 CMK 所需的最低权限:

{
    "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

问题排查

此部分列出了一些常见错误及其解决方法:

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

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

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

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