非活跃数据(Data At Rest)的加密

Version 2.0 ~ 2.1

除非用户特别指定了编码/解码的规则,否则我们会使用私有的编码规则来存储TigerGraph的数据,其中同时包含了数据的压缩与保密。与此同时,TigerGraph也支持业界标准的非活跃数据("data at rest")加密方式;

加密层次

非活跃数据可以在多个层次上加密。用户可以选择在其中的一个或多个层次上加密。

加密层

描述

TigerGraph 支持

硬件层

使用特制的加密磁盘可以在数据写入时自动加密,在读取时自动解密(基于授信的OS用户)

对TigerGraph不可见

内核层文件系统

使用Linux内建工具加密数据。需要root权限

对TigerGraph不可见

用户层文件系统

使用Linux内建工具和用户库加密数据。不需要root权限

对TigerGraph不可见

内核层加密

文件系统的加密采用的是高级的加密算法。 某些工具还向用户提供多种加密算法选择,使得加密即可以在内核模式,也可以在用户模式下完成。 若要在内核模式下运行加密,则需要拥有超级用户权限。

自Linux 2.6版本开始,设备映射工具(device-mapper)便一直使用至今。它使用内核加密API,通过一种通用的方法创建具有透明加密文件块的块存储设备虚拟层。

对于Ubuntu来说,安装操作系统时便可以选择是否需要全盘加密。而对于其他的Linux发行版来说,可以通过 dm-encrypt 工具加密磁盘。

eCryptfs 工具也很常用,它基于GPL协议开发,并已经预装在某些版本的Linux(例如Ubuntu)的内核中。

用户层加密

若无法获取root权限,用户也可以采取一个变通的办法,即在操作系统之上使用FUSE (Filesystem in User Space)功能创建一个用户层文件系统。虽然这样的做法在性能上相较于内核模式有损失,但同时它也为用户提供了更多定制化和调优的空间。

例 1: 使用dm-crypt工具在内核层加密文件系统

在本示例中,我们使用dm-crypt工具在内核层加密文件系统。dm-crypt工具被广泛应用在多个领域并提供不同的加密算法以供选择。它同时也能针对不同存储单位进行加密——包括全盘加密、分区加密、逻辑卷加密以及文件加密。

这种加密方式的基本思路为:首先创建一个文件,随后将加密后的文件系统映射到该文件上,并将其挂在为一个用于储存数据的文件夹。该文件夹只对授信的TigerGraph账户提供读写权限。

准备工作

首先,用户需要提供一台Linux主机,并且:

  • 拥有该主机的root权限

  • 未安装过TigerGraph系统

  • 有足够的空间存放需要加密的TigerGraph数据。存储空间即可以是本地磁盘,也可以是外挂磁盘。

操作步骤

  • 安装 cryptsetup (Ubuntu中已经预装该工具。对于其他Liunx版本,可能需要用到yum工具).

  • 安装TigerGraph

  • 向TigerGraph OS账户提供sudo权限

  • 使用 gadmin stop -y 或 gadmin stop admin -y 命令关闭所有TigerGraph服务

  • 切换至TigerGraph OS账户,运行下面的export命令设定变量。请将...中的值替换为你需要的值。

# TigerGraph数据库的用户名, 例如: tigergraph
export db_user='<username>'

# 数据加密文件的保存路径, 例如: /home/tigergraph/secretfs
export encrypted_file_path='<path-to-encrypted-file>'

# 数据加密文件的大小 (通过dd命令创建), 例如: 60G
export encrypted_file_size=<storage-size>

# 数据加密文件的密码, 例如: DataAtRe5tPa55w0rd
export encryption_password='<password>'

# TigerGraph的根目录地址, 例如: $HOME/tigergraph
export tigergraph_root="<tigergraph-root>"

# 为数据加密文件映射配置第一个可用的loop设备
export loop_device=$(losetup -f)
  • 创建TigerGraph数据加密文件

