前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让你的PostgreSQL更安全

让你的PostgreSQL更安全

原创
作者头像
所有的酒都不如你
发布2018-07-23 19:58:43
2K0
发布2018-07-23 19:58:43
举报

什么是PostgreSQL?

PostgreSQL自由的对象-关系型数据库服务器,在灵活的BSD风格许可证下发行。它在其他开放源代码数据库系统和专有系统之外,为用户又提供了一种选择。 我们还是建议您使用云数据库进行搭建,省去数据迁移等麻烦操作,数据库详见:https://cloud.tencent.com/product/cdb-overview

在本教程中,我们将讨论一些可以保护PostgreSQL数据库的方法。这有助于防止未经授权或恶意使用您的数据,几乎所有现代发行版都应以类似的方式运行。

安装

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

代码语言:javascript
复制
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib

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

您可以看看这篇文章《想熟悉PostgreSQL?这篇就够了》,这对您学习本文很有帮助。

对等身份验证

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

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

代码语言:javascript
复制
sudo su  -  postgres

接下来,我们可以通过输入以下内容连接到系统:

代码语言:javascript
复制
PSQL

那么我们如何能够在没有密码的情况下连接呢?这是因为Postgres已经通过用户名进行了身份验证,它认为这是安全的。

不要将postgres用户用于访问数据库软件以外的任何其他用户。这是出于的安全因素考虑。

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

代码语言:javascript
复制
\q
exit

不允许远程连接

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

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

代码语言:javascript
复制
sudo nano /etc/postgresql/9.1/main/pg_hba.conf
代码语言:javascript
复制
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套接字。后两个声明是远程的,我们会看到这些是指定本地计算机的接口。

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

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

也可以通过SSH隧道访问PostgreSQL,以便客户端计算机可以连接到远程数据库。另一种选择是使用SSL证书配置访问。这将允许加密的信息传输。

PostgreSQL中的安全性

虽然确保对提示的访问很重要,但在PostgreSQL确保数据也是必要的。PostgreSQL通过使用roles来实现这一点。

登录PostgreSQL:

代码语言:javascript
复制
sudo su - postgres
psql

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

确保在必要时可以分离用户和数据的一种方法是为每个应用程序分配不同的角色。

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

代码语言:javascript
复制
CREATE ROLE role_name WITH optional_permissions;

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

代码语言:javascript
复制
\h CREATE ROLE

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

代码语言:javascript
复制
ALTER ROLE role_name WITH optional_permissions;

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

代码语言:javascript
复制
\du
代码语言:javascript
复制
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 hello     | Create DB                                      | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}
 testuser  |                                                | {}

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

将用户与功能分开

角色是一种处理权限的灵活方式。它们负责处理共享用户组的某些方面问题,角色可以拥有其他角色的成员资格。

这为我们提供了一些解决权限的独特方法。我们可以为用户分配登录角色,然后我们可以在访问角色中分配这些角色成员身份,以便能够对数据执行实际功能。这种权限分离使我们能够管理每个用户在更细粒度级别上可以执行的操作。

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

代码语言:javascript
复制
CREATE ROLE login_role WITH login;
CREATE ROLE access_role;
\du
代码语言:javascript
复制
                             List of roles
  Role name  |                   Attributes                   | Member of 
-------------+------------------------------------------------+-----------
 access_role | Cannot login                                   | {}
 login_role  |                                                | {}
 postgres    | Superuser, Create role, Create DB, Replication | {}

由此可见,我们有两个新角色,其中一个无法登录。

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

代码语言:javascript
复制
CREATE DATABASE demo_application WITH OWNER access_role;

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

代码语言:javascript
复制
\c demo_application
REVOKE ALL ON SCHEMA public FROM public;
GRANT ALL ON SCHEMA public TO access_role;

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

代码语言:javascript
复制
RESET ROLE;
GRANT access_role TO login_role;
SET ROLE login_role;
CREATE TABLE test_table(
    name varchar(25));
代码语言:javascript
复制
ERROR: permission denied for schema public

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

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

代码语言:javascript
复制
RESET ROLE;
GRANT access_role TO login_role;
SET ROLE login_role;
CREATE TABLE test_table(
    name varchar(25));
代码语言:javascript
复制
CREATE TABLE

我们现在可以使用“login_role”登录并管理数据库,可以轻松添加或撤消处理此数据库的功能。

结论

本教程中讨论的方法只是开发自己的安全策略的一个起点。您的安全需求将是唯一的,这具体取决于不同的数据库用户以及您需要满足的流量的数量和类型。建议您在生产环境上测试之前必须进行全面测试,以确保您已实施所需的控件,并且您没有意外地限制软件的合法使用。

为了安全起见,我们还是建议您在生产环境使用云数据库,省去安全运维等麻烦操作,详见:https://cloud.tencent.com/product/cdb-overview


参考文献:《How To Secure PostgreSQL on an Ubuntu VPS 》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是PostgreSQL?
  • 安装
  • 对等身份验证
  • 不允许远程连接
    • 如果需要远程访问数据库怎么办?
    • PostgreSQL中的安全性
      • 为每个应用程序创建单独的角色
        • 将用户与功能分开
        • 结论
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档