PostgreSQL数据库安全(Security)

2024-02-05 11:18

本文主要是介绍PostgreSQL数据库安全(Security),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

查看原文:http://www.sijitao.net/1696.html
在这个章节,我们主要来了解postgresql的安全,主要讲用户权限问题。
在一般的数据库中,至少包含两种用户,管理员和终端用户。这个很好理解,管理员(及超级用户)拥有完全权限,而终端用户只有部分权限。

一、取消用户对表的访问(Revoking user access to a table)
在运行这个命令时,首先需要确保当前用户是管理员,或者是表的所有人,或者必须有grant的权限。
例如:
REVOKE ALL ON mysecrettable FROM userwhoshoudnotseeit;
这个命令取消userwhoshoudnotseeit对mysecrettable 表的所有权限。
不过因为一般表对public组有访问权限,所以要完全拒绝还需要运行下面这个sql。
REVOKE ALL ON mysecrettable FROM PUBLIC;

当然,如果在生产环境中,最好是在建立表的时候就对权限进行一下设定,保证只有指定用户才可以访问。
例如:

[code language="sql"]
CREATE TABLE table1(
...
);
REVOKE ALL ON table1 FROM GROUP PUBLIC;
GRANT SELECT ON table1 TO GROUP webreaders;
GRANT SELECT, INSERT, UPDATE, DELETE ON table1 TO editors;
GRANT ALL ON table1 TO admins;

[/code]

二、授予用户对表的访问(Granting user access to a table)

例如:

[code language="sql"]
CREATE GROUP webreaders;
GRANT SELECT ON pages TO webreaders;
GRANT INSERT ON viewlog TO webreaders;
GRANT webreaders TO tim, bob;

[/code]

首先创建webreaders组,然后授予该组对pages的select权限,对viewlog的insert权限,最后把tim,bob加入到webreaders组后,tim和bob就都拥有pages的select权限和viewlog的insert权限。
修改webreaders组对组内成员的权限设定都有效。
GRANT INSERT, UPDATE, DELETE ON comments TO webreaders;

授予用户对SCHEMA 的权限
GRANT SELECT ON ALL TABLES IN SCHEMA staging TO bob;

三、创建新用户(Creating a new user)
对于postgresql来说,创建新用户可以有两种方法,分别是命令行和sql。

命令行:

[code language="shell"]
pguser@hvost:~$ createuser bob
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) n
pguser@hvost:~$ createuser tim
Shall the new role be a superuser? (y/n) y

[/code]

SQL:

[code language="sql"]
CREATE ROLE bob WITH NOSUPERUSER INHERIT NOCREATEROLE CREATEDB LOGIN;
CREATE ROLE tim WITH SUPERUSER;

[/code]

查看创建的用户

[code language="shell"]
pguser=# \du tim
List of roles
Role name | Attributes | Member of
-----------+-------------+-----------
tim | Superuser | {}
: Create role
: Create DB
pguser=# \du bob
List of roles
Role name | Attributes | Member of
-----------+------------ +-----------
bob | Create DB | {}

[/code]

四、暂时防止用户的连接(Temporarily preventing a user from connecting)
有时候我们只是暂时不想让用户连接数据库,这里也有两种方法。
1、
设定bob不能登陆
pguser=# alter user bob nologin;
恢复bob登陆功能
pguser=# alter user bob login;
2、
设定bob的连接数为0
pguser=# alter user bob connection limit 0;
设定bob的连接数不限制
pguser=# alter user bob connection limit -1;

因为设置对已登录用户不影响,所以可以用下面这个命令强制没权限用户下线。
SELECT pg_terminate_backend(procpid)
FROM from pg_stat_activity a
JOIN pg_roles r ON a.usename = r.rolname AND not rolcanlogin;

五、删除用户但不删除他的数据(Removing a user without dropping their data)
如果用户拥有一些表,那么在删除的时候会提示如下错误,删除失败。

testdb=# drop user bob;
ERROR: role "bob" cannot be dropped because some objects depend on it
DETAIL: owner of table bobstable
owner of sequence bobstable_id_seq

最简单的方法是上面四中介绍的,前置用户的登陆权限。
pguser=# alter user bob nologin;

或者可以对需要删除的用户重命名。
pguser=# grant bob bobs_replacement;

如果必须要删除用户,那么可以先把对用用户的数据改成其他人,再删除。这个功能在8.2之后才加入。
REASSIGN OWNED BY bob TO bobs_replacement;

如果以上办法都不可行,那么最后可以用linux命令修改。

[code language="shell"]
postgres@vm-199:~$ pg_dump -s test | grep -i "alter.*owner to znq"
ALTER FUNCTION public.check_website_regexp(ifid integer) OWNER TO znq;
ALTER TABLE public.public_opinion_info OWNER TO znq;
ALTER TABLE public.temp OWNER TO znq;
ALTER TABLE public.temp_aid_seq OWNER TO znq;

postgres@vm-199:~$ pg_dump -s test | grep -i "alter.*owner to znq" >tmp.sql
postgres@vm-199:~$ sed -e 's/TO znq/TO zhangnq/' < tmp.sql | psql mydb

[/code]

六、检查所有用户是否拥有一个安全密码(Checking all users have a secure password)
因为PostgreSQL内部没有检查密码的工具,所以我们可以做的是把密码进行md5加密,然后在pg_hba.conf中设定拒绝简单密码登陆。

查看没有对密码进行加密的用户
select usename,passwd from pg_shadow where passwd not like 'md5%' or length(passwd) <> 35;

