Shell's Home

Feb 7, 2014 - 1 minute read - Comments

长白山旅游——第一天

这次去长白山旅游,是坐春秋的航班,从上海经停大连到白山机场。照例,是没有航空餐供应的。 长白山这里离朝鲜很近(好像在朝鲜被称作白头山,是金家的诞生地),从飞机上看下去全是白茫茫的雪。白山机场很小,从停机坪下去就是一个小小的转盘。转盘出去就是机场了。 气温没有想像中那么可怕,即使是夜晚,穿一件衬衫,一件毛衣,一件大衣,身上一点都不冷。在室外只要注意细节保暖(耳朵,手指,各种穿戴中间露出的部分),其他都不是什么问题。 镇子上的东西价格参差不齐。山珍水饺,两盘水饺(12个一盘),两盘凉菜要价100。另一边的小吃街,水饺只有30上下,却有24个的量。价格基本差上一倍。我们要了份羊汤,20,份量不错,味道一般。 不过小吃街实在是坑爹了点,说是一条街,实际上这条街全是银行。小吃只有街口的两家店面,每家里面有四五个小摊位上面在卖各种吃的。人很少,人气不足。当然,也可能是夜晚的原因。 而且这里的餐厅都很奇怪。菜异常的少,或者菜谱异常简单(好像东北都是这个风格)。山珍饺子菜谱上只有两页,一页写着饺子一页写着酒,中间稀稀拉拉几个凉菜。好像除了本店主打你们只要喝酒就好了的样子。另一家黄上煌则是四五页,开头几页都是XX锅,后面几页把前面的锅拼起来,然后一页酒,最后推荐多人套餐(就是把拼锅打包了卖)。小吃到还可以理解,每个小吃摊位上都是几样东西,不会太多的。 往前走能看到一条雪道。夜间看到的雪道很吓人,30-45度的坡度,大约每80米一个弯。以我的水平就这么往下滑,有没有拐弯真是一个困难的选择呢。有拐弯的地方当场撞到送医,没拐弯的地方接着往下滚,到山下一团雪人去送医。 回来才发现,那是特级雪道。我们明天大概就是在滑雪场里面简单滑一下初级就得了。

Jan 28, 2014 - 1 minute read - Comments

google authenticator的特性

算法 双方预先共享一对密码。 时间对30秒求整,用密码unbase64后HMAC签署。 如果当前时间前后一定时间内(几个误差)的值和用户提供值一致,就验证通过。 攻击者获得了数个时间和序列对,但是根据HMAC特性,他无法反向出密码。 因此 gauth不需要联网。但是双方时间必须同步。 gauth的优势在于,即使有人可以获得一次密码(例如keylogger),只要不在1分30秒内登录,获得的输入就无法使用。 对于可以取得gauth共享密码的人,gauth不能提供安全性加强。例如sudo,验证的是自己的身份。而用户密码只要登录即可读,因此没有提供加强的安全性。 对于ssh,在登录后也可以获得密码。因此只要给别人获得了一次登录权限,后续gauth不能保护你。反之,如果能保证对方一次登录都不会成功,则可以作为辅助。因此用于ssh上必须加上一个token只能使用一次,以确保对方获得了token也是作废的。 如果有人可以从手机中读取应用的信息,就可以一直冒充用户。因此越狱和root肯定会降低系统安全性。这就是为什么很多TOTP使用硬件来做这个事情。系统单纯,而且没有读取API。 缓慢的重试,每次命中概率都是1/1000000。持续试1000000次,也不能肯定猜中。实际上只有63.2%的概率猜中。如果30秒内连续重试1000000次,肯定破解了。合每秒重试3万多次,不算多。所以必须防止暴力破解。 如果没有紧急密码,安全性大约是20bit。但是数个紧急密码为破解提供了帮助。因此紧急密码一般是7位数字,综合复杂度一般评估为20bit上下。 以复杂度而言,不足以作为身份验证工具,只能作为身份验证辅助。所以gauth叫做two-factor-authentication。

