迁移到 AES-256 GCM 加密

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

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

如需查看 Looker 加密的数据的详细列表,请联系您的客户经理,或点击与我们联系,在 Looker 的帮助中心内打开支持请求。

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

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

客户托管的安装可以使用自己的 AWS KMS 帐号或自定义密钥管理系统。在客户托管的 Looker 安装过程中,所有数据密钥和 KEK 都会经过加密并在内部使用。如果未使用 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,请生成 64 位、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 建议您为 CMK 创建一个新的 IAM 角色,并将其与您的 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

问题排查

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

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

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

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

  • Looker 无法启动,原因是:支持密钥文件 的权限必须为 0400,但其权限为 XXX:CMK 文件必须处于只读状态,chmod 值为 0400