介绍
PostgreSQL是一个自1996年以来一直存在的数据库管理系统;就像其他数据库系统一样;SQL,MySQL,Oracle等,PostgreSQL的主要目的是为用户提供一种用于存储和数据检索的数据库创建方法。
本指南展示了如何在 PostgreSQL 中加密数据库. 标题中的术语 At Rest 是指在数据库中存在的加密,即使在没有任何活动的情况下它不被使用或居住在磁盘上。
在本教程中,您将学习几种方法来加密在PostgreSQL中创建的数据库,其中一些方法需要外部库,如Z-Lib、OpenSSL等。
前提条件
要完成本教程,您将需要:
- Ubuntu 22.10 服务器通过遵循我们的 Ubuntu 20.04 初始服务器设置指南,然后设置一个 PostgreSQL 安装。
通过命令:
1sudo apt-get install libreadline8 libreadline-dev zlib1g-dev bison flex libssl-dev openssl
方法1 - 在系统磁盘上加密数据库
第一个方法是加密数据库,而它是在磁盘上. 这是可用的最简单的加密形式,针对文件系统级别。
要做到这一点,您必须首先使用LUKS
创建加密的 _filesystem,这是专门为 Linux 创建的磁盘加密规格。
首先,您必须从控制台中设置下列所有 _filesystems 列表:
1df -hl
一旦列出所有 filesystems,请选择一个不包含重要信息的文件,因为它将在以后被格式化。
在运行上述命令后,在控制台输出中,您会注意到一个名为 Mounted on 的列。
假设所选择的分区是 /dev/vda15
. 然后必须卸载是如下:
1sudo umount /dev/vda15
接下来,格式化未安装的分区:
1sudo wipefs -a /dev/vda15
一旦格式化完成,是时候使用LUKS
加密分区了:
1sudo cryptsetup luksFormat /dev/vda15
请确保输入一个长且含有字母数字字符的字符。
加密完成后,必须创建一个map_point
,以便该分区在系统中可见。
1sudo cryptsetup luksOpen /dev/vda15 map_point
此地图可在使用命令的 /dev/vda15
分区中看到:
1lsblk
一个加密的分区现在已经完美设置了。接下来需要的是一个 filesystem 来存储我们的文件在分区内。
这可以通过创建一个 exFat 或 FAT32 filesystem. 现在,让我们以以下方式创建一个 Fat32 文件系统:
1sudo mkfs.vfat /dev/mapper/map_point -n encrypt_part
上面的命令有两个参数:
/dev/mapper/map_pint
:这指我们以前使用luksOpen
创建的map_point
. *encrypt_part
:这是你在创建文件系统时必须提到的卷名。
现在你只需要创建一个目录,在那里你会安装这个 filesystem. 这可以通过执行以下命令实现:
1mkdir /dev/vda15c
2sudo mount /dev/mapper/map_point /dev/vda15c
目录 /dev/vda15c
可以通过运行命令与 filesystem 一起查看:
1df -hl
<$>[注] 注: 运行命令「lsblk」将现在在map_point
的type
列下提到类型为crypt
。
您的文件系统现在已加密,可用于数据库存储。实现这一目标的一种方法是将您想要保护的现有数据库复制到该分区并卸载。
登录您的postgres
帐户如下:
1sudo -i -u postgres
然后,为了快速,运行这个:
1psql
现在,要查看包含数据库的目录,请发出以下命令:
1show data_directory
复制显示在输出中的目录. 假设它是类似的 /var/lib/postgresql/14/main
. 现在你知道你的数据库文件存储在哪里,你只需要复制或移动这些文件到加密的 filesystem。
要将整个postgresql文件夹移动到加密的 filesystem,您只需要在退出postgres帐户后执行以下命令。
1sudo -av /var/lib/postgresql /dev/vda15c
<$>[警告] 警告: 您可能会在语音输出
中看到某些属性
可能无法成功传输,这是完全正常的,因为我们正在传输文件的文件系统是一种crypt
类型,不会以任何方式允许更改权限。
一旦转移完成,您的数据库文件夹将被加密,然后您可以选择继续卸载
和关闭
分区。
要卸载,首先停止postgresql
服务,然后发出mount
命令:
1sudo systemctl stop postgresql
2sudo umount /dev/vda15c
您现在已经学会了如何在磁盘上加密postgresql数据库. 可以对这种方法进行许多其他修改,例如将postgresql目录完全迁移到文件系统,以节省安装/卸载时间。
方法 2 — 使用透明数据加密(TDE)加密数据库
如果 filesystem 加密过于令人不安,并且被用户认为不可靠,则有另一种方法来加密和解密数据,同时写入和从磁盘中获取。
TDE
不存在于Postgresql
的原始包中,它必须下载并使用,并且其预先构建的配置只能用于 server-side 加密,而服务器
运行。
首先,您需要从第三方工具中安装Postgresql TDE
,称为 CyberTec :
1wget https://download.cybertec-postgresql.com/postgresql-12.3_TDE_1.0.tar.gz
一旦下载,您需要提取该包:
1tar xvfz postgresql-12.3_TDE_1.0.tar.gz
在您的根
目录中将创建一个名为postgresql-12.3_TDE_1.0.tar.gz
的目录。
现在您需要将当前目录设置为此创建的文件夹:
1cd postgresql-12.3_TDE_1.0.tar.gz
一旦进入此文件夹,我们将开始配置我们的安装,但在此之前,我们需要安装以下几个必要的库:
1sudo apt-get install libldap2-dev libperl-dev python-dev
现在您可以配置安装:
1./configure --prefix=/usr/local/pg12tde --with-openssl --with-perl \
2 --with-python --with-ldap
一旦配置完毕,您需要发出以下命令:
1sudo make install
完成做
命令后,您需要在提取的包内切换到贡献
文件夹并再次发出做
命令,如下所示:
1cd contrib
2sudo make install
完成此命令后,您现在需要设置用于加密的密钥. 此步骤非常简单,因为您只需要写一个可以输出密钥
值的文件。
1cd \
2touch provide_key.sh
现在你需要打开该文件:
1nano provide_key.sh
一旦进入文件,加密下面的密钥并保存:
1echo 8ae8234234h243294324
密钥可以是您想要的任何值. 现在您所要做的就是给这个文件一个属性,以便它可以使用chmod
访问:
1chmod %x /provide_key.sh
现在你可以登录你的postgres
帐户如下:
1sudo su - postgres
此步骤后,您现在需要在您选择的目录中初始化您的数据库,这对于安全方面至关重要,即在运行postgres
服务器时减少任何权限错误。
1sudo mkdir /usr/local/postgres
然后将属性添加到它,以便稍后访问:
1sudo chmod 775 /usr/local/postgres
2sudo chown postgres /usr/local/postgres
现在您可以用您在上面的 provide_key.sh
文件中创建的密钥初始化您的数据库,在此之前,您还需要为数据库设置 export
路径。
1export PATH=$PATH:/usr/local/pgsql/bin
最后打了:
1initdb -D /usr/local/postgres -K /provide_key.sh
这将允许加密,并为您提供一项命令,以便在端复制和运行加密服务器。
1....Success. You can now start the database server using:
2
3 pg_ctl -D /usr/local/postgres -l logfile start
这就是你为Postgres
设置一个TDE服务器的方式。在provide_key.sh
文件中提供给你的密钥将用于读取/写入你的服务器接收的任何数据。
你可能在这里有一个问题,它如何加密数据库 at rest? 毕竟,加密 / 解密只有在服务器运行时才起作用。
好,从技术上讲,你是对的,但是,有一个抓住. 用于加密数据的密钥也被用来解密相同的数据,当它被检索时. 因此,一旦服务器关闭,你可以放心,存储在磁盘上的数据是加密的提供的密钥. 因此,它在两种情况下提供安全性; 在使用时 和 ** 在休息时** 。
现在你对TDE
有了明确的理解,现在是时候学习如何加密数据库的部分 at rest。
方法 3 – 加密数据库的部分
加密数据库的部分是一个非常高效的方法,与上面所述的方法相比. 原因是,你控制了你加密的内容,它不需要和前者一样多的时间。
要设置此设置,您首先需要安装扩展 pgcrypto
. 登录您的 postgres
帐户,然后运行以下命令:
1create extension if not exists pgcrypto;
该 pgcrypto文档提供了您可以用于加密/解密数据的命令的简短列表,但在这里,您将使用对称
密钥加密作为起点。
对于简单的使用,你可以假设一个长度为 1-3 的密钥,一个加密的值是可读的,而不是太长的,因为算法对数据之前附加的前缀加密,然后用会话密钥加密,结果通常更长。
因此,您现在可以测试它,让我们开始创建一个‘test_login’ 表:
1create table test_login (name VARCHAR(50), password TEXT);
现在,您可以将值插入到它中,按应该加密的密码
:
1insert into test_login (name, password) values ('Jonathon', pgp_sym_encrypt('123ab', 'd3a')::TEXT)
此密码
将以此加密格式存储在磁盘上. 若要解密此值,只需运行以下查询:
1select
2 name,
3 pgp_sym_decrypt(password::bytea, 'd3a')
4from
5test_login;
该命令将以原来的解密形式返回密码
,因此,在需要时,您可以实现数据库加密。
结论
在本文中,您了解了使用postgresql的数据库加密 at rest 的三种不同的方法。
文件系统中的数据库加密成本较低,但存储量较大,它加密了整个分区,并可能导致其他类型的数据也被加密。
使用TDE
加密的第二种选项更好,因为它还可以实时保护数据,但它不能单独加密记录,而且大多会保护整个数据库。
关于加密数据库部分内容的第三个想法是最有效的。 这不仅成本较低,而且使用户能够只获得他认为重要的数据,而不是加密所有其他无关记录。 它的缺点是大多数用户不知道黑客如何能够使用引证 (攻击)从数据库中取出重要信息,从而使被加密的部分无效. 因此,有些人可能认为,整个数据库加密的安全性要高得多,减少人为错误和错误.
您可以从文章中提供的链接查看更多加密选项,这也将在稍后的另一个教程中详细说明并解释,以便您不仅可以了解,还可以实时测试加密。