程序员与黑客

记录自余弦在qcon上的演讲

程序员与黑客(1)

防御就是提高攻击的成本

架构

思想一:黑客思维应该贯穿整个公司的业务[..->架构->研发->运维->..](理想状态技术团队每个人都有黑客思维)

思想二:优美的架构一定是健壮的

  1. 想象下生态系统

  2. 有漏洞/被黑很正常

  3. 快速自愈是关键

思想三:优美的架构一定是处处优美的(金刚狼)

...
文档(小注释,大系统,接替)
代码(代码龊漏洞也多)
逻辑(逻辑不能混乱)
人->团队(人是万恶之源)

思想四:安全的本质是信任(信任能)
[紧內聚,松耦合]设计思想
紧內聚->最小单元->一段逻辑代码(不是函数)
松耦合->分离->不信任任何输入
关键词:单元,分离

理解透了单元,才能知道分离的艺术(对象,各个属性,方法)

漏洞产生的本质
黑客通过输入[提交特殊数据],特殊数据在数据流的每个单元处理,如果某个单元没处理好,在单元输出的时候,就会出现单元的安全问题

例子:

  1. 操作系统层的单元,特殊数据当指令执行 ;rm -rf;

  2. 储存层,数据库SQL解析引擎把特殊数据当指令执行, 'union select user, pwd, 1, 2, from users--'

  3. web容器层如nginx单元没处理好,可能产生远程溢出,DoS等安全问题

架构思想

分离的艺术

人员职权的分离

  1. 人是万恶之源

每个角色的职权应该清晰

  1. 保证[生态系统]可以稳定运行的基础上,尽可能限制目标角色的权限

  2. 小心内鬼或被内鬼

  3. 服务器的分离

研发与线上服务器分离

杜绝在线上调试

  1. 杜绝把不成熟的代码发布到线上

  2. 线上服务器各司其职

按业务分离

主站,子站等业务不一样
  1. 按服务器类型分离
web、数据库、缓存

例子:MYSQL数据库的分离:

  1. 配置绑定IP,10.1.1.10, 127.0.0.1, 0.0.0.0

  2. 最小单元原则,数据库授权we访问

  3. 杜绝infile/outfile等特殊权限的可能性(load data infile "/etc/pass' into table foo;select * from foo into outfile "...")

  4. 写恶意代码在web可执行目录下,是常见的

  5. web与数据库服务器分离了会更好

  6. 帐号权限分离
    *帐号权限和认证授权模型的关系

认证和授权的关系?

认证(1/0)授权(rwx)
  1. 认证方式
密码、公私匙、两次认证

认证授权部署一定要全面

  1. 如何安全登陆linux服务器

禁止密码的方式登陆

  1. 私钥文件丢了怎么办
私钥本身可以设置密码可以放在安全的加密磁盘(truecrypy)
  1. 人员离职要及时和删除公钥

  2. 服务器实在太关键:vpn到内网

  3. 文件目录分离

文件目录设计关键

命名风格要求

命名风格乱七八糟患处是看到也难意识到
  1. 目录各司其职&RWX权限分配好(能R就坚决不给WX)

  2. 代码分离

代码设计的关键

命名风格

  1. 紧內聚、松耦合(系统、包、文件、类、函数、逻辑代码)

  2. 线上不应该出现svn/git权限

  3. 能提交遍以后的文件就提交遍以后的(php config 配置)

  4. Cookie分离

  Cookie name(一看就要悲剧的isLogin)

Cookie value hack
和身份认证有关系的值是不是可以被预测
是否可以被获取

  1. Cookie domain hack
    HTTPS协议的wx.qq.com Cookie设置到.qq.com
    关键Cookie: wxuin,wxsid
    任意子域出现XSS都可以拿到这个Cookie

  2. Cookie path hack

没的防
  1. Cookie expires hack
过期时间,用户体验和安全做个平衡永不过起或过期算法有问题(会永久劫持)
  1. Cookie httponly hack
Cookie有这个信息就不能被Js获取bypass方式 如 phpinfo()信息,部署不完备
  1. Cookie secure hack
强制https传输,bypass方式 部署不完备
  1. 子域分离

子域设计的关键

不同业务放到不同子域下

  1. 松耦合的公共模块可以考虑放在其他域名下(参考google)
 击破方式

proxy.html很多网站为了夸域方便就设置 document.domain='foo.com',设置后就可以跨子域

  1. crossdomain.xml文件,可以通过flash文件夸域获取

技术选型

第三方内容
前端框架
web应用
开发框架
语言
web容器
存储
操作系统

  1. 任何组件都有漏洞

越流行的开元组件越靠谱

  1. 越靠谱的团队打造的组件越靠谱

  2. 时刻做好被黑个头的准备

优美的架构重要性

  1. 分离设计大大提高入侵门槛

  2. 快速应急->快速自愈

千里之堤溃于蚁穴

  1. 程序员用不靠谱的组件、工具

模块/代码直接copy自不靠谱的地方

  1. 研发、运维工具下载自不靠谱的地方

  2. 升级中心的相关程序被植入后门

用靠谱的源

  1. 正确的md5校验(md5文件也可能被篡改)

  2. 绝大多数情况比较无奈

  3. 高保密机构不允许轻易升级

  4. 不要放在github上

  5. 邮箱hack

安全过程

  1. 黑客思维要贯穿(意识有限,经验培养)

  2. 优美的架构(少bug更少漏洞)

  3. 透彻理解:安全本质是信任(单元与分离重要性)

  4. 部署全面(否则形同虚设)

  5. 定期备份(出问题快速deff排查)

  6. code review

  7. 响应争分夺秒(黄金24)

  8. 专业团队把脉

  9. 安全辅助工具

类型
工具清单

日志分析
splunk, logcheck, logwatch

入侵检测/防御
snort, iptables, ipfw, fail2ban, portsentry, tripwire, ossec

后面检测
rkhunter, chkrootkit, lynis

流量监控
nagios, cacti, zabbix

环境隔离
chroot

web抗D/CC
jiasule.com

关键字:安全

版权声明

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部