安全性最佳实践
这一章描述用户应该遵循的基本安全性最佳实践,它可以确保最高级别的系统安全性。
Greenplum数据库的默认安全性配置:
- 仅允许本地连接。
- 为超级用户(gpadmin)配置的基本认证。
- 超级用户被授权做任何事情。
- 只有数据库角色的口令被加密。
系统用户(gpadmin)
保护和限制对gpadmin系统用户的访问。
Greenplum要求一个UNIX用户ID来安装和初始化Greenplum数据库系统。这个系统用户在Greenplum文档中被称作gpadmin。gpadmin用户是Greenplum数据库中的默认数据库超级用户,也是Greenplum安装及其底层数据文件的文件系统拥有者。默认的管理员账户是Greenplum数据库设计的根本。没有它系统无法运行,并且也没有办法限制gpadmin用户ID的访问。
这个gpadmin用户可以绕过Greenplum数据库的所有安全性特性。任何人通过这一用户ID登入到Greenplum主机,就可以读取、修改或者删除任何数据,包括系统目录数据和数据库访问权限。因此,非常有必要保护好gpadmin用户ID并且只允许必要的系统管理员可以接触到它。
只有在执行特定系统维护任务(例如升级或扩展)时,管理员才应该作为gpadmin登入到Greenplum。
数据库用户绝不应作为gpadmin登录,并且也绝不应以gpadmin运行ETL或者生产负载。
超级用户
被授予SUPERUSER属性的角色是超级用户。超级用户会绕过所有访问特权检查和资源队列。只有系统管理员应该被给予超级用户权利。
请见Greenplum数据库管理员指南中的“修改角色属性”。
登录用户
为每个登入系统的用户指派一个不同的角色并且设置LOGIN属性。
为了登录和审计的目的,每个被允许登入Greenplum数据库的用户应该被给予他们自己的数据库角色。对于应用或者Web服务,考虑为每一种应用或服务创建一个不同的角色。请见Greenplum数据库管理员指南中的“创建新角色(用户)”。
每一个登录角色应该被指派给一个单一的、非默认的资源队列。
组
使用组管理访问特权。
为每个对象/访问权限的逻辑分组创建一个组。
每个登录用户应该属于一个或者更多角色。使用GRANT语句给角色增加组访问。使用REVOKE语句从角色移除组访问。
不应该为组角色设置LOGIN属性。
见Greenplum数据库管理员指南中的“创建组(角色成员关系)”。
对象特权
只有拥有者和超级用户对新对象拥有完全的权限。权限必须被授予给其他角色(用户或组)以允许它们访问对象。每种类型的数据库对象都有不同的可以被授予的特权。使用GRANT语句给角色增加权限,使用REVOKE语句来移除权限。
用户可以使用REASIGN OWNED BY语句更改对象的拥有者。例如,要准备删除一个角色,先要更改属于该角色的对象的拥有者。使用DROP OWNED BY删除角色拥有的对象,包括依赖对象。
方案可以被用于实施额外的对象权限检查层,但是方案权限不会覆盖包含在该方案中对象上设置的对象特权。
操作系统用户和文件系统
要防止网络入侵,系统管理员应该验证在组织内使用的口令足够强。下面的推荐可以强化口令:
- 最小口令强度推荐:至少9个字符。MD5口令应该为至少15个字符。
- 混合大小写字母。
- 混合字母和数字。
- 包括非字母数字字符。
- 选择一个用户可以记住的口令。
下面推荐了一些可以用来确定口令强度的口令破解软件。
- John The Ripper。 一种快速灵活的口令破解程序。它允许使用多个单词列表并且可以进行蛮力口令破解。该程序可以从http://www.openwall.com/john/得到。
- Crack。可能是最著名的口令破解软件,Crack也非常快,但是可能不如John The Ripper那么易用。该软件可以在 https://dropsafe.crypticide.com/alecm/software/crack/c50-faq.html得到。
整个系统的安全性依赖于root口令的强度。该口令应该至少长达12个字符并且包括大写字母、小写字母、特殊字符和数字的组合。它不能基于任何词典中的词。
应该配置口令过期参数。
确保下面的行存在于文件/etc/libuser.conf的[import]小节中。
login_defs = /etc/login.defs
确保在[userdefaults]小节中没有以下列文本开头的行,因为这些词会覆盖来自/etc/login.defs的设置:
- LU_SHADOWMAX
- LU_SHADOWMIN
- LU_SHADOWWARNING
确保下面的命令不会产生输出。通过这一命令列出的任何账号都应该被锁定。
grep "^+:" /etc/passwd /etc/shadow /etc/group
注意:我们强烈推荐客户在初始设置后更改他们的口令。
cd /etc
chown root:root passwd shadow group gshadow
chmod 644 passwd group
chmod 400 shadow gshadow
找出所有全域可写的文件以及没有设置其粘滞位的文件。
find / -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print
为前一个命令结果中的所有目录设置其粘滞位(# chmod +t {dir})。
找出所有全域可写的文件并且修正每一个被列出的文件。
find / -xdev -type f -perm -0002 -print
为前述命令给出的所有文件设置正确的权限(# chmod o-w {file})。
找出所有不属于有效用户或组的文件,然后为它们分配一个拥有者或者移除文件。
find / -xdev \( -nouser -o -nogroup \) -print
找出所有全域可写的目录并且确认它们属于root或者某个系统账户(假定只有系统账户的用户ID低于500)。如果该命令生成输出,验证其分配是否正确或者将它们重新分配给root。
find / -xdev -type d -perm -0002 -uid +500 -print
口令质量、口令过期策略、口令重用、口令重试尝试以及更多认证设置可以通过可插拔认证模块(PAM)框架配置。PAM在目录/etc/pam.d中查找应用相关的配置信息。运行authconfig或者system-config-authentication将重写PAM配置文件,这会毁掉任何手工更改并且将它们替换为系统默认配置。
默认的PAM模块pam_cracklib提供了口令的强度检查。要配置pam_cracklib以要求至少一个大写字符、小写字符、数字和特殊字符(U.S.国防部指导方针推荐),可编辑文件/etc/pam.d/system-auth并且在对应于口令前置条件pam_cracklib.so try_first_pass的行中包括下列参数。
retry=3:
dcredit=-1. Require at least one digit
ucredit=-1. Require at least one upper case character
ocredit=-1. Require at least one special character
lcredit=-1. Require at least one lower case character
minlen-14. Require a minimum password length of 14.
例如:
password required pam_cracklib.so try_first_pass retry=3\minlen=14 dcredit=-1 ucredit=-1 ocredit=-1 lcredit=-1
可以设置这些参数来反映用户的安全性策略需求。注意口令限制不适用于root口令。
PAM模块pam_tally2提供了在指定失次数的败登录尝试之后锁住用户账户的功能。要实施口令封锁,可编辑文件/etc/pam.d/system-auth来包括下列行:
第一个认证行应该包括:
auth required pam_tally2.so deny=5 onerr=fail unlock_time=900
第一个账户行应该包括:
account required pam_tally2.so
这里,deny参数被设置以限制重试次数为5并且unlock_time已经被设置为900秒来保持账户在被解锁前锁定900秒。请配置这些参数以反映用户的安全性策略需求。被锁定的账户可以用pam_tally2工具手工解锁:
/sbin/pam_tally2 --user {username} -reset
用户可以使用PAM限制重用最近用过的口令。可以设置pam_ unix模块的remember选项来记住最近的口令并且阻止重用它们。要做到这一点,可在/etc/pam.d/system-auth中编辑适当的行来包括remember选项。
例如:
password sufficient pam_unix.so [ … existing_options …]
remember=5
用户可以设置要记住的历史口令的数量以正确地反映其安全性策略需求。
cd /etc
chown root:root passwd shadow group gshadow
chmod 644 passwd group
chmod 400 shadow gshadow
Parent topic: 安全性配置指南