系统安全评审模式

1 是否针对金额,状态等核心参数进行严格的一致性核对

2 加解密方式是否合理,是否足够安全,key?md5?公私钥?

3 是否存在性能问题,容量评估如何,是否合理的使用了cache,是否选用了合理的网络通讯模型或者中间件

4 如果涉及多个服务间的调用,如何保障不同系统接口调用的一致性,出现差错事如何处理

5 接口是否支持重入,所有的敏感操作是否根据唯一的单来保障状态的变迁,是否存在多次处理的可能。

6 业务或者接口上是否存在防刷机制

7 如果涉及多个系统,是否有对账机制来保障系统间的一致性

8 服务或者接口是否有自我保护机制(超时,重连,告警,频率限制,自杀机制等)

9 服务是有状态还是无状态,是否存在单点问题

10 如果涉及事务,事务的顺序是否一致,是否存在死锁问题。亦需考虑频繁锁对系统性能的影响。

11 模块设计是否做到了快慢分离,核心非核心分离(比如交易和查询)

12 状态变迁是否严格校验(必须校验前置状态)。不同的CGI或者服务之间跳转时,如何保障不被人截断和篡改。

13 对于支付类服务,是否做到了接口的原子化。 对于查询类服务,是否做到了与帐号关系绑定,不能够查询到非登录帐号相关的讯息。

14 对于敏感的数据和接口,是否已做服务后置(后台服务,防火墙保护),是否已做了隔离(避免单一途径获取所有的资源,分而治之),是否形成互相制约的闭环。

15 系统的处理方式是否合理,批量?实时?是否对现有系统有所冲击。

16 新引入的数据库操作是否合理?是否使用了合适的索引?正确的条件?是否存在不合理的慢查询?

17 如何涉及web层,如CGI的参数传递,必须确保关键信息的防篡改型(加密或签名),严禁出现修改请求串就可以完成后台接口调用的CGI出现。敏感操作或交易接口必须加密。

18 web层的接口调用,如果涉及敏感操作,必须确保必要的安全措施是否已添加到关键路径,如风控调用,数字证书验证,甚至手机验证码验证。

19 加密的信息不能出现在任何的日志或SQL中,不能够依赖SQL进行加密。必须使用可靠的加密算法如RSA等。

20 涉及与外部系统的交互时,涉及唯一交易主体(卡号,协议号)就可以交易的,相当于无密。这种情况对这些信息必须加密,同时也必须具备防篡改机制。   及时被人篡改了,也必须有对账机制能够及时发现这个问题。

21 对于查询接口,敏感的讯息也必须加密,同时也必须进行强制一致性检查。不允许出现可以通过组串或者发包等方式,查询到非本人的或者非授权的讯息。

 

一个健壮高效的运营系统所应具备的潜质

1 健全有效的容量管理。

2 尽可能少的单点瓶颈,具备可分布扩展的能力。

3 系统无单点问题 (通过LVS,HA,切换脚本等方式做到无需人工介入)

4 简洁,有效的应用系统日志规范(有效监控的基石)。

5 立体化,有效的监控(业务纬度,接口纬度,数据层纬度,自身资源纬度)。

6 业务系统快慢分离,核心业务和非核心业务尽可能的解耦。重要业务之间也尽可能的解耦。

7 保持简短的关键路径(核心功能路径)。

8 具备异地容灾能力(同城/跨城),以及极端情况下数据最大程度的恢复能力和灾难下的业务可持续运营能力。

9 具备数据被恶意篡改后的发现及恢复能力(热备,温备,冷备)。

10 具备完善的容灾演练计划并落实。

11 具备安全有效的版本发布流程(审批和发布),版本一致性检查,以及健全的备份,回退能力。

12 具备独立,切实有效的审计机制。

公钥用来加密和验证签名,私钥用来签名和解密

非对称加密系统中,有两个密钥:一个是公钥,一个是私钥。公钥是可以向你的一组用户公开的一个密钥,其实就是一个大的素数。私钥只有你自己拥有,其他人不能盗取你的私钥。

私钥其实也是一个大的素数,公钥是拿来加密用的。比如,有某一个人想发信息给你,你通过安全途径给他公钥,他用公钥对他要发给你的信息进得加密运算,然后再通过网络发送加密后的密文给你,虽然有人能盗取这个密文,但他不知道私钥,他解不了密。而你则可以用私钥进行解密,私钥则是用来签名的。比如,你要发布一个公告,你就用你的私钥对公告进行加密运算,然后发布出去,而看公告的人则用公钥对公告进进行解密运算,如果可以解密,则证明该公告是你发出的,也就相当于验证了签名。

因此,公钥和私钥都有两个作用: 公钥用来加密和验证签名,私钥用来签名和解密。

innodb中,显式的使用begin(start transaction),DB所做的事情

在innodb中,如果显示的使用了begin(start transaction),这innodb会自动做一个件事情,就是设置临时”set autocommit=0″,当commit或者rollback之后,再回到到之前的autocomit模式。

这一点很重要,直接促使我们数据库操作时,需要注意的几个原则,特别是第2点

1 如果启用事务,可以不必显示的设置set autocommit=0,即使当时autocommit模式为1(直接提交模式),可以通过begin/commit来隐式的调用。当然,begin/commit 必须成对使用。不commit的话,事务是不会被提交的。

2 如果不想使用事务(某些情况下,单条很频繁的插入或者更新,为了提高效率,你可能会这么做),必须显示的调用 set autocommit=1,因为你无法却仍目前的连接的autocommit模式。特别是长连接,没准前一个程序,就设置了set
autocommit=0,如果想当然的认为Mysql是自动提交模式,就会造成更新失败,相当于事务没有提交。

3 使用某连接前先rollback。这样是保证为了避免哪个粗心的同事留下了一些未提交的事务。不先rollback,可能会出现误提交的情况。