dd of=$encrypted_file_path bs=$encrypted_file_size count=0 seek=1
  • 修改该文件的权限,使得只有文件所有者 (即上一步中创建该文件的账户)才能够访问该文件。

chmod 600 $encrypted_file_path
  • 在文件上关联一个loop设备

sudo losetup $loop_device $encrypted_file_path
  • 加密该设备中的数据。使用cryptsetup工具会用到Linux设备映射的路径(本示例中为),执行卷的初始化,并输入已设定好的密码(本示例中为​encryption_password)

sudo cryptsetup -y luksFormat $loop_device 

若用户想自动化该过程,可使用以下命令编写一个root用户的TTY会话:

echo "$encryption_password" | cryptsetup -y luksFormat $loop_device 
  • 打开分区,并创建一个$encrypted_file_path的映射:

sudo cryptsetup luksOpen $loop_device tigergraph_gstore 

若用户想自动化该过程,可使用以下命令编写一个root用户的TTY会话:

echo "$encryption_password" | cryptsetup luksOpen $loop_device tigergraph_gstore
  • 清除bash变量和bash历史记录中的密码

下面的命令可能会将之前所有的bash记录一并清除。若用户只想清理部分历史记录,可以通过编辑~/.bash_history来实现。

unset encryption_password
history -c
history -w
  • 创建文件系统并确认其状态:

sudo mke2fs -j -O dir_index /dev/mapper/tigergraph_gstore
  • 将新创建的文件系统挂在到 /mnt/secretfs:

sudo mkdir -p /mnt/secretfs
sudo mount /dev/mapper/tigergraph_gstore /mnt/secretfs
  • 将权限修改为700,即只有$db_user账户可以访问该文件系统:

sudo chmod -R 700 /mnt/secretfs
sudo chown -R $db_user:$db_user /mnt/secretfs
  • 将原始的TigerGraph数据文件移动到加密文件目录,并建立一个快捷方式。如果只想加密TigerGraph的datastore(称为gstore),则可以使用以下命令

mv $tigergraph_root/gstore /mnt/secretfs/gstore
ln -s /mnt/secretfs/gstore $tigergraph_root/gstore

此外,如果用户还希望加密一些其他TigerGraph的敏感信息文件,例如字典(dictionary),kafka数据文件或者日志文件,则可以将它们单独加密,或干脆将整个TigerGraph文件夹都加密。这种情况下,需要移动的文件夹变成了$tigergraph_root,而不是之前的tigergraph_root/gstore。

mv $tigergraph_root /mnt/secretfs/tigergraph
ln -s /mnt/secretfs/tigergraph $tigergraph_root

现在,所有的TigerGraph的数据都已归入加密文件系统中。在tigergraph账户访问数据的时候(而且是仅当tigergraph账户访问数据的时候),数据会自动解密。

若想让加密动作自动运行,则需要:

  1. 将所有步骤编写在一个bash脚本中。

  2. 去掉命令中所有的sudo前缀,因为该脚本会由root用户执行。

  3. 先安装TigerGraph系统,然后用root权限执行该脚本。

由于脚本中会包含加密的密码,所以出于安全性的考虑,请勿将密码以明文方式保存在任何文件中。用户可以选择删除该脚本,或者在脚本中把密码删除。

性能评估

数据加密通常与CPU的状态更相关,而与IO吞吐量关联性较小。如果CPU的使用率始终保持在100%以下,则数据加密不会造成明显的性能损失。以下同时包含了小请求和大请求的性能测试证明了这个猜测:无论是小请求(~1秒)还是大请求(~100秒),数据加密都只造成了约5%的性能损失。

GSE 冷启动 (读)

载入数据 (写)

未加密

45秒

809秒

加密

47秒

854秒

% 性能损失

4.4%

5.8%