Jan 24, 2014 - 2 minute read - Comments

openvpn auth with google authentication

client config # base config client dev tun proto udp remote 192.168.1.122 1194 nobind user nobody group nogroup persist-key persist-tun mute-replay-warnings comp-lzo # authentication config ca ca.crt cert shell.crt key shell.key ns-cert-type server tls-auth ta.key 1 auth-user-pass Group should be nogroup, not nobody in debian. auth-user-pass is needed for google auth. pam config account [success=2 new_authtok_reqd=done default=ignore] pam_unix.so account [success=1 new_authtok_reqd=done default=ignore] pam_winbind.so account requisite pam_deny.so account required pam_permit.

Jan 23, 2014 - 7 minute read - Comments

lxc和virtualbox和物理机的简单性能测试和对比

说明 测试各种虚拟化系统下的虚拟机性能。 测试使用sysbench。 CPU采用如下指令测试。 sysbench --test=cpu --num-threads=2 --cpu-max-prime=50000 run 文件IO采用如下指令测试。 sysbench --test=fileio --file-total-size=10G prepare sysbench --test=fileio --file-total-size=10G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run 内存采用如下指令测试。 sysbench --test=memory --num-threads=2 --memory-access-mode=seq run sysbench --test=memory --num-threads=2 --memory-access-mode=rnd run 线程采用如下指令。 sysbench --test=threads --num-threads=2 run sysbench --test=mutex --num-threads=2 --mutex-locks=1000000 run 裸硬盘测试采用如下指令。 hdparm -tT <dev> 物理机上有三个文件系统,ext4/xfs/btrfs,前两者仅做fileio测试以对比性能。 另外做两个特殊文件系统对比,aufs带复制和aufs无复制。前者在只读层上准备好测试文件,而后进行随机读写测试。其中就附带了文件复制开销。后者在aufs建立后初始化测试文件,因此消除了文件复制开销。 所有测试都是测试数次,取最高者(因为低者可能受到各种干扰)。一般是2-3次。 物理机是一台DELL Intel 64位桌面系统,支持硬件虚拟化,有4G内存。系统采用debian jessie,测试于2014年1月17日-20日执行,内核3.12.6-2 (2013-12-29) x86_64。 虚拟机lxc是使用lxc切分的一台虚拟机,没有做资源限制。 虚拟机vbox是使用virtualbox切分的一台虚拟机,分配了所有CPU,打开了硬件虚拟化,分配了1G内存。 文件系统 ext4 Operations performed: 21311 Read, 14207 Write, 45440 Other = 80958 Total Read 332.

Jan 22, 2014 - 1 minute read - Comments

在PAM中使用google authentication

PAM是linux系统身份验证的核心,在用户登录/ssh身份校验中均有很大用途。但是很少有人想到,其实这个东西还可以用google authentication来进行身份校验。 安装 sudo apt-get install libpam-google-authenticator 设定 使用前,需要对用户做一个用户级配置,生成配置文件。这个文件就是这个用户的身份验证凭证。配置请使用用户执行google-authenticator。 上来先会问你是否使用基于时间的验证,肯定选是。但是注意,基于时间的验证要求服务器时间必须精确。更准确的说,是服务器时间和手机时间校准在30秒以内。由于手机一般都采用GSM校时,因此只需要在意服务器时间。建议是使用ntpdate来校准时间。特别注意,linux的时钟是会漂移的,必须按天级校准。 然后程序会给出一个url,还可能有QR码(真够不容易的,Console级别的QR码。。。)。记住,一定要用url去获得QR码给程序扫描。因为url获得的QR码算法是最新的,而直接生成的有可能不能跑。 下面是secret key和verification code,一般来说这两个不用关心。但是你需要记住emergency scratch codes。libpam-google-authenticator默认给你生成了5个,一般都够用了。通常用到3个就更新一遍吧。 是否生成配置,选是。 是否拒绝使用同一个token的人登录。如果选是,30秒内只能登录一个人。建议选是。 是否放送时间验证,从1分30秒到4分钟。如果选是,允许更大的服务器时间偏差。看你服务器时间是不是够准。 是否防止暴力破解,30秒内尝试不超过3次。建议选是。 OK,你的配置就完成了。如果有多个用户,请多次配置。 手机app 按照系统安装以下app,下面以android版为例介绍。 Google Authenticator Android Google Authenticator iOS Authenticator for Windows Phone Blackbarry 选择setup account,然后scan a barcode。程序会要求你使用barcode扫描软件扫描(推荐barcode scanner)。这时去扫描设定一节中访问url显示的那个qr码。 pam配置 对于ssh而言,请在/etc/pam.d/sshd的最后一行增加这句。 auth required pam_google_authenticator.so 注意,这样其实是密码/校验码双重验证。如果你不需要密码请注释掉下面这句。 @include common-auth 或者其他包含以下这句的地方。 auth required pam_permit.so 如果你希望增强sudo安全性,也可以把这句加入/etc/pam.d/sudo后面。如果同样不需要密码,请注释上面那句。 sshd配置 保证/etc/ssh/sshd_config里面,以下参数都处于正确的配置。 ChallengeResponseAuthentication yes PasswordAuthentication no UsePAM yes 如果你使用openssh6.

