如何在Ubuntu VPS上保护PostgreSQL

数据库管理系统对于处理来自网站和应用程序的信息非常有用。 PostgreSQL是一个流行的数据库管理系统,是令人难以置信的强大。当使用PostgreSQL,它是必要的,你采取适当的preca

什么是PostgreSQL?

PostgreSQL,也称为postgres,是一个流行的数据库管理系统,用于处理许多网站和应用程序的数据。

在本指南中,我们将讨论一些可以保护PostgreSQL数据库的方法。 这将有助于防止未经授权或恶意使用您的数据。

我们将在Ubuntu 12.04 VPS上完成本教程中的步骤,但几乎每个现代分发应该以类似的方式运行。

安装

如果您尚未安装PostgreSQL,可以使用以下命令安装:

sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

现在应该在系统上安装数据库软件。

对等验证

默认情况下,PostgreSQL通过将Linux用户帐户与PostgreSQL帐户相关联来处理身份验证。 这被称为“对等”认证。

安装后,Postgres创建了一个名为“postgres”的Linux用户,可以用来访问系统。 我们可以通过键入以下内容更改为此用户:

sudo su - postgres

从这里,我们可以通过键入以下内容连接到系统:

psql

注意我们如何连接没有密码。 这是因为Postgres已通过用户名认证,它假定是安全的。

不要使用比访问数据库软件的任何其他Linux的“Postgres的”用户。 这是一个重要的安全考虑。

通过键入以下内容退出PostgreSQL和postgres用户:

\q
exit

不允许远程连接

一种删除潜在攻击向量的简单方法是不允许远程连接到数据库。 这是从Ubuntu存储库安装PostgreSQL时的当前默认值。

我们可以通过查看基于主机的身份验证文件来仔细检查是否不允许远程连接:

sudo nano /etc/postgresql/9.1/main/pg_hba.conf
local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

我已删除上面的输出的意见。

正如你可以看到的,前两个安全行指定“local”作为它们适用的范围。 这意味着他们正在使用Unix / Linux域套接字。

后两个声明是远程的,但是如果我们查看它们应用的主机(127.0.0.1/32和:: 1/128),我们看到这些是指定本地机器的接口。

如果您需要远程访问数据库怎么办?

要从远程位置访问PostgreSQL,请考虑使用SSH连接到数据库计算机,然后使用与数据库的本地连接。

另外,也可以通过SSH 隧道访问到PostgreSQL,使得客户机可以连接到远程数据库,好像它是局部的。 你可以学习如何隧道的PostgreSQL通过SSH在这里。

另一种选择是使用SSL证书,配置访问。 这将允许信息的加密传输。 你可以学习到建立SSL PostgreSQL的这个链接。

PostgreSQL中的安全性

虽然安全访问提示很重要,但是在PostgreSQL环境中保护数据也很重要。 PostgreSQL通过使用“角色”来实现这一点。

登录到PostgreSQL以跟随这一节:

sudo su - postgres
psql

为每个应用程序创建单独的角色

如果需要,确保您的用户和数据可以分离的一种方法是为每个应用程序分配不同的角色。

要创建新角色,请键入以下内容:

CREATE ROLE role_name WITH optional_permissions;

要查看您可以分配的权限,请键入:

\h CREATE ROLE

您可以通过键入以下内容来更改任何角色的权限:

ALTER ROLE role_name WITH optional_permissions;

通过键入以下内容列出当前角色及其属性:

\du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 hello     | Create DB                                      | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 testuser  |                                                | {}

创建一个新用户并为将要使用PostgreSQL的每个新应用程序分配适当的权限。

将用户与函数分离

角色是一种灵活的处理权限的方法。 他们分享用户和组的一些方面,并可以使它们工作。 角色可以有其他角色的成员身份。

这给了我们一些独特的方式来解决权限。

我们可以将用户登录的角色(比如我们谈到上面的应用角色),然后我们就可以在分配角色的访问这些角色的成员对数据执行的实际功能。

这种特权分离允许我们管理每个用户在更细粒度的级别上可以做什么。

为了测试这个,让我们创建两个角色:

CREATE ROLE login_role WITH login;
CREATE ROLE access_role;
\du
                             List of roles
  Role name  |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 access_role | Cannot login                                   | {}
 login_role  |                                                | {}
 postgres    | Superuser, Create role, Create DB, Replication | {}

如您所见,我们有两个新角色,其中一个不能登录。

我们现在可以创建一个由“access_role”拥有的数据库:

CREATE DATABASE demo_application WITH OWNER access_role;

我们现在可以连接到数据库并锁定权限,只允许“access_role”创建表:

\c demo_application
REVOKE ALL ON SCHEMA public FROM public;
GRANT ALL ON SCHEMA public TO access_role;

我们可以通过将用户更改为“login_role”并尝试创建表来进行测试:

SET ROLE login_role;
CREATE TABLE test_table(
	name varchar(25));
ERROR: permission denied for schema public

最后,我们可以将“login_role”作为成员添加到“access_role”。 这将允许它访问与“access_role”相同的功能。

我们将角色重置为“postgres”,授予“access_role”中的“login_role”成员资格,然后重试该过程:

RESET ROLE;
GRANT access_role TO login_role;
SET ROLE login_role;
CREATE TABLE test_table(
	name varchar(25));
CREATE TABLE

这工作。

我们现在可以使用“login_role”登录并管理数据库。 这使得添加或撤消在此数据库上工作的能力变得容易。

结论

本文中讨论的方法只是开发自己的安全策略的一个跳转点。 您的安全需求将是唯一的,具体取决于不同的数据库用户以及您需要满足的流量的数量和类型。

建议您在实施生产系统之前研究任何安全措施的好处和缺点。 有必要进行彻底的测试,以确保您实施了您正在寻找的控制,并且您没有不小心限制您的软件的合法使用。

作者:Justin Ellingwood