如何在 Ubuntu 22.04 上为 PostgreSQL 中的静态数据库加密

介绍

PostgreSQL是一个自1996年以来一直存在的数据库管理系统;就像其他数据库系统一样;SQL,MySQL,Oracle等,PostgreSQL的主要目的是为用户提供一种用于存储和数据检索的数据库创建方法。

本指南展示了如何在 PostgreSQL 中加密数据库. 标题中的术语 At Rest 是指在数据库中存在的加密,即使在没有任何活动的情况下它不被使用或居住在磁盘上。

在本教程中,您将学习几种方法来加密在PostgreSQL中创建的数据库,其中一些方法需要外部库,如Z-Lib、OpenSSL等。

前提条件

要完成本教程,您将需要:

通过命令:

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 来存储我们的文件在分区内。

这可以通过创建一个 exFatFAT32 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_pointtype列下提到类型为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加密的第二种选项更好,因为它还可以实时保护数据,但它不能单独加密记录,而且大多会保护整个数据库。

关于加密数据库部分内容的第三个想法是最有效的。 这不仅成本较低,而且使用户能够只获得他认为重要的数据,而不是加密所有其他无关记录。 它的缺点是大多数用户不知道黑客如何能够使用引证 (攻击)从数据库中取出重要信息,从而使被加密的部分无效. 因此,有些人可能认为,整个数据库加密的安全性要高得多,减少人为错误和错误.

您可以从文章中提供的链接查看更多加密选项,这也将在稍后的另一个教程中详细说明并解释,以便您不仅可以了解,还可以实时测试加密。

Published At
Categories with 技术
comments powered by Disqus