Jan 15, 2014 - 2 minute read - Comments

golang和nginx的简单性能对比

说明 测试都是ab做的,中等并发量,统一采用10000并发,100000个请求。都是本机请求本机,避免公司内网IDS的干扰。 机器是一台双核CPU的DELL:Intel® Pentium® CPU G2030 @ 3.00GHz。配4G内存。 第一组数据是ab测试nginx,nginx的配置如下: worker_processes 4; pid /run/nginx.pid; worker_rlimit_nofile 30000; events { worker_connections 20000; multi_accept on; } http { sendfile on; tcp_nopush on; tcp_nodelay on; ... } 第二组是ab测试golang,返回固定是个OK。 第三组是ab测试golang,返回某个目录或文件。 err := http.ListenAndServe(":8080", http.FileServer(http.Dir("/home/shell/photo"))) nginx Concurrency Level: 10000 Time taken for tests: 5.720 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Total transferred: 172100000 bytes HTML transferred: 160000000 bytes Requests per second: 17482.

Jan 2, 2014 - 1 minute read - Comments

lxc简单介绍

基本安装 安装lxc包。 注意修改/bin/sh,链接到/bin/bash。lxc在某些版本上有一个bug,声明为/bin/sh却使用bash语法,导致不如此链接会出现错误。 lxc on debian wiki 镜像和设定 使用lxc-create -n name -t template生成镜像。 在/usr/share/lxc/templates可以看到可用的模板。 在/var/cache/lxc/debian会缓存生成过程的临时文件。 生成的镜像需要在镜像内安装lxc,否则无法使用lxc-execute。 资源限制 在config文件内,写入cgroup限定规则。注意,使用内存限定的话,需要在内核参数中加入cgroup_enable=memory。 在debian下,可以修改/etc/default/grub文件,使用update-grub重新生成规则。 GRUB_CMDLINE_LINUX_DEFAULT="cgroup_enable=memory quiet" 在config文件中可以如下限定。 lxc.cgroup.memory.limit_in_bytes = 512M # 限定内存 lxc.cgroup.cpuset.cpus = 0 # 限定可以使用的核 lxc.cgroup.blkio.throttle.read_bps_device = 8:0 100 # 读取速率限定 lxc.cgroup.blkio.throttle.write_bps_device = 8:0 100 # 写入速率限定 lxc.cgroup.blkio.throttle.read_iops_device = 8:0 100 # 读取频率限定 lxc.cgroup.blkio.throttle.write_iops_device = 8:0 100 # 写入频率限定 cgroups blkio-controller cpusets memory 执行 lxc-start -n name /bin/echo hello 还可以用以下指令,在已经启动的container里执行进程。

Dec 30, 2013 - 1 minute read - Comments

