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

2023-11-18

介绍

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

通过命令:

  1. sudo apt-get installlibreadline8 libreadline-dev zlib1g-dev bison flex libssl-dev openssl

方法一——加密系统盘数据库

第一种方法是对磁盘上的数据库进行加密。它是针对文件系统级别的最简单的可用加密形式。

为此,您必须首先创建一个加密的文件系统 using LUKS,这是专门为 Linux 创建的磁盘加密规范。一旦加密文件系统设置完毕后,我们将复制我们的Postgres clusters在这个系统内部实现所需的加密。

首先,您必须设置所有的列表文件系统从控制台如下:

  1. df -hl

一旦所有文件系统列出的信息中,请选择不包含重要信息的一项,因为稍后将对其进行格式化。连接到系统的 USB 驱动器也可用于加密。

在运行上述命令后的控制台输出中,您将注意到一个名为镶嵌在。这显示了安装该特定文件系统的分区。

假设所选分区是/dev/vda15。然后您必须卸载如下:

  1. sudo umount/dev/vda15

接下来,格式化卸载的分区:

  1. sudo wipefs -a/dev/vda15

格式化完成后,就可以使用以下命令对分区进行加密了LUKS:

  1. sudocryptsetup luksFormat /dev/vda15

这将要求输入必须提供的密码。确保输入的密码较长且包含字母数字字符。

加密完成后会出现一个map_point必须创建该分区才能在系统中可见。这可以通过执行以下命令来实现:

  1. sudocryptsetup luksOpen /dev/vda15 map_point

然后可以在下面看到该映射/dev/vda15使用命令分区:

  1. lsblk

至此,加密分区就已经完美设置完毕。接下来需要的是一个文件系统将我们的文件存储在分区内。

这可以通过创建一个来实现exFat or FAT32 文件系统。现在,让我们创建一个Fat32文件系统如下:

  1. sudomkfs.vfat /dev/mapper/map_point-n加密部分

上面给出的命令有两个参数:

  • /dev/mapper/map_pint: 这是指map_point我们之前创建的luksOpen.
  • encrypt_part:这是创建文件系统时必须提及的卷的名称。您可以将其更改为您喜欢的任何名称。

现在你只需要创建一个目录来安装它文件系统。这可以通过执行以下命令来实现:

  1. mkdir/dev/vda15c
  2. sudo mount/dev/mapper/map_point /dev/vda15c

目录/dev/vda15c可以看到文件系统通过运行命令:

  1. df -hl

Note:运行命令lsblk现在将类型称为crypt列下type of the map_point.

您的文件系统现已加密,可用于数据库存储。实现此目的的方法之一是将要保护的现有数据库复制到此分区中并卸载。当您想再次使用它时,只需重新安装分区,然后开始处理数据库即可。

登录您的postgres账户如下:

  1. sudo -i -upostgres

然后对于提示符,运行以下命令:

  1. psql

现在要查看包含数据库的目录,请发出如下命令:

  1. 显示数据目录

复制输出中显示的目录。让我们假设它是这样的/var/lib/postgresql/14/main。既然您知道数据库文件的存储位置,您只需将这些文件复制或移动到加密的文件系统.

要移动整个postgresql文件夹到您的加密文件系统,您只需要在注销后执行以下命令postgres帐户。

  1. sudo -av/var/lib/postgresql /dev/vda15c

Warning:您可能会看到在verbose output那一些attributes可能无法转移成功。这完全没问题,因为我们正在传输文件的文件系统是crypt类型,并且不允许以任何方式修改权限。

传输完成后,您的数据库文件夹现已加密。然后您可以选择继续并unmount and close分区。

要卸载,首先停止postgresql服务,然后发出umount命令:

  1. sudosystemctl 停止 postgresql
  2. sudo umount/dev/vda15c

您现在已经学会了如何加密postgresql数据库在磁盘上。对此方法还可以进行许多其他修改,例如重新定位postgresql目录完全位于文件系统上以节省安装/卸载时间。这一点会在后面的文章中详细谈到。

方法 2 — 使用透明数据加密 (TDE) 加密数据库

If 文件系统加密太令人畏惧并且用户认为不可靠,还有另一种方法可以在从磁盘写入和检索数据时加密和解密数据。

TDE不存在于Postgresql在其原始包装中。必须下载并使用它。它的预构建配置仅适用于服务器端加密,同时server运行。还有其他配置TDE还有,比如client side, tablespace etc.

