PostgreSQL是一个数据库管理系统,自 1996 年以来一直存在。就像其他数据库系统一样; SQL、MySQL、Oracle等,PostgreSQL的主要目的是为用户提供一种创建数据库用于存储和数据检索的方式。其突出的功能之一包括事务和并发支持。
本指南演示如何加密 PostgreSQL 中的数据库。期限At Rest标题中的加密指的是数据库上存在的加密,即使数据库没有被使用或驻留在磁盘上而没有任何活动。加密不是一个问题should but a must。如果没有适当的安全性,信息遭受攻击的风险就会很高。
在本教程中,您将学习加密 PostgreSQL 中创建的数据库的几种方法。有些方法需要外部库,例如Z-Lib
, OpenSSL
等等。当您查看列表时,您最终将了解哪种方法在时间和效率方面最适合您。
要完成本教程,您将需要:
- 按照我们的配置配置 Ubuntu 22.10 服务器Ubuntu 20.04 的初始服务器设置指南,然后设置PostgreSQL安装.
- 安装以下库
- Bison
- ReadLine
- Flex
- Zlib
- OpenSSL
- Crypto
通过命令:
-
sudo apt-get installlibreadline8 libreadline-dev zlib1g-dev bison flex libssl-dev openssl
第一种方法是对磁盘上的数据库进行加密。它是针对文件系统级别的最简单的可用加密形式。
为此,您必须首先创建一个加密的文件系统 using LUKS
,这是专门为 Linux 创建的磁盘加密规范。一旦加密文件系统设置完毕后,我们将复制我们的Postgres clusters
在这个系统内部实现所需的加密。
首先,您必须设置所有的列表文件系统从控制台如下:
一旦所有文件系统列出的信息中,请选择不包含重要信息的一项,因为稍后将对其进行格式化。连接到系统的 USB 驱动器也可用于加密。
在运行上述命令后的控制台输出中,您将注意到一个名为镶嵌在。这显示了安装该特定文件系统的分区。
假设所选分区是/dev/vda15
。然后您必须卸载如下:
接下来,格式化卸载的分区:
格式化完成后,就可以使用以下命令对分区进行加密了LUKS
:
-
sudocryptsetup luksFormat /dev/vda15
这将要求输入必须提供的密码。确保输入的密码较长且包含字母数字字符。
加密完成后会出现一个map_point
必须创建该分区才能在系统中可见。这可以通过执行以下命令来实现:
-
sudocryptsetup luksOpen /dev/vda15 map_point
然后可以在下面看到该映射/dev/vda15
使用命令分区:
至此,加密分区就已经完美设置完毕。接下来需要的是一个文件系统将我们的文件存储在分区内。
这可以通过创建一个来实现exFat or FAT32 文件系统。现在,让我们创建一个Fat32文件系统如下:
-
sudomkfs.vfat /dev/mapper/map_point-n加密部分
上面给出的命令有两个参数:
-
/dev/mapper/map_pint
: 这是指map_point
我们之前创建的luksOpen
.
-
encrypt_part
:这是创建文件系统时必须提及的卷的名称。您可以将其更改为您喜欢的任何名称。
现在你只需要创建一个目录来安装它文件系统。这可以通过执行以下命令来实现:
-
mkdir/dev/vda15c
-
sudo mount/dev/mapper/map_point /dev/vda15c
目录/dev/vda15c
可以看到文件系统通过运行命令:
Note:运行命令lsblk
现在将类型称为crypt
列下type
of the map_point
.
您的文件系统现已加密,可用于数据库存储。实现此目的的方法之一是将要保护的现有数据库复制到此分区中并卸载。当您想再次使用它时,只需重新安装分区,然后开始处理数据库即可。
登录您的postgres
账户如下:
然后对于提示符,运行以下命令:
现在要查看包含数据库的目录,请发出如下命令:
复制输出中显示的目录。让我们假设它是这样的/var/lib/postgresql/14/main
。既然您知道数据库文件的存储位置,您只需将这些文件复制或移动到加密的文件系统.
要移动整个postgresql
文件夹到您的加密文件系统,您只需要在注销后执行以下命令postgres
帐户。
-
sudo -av/var/lib/postgresql /dev/vda15c
Warning:您可能会看到在verbose output
那一些attributes
可能无法转移成功。这完全没问题,因为我们正在传输文件的文件系统是crypt
类型,并且不允许以任何方式修改权限。
传输完成后,您的数据库文件夹现已加密。然后您可以选择继续并unmount
and close
分区。
要卸载,首先停止postgresql
服务,然后发出umount
命令:
-
sudosystemctl 停止 postgresql
-
sudo umount/dev/vda15c
您现在已经学会了如何加密postgresql
数据库在磁盘上。对此方法还可以进行许多其他修改,例如重新定位postgresql
目录完全位于文件系统上以节省安装/卸载时间。这一点会在后面的文章中详细谈到。
If 文件系统加密太令人畏惧并且用户认为不可靠,还有另一种方法可以在从磁盘写入和检索数据时加密和解密数据。
TDE
不存在于Postgresql
在其原始包装中。必须下载并使用它。它的预构建配置仅适用于服务器端加密,同时server
运行。还有其他配置TDE
还有,比如client side
, tablespace
etc.
首先,您首先需要安装Postgresql TDE
来自名为CyberTec as:
-
wgethttps://download.cybertec-postgresql.com/postgresql-12.3_TDE_1.0.tar.gz
下载后,您需要解压包:
-
tarxvfz postgresql-12.3_TDE_1.0.tar.gz
具有名称的目录postgresql-12.3_TDE_1.0.tar.gz
现在将在您的root
目录。
现在您需要将当前目录设置为这个创建的文件夹:
-
cdpostgresql-12.3_TDE_1.0.tar.gz
进入此文件夹后,我们将开始配置安装。但在此之前,我们需要安装一些必要的库,如下所示:
-
sudo apt-get installlibldap2-dev libperl-dev python-dev
现在您可以配置安装:
- 。/配置--prefix=/usr/local/pg12tde --with-openssl --with-perl\
- --with-python --with-ldap
配置完成后,您需要发出以下命令:
这可能需要一段时间才能完成。之后make
命令完成后,您需要切换到contrib
提取的包中的文件夹并发出make
再次命令如下:
完成此命令后,您现在需要设置用于加密的密钥。这一步非常简单,因为您所要做的就是编写一个可以输出的文件key
价值。为此,您可以创建一个文件,如下所示:
您现在需要打开该文件:
进入文件后,对下面的密钥进行编码并保存:
echo 8ae8234234h243294324
键可以是您想要的任何值。现在您所要做的就是为该文件指定一个属性,以便可以使用chmod
:
现在您可以登录您的postgres
账户如下:
完成此步骤后,您现在需要在您选择的目录中初始化数据库。为了安全起见,这很重要,即减少运行期间的任何权限错误postgres
服务器。创建文件夹为:
-
sudo mkdir/usr/local/postgres
然后添加属性以供稍后访问:
-
sudo chmod 775/usr/local/postgres
-
sudo chownpostgres /usr/local/postgres
现在您可以使用您在中创建的密钥初始化数据库provide_key.sh
上面的文件。在此之前,您还需要设置export
数据库的路径
-
export PATH=$PATH:/usr/local/pgsql/bin
最后击中:
- initdb -D/usr/local/postgres-K/provide_key.sh
这将启用加密并在最后为您提供复制和运行命令以执行加密服务器。该命令将如下所示:
- ....成功。您现在可以使用以下命令启动数据库服务器:
-
- pg_ctl -D/usr/local/postgres-l日志文件开始
这就是设置 TDE 服务器的方式Postgres
。您在中提供的密钥provide_key.sh
文件将用于读取/写入服务器接收到的任何数据。这样就达到了传输过程中保护数据安全的目的。
那么你可能会有一个问题,它是如何加密数据库的at rest?毕竟,加密/解密只有在服务器运行时才起作用。没有at rest意思是数据库没有被使用?
嗯,从技术上来说,你是对的。但是有一个问题。用于加密数据的密钥也用于在检索数据时解密相同的数据。因此,一旦服务器关闭,您就可以放心,磁盘上的数据已使用提供的密钥进行加密。因此,它可以在这两种情况下提供安全性;使用过程中 and at rest.
现在您已经清楚地了解了TDE
,是时候学习如何加密数据库的某些部分了at rest.
与上面给出的方法相比,加密数据库的某些部分是一种非常有效的方法。原因是您可以控制加密的内容,并且不需要像前者那样花费那么多时间。
要进行此设置,您首先需要安装扩展pgcrypto
。登录您的postgres
帐户,然后运行以下命令:
The pgcrypto文档提供了可用于加密/解密数据的命令的简短列表。然而,在这里,您将使用symmetric
密钥加密作为开始。
为了简单使用,您可以假设长度为 1-3 的密钥作为可读且不太长的加密值。由于该算法对附加在数据之前的前缀进行哈希处理,然后使用会话密钥对其进行加密,因此结果通常会更长。这在保护数据方面是一种极好的措施,因为长度越长,破解密码就越困难。
因此,您现在可以对此进行测试。让我们开始创建一个test_login
table:
- 创建表test_login(名称 VARCHAR(50), 密码文本);
现在,您可以使用以下命令向其中插入值password
被加密,因为它应该:
- 插入test_login(名称、密码) values (“乔纳森”, pgp_sym_加密('123ab', 'd3a')::TEXT)
This password
现在将以这种加密格式保存在磁盘上。要解密该值,只需运行以下查询:
-
select
- name,
- pgp_sym_解密(密码::bytea,'d3a')
- from
- 测试登录;
该命令将返回password
以其原始解密形式。因此,通过这种方式就可以实现数据库加密at rest需要的时候。
在本文中,您学习了三种不同的数据库加密方法at rest使用时postgresql
.
文件系统中的数据库加密成本较低,但存储密集度更高。它会加密整个分区,并可能导致其他类型的数据也被加密。
第二种加密方式是使用TDE
更好,因为它还可以实时保护数据。但它无法单独加密记录,并且主要保护整个数据库。实时解密还是会很慢。
加密数据库部分的第三个想法是最有效的。它不仅成本较低,而且使用户能够仅保护他/她认为重要的数据,而不是加密所有其他不相关的记录。它的缺点是大多数用户不知道黑客如何利用推理(一种攻击)从数据库中挑选出重要信息,从而使加密部分无效。因此,在这种情况下,有些人可能会争辩说,整个数据库加密更加安全,并且减少了人为错误和故障。
最后,由用户来找到最适合他们的方法。您可以从文章中提供的链接中查看更多加密选项,这些选项也会在稍后的另一个教程中详细阐述和解释,以便您不仅可以了解而且可以实时测试加密。