一个神奇的故事——为什么程序能够工作

故事的原因 今天被一个妹子问到一个专业问题。每天看你们在写程序,为什么你们写一些东西,就会出现很多神奇的功能。 好吧,这是很多“外行”很难理解的问题。大多数职业非职业程序员,只要写过一点程序,就不会对这种事情表示惊奇。然而问题是,很多人并没有深刻的认识到,这个问题其实非常难解答,可以算是计算机本质性问题之一。 我当时的解答有点奇怪和玄幻色彩。我打了个比方,例如你有个萝卜头,你扇它一下,它会往前蹦一下。你又有个电灯,按一下开关就亮,按一下开关就灭。那么你把两者组装起来,在旁边立个牌子,扇一下萝卜头灯就亮,再扇一下就灭。事情看起来就很神奇了。至于萝卜头为什么会这么做,这个事情我并不了解。 实际上,这个回答很让人莫名其妙。什么萝卜头和奇怪的世界观阿,这不是在讲程序吧。好吧,我把整个故事讲的稍微完整一点。作为对所有有这个问题的人的解答。 原型 在讲整个故事前,让我们稍微的放开一点想象力。例如我们有一个老鼠,一盒一碰就会掉下奶酪的奶酪盒,一个转笼(就是老鼠经常在里面跑的那种),一个小的皮带环,一个风扇,一个导轨,就是扔个铁球,就能沿着导轨滚动的那种。 我们把转笼和风扇用皮带环连接起来,然后里面放上白老鼠,上面放上奶酪盒,旁边放一个导轨,然后用黑盒子罩住,旁边放一张纸。这是一个神奇的设备,当你向里面投入一块钱,就会有风吹出来。因为钱沿着导轨滚下来,会碰到奶酪盒。老鼠就会开始跑,带动风扇吹出风来。 好像很神奇的样子哎,投币式风扇。 哎哎等等,你弄了那么复杂的一堆东西,就是为了吹风扇?那为什么不用电风扇呢? 其实我们的老鼠盒子和电风扇具有一样的结构。老鼠是动力源,奶酪盒是开关,皮带环是传动系统,风扇负责执行。我们只要正确的将每个具备功能的部件组合起来,就可以产生奇妙的效果。至于每个部件为什么能达到他自己的功能,这个我们并不关心。设计部件的人会为我们做出合适的实现。 同样的组合,如果是电扇,我想大部分人都不会表示不理解。然而如果换成老鼠盒子,大家就会觉得很神奇,如果换成程序,就会觉得更神奇了。 其实程序和老鼠盒子非常类似。程序的每个部件都有自己独特的功能,我们只要负责将这些部件以合适的逻辑连接起来,就可以完成新的功能。当然,如何连接部件是一个非常有技术含量的问题,需要专门的培训。 然而,程序比老鼠盒子更加复杂,更加让人觉得神秘莫测的地方是。程序经常出现一些我们听不懂的东西。同样用老鼠盒子做比方,请想象一下以下事件: 不可往复 这个系统还没上线,就被产品经理吐槽了一把。这个系统的第一个问题,就是能开不能关。一旦老鼠开始跑,直到没有力气之前系统是不会停的,无论人在不在。为了修正这点,我们再弄了一个传送带,用皮带环和转笼连接。当老鼠跑上一分钟后,传送带就会把奶酪传送到老鼠面前,老鼠就会吃掉奶酪,从而停止奔跑。 白老鼠的不稳定性 系统终于上线了,不过有奇怪的问题。系统不知道为什么,有的时候工作有的时候不工作。 经过工程师的检测,这主要是老鼠会吃饱。一旦老鼠吃饱了,奶酪就失去了吸引力。因此每隔三四块奶酪就会停止工作。不过老鼠饿的很快。所以十分钟后又恢复了工作。所以表现就是不稳定。 工程师为了紧急修复这个问题,让每次掉出来的奶酪减小到了很小的尺度,大约是原来的三分之一。这样就算十分钟连续工作,也不会吃饱。 老鼠盒子的黑客事件 没多久,这个盒子碰到了黑客。有个人掀开盒子看了一眼,发现导轨只辨识撞击,不辨识是否是货币。因此出现了大量铁球替代硬币的事情,扔个铁球就开始吹风。市场部表示工程师需要紧急解决这个问题。 工程师巧妙的将轨道绕了几个弯,并减小了弯上的轨道宽度。如果投入物是硬币,那么他的重量和形状就会使得他正确的通过弯。而铁球或轻或重会从导轨上掉下去。从而解决了这个问题。 并发请求 很快,系统又遇到了一个问题。有人一次性的投入了两个硬币,因此击中了奶酪盒两次。老鼠只跑了一分钟就吃了两块奶酪。因此这个人又重复的连续投了多次货币。这导致老鼠吃饱了,因此盒子不工作了。客户大发雷霆,打电话到售后骂人,老板很生气。 工程师发现这是因为奶酪被连续放置的缘故。于是他们设计了一个连杆。当老鼠开始工作的时候,就会启动连杆,关闭投币口。这样就不会引起老鼠连续吃东西了。而老鼠停下的时候,连杆就会打开。就可以继续投币。 老鼠饿死了 经过了一个圣诞节,大家都不去玩老鼠盒子,老鼠饿死了,老板把运营骂了一顿。 运营乖乖去换了一只老鼠,并让工程师在盒子里装了一个摄像系统,可以让他们看到老鼠是否存在。 现状 现在我们有一个神奇的盒子,投币就可以吹风。这个盒子是由一个带着摄像系统的黑色外壳,一个盘旋的及其复杂的导轨,一个奶酪盒子,一个传送带,一个连杆,两组皮带环,一个转笼,一只老鼠,一个风扇组成。为什么会这样?一个妹子问。。。

