1

记录自余弦在qcon上的演讲

程序员与黑客(1)

防御就是提高攻击的成本

架构

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

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

  1. 想象下生态系统

  2. 有漏洞/被黑很正常

  3. 快速自愈是关键

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

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

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

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

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

例子:

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

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

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

架构思想

分离的艺术

人员职权的分离
  1. 人是万恶之源

    • 每个角色的职权应该清晰

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

    • 小心内鬼或被内鬼

  2. 服务器的分离

    • 研发与线上服务器分离

      • 杜绝在线上调试

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

    • 线上服务器各司其职

      • 按业务分离

        主站,子站等业务不一样
      • 按服务器类型分离

        web、数据库、缓存

        例子:MYSQL数据库的分离:

      • 配置绑定IP,10.1.1.10, 127.0.0.1, 0.0.0.0

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

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

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

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

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

    • 认证和授权的关系?

      认证(1/0)
      授权(rwx)
    • 认证方式

      密码、公私匙、两次认证

      认证授权部署一定要全面

  • 如何安全登陆linux服务器

    • 禁止密码的方式登陆

    • 私钥文件丢了怎么办

      私钥本身可以设置密码
      可以放在安全的加密磁盘(truecrypy)
    • 人员离职要及时和删除公钥

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

  • 文件目录分离

    • 文件目录设计关键

      • 命名风格要求

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

  • 代码分离

    • 代码设计的关键

      • 命名风格

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

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

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

    • Cookie分离

        Cookie name(一看就要悲剧的isLogin)
      • Cookie value hack
        和身份认证有关系的值是不是可以被预测
        是否可以被获取

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

      • Cookie path hack

        没的防
      • Cookie expires hack

        过期时间,用户体验和安全做个平衡
        永不过起或过期算法有问题(会永久劫持)
      • Cookie httponly hack

        Cookie有这个信息就不能被Js获取
        bypass方式 如 phpinfo()信息,部署不完备
      • Cookie secure hack

        强制https传输,bypass方式 部署不完备
  • 子域分离

    • 子域设计的关键

      • 不同业务放到不同子域下

      • 松耦合的公共模块可以考虑放在其他域名下(参考google)

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

        • crossdomain.xml文件<allow-access-from domain="*"/>,可以通过flash文件夸域获取

  • 技术选型

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

    • 任何组件都有漏洞

      • 越流行的开元组件越靠谱

      • 越靠谱的团队打造的组件越靠谱

    • 时刻做好被黑个头的准备

      • 优美的架构重要性

      • 分离设计大大提高入侵门槛

      • 快速应急->快速自愈

    千里之堤溃于蚁穴

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

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

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

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

      • 用靠谱的源

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

      • 绝大多数情况比较无奈

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

    • 不要放在github上

    • 邮箱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

    coordinate35
    167 声望16 粉丝