Sichuanren's Blog

November 26, 2014

Node.js安全开发技巧

Filed under: Security — Tags: — sichuanren @ 3:23 pm
毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南。在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心。

1.避免使用Eval

Eval并不是唯一一个需要避免的函数,在后台,下面这几个表达式可以使用eval:

  • setInterval(String, 2)
  • setTimeout(String, 2)
  • new Function(String)

为什么要禁止使用eval?因为它会打开代码引起注入攻击,并且降低运行速度。2.请用严苛模式(Strict mode)

这种情况下,你可以使用一个受限制的JavaScript变量,它可以消除一些隐性错误并且会把这些错误抛出去。

3.Undeletable属性

  1. ‘use strict’;
  2. delete Object.prototype; // TypeError  

4.对象声明必须是独一无二的

  1. ‘use strict’;
  2. var obj = {
  3.     a: 1,
  4.     a: 2
  5. };
  6. // syntax error

5.Prohibits with

  1. var obj = { x: 17 };
  2. with (obj) // !!! syntax error  
  3. {
  4. }

你可以访问 MDN来获得这些隐性错误的完整列表。
6.测试

不用说,测试,测试,多点测试~

当然,不仅仅是单元测试,直戳测试金字塔

7.对sudo node app.js说再见

我看到很多人在运行拥有超级用户权限的Node APP,为什么?因为他们想让应用程序能够监听80或443端口。

这种做法是错误的。小心一个错误/bug进程就能降低整个系统,因为它已经拥有合法的凭证去做任何事情。

取而代之,你应该设置一个HTTP服务器/代理来转换请求,可以是nginx、Apache等等。

8.避免命令注入

看看下面这段代码有什么问题?

  1. child_process.exec(‘ls’function (err, data) {
  2.     console.log(data);
  3. });

child_process.exec调用去执行/bin/sh,所以,这是一个bash注射器,而不是一个程序启动器。

当用户输入的内容传递到这个方法中,就会产生问题——要么是一个\要么就是$(),攻击者很可能会注入一个新的命令。

开发人员可以使用child_process.execFile来解决此类问题。访问 LiftSecurity来查看如何处理命令注入。

9.临时文件

开发人员在创建文件时要特别注意,例如处理上传文件。这些文件很容易吃掉你所有的磁盘空间。

解决方法是使用Streams。

10.确保Web应用程序安全

这里不仅仅是针对Node——而是关于如何确保你的Web应用程序安全。

11.跨站脚本反射

当攻击者把代码注入到HTTP响应时,这种情况才会发生。应用程序在返回无效的输入到客户端时(大多数都是基于JavaScript编写的),应用程序很容易遭受这种类型攻击。攻击者可以盗取cookies、执行剪贴板和修改页面本身。

具体示例:

如果用户查询字符串在没有验证的情况下被发送回客户端,并且插入到DOM中,它便会执行。
如何预防:

  • 禁止插入不可信的数据到DOM中;
  • 在插入前进行HTML escape。

点击链接可以查看更多关于 跨站脚本反射解决之道

12.停止Cookie盗窃

默认情况下,在同一个域里,JavaScript可以读取cookies,在跨站脚本攻击里,这是非常危险的。不仅如此,任何第三方JavaScript库都可以读取它们。

示例:

  1. var cookies = document.cookie.split(‘; ‘);

如何预防:

开发者可以在cookies里面设置httponly标记,这样,JavaScript便无法接近cookie了。

13.内容安全策略(CSP)CSP(Content Security Policy)是一个额外添加的安全层,它有助于检测和减轻某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。

通过HTTP header中的Content-Security-Policy方法来启动CSP。

示例

  1. Content-Security-Policy: default-src ‘self’ *.mydomain.com

这样便会允许内容来自可信域或其子域。
点击查看更多有关 CSP示例

14.跨站请求伪造(CSRF)

CSRF(Cross-Site Request Forgery)是一种挟制终端用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