Dec 3, 2013 - 1 minute read - Comments

KK行——第四日

第四天也是自由行动,总算能玩到一些好玩的了。 鉴于有些人已经去过加亚岛了,所以我们去的是另一个岛。上去后发现这里居然有降落伞,而且可以两人乘坐。上次去普吉岛的时候被鄙视太重,这次总拖的起来吧? 在海上坐降落伞其实是个非常不错的体验,你可以明显感到风的流动,并且看到海水从碧蓝到碧绿的变化。如果不会超重的话(不许笑),我下次打算体验一下热气球。 船老大还提供下水和不下水的选项。如果你有兴趣,他们会开的慢一点,让降落伞在水面擦过。然后就可以半截身子浸在水里。道哥和他老婆享受了一把这个待遇。整个水全溅起来,满头满脸。我当时没带泳裤,所以干脆的放弃了,还是在天上看看就好了。。。 降落伞的宣传价是100RM,但是讲一下价就到70RM左右了。剩下能谈到多少就看个人功力了。我们近20个人,拿到了65RM的价格。 回到岛上,换一批人出去被吊起来,剩下的人就去堆沙子和浮浅。实话说,KK作为浮浅来说比puhket和maldive差很多。鱼都是比较小的种类,而且密度比较稀疏。当然,珊瑚礁比puhket漂亮的多,而能见度也比maldive好。但是我没带泳装,而且背已经严重的晒伤了。所以还是没有下水。 当晚我们在酒店附属的酒吧里面呆到很晚,和台上的一帮国际友人唱歌玩,最后还送了人家两个牛小七。 最后是关于机场的重点。马来西亚禁止贝壳和珊瑚出口,所以如果被发现带贝壳或者珊瑚走的话,抱歉,重罚加没收。所以要带贝壳珊瑚什么的就别想了。至于海星之类的活物更没指望。原则上贝壳工艺品并不受限,但是必须在购买时索要凭证证明你是购买的,否则也不能放行。 而且他们的安检很奇怪。第一道口在办理登机的counter那里。国内出去的时候,我们只称托运重量。马来是称量所有物品,包括随身的。而春秋的额度又特别低,只有15。所以我们一帮人就紧急分配重量,谨防超标。我把公司的东西交给别人带,自己带自己东西。最后我上去的时候,能穿的都穿了,在热带穿的像只北极熊一样,还偷背着一只相机包。最后一称,16公斤。理论上一公斤45RM,合95RMB。不过还不错,没找我要。 第二道安检在过海关前,第三道在海关那里,不安检,只办理手续。在办理手续的时候,居然碰到了第一天来的时候碰到的两个妹子。和她们聊了一下。结果他们发现我们是公司出钱全包到这里来玩的时候,当场就称呼我们为土豪公司。后来我们的人就直接被叫做“土豪的同事”了。 下面就是他们安检比较奇怪的地方了。在候机厅进入另一个候机厅的时候,居然又安检一次。这次才夸张,水都不让带,必须喝光,要么留下。春秋又是不供水的。这个机场的政策让人怀疑春秋是不是买通他们了。还有这次贝壳在机场免税店里面购买了一个大贝壳(好像有点绕),结果在最后一道安检的时候被拦下。保安问我要购物凭证,我说没有,我就在你们机场里面买的。他先说不行。我说你可以打开看看。然后他打开一看——贴着一个标。当时后面有个人说这个标是我们机场的,我就被放行了。所以为了省麻烦,要买工艺品还是索要凭证的好。不过后面两个买了同样贝壳的人连开包都不用,估计是因为保安已经在我这里看到贝壳的形状了,所以后面的就没检。 后来我们讨论,安检这么严一定有什么事。前面两个妹子就说有两个游客在仙本那出事了,被人杀了。然后我就有点小庆幸,我们的运气还是不错的。

