delphij's Chaos
选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……
简单记一笔,感谢 Stanford 的 数据库入门 课程课后作业 (有人在 StackOverflow提问)。复习一下。
应用场景:找出一家能制作全部30岁以上人士需要的Pizza种类的Pizza店。
在示范数据库中给出的四个关系:
Person(name, age, gender) // name is a key
Frequents(name, pizzeria) // [name,pizzeria] is a key
Eats(name, pizza) // [name,pizza] is a key
Serves(pizzeria, pizza, price) // [pizzeria,pizza] is a key
通过一些计算,我们可以得到两个投影:
投影 A:
Chicago Pizza | cheese | cheese
Chicago Pizza | cheese | supreme
Chicago Pizza | supreme | cheese
Chicago Pizza | supreme | supreme
Dominos | cheese | cheese
Dominos | cheese | supreme
投影 B:
Read more...比较感兴趣的项目是之前了解过但仔细看过的 FlashCache,这是 Facebook 搞的一个 SSD 加速模块,原理不复杂,是在文件系统下面做上一层集关联(set-associative)高速缓存,提供了LRU和FIFO两种淘汰方法。这次 Mohan Srinivasan 讲解的时候提到了以前公开发表的讲稿上没有的一个内容—-按线程id/线程组id去做的黑白名单,并对MySQL进行了修改,令其在扫描表时不做cache。从使用的角度,这个不失为一个不错的折衷方法。
第二个创意不错,使用压缩和 dedup 的方法在 1ms 延迟内做到 1:5 到 1:10 的数据缩减,从而实现低成本的 SSD 阵列。这个概念卖给愿意做虚拟化的企业是很好的,但是对其他应用可能就差点意思了,特别是数据安全唯一的保障是及时做远程复制,这个不太理想。不过,在存到 SSD 上之前先做排重或压缩来减少 I/O 数据量,假如能做到很好的压缩比,并控制 write clustering 令其尽量凑整而避免过量的擦写的话,确实能够极大地改善 SSD 的寿命。不过这个presentation主要是介绍产品,具体的技术介绍的不多。
另一个比较感兴趣的是 Cirrascale 的一个刀片设计,这个设计中在(竖直放置)1U厚度的刀片上放了12块硬盘(如果有导轨,可以热插拔!),并通过 SAS 交换机来连接,电源外置。刀片单元上下各一组工业风扇来散热。机箱设计的相当不错,充分考虑了散热问题。由于 SAS 可以做 multi-path,这个设计的可靠性应该是很好的。同时也极大地节省了空间,和 Dell 同类的刀片相比需要的空间是 7:27。
Read more...C语言和 UNIX 之父、K&R 的"R",Dennis Ritchie,于2011年10月12日在家中病逝。
Dennis Ritchie 在 Bell 实验室对 Ken Thompson 设计的 B 语言进行了扩展,并以此为基础设计了 C 语言。 C 语言与当时设计操作系统常用的汇编语言相比,提供了更好的可移植性,并成为了 UNIX 系统高可移植性的基础。Dennis Ritchie 做的这些工作是开创性的。这些工作使得我们能够使用包括数据结构、函数等高级语言特性的语言书写程序,并可以很容易地移植到不同类型的硬件上,同时又保持与为不同的硬件手工书写的汇编代码接近的性能。C++ 之父 Bjarne Stroustrup 对于 Ritchie 的工作如此评价:“They said it couldn’t be done, and he did it."。即使在 40 多年后的今天, C 仍然在从嵌入式设备到超级计算机在内的各种计算环境中广泛使用。
Read more...“UNIX is very simple, it just needs a genius to understand its simplicity.”
Google Authenticator 是一个 TOTP(基于时间的一次性口令)实现,它采用了 RFC 4226 算法。
Google Authenticator 与 RSA SecurID 非常类似。具体来说,它使用一个随机串和以整数表达的时间作为输入去计算 HOTP(算法是 HMAC-SHA-1),然后取输出的最后几位作为一次性口令。
虽然目前已经发现了一些 SHA-1 的弱点,但目前为止还没有公开的已知算法可以从 hash 值直接高效地反推出明文信息。另一方面, HOTP 只截取 hash 的最后几位,因此,攻击者在知道可能的明文信息之后,还必须获得足够多的 TOTP 时间和 hash 值才能够进行离线验证。
在现代 Unix 系统上,通常使用 PAM 来完成系统的验证工作。在 FreeBSD 上,可以通过 security/pam_google_authenticator 来安装 Google Authenticator 的 PAM 模块。这样就可以配置 sudo 来使用它做验证了。
在 /usr/local/etc/pam.d/sudo 中,auth部分预设是这样的:
auth include system
这表示采用系统内建的 ‘system’ 规则配置。我们在这后面加入强制使用 Google Authenticator 的配置:
auth required /usr/local/lib/pam_google_authenticator.so noskewadj
这里的 required 表示如果验证失败则认为整个验证链失败。
如果不需要用户重新输入口令,则可以用上面这行换掉include那行。
在 sudoers 中还需要配置使用口令。如果是 NOPASSWD,则系统会绕过 auth 这一部分。
需要注意的是,由于 sudo 是一个特权提升点,因此假如用可以被用户自行改动的文件作为访问控制机制,便会构成一个显然的安全漏洞。因此,对应的 Google Authenticator 配置应以 sudo 的目标用户的身份进行(此外还应在sudoers中配置 Defaults rootpw):
Read more...Steven Paul “Steve” Jobs (1955 - 2011) passed away peacefully today. There aren’t enough words to express all he contributed to this world.
Today, a shocking news have shaken the industry. Steve Jobs, a pioneer of our industry, after several years of struggling with cancer, passed away at 56. This marks a loss not only to Apple computer, but the whole industry, even Apple’s business rivals.
I want to quote his 2005 Commencement at Stanford:
Read more...鸡蛋不能放在同一个篮子里,特别是 DNS 服务器这样的鸡蛋……在没拿到AS之前,至少也应该做到跨ISP冗余才好。
Read more...Von Neumann体系结构的计算机系统的一项特点是使用内存来保存程序和数据。这种设计减少了制造计算机的成本,但是也带来了一个弱点:因为事实上程序也是一种数据,如果这些"数据"在运行时可写,程序便有可能修改其本身,而如果这一特性被误用,例如由于程序本身的设计缺陷,攻击者便可以利用它来执行攻击者希望的任何事情。
直观上,解决这个问题的方法是让应用程序可写的位置都不可执行,或者说,应用程序新写的数据,在获得更高权限实体核准之前(例如,这些实体可以验证这些数据是生成自可信来源的输入),不允许作为程序执行。
实践上,需要考虑的问题则比乍看起来要复杂的多。例如,在比较新的处理器上,在虚拟内存子系统可以实现在映射内存页时让 w 和 x 互斥(即可写的内存页就不可执行),来让攻击者利用缓冲区溢出问题,覆盖返回地址令进程跳转到其指定的地址时触发保护异常,但这种做法并不能阻止因为程序本身的设计缺陷导致这些数据被写盘,然后再被解释或执行的问题。举例来说,如果攻击者掌握两项安全弱点,一项是可以执行文件系统中任意位置的php脚本但不能指定任何参数,另一项是可以在临时目录中写一个扩展名为.jpg的文件,那么利用这两项漏洞就可以实现以Web应用的身份执行任意代码的目的了。对于某些每个月都会出现一个本地特权提升问题的操作系统而言,这很可能会带来更加灾难性的后果。通过umask的设置,以及对脚本路径进行限制,可以解决绝大多数情况下的这类问题,但并不总能解决问题—-对所有输入进行验证和检查,并尽可能限制 Web 应用,或其它与用户输入交互的组件的执行权限,仍然是非常必要的。
Read more...在与癌症斗争了 7 年之后,Steve Jobs 今天正式向 Apple 董事会辞去了 CEO 职务。
让我们用 Apple 1997 年的广告 Think Different 来怀念这位科技界的领袖和属于他的时代:
Here’s to the crazy ones. The misfits. The rebels. The troublemakers. The round pegs in the square holes. The ones who see things differently. They’re not fond of rules. And they have no respect for the status quo. You can quote them, disagree with them, glorify or vilify them. About the only thing you can’t do is ignore them. Because they change things. They push the human race forward. And while some may see them as the crazy ones, we see genius. Because the people who are crazy enough to think they can change the world, are the ones who do. - Apple Inc.
Read more...今天 BAFUG 活动, Luigi Rizzo (十年前提出DEVICE_POLLING概念的那哥们) 带来了他在 FreeBSD 上新实作的 netmap。
简单来说 netmap 实际上是提供了一种让用户程序以一致的接口直接访问网卡(收发包且zero copy)的方法。Luigi Rizzo 的测试中,用以 1050MHz 的单核,在很普通的万兆网卡上就可以轻松达到 14.8 Mpps 了,每个包的开销大约是90个时钟周期。
netmap 对网卡的驱动需要做少量修改,但基本都在30行以内。系统仍然可以"看到"用于netmap的网卡,这个接口暂时还不支持 kqueue(不过貌似暂时也没太大必要的说,毕竟一台机器不会有几千块网卡)。除了性能之外,netmap的设计还可以确保内核永远不崩,此外,现有的 libpcap 程序可以很容易地移植到 netmap 平台(取了一个路由平台做例子,使用 libpcap 兼容库可达到大约 70% 左右的 native API 性能;直接用 native API 的话,性能大约是经过优化的普通 libpcap+内核模块 的 Linux 环境的 4 倍)。
现在我自己想到的比较有用的用途是在用户态跑一个 TCP/IP 栈一类的应用—-当然,应用程序可以跟这个 TCP 栈捆在一起。到会的 C记,J记 以及某测试公司的同学提出了不少问题,其中关于 netmap 需要复制哪些内存,这个东西对他们的业务来来说,用途会更直接一些。
这个暂时还没进 -CURRENT。立刻可以想到的改进包括尽量省掉对页表的改动。应用方面似乎可以给 nginx 啥的直接做个 TCP 栈之类的?省掉了 socket 需要的开销,TCP方面可以做的事情就很多了,比如两台机器可以互相推 TCP 状态之类的来做 HA,等等。
Read more...之前一直没什么概念,今天看了微软的 KB 321169 的解释,大致如此:
不过感觉这个解释依然不是很有说服力—-文档上说,SMB服务器端是需要对 NT_TRANSACT_NOTIFY_CHANGE 给出回应的,那么这种情况下ACK不就回应回来了吗?或者说,只要收到了 ACK 就说明服务器端已经处理了这条 SMB?哪位帮忙理解一下?
Read more...