我们使用TPC-H dataset( http://www.tpc.org/tpch/ )标定性能指标,系数为10。导入TigerGraph的数据量为23GB。写入测试(载入数据)的步骤为:首先运行了一个加载作业,随后使用SIGTERM(退出动作相对平缓)强制停止GPE,从而确保所有的kafka数据都已经被使用。读取测试(GSE冷启动)的步骤为:运行"gadmin start gse"并持续检查"gadmin status gse"直到状态变为在线(online),并记录所花费的时间。

例 2: 在亚马逊EC2主机上加密数据

主流的云服务商均提供数据加密的服务。如需获取有关亚马逊EC2主机中的数据加密的指导,我们推荐用户阅读亚马逊安全博客(AWS Security Blog): How to Protect Data at Rest with Amazon EC2 Instance Store Encryption .

在本章节中,我们也提供一个简单示例,用于演示如何将亚马逊EC2上的TigerGraph文件系统进行加密。所有步骤均基于文档: How to Protect Data at Rest with Amazon EC2 Instance Store Encryption ,但同时也需要一些额外的动作和修改。

这种加密方式的基本逻辑为:首先创建一个文件,随后将加密后的文件系统隐射到该文件上,并将其挂在为一个用于储存数据的文件夹。该文件夹只对授信的TigerGraph账户提供读写权限。

请将尖括号... 内的参数替换为你所需要设定的参数。(不包括尖括号本身)

准备动作

请确认 AWS CLI 已经由本地秘钥正确安装和配置。

创建一个S3桶(S3 bucket)

来自 Amazon Data-at-Rest blog
登录S3管理界面并选择“创建桶”
输入需要创建的桶的名字,并点击Create按钮
你可以在右侧看到该桶的具体信息

为S3桶配置正确的IAM身份与权限

来自 Amazon Data-at-Rest blog
1.Sign in to the AWS Management Console and navigate to the IAM console . In the navigation pane, choose Policies , choose Create Policy . Choose the JSON tab, paste in the following JSON code, and then choose Review Policy . Name and describe the policy, and then choose Create Policy to save your work. For more details, see Creating Customer Managed Policies .

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<your-bucket-name>/LuksInternalStorageKey"
        }
    ]
}
The preceding policy grants read access to the bucket where the encrypted password is stored. This policy is used by the EC2 instance, which requires you to configure an IAM role. You will configure KMS permissions later in this post. 
(The following instructions have been updated since the original blog post.)

2."Select type of trusted entity: Choose AWS service .
3."Select the service that will use this role": Choose EC2 then choose Next: Permissions.
4.Choose the policy you created in Step 1 and then choose Next: Review.
5.On the Create role page, type your role name , a Role description, and choose Create role .
6.The newly created IAM role is now ready. You will use it when launching new EC2 instances, which will have the permission to access the encrypted password file in the S3 bucket.

创建一个 KMS 秘钥 (可选)

若用户没有KMS秘钥,可以首先创建一个:

  1. IAM console 中, 在功能菜单中选择 Encryption keys。

  2. 选择 Create Key , 并且输入** 你的秘钥的别名 **

  3. 在步骤: Step 4 : Define Key Usage Permissions 中 , 选择 你的身份名

  4. 当前的身份已能够使用该秘钥。

使用KMS加密一个密码并将其保存在S3桶中

来自 Amazon Data-at-Rest blog
Next, use KMS to encrypt a secret password. To encrypt text by using KMS, you must use AWS CLI . AWS CLI is installed by default on EC2 Amazon Linux instances and you can install it on Linux, Windows, or Mac computers.

To encrypt a secret password with KMS and store it in the S3 bucket:

From the AWS CLI, type the following command to encrypt a secret password by using KMS (replace <your-region> with your region). You must have the right permissions in order to create keys and put objects in S3 (for more details, see Using IAM Policies with AWS KMS ). In this example, I have used AWS CLI on the Linux OS to encrypt and generate the encrypted password file.
aws --region <your-region> kms encrypt --key-id 'alias/<your-key-alias>' --plaintext '<your-password>' --query CiphertextBlob --output text | base64 --decode > LuksInternalStorageKey

