delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
今天尝试了一下将 zpool 在线转换为 geli 加密卷,失败。这里记一笔。
想法是:将 zpool (RAIDZ)中的一块盘 offline,建立 GELI 卷,然后用新建的 GELI 卷来替换拿下来的盘。
失败原因主要是两点:首先,GELI 设备比其下的盘小 4kB (8个扇区)。这部分空间用来保存 GELI 的元数据。这样,替换后的设备要比原先的略小(之前曾经遇到过 SATA 硬盘不同批次尺寸不一样的情况)。另外,这个 zpool 在创建的时候使用的是 512 字节的扇区,而 GELI 的块尺寸是 4kB,因此会有问题。
如此看来,为了支持未来的扩展,需要做两件事:
第一个是毫不犹豫地"浪费"少量空间:预留适当的保留空间(如 1MB,甚至若干 GB 的交换区)可以避免在未来需要换盘时因为供货的问题导致出现困难。当然,如果是针对企业市场的硬盘,通常是可以避免这种情况发生的。不过需要注意的是,如果交换分区放在不同的硬盘上而不做任何冗余的话,也有可能会出现掉盘导致系统不稳定的问题。
第二个是应该尽量将卷做成按 4kB 对齐的,即使磁盘本身并不是 4kB 的。我个人的测试显示这样并不会导致性能下降,相反在许多情况下可以改善吞吐量。
Read more...早期的 FreeBSD 版本中采用的是 md5crypt,其作者 Poul Henning-Kamp 最近发表了一篇文章:Md5crypt Password scrambler is no longer considered safe by author,所以 FreeBSD 预设的密码格式也就随之改成了 SHA512 crypt。
不过其实这个意义也不是太大,因为这个版本(5000轮,16位salt=96bit)虽然慢的还算可以,可是计算机的速度还是在持续增长的。
前段时间找时间把 FreeBSDChina.org 的密码格式也换成 SHA512-crypt 了。目前采取的方法是用户登录的时候,如果验证通过,则用用户明文口令产生新的 SHA512-crypt 并刷回数据库(因为原先保存的是 hash 值)。这样,几个月后还可以把不活跃用户挑选出来一起砍掉。
Read more...今天看到有人问 GMail 为什么会显示一个黄色的三角符号(浏览器在 https 页面包含非 https 内容时的警告)。检查一下发现我的居然也是,心想 Google 大概应该不会干这么缺心眼的事,于是打开 Developer tools 检查,发现这个"不安全"的内容来自于 AdBlock,具体来说是插件在阻止广告时插入到页面中的内容。
AdBlock未必真的会做损害安全的事情,不过,这个让我想起之前在 Facebook 上看到的奇怪的广告,最后发现是安装的一个应用导致的,这个后果确实还是相当可怕的,除了浏览器本身之外,安装的插件也会影响安全,而这些东西做审计还是相当困难的,尤其是在 Chrome 中的自动更新特性,如果 Chrome Market 没有认真审核代码的话,还是相当危险的。
Read more...官方版本的 nginx 在 https 的时候是不对流量做压缩的,具体原因在这里 和 这里 有解释,它会增加半兆的连接内存开销。
启用 https 压缩除了需要 nginx 本身做少量修改(例如去掉 if
\[n\]def SSL_OP_NO_COMPRESSION 部分的语句块)之外,还需要 OpenSSL 本身编译了加密支持。FreeBSD ports 的 security/openssl 预设启用了 ZLIB 扩展,但基本系统目前没有(由于 zlib 是很大的一片代码,也许需要做了 Capsicum 处理之后才可以放进来用)。
启用 https 压缩通常并不会显著地减少带宽占用,因为多数情况下浏览器会与服务器协商将内容以 deflate 方式在放进 https 流之前做压缩处理。不过,启用压缩可以进一步减少 TLS 协议本身使用对称加密时可能发生的信息泄漏风险,其代价是引入 zlib 可能引入更多漏洞,以及每个连接增加大约 0.5MB 的内存占用。
Read more...多年不用 Mac 了,这没有 PgUp 和 PgDn 的死毛病还是没改。我觉得我真是没法接受没有 Page Up 和 Page Down 的键盘的。
当然,设计者关上一道窗的同时,往往又会在另外的地方开一扇门。Mac 上可以用组合键来模拟这些功能:
另外,由于 Terminal 对这两个键有另外的解释,需要在 Preferences 中重新定义它们的映射:
然后就虽不爽,但可用了。
Read more...祸不单行。继 老婆 笔记本坏掉之后,我的也在周一突然坏掉了。因为已经过保,找来 Dell 的维修手册做了初步诊断之后认为是主板问题,简单尝试了下没有修好,所以找老板商量,暂时买了一台 Asus G75VW 来用。
这是一款游戏用移动式PC。不兼容的状况包括:
我首先在预装的 Windows 系统中制作了一份恢复 DVD(共4张)。当然,如果不打算恢复 Windows 系统的话是可以跳过这一步的,升级 BIOS 可以通过 U 盘来完成。
用 LiveFS 安装 FreeBSD。由于 FreeBSD 目前还没有提供基于 EFI 的引导加载器(2012年的 Google SoC 项目有一个是关于 EFI 引导加载器 的),因此只能先破坏掉硬盘上现有的 GPT 分区。
gpart destroy -F ada0
dd if=/dev/zero of=/dev/ada0 bs=512 count=34
dd if=/dev/zero of=/dev/ada0 bs=512 oseek=/* LBA - 35 */ count=34
接下来的安装就和普通的 MBR 安装一样了。
目前知道的一些其他事项。
由于采用的是 Ivy Bridge 的 Core i7,因此可以用 AES-NI 来加速。向 GELI 卷写 1MB 的随机数块的速度可以稳定在 33MB/s;写 0 数据块的速度可以稳定在大约 60 MB/s。对于全加密的卷来说,第一次使用之前应该覆写一遍加密的随机数,而不是 0。(当然,这个架不住有人拿 $5 的扳手揍你到说出密码为止)(当然,其实根本没人 care 你的硬盘上存的是啥)。
Read more...时间过得真是太快了。最近这段时间, 乔帮主 2005 年 Stanford 毕业典礼演讲 里说的那段话一直让我觉得有如芒刺在背:
Your time is limited, so don't waste it living someone else's life.
Don't be trapped by dogma - which is living with the results of other
people's thinking. Don't let the noise of other's opinions drown out
your own inner voice. And most important, have the courage to follow
your heart and intuition. They somehow already know what you truly
want to become. Everything else is secondary.
来美帝快 6 年了, FreeBSDChina.org 也已经 10 周年了。我想,接下来的十年,我需要做一些新的事情,认识一些新的人,去一些新的地方,等等等等。所谓 Keep looking, don’t settle,这话说起来容易,做起来没那么容易,可是趁着年纪不算太大,还是要尽量去做。
Read more...计时攻击是一种通过观测由于某些操作时泄露出来的时间信息来获取更多信息的攻击。由于设计和实现的不同,攻击者能够通过计时得到的信息也会不一样。简而言之,作为安全系统的设计者,必须对可能泄露信息的各种渠道有充分的了解,并针对它们采取因应措施。
今天在和人讨论的时候想到一个例子,这里记下来。
为了阻止采用 GPU 穷举,我们可能会使用一些增加轮数的散列算法。一个设计不完善的登录系统的登录流程大致如下:
假定我们采用了一种够慢的算法来计算散列值,上述流程的问题便是,假如用户不存在,尽管攻击者观察到的提示是一样的"用户名或密码错误",但这个提示出现的时间可能会比用户存在时慢一些。这样,这个登录系统便透露了"用户不存在"这样的信息。
补救的办法是在用户不存在时,也根据同样的算法计算一下散列串,然后再提示"用户名或密码错误";还有一种办法是增加一个随机的延时。具体采用什么样的做法,要看具体的应用场景。
Read more...sh(1) 脚本中,` 和 $() 的作用类似。比如:
rm
find /foo/bar -ctime +3d -type f`` 【注1】
表示将 find 的输出结果作为rm的命令行输入。
常写 sh(1) 脚本的人可能会用另一个写法:
rm $(find /foo/bar -ctime +3d -type f)
这个写法和第一种是等价的。不过,$()的好处是可以嵌套。
个人比较倾向于使用 ` 而不是 $(),主要有三个原因:
【注1】FreeBSD系统中,此处实际可以用 find /foo/bar -ctime +3d -type f -delete
来代替。
常见的场景是由于某种原因 ls 无法使用(内存不足、动态连接库丢失等等)。
因为 shell 通常可以做 * 扩展,所以我们可以用:
echo *
来列出当前目录中的文件。
Read more...