PostgreSQL是自由的对象-关系型数据库服务器,在灵活的BSD风格许可证下发行。它在其他开放源代码数据库系统和专有系统之外,为用户又提供了一种选择。 我们还是建议您使用云数据库进行搭建,省去数据迁移等麻烦操作,数据库详见:https://cloud.tencent.com/product/cdb-overview
在本教程中,我们将讨论一些可以保护PostgreSQL数据库的方法。这有助于防止未经授权或恶意使用您的数据,几乎所有现代发行版都应以类似的方式运行。
如果您当前尚未安装PostgreSQL,可以使用以下命令安装它:
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
现在应该在您的系统上安装数据库软件。
您可以看看这篇文章《想熟悉PostgreSQL?这篇就够了》,这对您学习本文很有帮助。
默认情况下,PostgreSQL通过将Linux用户帐户与PostgreSQL帐户相关联来处理身份验证。这称为“对等”身份验证。
安装后,Postgres创建了一个名为“postgres”的Linux用户,可以用来访问系统。我们可以输入以下内容更改为此用户:
sudo su - postgres
接下来,我们可以通过输入以下内容连接到系统:
PSQL
那么我们如何能够在没有密码的情况下连接呢?这是因为Postgres已经通过用户名进行了身份验证,它认为这是安全的。
不要将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套接字。后两个声明是远程的,我们会看到这些是指定本地计算机的接口。
要从远程位置访问PostgreSQL,请考虑使用SSH连接到数据库计算机,然后使用本地连接到数据库。
也可以通过SSH隧道访问PostgreSQL,以便客户端计算机可以连接到远程数据库。另一种选择是使用SSL证书配置访问。这将允许加密的信息传输。
虽然确保对提示的访问很重要,但在PostgreSQL确保数据也是必要的。PostgreSQL通过使用roles来实现这一点。
登录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”并尝试创建表来测试它:
RESET ROLE;
GRANT access_role TO 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”登录并管理数据库,可以轻松添加或撤消处理此数据库的功能。
本教程中讨论的方法只是开发自己的安全策略的一个起点。您的安全需求将是唯一的,这具体取决于不同的数据库用户以及您需要满足的流量的数量和类型。建议您在生产环境上测试之前必须进行全面测试,以确保您已实施所需的控件,并且您没有意外地限制软件的合法使用。
为了安全起见,我们还是建议您在生产环境使用云数据库,省去安全运维等麻烦操作,详见:https://cloud.tencent.com/product/cdb-overview
参考文献:《How To Secure PostgreSQL on an Ubuntu VPS 》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。