首先,您首先需要安装Postgresql TDE来自名为CyberTec as:

  1. wgethttps://download.cybertec-postgresql.com/postgresql-12.3_TDE_1.0.tar.gz

下载后,您需要解压包:

  1. tarxvfz postgresql-12.3_TDE_1.0.tar.gz

具有名称的目录postgresql-12.3_TDE_1.0.tar.gz现在将在您的root目录。

现在您需要将当前目录设置为这个创建的文件夹:

  1. cdpostgresql-12.3_TDE_1.0.tar.gz

进入此文件夹后,我们将开始配置安装。但在此之前,我们需要安装一些必要的库,如下所示:

  1. sudo apt-get installlibldap2-dev libperl-dev python-dev

现在您可以配置安装:

  1. 。/配置--prefix=/usr/local/pg12tde --with-openssl --with-perl\
  2. --with-python --with-ldap

配置完成后,您需要发出以下命令:

  1. sudo make install

这可能需要一段时间才能完成。之后make命令完成后,您需要切换到contrib提取的包中的文件夹并发出make再次命令如下:

  1. cd贡献
  2. sudo make install

完成此命令后,您现在需要设置用于加密的密钥。这一步非常简单,因为您所要做的就是编写一个可以输出的文件key价值。为此,您可以创建一个文件,如下所示:

  1. cd \
  2. touch提供密钥.sh

您现在需要打开该文件:

  1. nano提供密钥.sh

进入文件后,对下面的密钥进行编码并保存:

echo 8ae8234234h243294324

键可以是您想要的任何值。现在您所要做的就是为该文件指定一个属性,以便可以使用chmod:

  1. chmod%x /provide_key.sh

现在您可以登录您的postgres账户如下:

  1. sudo su- postgres

完成此步骤后,您现在需要在您选择的目录中初始化数据库。为了安全起见,这很重要,即减少运行期间的任何权限错误postgres服务器。创建文件夹为:

  1. sudo mkdir/usr/local/postgres

然后添加属性以供稍后访问:

  1. sudo chmod 775/usr/local/postgres
  2. sudo chownpostgres /usr/local/postgres

现在您可以使用您在中创建的密钥初始化数据库provide_key.sh上面的文件。在此之前,您还需要设置export数据库的路径

  1. export PATH=$PATH:/usr/local/pgsql/bin

最后击中:

  1. initdb -D/usr/local/postgres-K/provide_key.sh

这将启用加密并在最后为您提供复制和运行命令以执行加密服务器。该命令将如下所示:

  1. ....成功。您现在可以使用以下命令启动数据库服务器:
  2. pg_ctl -D/usr/local/postgres-l日志文件开始

这就是设置 TDE 服务器的方式Postgres。您在中提供的密钥provide_key.sh文件将用于读取/写入服务器接收到的任何数据。这样就达到了传输过程中保护数据安全的目的。

那么你可能会有一个问题,它是如何加密数据库的at rest?毕竟,加密/解密只有在服务器运行时才起作用。没有at rest意思是数据库没有被使用?

嗯,从技术上来说,你是对的。但是有一个问题。用于加密数据的密钥也用于在检索数据时解密相同的数据。因此,一旦服务器关闭,您就可以放心,磁盘上的数据已使用提供的密钥进行加密。因此,它可以在这两种情况下提供安全性;使用过程中 and at rest.

现在您已经清楚地了解了TDE,是时候学习如何加密数据库的某些部分了at rest.

方法 3 — 加密部分数据库

与上面给出的方法相比,加密数据库的某些部分是一种非常有效的方法。原因是您可以控制加密的内容,并且不需要像前者那样花费那么多时间。

要进行此设置,您首先需要安装扩展pgcrypto。登录您的postgres帐户,然后运行以下命令:

  1. 创建扩展if不存在 pgcrypto;

The pgcrypto文档提供了可用于加密/解密数据的命令的简短列表。然而,在这里,您将使用symmetric密钥加密作为开始。

为了简单使用,您可以假设长度为 1-3 的密钥作为可读且不太长的加密值。由于该算法对附加在数据之前的前缀进行哈希处理,然后使用会话密钥对其进行加密,因此结果通常会更长。这在保护数据方面是一种极好的措施,因为长度越长,破解密码就越困难。

因此,您现在可以对此进行测试。让我们开始创建一个test_login table:

  1. 创建表test_login(名称 VARCHAR(50), 密码文本);

现在,您可以使用以下命令向其中插入值password被加密,因为它应该:

  1. 插入test_login(名称、密码) values (“乔纳森”, pgp_sym_加密('123ab', 'd3a')::TEXT)