示例:

  1. <body onload=“document.forms[0].submit()”>
  2.   <form method=“POST” action=http://yoursite.com/user/delete&#8221;>
  3.     <input type=“hidden” name=“id” value=“123555.”>
  4.   </form>
  5. </body>

执行上面这段代码的后果就是轻易删除用户配置文件。
如何预防:

要想阻止CSRF,你应该实现同步令牌模式(Synchronizer Token Pattern),幸运地是,Node社区已经帮你完成了这件事。长话短说,一起来看看它的工作原理:

  • 当一个GET请求被服务检查为CSRF令牌——如果不存在,就创建一个;
  • 当用户输入显示时,确保要添加一个隐形的CSRF令牌值;
  • 当发送表单时,确保值是来自表单并且要与session相匹配。

行动

开发者应该有所行动,制作一个 Security Adventure车间来指导现实应用开发。

15.保护Express应用程序:Helmet

Helmet是一系列帮助增强Node之Express/Connect等Javascript Web应用安全的中间件。安全功能包括:

  • csp
  • crossdomain
  • xframe
  • xssfilter
  • 等等

有关Helmet更多内容,可以访问其托管地址: https://github.com/evilpacket/helmet

16.使用工具

  • npm shrinkwrap:该命令可以给一个包的所有依赖关系上锁,并且创建一个npm-shrinkwrap.json文件。更多详情可以访问 NPM
  • retire.js:retire.js是一个命令行扫描器,帮助你找到你应用中依赖库存在的漏洞。

如果你想了解更多关于Node安全方面的内容,你可以关注 Node Security 项目。他们的目标是审核NPM中的每一个模块,发现问题并修复问题。(张红月/编译)

英文来自: CODESHIP

Advertisements

November 25, 2014

互联网巨头奉献的十大开源安全工具,互联网安全必备知识

Filed under: Information — Tags: , — sichuanren @ 2:30 pm

Facebook等大型互联网公司推动的服务器与数据中心、大数据工具的开源化项目类似,当大型互联网公司们在超大规模基础设施运营方面面临的挑战 超出技术厂商的能力时,这些巨头就选择反客为主,成为创新技术的推动者和提供者。同样的情况也在信息安全领域中发生着。不少大型互联网公司经常会将自己开 发的顶级安全工具开源,推动整个互联网的安全发展。

本月早些时候安全牛曾介绍过Google开源的web安全测试工具Firing Range、Nogofail以及Facebook开源的Osquery等。

事实上不仅Google、Facebook,包括Netflix甚至Etsy.com这样的电商网站也都贡献过精品开源安全工具。

以下安全牛为大家汇总整理十大互联网巨头的开源安全工具,供大家收藏参考:

一、安全猴 Security Monkey

“安全猴”是Netflix三年前开发的一个安全工具,能够对亚马逊云服务的配置进行监控和安全分析,组件功能包括监控各种AWS账号组件,机遇规则的开发和执行活动,在审计规则被触发时通知用户,并存储配置历史信息用作电子取证和审计目的。

二、OSquery

OSquery是Facebook刚刚发布的一个安全工具,为安全专业人士提供了一个可调用底层操作系统功能的系统,例如启动进程、加载内核模块、在SQL数据库表中打开网络连接进行查询和监控等。

三、Skyline

Skyline是电商网站Etsy技术团队开发的一个类似Nagios的实时异常侦测系统,主要目的是为安全团队提供一个可扩展的被动监控指标体系——可以同时跟踪成百上千的指标。

四、MIDAS

MIDAS是Etsy与Facebook安全团队合作为Mac电脑开发的一个轻量级可扩展的入侵侦测系统。开发团队希望从MIDAS开始,企业开始留意OSX系统端点的常见攻击模式。

五、Secureheaders

Secureheaders是Twitter送给web开发者的一份大礼,作为一款web安全开发工具,Secureheaders能够自动实施安 全相关的header规则,包括内容安全政策(CSP),防止XSS、HSTS等攻击,防止火绵羊(Firesheep)攻击以及XFO点击劫持等。

六、Google Rapid Response