Dec 2, 2013 - 1 minute read - Comments

KK行——第二三日

第二天的行程是美人鱼岛,基本就是跟团运动。跑到美人鱼岛,浮浅一次,吃午饭,浮浅第二次,回去。 比较无语的是,第一次出发的时候,跑到海里才发现少了两个妹子。回去一看这俩换衣服比较慢,硬生生没赶上第一次浮浅。第二次我好歹跟着,结果一个不靠谱的给我们指到另一个船上去了。我们三个带着N贵的水下相机,只有三个人在那里浮浅。。。 所以团队出门注意随时数人,个人注意紧跟领队。否则后果很严重。 需要特别注明的是(虽然第二次说这个了),这里的深潜,需要提前预约,和泰国不一样。 第三天的行程是看长鼻猴和萤火虫,实话说很一般。因为长鼻猴距离比较远,拿着望远镜也看不清楚。这毕竟是野外,不是动物园,不能追求最好的展示效果。而萤火虫——去,初中的时候门口一大片的全是萤火虫,见太多就没感觉了。 第三天晚上我发现一个严重的问题——我的令吉严重的过多了。这次我为深潜保留了300-500RM。结果两次都没深潜成。现在这笔钱带不回去只能花掉。而且团里很多人都有类似的问题(虽然不完全是因为深潜)。所以,当晚某大陆游客团的疯狂购物传奇就开始了。 当晚我买了一堆榴莲酥(记得,生鲜水果不得上飞机),数盒红茶巧克力,还有几包咖啡。实际吃下来,榴莲酥和咖啡广受欢迎,严重不足。红茶巧克力反响一般。榴莲味咖啡则是被我当猎奇产品送了出去。好吧,幸好原来也是买着玩的。 要去的朋友可以多入榴莲酥。凯诚附近有家榴莲王,里面打工的妹子很不错。老板祖上是福建过去的,一口台湾腔。可以先试试他们的油炸冰冻榴莲,再买点新鲜的榴莲酥回来。 另外我又跑去做了个泰式按摩。按摩的妹子英文很奇怪,仔细一问原来是从泰国来打工的。我的右手大拇指原来有点摔伤,痛了很久了没法动。她拿精油推了一会,居然基本没事了。我顿时感到很惊奇,就问老板推拿的精油有没有在卖。老板说不好意思他们都是自用的,不卖的。很可惜。