digoal
2015-11-30
PostgreSQL , 安全 , UDF , 提权
PostgreSQL 安全指南请参考,内附今年PG大会的安全分享。
http://blog.163.com/digoal@126/blog/static/16387704020155131217736/
赶紧检查一下你的数据库是否安全吧。
在赠送一个PostgreSQL的巡检脚本,
https://github.com/digoal/pgsql_admin_script/blob/master/generate_report.sh
今天看到有人利用PostgreSQL的大对象导出功能,将写好的.so文件导出到/tmp目录,然后在PostgreSQL中创建一个C函数,调用这个.so文件中的C函数,以此来将PostgreSQL变成肉鸡。
要完成这个攻击需要具备几个条件,
1. 攻击者必须要能连到你的数据库。这点postgresql可以通过pg_hba.conf来控制,这是postgresql的守门员哦,一定要用好它。
2. 导出大对象需要超级用户权限,如果攻击者只有普通用户权限是无法将数据导出到文件的。这一点postgresql非常靠谱,所有涉及写文件或者读文件的数据库函数,都需要超级用户的权限。所以保护好你的超级用户是非常重要的哦。
3. 创建C函数,需要超级用户权限,因为language C在postgresql中是untrusted的。
4. 攻击者可以使用触发器和规则给DBA下陷阱,如果DBA使用超级用户访问了普通用户布下的陷阱表,视图或函数,有可能成为帮凶,帮助攻击者从普通用户提升为超级用户,或者帮助攻击者攻陷数据库。这个还是需要DBA提高警惕,当然通过hack postgresql源码,是可以解决这个问题的,阿里云RDS PG已经解决了这个问题。
5. 攻击者必须要能破解你的数据库密码,postgresql可以通过passwordcheck和cracklib来强制用户使用复杂密码,提高暴力破解的难度到N个数量级。
6. 攻击者如果要暴力破解你的密码怎么办?postgresql提供了auth_delay插件,防止暴力破解。
7. 万一以前没有使用passwordcheck要求用户创建复杂密码怎么办?如何找出现在数据库中的简单密码呢?我在巡检脚本中提供了方法。大家可以参照做一下。
8. 还有一点非常重要,pg_hba.conf中千万不要用trust认证,这是不需要密码的,你打算裸奔吗?
最后,作为DBA,养成良好的安全习惯很重要,不要掉以轻心。
祝福大家的PostgreSQL安全,稳定,性能好。
关于这次攻击的方法:
http://www.freebuf.com/articles/network/87479.html
您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.