GRR(Google Rapid Response)是Google开发的一个时间响应框架,支持进行远程实时取证。Google将GRR以开源工具的方式与安全界分享,可以作为FireEye/Mandiant 的MIR事件响应平台的替代产品。

七、Scumblr和Sketchy

Scumblr和Sketchy是Netflix今年夏天同时发布的两款web应用,可以帮助安全团队监控和记录社交媒体和网络聊天中的安全威胁和攻击。

八、Conceal

Conceal是面向Android平台的一组简单的Java API,能够对SD卡等公共存储设备中的大文件进行快速加密和认证。Conceal由Facebook设计,开发者可利用Conceal开发出能适用于老版本Android的内存和处理器开销较低的加密算法。

九、Rappor

RAPPOR(Randomized Aggregatable Privacy-Preserving Ordinal Response )是Google上月才发布的隐私工具,能够从终端用户软件采集众包统计数据,同时又不侵犯用户隐私。

十、Moloch

Moloch由AOL的技术团队开发,是一个网络流量分析取证工具,能够大规模抓取IPv4数据包,进行索引并存储,可通过一个简单的web界面浏览、搜索和输出所有PCAP数据。

稿源:安全牛

November 24, 2014

Librato——监控&可视化云服务

Filed under: Uncategorized — sichuanren @ 9:56 pm

Librato是一个托管服务,用来管理和监控云端应用程序。用户无需安装或部署任何软件即可创建自定义dashboard,并且非常流畅。核心功能:

数据收集:集成了Heroku、AWS以及数十种收集代理(甚至包括Nest),以及纯语言绑定,Java、Clojure等;

自定义报表;
数据可视化;
自动通知功能。

独特之处:Librato几乎可以表现任何东西,并且把数据变得有意义。

起源:Librato创建于美国旧金山,由Fred van den Bosch,Joe Ruscio, Mike Heffner 和 Dan Stodin合作开发。

November 22, 2014

来自官方映像的 6 个 Dockerfile 技巧,实战出真知!

Filed under: Docker — sichuanren @ 2:24 am

前篇文章是关于Docker官方镜像的,本文将根据我从官方镜像学到的经验,讲解编写Dockerfile的技巧。
1. 选择Debian
官方镜像的大多数Dockerfile,不管是直接还是通过其他镜像,都是基于Debian的。Dockerfile版本通常跟特定的发行版挂钩,
正常是使用稳定版(wheezy),有些是测试版(jessie),还有是不稳定版(sid)。Debian镜像的主要好处是文件小,加起来才
85.1MB,而Ubuntu要200MB。指定准确的发行版可以预防一些问题,比如,即使标上latest的发行版升级了,构建也不会崩溃。

2. 确定来源
如果要用户信赖你的镜像,你就要考虑如果验证此镜像上的所有软件的真实性。如果通过apt-get方式从Debian的仓库获取,这个验证过程已经
被解决了。如果从网上下载文件,或者从第三方仓库安装软件,你就应该通过校验和、数字签名等方式验证这些文件。比如,为了验证nginx包,nginx的
Dockerfile会做如下操作:
RUN apt-key adv –keyserver pgp.mit.edu –recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
RUN echo “deb http://nginx.org/packages/mainline/debian/ wheezy nginx” >> /etc/apt/sources.list
ENV NGINX_VERSION 1.7.7-1~wheezy
RUN apt-get update && apt-get install -y nginx=${NGINX_VERSION}

注意nginx也是跟一个特定的版本关联的。这种做法可以保证,维护者测试的镜像跟构建工具构建的是相同的。但是,这个假设也不是绝对的,因为nginx本身的依赖也会随时间变化(比如有些依赖会标明>=某个版本)。
你自己也可以对下载的文件做相似的操作,计算文件校验和,然后跟本地版本(stored version)比较。这些操作都由Redis Dockerfile做过了。另外,有些下载的文件可能包含签名文件,你可以通过gpg来验证,通常这些操作都由官方镜像做过了。
不幸的是,一些官方镜像也没能定期正确地进行这些验证操作,或者只验证了部分文件,所以查看官方Dockerfile时要注意下。

