本文以我亲身经历 PCI 认证告诉你们国外的安全公司和安全标准是多么严格和苛刻,办事多么认真负责。
很多年前,我在国外搭建过站内支付, 也是第一次被要求需要通过 PCI compliance。当时我本来以为自己这点安全知识背景,我的网站应该没有啥大问题, 结果第一次扫描就出了 17 个问题,包括 apache,mysql 的版本过低,用了不安全的第三方 webmail——horde, 没有屏蔽不安全的 SSL2。 此外还有若干 XSS 以及 error handling 的问题,唯一幸运的就是没有发现 SQL injection(只是未发现而已),否则就颜面全失了。
PCI 严格之处在于随时更新,3 个月后你如果通过不了当时的 PCI 就会取消认证,让你回去折腾去。 如果不能通过 PCI compliance, 就不允许网站对接站内支付,要么跳转第三方支付页面,要么就是花钱购买专业公司的服务帮你通过认证。最麻烦的是,这 3 个月 PCI 也在升级,没准之前还好好的,下一个周期的时候因为市面上某个开源邮箱或者 FTP 产品出了漏洞,你就通不过验证了。
我的网站在 2011 年的时候碰到了一个非常大的问题,就是 PHP 核心代码加了 Zend Guard(我无法完美解密), 需要使用 zend optimizer, 但是此物不支持 PHP 5.3, 当时 PCI 认证刚好可以 PHP 5.2 的最新一个更新,但是我知道 5.2 很快就不能使用了。 于是我就不得不自己去重写整个核心,前后开发和调整折腾了将近 2 个月的时间,刚好赶上了最后一班车。
PCI 有很多细节,对于专业运维人士很容易,但是很多公司很容易忽略,就拿 SSLv2 来说吧。
sslv2 是很弱的,必须要禁止的东西,然而 PCI 对 sslv2 的潜在威胁搜查地是非常彻底的。
apache 的 httpd.conf 需要调整为
SSLProtocol -ALL +SSLv3 +TLSv1
SSLCipherSuiteALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2:!EXPORT
postfix 需要调整为:
smtpd_tls_protocols = SSLv3,TLSv1
smtpd_tls_ciphers = medium
smtpd_tls_exclude_ciphers = aNULL
smtpd_sasl_security_options =noplaintext
dovecot (IMAP) 需要改成:
ssl_cipher_list =ALL:-ADH:RC4+RSA:+HIGH:+MEDIUM:-LOW:-SSLv2:-EXP
这里-ADH 不能是 !ADH, -LOW 不加就通不过。
single sign on 配置要改:
ssl.cipher-list =―ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-
SHA:AES256-SHA:ADH-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES128-
SHA:AES128-SHA:KRB5-DES-CBC3-MD5:KRB5-DES-CBC3-SHA:ADH-DES-CBC3-
SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-
MD5:DHE-DSS-RC4-SHA:KRB5-RC4-MD5:KRB5-RC4-SHA:ADH-RC4-MD5:RC4-SHA:RC4-
MD5:RC2-CBC-MD5:RC4-MD5‖
ssl.use-sslv2 = ―disable‖
你以为这就完了? SSL2 还是冰山一角,我能回忆起来的就有 trace engine off, 默认账号的禁用等等。总之这是一种痛苦和折磨, 然而正因为这种折磨,让国外广大的用户至少可以看到安全行业同黑产做斗争的决心,而不是整天悲观地认为哪都不安全,心都凉透了。
厉哥出品
【微信号】mintshow
人生如戏,全靠演技。
游戏人生,行走江湖。