查看对密码加密过的用户
select usename,passwd from pg_shadow where passwd like 'md5%' and length(passwd) = 35;

不过这个对安全密码来说只完成一半,还需要确认用户是否使用了容易猜的密码,比如"password', 'secret', or 'test' 。这个具体可以看这里:http://www.postgresql.org/docs/devel/static/passwordcheck.html 。

七、对特定用户授予有限的管理权限(Giving limited superuser powers to specific users)
ALTER ROLE BOB WITH CREATEDB;
ALTER ROLE BOB WITH CREATEUSER;
以上命令可以给指定用户赋予权限,但是都只是一些保留的功能。如果需要其他权限,这里可以考虑用封装函数。

例如:

[code language="shell"]
pguser@hvost:~$ psql -U postgres
test2
...
test2=# create table lines(line text);
CREATE TABLE
test2=# copy lines from '/home/bob/names.txt';Chapter 6
137
COPY 37
test2=# SET SESSION AUTHORIZATION bob;
SET
test2=> copy lines from '/home/bob/names.txt';
ERROR: must be superuser to COPY to or from a file
HINT: Anyone can COPY to stdout or from stdin. psql's \copy command
also works for anyone.

[/code]

这里可以看到bob没有copy权限,那么应该如何授予?
1、创建函数copy_from:

[code language="sql"]
create or replace function copy_from(tablename text, filepath text)
returns void
security definer
as
$$
declare
begin
execute 'copy ' || tablename || ' from ''' || filepath || '''';
end;
$$ language plpgsql;

[/code]

2、把函数copy_from授权给bob:

[code language="sql"]
revoke all on function copy_from( text, text) from public;
grant execute on function copy_from( text, text) to bob;

[/code]

八、审查数据定义语言(DDL)的修改
首先修改postgresql.conf文件,添加或者修改log_statement = 'ddl' ,重新加载/etc/init-d/postgresql reload 。
查看日志中的修改记录:
postgres@hvost:~$ egrep -i "create|alter|drop" \ /data/pgsql93/pg_log/postgresql-2014-04-23_000000.log

查看谁对数据库进行了修改,需要在postgresql.conf文件中添加log_line_prefix参数%u,推荐参数包括 '%t %u %d',分别包括timestamp, database user和database name。

九、审查数据变化(Auditing data changes)
这个主要也有两种办法。第一种是通过修改postgresql.conf文件,通过log记录操作在服务器中;第二种是通过创建触发器triggers 实现。
1、设置log_statement = 'mod' 或者 'all',收集所有INSERT, UPDATE, DELETE和TRUNCATE操作记录。
2、举例说明:

[code language="sql"]
CREATE TABLE emp (
empname text NOT NULL,
salary integer
);
CREATE TABLE emp_audit(
operation text NOT NULL,
stamp timestamp NOT NULL,
userid text NOT NULL,
empname text NOT NULL,
salary integer
);
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO emp_audit SELECT 'DEL', now(), user, OLD.*;
ELSIF (TG_OP = 'UPDATE') THENSecurity
-- save old and new values
INSERT INTO emp_audit SELECT 'OLD', now(), user, OLD.*;
INSERT INTO emp_audit SELECT 'NEW', now(), user, NEW.*;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO emp_audit SELECT 'INS', now(), user, NEW.*;
ELSEIF (TG_OP = 'TRUNCATE') THEN
INSERT INTO emp_audit SELECT 'TRUNCATE', now(), user, '-', -1;
END IF;
RETURN NULL; -- result is ignored bacause this is an AFTER trigger
END;
$emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
CREATE TRIGGER emp_audit_truncate
AFTER TRUNCATE ON emp
FOR EACH STATEMENT EXECUTE PROCEDURE process_emp_audit();

[/code]

十、结合LDAP(Integrating with LDAP)
具体参考教程,这里博主没测试过。

十一、使用SSL连接(Connecting using SSL)
使用ssl会影响数据传输速度,如果确定网络安全,可以不需要使用ssl 。
修改postgresql.conf,把ssl设置成on 。

pg_hba.conf设置:
host all all 192.168.54.1/32 md5
hostssl all all 0.0.0.0/0 md5
这个意思是192.168.1.0/24不使用ssl,其他ip连接都使用ssl 。

十二、对敏感数据进行加密(Encrypting sensitive data)
pgcrypto的使用,具体可以参考下面几个网址:

http://www.postgresql.org/docs/9.0/static/pgcrypto.html
http://www.openssl.org/
http://www.gnupg.org/gph/en/manual.html

 

相关内容

探索postgresql数据库(一):http://www.sijitao.net/1428.html

探索postgresql数据库(二):http://www.sijitao.net/1438.html

Postgresql 数据库控制解析(一):http://www.sijitao.net/1454.html

Postgresql 数据库控制解析(二):http://www.sijitao.net/1501.html

PostgreSQL数据库中的表和数据(Tables & Data):http://www.sijitao.net/1576.html

这篇关于PostgreSQL数据库安全(Security)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680734

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

PostgreSQL数据库密码被遗忘时的操作步骤

《PostgreSQL数据库密码被遗忘时的操作步骤》密码遗忘是常见的用户问题,因此提供一种安全的遗忘密码找回机制是十分必要的,:本文主要介绍PostgreSQL数据库密码被遗忘时的操作步骤的相关资... 目录前言一、背景知识二、Windows环境下的解决步骤1. 找到PostgreSQL安装目录2. 修改p