3. 移除构建依赖
如果通过源码编译构建,你的镜像通常比需要的大很多。可能的话,在同一条RUN指令中,安装构建工具、构建软件,然后移除构建工具。虽然这样做又诡异又恼
人,但是可以省下几百MB空间。在不同的指令中删除文件是没有意义的,因为这些文件已经被打包进镜像了。我们看下Redis
Dockerfile是怎么做的:
RUN buildDeps=’gcc libc6-dev make’; \
set -x \
&& apt-get update && apt-get install -y $buildDeps –no-install-recommends \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir -p /usr/src/redis \
&& curl -sSL “$REDIS_DOWNLOAD_URL” -o redis.tar.gz \
&& echo “$REDIS_DOWNLOAD_SHA1 *redis.tar.gz” | sha1sum -c – \
&& tar -xzf redis.tar.gz -C /usr/src/redis –strip-components=1 \
&& rm redis.tar.gz \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& ln -s redis-server “$(dirname “$(which redis-server)”)/redis-sentinel” \
&& rm -r /usr/src/redis \
&& apt-get purge -y –auto-remove $buildDeps

gcc, libc和make在同一条指令中先被安装,使用,然后被删掉。另外注意下,作者还删除了不会被使用的tar.gz源文件夹。顺带提下,这些代码也演示了如何使用sha1sum来验证Redis下载文件的校验和。

4. 选择gosu
gosu实用工
具,通常用在ENTRYPOINT指令调用的脚本中,这些ENTRYPOINT指令位于官方镜像的Dockerfile中。它是个类sudo的简单工具,
接受并运行特定用户的特定指令。但是gosu可以避免sudo怪异恼人的TTY和信号转发(signal-forwarding)行为。
看下这篇编写入口点脚本的官方建议,大多数官方镜像都遵循该建议。

5. 选择buildpack-deps基础镜像
很多Docker的”language-stack”镜像都是基于 buildpack-deps 基
础镜像,该镜像包含了通常开发所必须的头文件和工具(比如源码管理工具)。如果你想构建一个language-stack镜像,使用这个基础镜像可以省下
不少时间。但是向镜像添加非必须的东西也遭受了很多批评,这导致了一些仓库,如Node提供了直接基于Debian的可选slim包(完整的Node镜像
有728MB,slim只有291.4MB)。但是记住用户可能需要某些开发库,同时也通过某种途径下载了基础镜像。

6. 使用描述性标签
所有的官方镜像都提供了很多标签。像latest标签一样,提供一个版本标签是种好做法,这样用户就不用担心基础镜像变更而破坏容器。官方镜像做了更多, 提供了上文提及的精简slim镜像,以及自动导入和编译的onbuild镜像。镜像打上onbuild标签,即使转移代码再编译,来新建子镜像,用户也不会太意外。

November 21, 2014

Teresa did a great job

Filed under: thinking — sichuanren @ 3:25 pm

While I reviewed the report from Ms. Argue I was kind of sad and hopeless. I thought about immediately what and how we should do. I knew we should do something differently and change, but not knew how or what.

Teresa managed her emotion much better and talked to Albert with him sitting side-by-side. They reviewed the key points together and tried to work out a plan. I am happy that Teresa dis a great job with patience and love to handle such a thing to Albert.

My workstation disk partition

Filed under: Uncategorized — sichuanren @ 3:15 pm

root@gliu:/# cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
# / was on /dev/sda3 during installation
UUID=9dae8120-6c67-4470-9755-478816da3ab7 / ext4 errors=remount-ro 0 1
# /boot was on /dev/sda1 during installation
UUID=0a640fc7-93b4-4ad6-9964-918b17add3eb /boot ext4 defaults 0 2
# /home was on /dev/sda4 during installation
UUID=664649f0-617a-4194-9012-d7b4afe40831 /home ext4 defaults 0 2
# /opt was on /dev/sdb1 during installation
UUID=97612e5b-e0fe-4bf8-b6e4-947aa4323af2 /opt ext4 defaults 0 2
# swap was on /dev/sda2 during installation
UUID=d006e3cb-44e5-4614-8973-221ca11cf2fb none swap sw 0 0
# /myraid was on /dev/md0
UUID=59fe4139-f47d-46bf-9455-c68e1f156dec /myraid ext4 defaults 0 2
fss02:/vol/vol09/sam /sam nfs defaults 0 0 3
fss02:/vol/vol08/spst /spst nfs defaults 0 0 3
tss01:/avengers/5620QA /avengers nfs defaults 0 0 3
fss05:/home10/genel /users/genel nfs defaults 0 0 3