This password现在将以这种加密格式保存在磁盘上。要解密该值,只需运行以下查询:

  1. select
  2. name,
  3. pgp_sym_解密(密码::bytea,'d3a')
  4. from
  5. 测试登录;

该命令将返回password以其原始解密形式。因此,通过这种方式就可以实现数据库加密at rest需要的时候。

结论

在本文中,您学习了三种不同的数据库加密方法at rest使用时postgresql.

文件系统中的数据库加密成本较低,但存储密集度更高。它会加密整个分区,并可能导致其他类型的数据也被加密。

第二种加密方式是使用TDE更好,因为它还可以实时保护数据。但它无法单独加密记录,并且主要保护整个数据库。实时解密还是会很慢。

加密数据库部分的第三个想法是最有效的。它不仅成本较低,而且使用户能够仅保护他/她认为重要的数据,而不是加密所有其他不相关的记录。它的缺点是大多数用户不知道黑客如何利用推理(一种攻击)从数据库中挑选出重要信息,从而使加密部分无效。因此,在这种情况下,有些人可能会争辩说,整个数据库加密更加安全,并且减少了人为错误和故障。

最后,由用户来找到最适合他们的方法。您可以从文章中提供的链接中查看更多加密选项,这些选项也会在稍后的另一个教程中详细阐述和解释,以便您不仅可以了解而且可以实时测试加密。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Ubuntu 22.04 上的 PostgreSQL 中静态加密数据库 的相关文章

  • 如何在 Go 应用程序中处理打开/关闭数据库连接?

    我的 Web API 应用程序中有一组函数 他们对 Postgres 数据库中的数据执行一些操作 func CreateUser db err sql Open postgres user postgres password passwor
  • 查询交叉表视图

    我在 PostgreSQL 中有一个表 如下所示 Item1 Item2 Item3 Item4 Value1 Value2 Value3 Value4 我想要一个查询 该查询将显示如下表 ItemHead ValueHead Item1
  • 如何在 postgreSQL 中从时间戳中减去/添加分钟

    我有以下场景 我有员工登记他们的上班 下班手续 但他们有10分钟的容忍度 我通过这种观点得到的最新条目 CREATE OR REPLACE VIEW employees late entries id created datetime en
  • Postgres 运行缓慢的删除查询

    我们有一个表 其行数刚刚超过 62k 我们正在对其运行一个非常简单的删除查询 需要 45 分钟才能完成 DELETE FROM myTable WHERE createdtime lt 2017 03 07 05 00 00 000 我们尝
  • 使用 RMySQL 会干扰 RPostgreSQL

    我有一个 R 脚本 我想从 MySQL 数据库中提取一些数据 然后从 PostgreSQL 数据库中提取一些数据 但是 从 RMySQL 加载 MySQL 驱动程序会阻止我从以下位置加载 PostgreSQL 驱动程序 PostgreSQL
  • Postgres 使用 Rails Active Record 在 IN 列表中 ORDER BY 值

    我收到按 收入 排序的 UserId 列表 一次大约 1000 个 我在 我的系统数据库 中有用户记录 但 收入 列不存在 我想从 我的系统数据库 中检索用户 按照列表中收到的排序顺序 我尝试使用 Active Record 执行以下操作
  • PSQL [错误] - 值被识别为列

    前几天刚开始学习数据库 我遇到了这个问题 我的值被识别为一列 并且它吐出了一个错误 这是我的News table id bodyText url createdAt updatedAt 这是我在 psql 中运行的命令 INSERT INT
  • 如何记录数据库代码以查看数据库对象之间的依赖关系? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想为我的宠物项目编写文档 我的 PostgreSQL 数据库中有 30 个表 近 50 个视图和大约 30 个函数 存储过程 我想看
  • 对 postgresql 中使用 array_agg 创建的文本聚合进行排序

    我在 postgresql 中有一个表 下表 动物 可以解释我的问题 name tiger cat dog 现在我正在使用以下查询 SELECT array to string array agg name FROM animals 结果是
  • PostgreSQL:比较 json [重复]

    这个问题在这里已经有答案了 众所周知 目前 PostgreSQL 还没有方法来比较两个 json 值 比较就像json json不起作用 但是选角呢json to text before Then select x a y b json t
  • postgresql中数组的区别

    我有两个数组 1 2 3 4 7 6 and 2 3 7 在 PostgreSQL 中可能有共同的元素 我想做的是从第一个数组中排除第二个数组中存在的所有元素 到目前为止我已经取得了以下成果 SELECT array SELECT unne
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • Postgresql 的 SQL_NO_CACHE?

    MySQL 关键字是否有等效的 postgresqlSQL NO CACHE 或 SQL Serverdbcc drop clean buffers 即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分吗 UPDATE 这个问题 查看
  • 为什么我的 postgis 不在几何字段上使用索引?

    Windows 上的 postgresql 9 5 postgis 2 2 我首先创建一个表 CREATE TABLE points id SERIAL ad CHAR 40 name VARCHAR 200 然后 添加一个几何字段 geo
  • Postgres:显示继承的字段

    我应该实现什么查询来获取继承的列 读过this http www alberton info postgresql meta info html综合帖子没有找到解决办法 如果我理解正确的话 您想知道作为表之间继承的一部分的列的名称 SELE
  • PostgreSQL 在递归查询中找到所有可能的组合(排列)

    输入是一个长度为 n 的数组 我需要生成数组元素的所有可能组合 包括输入数组中元素较少的所有组合 IN j A B C OUT k A AB AC ABC ACB B BA BC BAC BCA 随着重复 所以AB BA 我尝试过这样的事情
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 部分唯一索引不适用于冲突子句 PostgreSQL

    表结构 create table example a id integer b id integer c id integer flag integer 部分索引 create unique index u idx on example a
  • 带有可变 WHERE 子句的批量 UPDATE 表

    我有一堆值对 foo1 bar1 foo2 bar2 我想做一堆更新 将 foo 列设置为 foo1 其中 bar 列为 bar1 我正在使用 psycopg2 在 Python 中执行此操作 我可以executemany与查询UPDATE
  • PostgreSQL - 致命:用户“myuser”身份验证失败[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我刚刚在我的 Ubuntu Box 中安装了 PostGreSQL 我想做的第一件事就是创建一个数据库 我读了文档 http www postgres

随机推荐

  • 如何在 Ubuntu 20.04 上安装 Git

    Git 是世界上最流行的分布式版本控制系统 被许多开源和商业项目使用 它允许您与其他开发人员协作进行项目 跟踪代码更改 恢复到之前的阶段 创建分支 和更多 Git 最初是由莱纳斯 托瓦尔兹Linux内核的创建者 本指南介绍如何在 Ubunt
  • 如何在 Ubuntu 18.04 上安装 VirtualBox 来宾添加

    虚拟盒子是一款开源 跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 VirtualBox 提供了一组可以安装在来宾操作系统中的驱动程序和应用程序 VirtualBox Guest Additions 来宾添加为来宾计算机提供了多种
  • Linux 类型命令

    The type命令用于显示有关命令类型的信息 它将向您展示在命令行上键入给定命令时将如何解释 在这篇文章中 我们将解释如何使用Linuxtype命令 如何使用 type 命令 type是 Bash 和其他 shell 如 Zsh 和 Ks
  • 如何在 CentOS 7 上使用 Apache 安装和保护 phpMyAdmin

    phpMyAdmin 是一个基于 PHP 的开源工具 用于通过基于 Web 的界面管理 MySQL 和 MariaDB 服务器 phpMyAdmin 允许您与 MySQL 数据库交互 管理用户帐户和权限 执行 SQL 语句 以各种数据格式导
  • 如何在 Ubuntu 20.04 上设置 Nginx 服务器块

    服务器块是一种 Nginx 指令 它定义特定域的设置 允许您在一台服务器上运行多个网站 对于每个网站 您可以设置网站文档根目录 包含网站文件的目录 创建单独的安全策略 使用不同的 SSL 证书等等 本文介绍如何在 Ubuntu 20 04
  • 如何在 CentOS 7 上添加和删除用户

    CentOS 以及所有其他 Linux 发行版都是一个多用户操作系统 每个用户可以对各种命令行和 GUI 应用程序拥有不同的权限级别和特定设置 了解如何添加和删除用户是每个 Linux 用户应该了解的基本技能之一 在本教程中 我们将解释如何
  • 如何在树莓派上安装和使用 Docker

    Docker 是一个容器化平台 允许您快速构建 测试和部署应用程序作为可移植 自给自足的容器 几乎可以在任何地方运行 在本教程中 我们将解释如何在 Raspberry Pi 上安装 Docker 并探索基本的 Docker 概念和命令 先决
  • 如何在 Ubuntu 18.04 上使用 Apache 安装和配置 Nextcloud

    下一云是一个开源 自托管的文件共享和协作平台 类似于 Dropbox 它捆绑了媒体播放器 日历和联系人管理 Nextcloud 可通过应用程序进行扩展 并拥有适用于所有主要平台的桌面和移动客户端 在本教程中 我们将向您展示如何在 Ubunt
  • 了解 /etc/passwd 文件

    Linux 系统上可以使用多种不同的身份验证方案 最常用和标准的方案是针对 etc passwd and etc 影子 files etc passwd是一个基于纯文本的数据库 包含系统上所有用户帐户的信息 这是owned第 644 章权限
  • 如何在 Debian 9 上使用 UFW 设置防火墙

    Debian 包含多个软件包 这些软件包提供了用于管理防火墙的工具 其中 iptables 作为基本系统的一部分安装 对于初学者来说 学习如何使用 iptables 工具正确配置和管理防火墙可能很复杂 但 UFW 简化了它 UFW Unco
  • 如何在 Ubuntu 14.04 服务器上安装 ISPConfig3

    介绍 尽管命令行是一个功能强大的工具 可以让您在许多情况下快速轻松地工作 但在某些情况下 可视化界面会很有帮助 如果您要在一台计算机上配置许多不同的服务 或者为客户端管理系统的某些部分 则可以使用诸如ISP配置可以使这个任务变得更加简单 I
  • 如何在 CentOS 7 上安装 Git

    介绍 版本控制已成为现代软件开发中不可或缺的工具 版本控制系统允许您在源代码级别跟踪您的软件 您可以跟踪更改 恢复到之前的阶段以及从基本代码分支以创建文件和目录的替代版本 最流行的版本控制系统之一是git 许多项目在 Git 存储库中维护其
  • 什么是 Kubernetes?

    介绍 Kubernetes 是一个功能强大的开源系统 最初由 Google 开发 并得到云原生计算基金会 CNCF 的支持 用于在集群环境中管理容器化应用程序 它旨在提供更好的方法来管理跨不同基础设施的相关分布式组件和服务 要了解有关 Ku
  • 使用 Debian 9 进行初始服务器设置

    介绍 当您首次创建新的 Debian 9 服务器时 您应该尽早执行一些配置步骤作为基本设置的一部分 这将提高服务器的安全性和可用性 并为您后续的操作奠定坚实的基础 第一步 以 root 身份登录 要登录您的服务器 您需要知道您的服务器的公共
  • 如何使用 DigitalOcean 云服务器创建虚荣或品牌名称服务器

    介绍 托管提供商或经销商特别感兴趣 拥有品牌或 虚荣域名服务器为客户提供了更专业的外观 它 无需要求您的客户将其域名指向另一个域名 公司的域名服务器 本教程将概述两种创建方法 自定义域名服务器 i 虚荣和 ii 品牌 Types 虚荣名称服
  • 如何在 Ubuntu 18.04 上安装 MySQL

    本教程的先前版本由以下人员编写榛子维尔多 介绍 MySQL是一个开源数据库管理系统 通常作为流行的一部分安装LAMP Linux Apache MySQL PHP Python Perl 堆栈 它使用关系数据库和 SQL 结构化查询语言 来
  • 如何使用 passwd 和 adduser 在 Linux VPS 上管理密码

    介绍 密码和身份验证是每个用户在 Linux 环境中工作时必须处理的概念 这些主题涵盖许多不同的配置文件和工具 在本指南中 我们将探索一些基本文件 例如 etc passwd 和 etc shadow 以及用于配置身份验证的工具 例如名称恰
  • 如何在 VPS 上安装和使用 Logwatch 日志分析器和报告器

    介绍 应用程序创建所谓的 日志文件 来跟踪在任何给定时间发生的活动 这些文件远非简单的文本输出 浏览起来可能非常复杂 特别是当所管理的服务器很繁忙时 当需要参考日志文件时 例如 在发生故障 数据丢失等情况下 利用所有可用的帮助变得至关重要
  • 如何修改 DOM 中的属性、类和样式

    介绍 在本教程之前的教程中series 如何更改 DOM 我们介绍了如何使用内置方法从文档对象模型 DOM 中创建 插入 替换和删除元素 通过提高操作 DOM 的熟练程度 您可以更好地利用 JavaScript 的交互功能并修改 Web 元
  • 如何在 Ubuntu 22.04 上的 PostgreSQL 中静态加密数据库

    介绍 PostgreSQL是一个数据库管理系统 自 1996 年以来一直存在 就像其他数据库系统一样 SQL MySQL Oracle等 PostgreSQL的主要目的是为用户提供一种创建数据库用于存储和数据检索的方式 其突出的功能之一包括