在命令行中使用密码的话, 有几个坏处,
1. 因为命令会记录到命令历史中, 所以使用history就能看到命令行中的密码.
2. 如果使用了远程syslog或其他类似的操作日志收集工具的话, 这些包含了密码的命令最终还会记录到远程, 所以泄密的风险范围再次扩大.
3. ~/.psql_history
4. pg_stat_statements插件中也会记录SQL,
postgres=# \d pg_stat_statements
View "public.pg_stat_statements"
Column | Type | Modifiers
---------------------+------------------+-----------
userid | oid |
dbid | oid |
queryid | bigint |
query | text |
calls | bigint |
total_time | double precision |
rows | bigint |
shared_blks_hit | bigint |
shared_blks_read | bigint |
shared_blks_dirtied | bigint |
shared_blks_written | bigint |
local_blks_hit | bigint |
local_blks_read | bigint |
local_blks_dirtied | bigint |
local_blks_written | bigint |
temp_blks_read | bigint |
temp_blks_written | bigint |
blk_read_time | double precision |
blk_write_time | double precision |
建议在创建用户,修改用户密码后,调用pg_stat_statements_reset()来清除这里记录的SQL。
或者配置pg_stat_statements.track_utility=off,就不会跟踪记录DDL语句了。
5. pg_stat_statements对应的文件。
postgres@digoal-> pwd
/data01/pg_root_1921/pg_stat_tmp
postgres@digoal-> ll
total 28K
-rw------- 1 postgres postgres 2.5K Sep 24 16:00 db_0.stat
-rw------- 1 postgres postgres 9.6K Sep 24 16:00 db_151898.stat
-rw------- 1 postgres postgres 607 Sep 24 16:00 global.stat
-rw------- 1 postgres postgres 6.4K Sep 24 14:48 pgss_query_texts.stat
停库后记录在这里
postgres@digoal-> cd ../pg_stat
这个也非常不靠谱哦。也是泄露渠道之一。
建议设置参数pg_stat_statements.save=off,但是对于9.4这个版本,它依旧会写文件,只是在关闭和启动时会去清理这个文件,具体可以看代码,9.1的版本是不会写文件的。所以建议加上
pg_stat_statements.track_utility=off。
在数据库的使用过程中同样存在类似问题.
例如在psql客户端中创建用户时, 输入的密码, 可能被记录到几个地方.
1. 如果开启了ddl记录, 那么这条SQL会记录到数据库的日志中, 例如csvlog.
2. 如果开启了psql的命令行记录如readline , 会记录到~/.psql_history文件中.
3. 如果开启了会话审计的话, 这些命令同样会记录到会话审计日志(例如通常使用的堡垒机)
不安全的做法 :
安全的做法 :
digoal=# create role digoal login encrypted password 'test';
CREATE ROLE
审计日志记录的是明文
2014-06-03 09:39:23.505 CST,"postgres","digoal",27036,"[local]",538d2706.699c,5,"idle",2014-06-03 09:38:14 CST,2/189,0,LOG,00000,"statement: create role digoal login encrypted password 'test';",,,,,,,,"exec_simple_query, postgres.c:1051","psql.bin"
安全的做法 :
postgres@db-172-16-3-150-> createuser -S -l -P digoal
Enter password for new role:
Enter it again:
那么在审计日志中记录的是MD5
2014-06-03 09:42:46.137 CST,"postgres","postgres",27173,"[local]",538d2816.6a25,3,"idle",2014-06-03 09:42:46 CST,2/210,0,LOG,00000,"
statement: CREATE ROLE digoal PASSWORD 'md59bb83593ae914b642e56dfa03e77b0de' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;
",,,,,,,,"exec_simple_query, postgres.c:1051","createuser"