Sichuanren's Blog

genel@gliu:/home$ sudo parted -l
Model: ATA WDC WD5000HHTZ-6 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number Start End Size File system Name Flags
1 1049kB 300MB 299MB ext4
2 300MB 32.3GB 32.0GB linux-swap(v1)
3 32.3GB 132GB 100GB ext4
4 132GB 300GB 168GB ext4
5 300GB 500GB 200GB ext4

Model: ATA WDC WD5000HHTZ-6 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos

Number Start End Size Type File system Flags
1 1049kB 300GB 300GB primary ext4
2 300GB 500GB 200GB primary ext4

Model: Linux Software RAID Array (md)
Disk /dev/md0: 200GB
Sector size (logical/physical): 512B/4096B
Partition Table: loop

Number Start End Size File system Flags
1 0.00B 200GB 200GB ext4

View original post

github-cheat-sheet

Filed under: git, github — sichuanren @ 2:28 pm

github-cheat-sheet-en

My workstation disk partition

Filed under: Uncategorized — sichuanren @ 1:53 pm

genel@gliu:/home$ sudo parted -l
Model: ATA WDC WD5000HHTZ-6 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number Start End Size File system Name Flags
1 1049kB 300MB 299MB ext4
2 300MB 32.3GB 32.0GB linux-swap(v1)
3 32.3GB 132GB 100GB ext4
4 132GB 300GB 168GB ext4
5 300GB 500GB 200GB ext4

Model: ATA WDC WD5000HHTZ-6 (scsi)
Disk /dev/sdb: 500GB
Sector size (logical/physical): 512B/4096B
Partition Table: msdos

Number Start End Size Type File system Flags
1 1049kB 300GB 300GB primary ext4
2 300GB 500GB 200GB primary ext4

Model: Linux Software RAID Array (md)
Disk /dev/md0: 200GB
Sector size (logical/physical): 512B/4096B
Partition Table: loop

Number Start End Size File system Flags
1 0.00B 200GB 200GB ext4

November 20, 2014

Compress vmdk image for virtualbox

Filed under: Cloud, Virtualization — sichuanren @ 8:28 pm

We have a need to reuse qcow2 image for VirutalBox. With qemu-img convert we can get vmdk image but the size jump from 11G to 30G. Using vBoxManager tool option –compact (e.g., vdi) does not work. Also vBox boot the qcow2 image directly doesn’t work.

Solution: vmware-vdiskmanager -r /opt/vDisks/main1.vmdk -t 5 /opt/vDisks/main2.vmdk

Mozilla、思科和EFF将为网站免费提供SSL证书

Filed under: Information — sichuanren @ 12:12 am

Mozilla、思科、Akamai、IdenTrust、EFF和密歇根大学研究人员宣布了 Let’s Encrypt CA项目,计划为网站提供免费SSL证书,加速将Web从HTTP过渡到HTTPS。Let’s Encrypt CA项目计划从2015年夏天开始向任何需要加密证书的网站自动发行和管理免费证书。

部署HTTPS的最大障碍是HTTPS所需证书的复杂性、官僚主义和费用,Let’s Encrypt项目的目标是解决这些问题,将证书安装的时间减少到20到30秒。Let’s Encrypt CA将由非赢利组织Internet Security Research Group (ISRG)运营。

http://www.solidot.org/story?sid=41933

« Newer PostsOlder Posts »

Create a free website or blog at WordPress.com.