aws s3 cp LuksInternalStorageKey s3://<your-bucket-name>/LuksInternalStorageKey
The preceding commands encrypt the password (Base64 is used to decode the cipher text). The command outputs the results to a file called LuksInternalStorageKey. It also creates a key alias (key name) that makes it easy to identify different keys; the alias is called <your-key-alias> . The file is then copied to the S3 bucket created earlier in this post.

基于身份配置EC2主机并启用该配置

本章节将说明如何开启一个全新的EC2主机实例,并使用新的IAM身份和启动脚本执行文件系统的加密步骤。

本章节中涉及的脚本需要用root权限执行,且不可通过ssh管道手动执行或由未授权用户执行。

  1. EC2 console之中激活一个新的实例 (具体详见 this tutorial)。 可使用Amazon Linux AMI 2017.09.1 (HVM), 采用SSD卷类 (若不使用Amazon Linux AMI则需要在最开始创建一个脚本用于安装python, pip 和 AWS CLI)。

  2. 在步骤3: Configure Instance Details中:

    1. IAM role中,请选择 你的身份名

    2. User Data中,请将下面的代码块中的尖括号中的内容替换成你需要的值,然后粘贴到TigerGraph的安装脚本中。

加密动作的启动脚本
#!/bin/bash

db_user=tigergraph

## Initial setup to be executed on boot
##====================================
# Create an empty file. This file will be used to host the file system.
# In this example we create a <disk-size> (for example: 60G) file at <path-to-encrypted-file> (for example: /home/tigergraph/gstore_enc).
dd of=<path-to-encrypted-file> bs=<disk-size> count=0 seek=1

# Lock down normal access to the file.
chmod 600 <path-to-encrypted-file>

# Associate a loopback device with the file.
losetup /dev/loop0 <path-to-encrypted-file>

#Copy encrypted password file from S3. The password is used to configure LUKE later on.
aws s3 cp s3://<your-bucket-name>/LuksInternalStorageKey .

# Decrypt the password from the file with KMS, save the secret password in LuksClearTextKey
LuksClearTextKey=$(aws --region <your-region> kms decrypt --ciphertext-blob fileb://LuksInternalStorageKey --output text --query Plaintext | base64 --decode)


# Encrypt storage in the device. cryptsetup will use the Linux
# device mapper to create, in this case, /dev/mapper/tigergraph_gstore.
# Initialize the volume and set an initial key.
echo "$LuksClearTextKey" | cryptsetup -y luksFormat /dev/loop0

# Open the partition, and create a mapping to /dev/mapper/tigergraph_gstore.
echo "$LuksClearTextKey" | cryptsetup luksOpen /dev/loop0 tigergraph_gstore

# Clear the LuksClearTextKey variable because we don't need it anymore.
unset LuksClearTextKey

# Create a file system and verify its status.
mke2fs -j -O dir_index /dev/mapper/tigergraph_gstore

# Mount the new file system to /mnt/secretfs.
mkdir -p /mnt/secretfs
mount /dev/mapper/tigergraph_gstore /mnt/secretfs

# create user tigergraph
adduser $db_user

# Change the permission so that only tigergraph has access to the file system
chmod -R 700 /mnt/secretfs
chown -R $db_user:$db_user /mnt/secretfs

# Install TigerGraph
# Run the one-command installation script with TigerGraphh root path under /mnt/secretfs

在系统启动后,脚本运行可能会花费几分钟时间。

随后,用户便可以启动一个或多个包含加密文件夹 /mnt/secretfs 的EC2主机。这些目录只能由 tigergraph 用户访问。

性能表现

数据加密操作对系统的影响通常与CPU使用率更相关,而与IO吞吐量关联性较小。如果CPU的使用率始终保持在100%以下,则数据加密不会造成明显的性能损失。

Copyright (c) 2015-2018 www.tigergraph.com. All rights reserved.

Last updated