OpenBSD: 黑客自筑城堡 写出号称最安全的UNIX
当Windows不停升级仍无法抵御黑客、病毒与垃圾邮件,一个加拿大黑客率领60人做出了世界上最安全的操作系统,而且它是免费的。10年前,希欧·德若特(Theo De Raadt)陷入了人生的最低谷,至少在别人看来是这样。他当时没有一份正式的工作,并且刚刚从一个开源软件开发团队NetBSD被踢了出来。而编写开源软件代码是他唯一想做的事情。
德若特9岁时随父母一起从南非搬到了加拿大,后来在卡尔加里大学获得了计算机科学学位。在上大学之前这个家伙就想编写开源软件了。在那个时代程序员们会编写一些东西然后把他们贴到BBS上面。然后这些东西就会传播出去,这是很时髦的事情。德若特最初编写了一些小的图形程序和小游戏,后来在 Unix风光的日子里他成为comp.sources.unix新闻组的一员。尽管随后互联网开始变得流行起来,但德若特和朋友们仍旧做着同样的事情。
“这里面的大多数人,比如我,编写开源软件因为这是一种协同工作、迸发好点子的文化。”德若特回忆道,“我们不愿把编写程序当成一份工作。”毕业后暂时作了几天程序开发员后,1993年这个家伙就和3个朋友一起开发出一套叫做NetBSD的系统。但自从他和另外一名开发人员发生了矛盾后,事情就一发不可收拾了。
“那家伙是个彻头彻尾的衰人!我当时让他少聊天踏踏实实做些工作。”至今德若特仍不依不饶。后来这名程序员通过Email向德若特道歉。但他甚至没有删除这封邮件,反而用恶毒的、过分的语言回复对方,同时将这封邮件抄送给成百上千的开发高手取乐。于是在合作一年后因为自己的莽撞和不厚道,德若特被踢出了这个团队。
但德若特毫不在乎,他立即着手开发一套NetBSD的竞争产品,并且在几个月后他就发布了这套名为OpenBSD的操作系统的第一个版本。而那封不厚道的邮件甚至被视为是OpenBSD的立项文件。如今用Google搜索“theo de raadt”时,这封邮件的内容链接仍会位于结果列表中的前几位。
OpenBSD曾赢得过“安装四年也找不到一个漏洞”的美名,这套操作系统源于古老的Berkeley Unix,这个星球上另外两大十分出色的操作系统——Sun微系统公司的Solaris和苹果电脑公司的OS X——也同源于此。10年之后,德若特高兴地看到相比NetBSD他的软件更受人们关注。由于采用了先进的密码系统和数据通讯过滤,英特尔、甲骨文、 Adobe的公司系统中都运行着OpenBSD。而且它不收一分钱。
为什么在安全问题成为整个行业最头疼的问题时,德若特却能够让OpenBSD在这个敏感话题上声名显赫呢?很简单,那就是认真。
他们采取最基础的办法:一行行检索源代码,找出问题。整个团队中有10到15个人,大概用了4年的时间彻底检查了OpenBSD那300兆的源码。一旦发现错误,开发人员不是立即修改,然后继续寻找其它的错误。OpenBSD的家伙们则是停下来分析这个错误的根源是什么,尽可能一举将整个系统里的所有同类错误修正。如此大概找到了100个普遍问题。
与此同时,改善程序的系统构造,让每个功能都有序运行。另外,德若特认为如今许多软件过于复杂化,过于庞大的程序就很难兼顾安全。当程序开发人员编写出一个功能复杂的软件的时候,其安全性却很低。于是OpenBSD有80个程序员竭力精简自己的作品。要知道,300兆源码只是相当微软 Windows、Office源码体积的1/4,而这两款软件称得上是世界上最赚钱的软件产品。
但德若特并没有就此寻找投资、转而商业化的打算。接受《环球企业家》专访时,他用“深恶痛绝”表示了自己对资本的感受:“金钱不会提高程序代码的质量,只有技巧和时间才能够做到。”
他每年靠3万加元度日,这笔钱来自销售45美元/张的OpenBSD光盘、印着吉祥物和宣传口号的T恤衫的收入,以及软件用户的捐赠。销售收入和捐赠收入的金额大致相当,除了支付一些生活费用,如宽带、冷气、电灯等,剩下的钱将会用在他们每年一次的黑客马拉松(hackathon)活动上。在那里60个开发人员齐聚一堂,用整整一周的时间面对面地讨论、疯狂编写代码。尽管德若特不反对开源社区中的其他人寻求风险投资的帮助,但他认为这对软件质量的提高不会有太大帮助。因为风险投资商们为了获得更多的回报,将会把大笔的投资用在市场营销方面。而且如果金钱能够做到这一切,那些商业软件早就做的足够好了,德若特自己将会无事可做。
无所顾忌
看一看37岁的德若特的生活,就知道他是什么样的人了。在其网站上,他对自己的描述是:一个铁杆黑客、老式UNIX电脑收藏者、狂热的山地自行车手、洞穴探索者、登山迷、初级的酿酒师。而他养的两只猫分别叫“伽利略”和“开普勒”。
在这种充满冒险气质的生活背后,德若特一直是一名言辞犀利到令人难以接受的人,他在加拿大卡尔加里一间地下室里工作,并发表各种异见。
2001年,德若特从美国高级研究项目局获得了一笔2年230万美元的研究基金,得以继续研发OpenBSD。美国高级研究项目局非常重视这套系统刀枪不入的安全性能。但这名黑客又一次张开了他的大嘴。他在一份加拿大报纸上批评伊拉克战争是一场贪婪的石油争夺游戏。没多久美国高级研究项目局就撤销了提供的资助。
尽管德若特作为一名开源软件运动的倡导者和领军人物,但在今年6月接受采访时他对Linux却没有什么好话,只是强调他自己的软件采用了高级严谨的代码。“我认为我们的代码质量更高,因为我们在这上面花了大心思。凑近Linux仔细看看吧,它正在朝着另一个微软发展。这是一套质量低劣的软件,他们的人已经不行了。”
而谈到开源世界的天皇巨星李纳斯?托沃兹(Linus Torvalds)时德若特也毫不客气:“我不知道他的工作重点在什么地方,但肯定不是质量。”当托尔华兹了解了德若特对自己的评价后,只表示了这是一个很难缠的家伙便什么都不说了。
对《环球企业家》,德若特说:“我被曲解了,我批评Linux是因为它的确在质量上有问题。它可能会变得更流行、更庞大,但不是质量的提高。事实上,一件事情变得越庞大,保持高质量的难度就越大。我说过Linux质量很差的话,并且这是真的。”这也是德若特为什么坚持控制OpenBSD的体积和复杂程度,他坚信小即是美。
即使充满争议性,OpenBSD的研发从未停止。每六个月,就会有一款新的OpenBSD诞生,谈到之所以固定生产周期,德若特的解释是:“这个时间长度刚刚好,以至于我不会因忙碌而自杀。”
德若特得到了开源世界中许多志愿者的帮助。他们每年都会从全世界各个地方聚到卡尔加里一次,为OpenBSD开发新的功能。其中一些人就住在德若特的家里,平时这里只有他和女友。德若特甚至认为有时候这些家伙住的时间太长了。这项年度活动被他们称为黑客马拉松。今年5月份60名包括从澳大利亚、巴西、日本飞来的技术天才们参加了黑客马拉松。他们在凯悦酒店里连续一周几乎没有睡觉,疯狂地编写程序代码。任何人都可以提出自己的意见,但德若特拥有最终决定权。
一家叫做InternetSecure的公司高高兴兴地为今年的黑客马拉松支付了3万美元的账单,这是一家提供线上信用卡交易系统的加拿大公司。去年这家公司在3台英特尔服务器上运行了OpenBSD系统,有效防止了黑客的攻击。在这之前黑客们曾经把他们的服务器打开了花。“目前OpenBSD是这个星球上最安全的操作系统。” Lok Technology公司的创始人西蒙?洛克(Simon Lok)说道,“我们不会再用其它任何东西了。”
拥有计算机专业博士学位的洛克是德若特或者说是OpenBSD的死忠。他表示Lok Technology公司最初使用的是Linux系统,但4年前当他仔细检查了这套风头正劲的操作系统的源代码后,便决定转换到OpenBSD系统。“你猜我看到了什么?在Linux系统的心脏——系统内核程序里面我看到了开发人员的一行注解‘这行代码属于这里吗?’”洛克说,“这对我的信任是一种打击,那时我就知道是时候更换系统了。”
早期的德若特更多是一个程序员的角色,并且沉醉于被他称为一种“美学”的代码编写过程之中。他和整个团队的工作都是在几乎没有任何管理的情况下完成的。但现在随着越来越多的人加入到OpenBSD工作,德若特不得不花费很多时间去和他们沟通、协调。沟通的工作让整个团队的进度都慢了下来。因为当新人希望为OpenBSD贡献他们的技能和时间时,需要一些时间帮助他们启动并加速。只有这样他们才能够很好的融入OpenBSD的开源社区。
在团队内部,德若特以“慈善的独裁者”而出名:“只要是能够确保安全的,任何事情我都会去做,甚至是来自于我们源代码的进步。我们坚信软件的发展,而非革命;因此,在安全的前提下,变化的脚步却很缓慢,我们一点错误都不想犯。”
这种思路正在得到更为广泛的认可,最近一次他与本刊记者通信时,正在意大利威尼斯和许多开发高手碰面,在那里几乎所有的时间他都在编写代码。
这些高手们,丝毫不能理解为什么人们会花费5万美元去购买思科(Cisco Systems)或者Check Point的黑客防火墙,他们能够不花一分钱得到OpenBSD并且获得更好的安全保护。OpenBSD甚至守护着库尔德斯坦(Kurdistan)一条输气管线!
现在还没有人能够从OpenBSD上面赚到钱,最好的情况也只是企业为他们自己节省了开销。 “使用的人没有去宣传,所以它才这样默默无闻,”德若特表示。他不知道或者说不在乎有多少人在使用OpenBSD,尽管它已经被下载了数百万次。“我唯一在乎的是编写高质量的代码。如果强迫我做循规蹈矩的工作,我会疯掉。”德若特甚至并不在乎是否存在一个OpenBSD的市场空间。他坚持认为自己只不过是一个专注于开源代码项目的领导者,而不是关心它是被如何使用的。
其真正的痛苦在于同10几年前相比,他们仍然在一个硬件环境很封闭的世界里编写源代码。很多硬件厂商,从苹果、SUN、IBM、Nvidia、英特尔到戴尔,都在谈论支持和购买开源软件,但另一方面他们又拒绝提供相关文档。因此开源软件工程师很难为这些大公司的硬件产品编写源代码。但据德若特透露,有些时候这些大公司会私下将一些文档流出给像RedHat这样的Linux软件公司的开发程序员,还要签署NDA协议(Non-Disclosure Agreements)。这样就把许多有能力为某些硬件编写驱动程序的程序师限制在外,只有那个拥有文档的人才可以。
对OpenBSD团队来说,当这些大型硬件厂商并不向他们提供说明文档的时候,编写支持这些硬件产品的代码是非常困难的。德若特认为他们受到了不公平待遇:当像Red hat这样比较强壮的Linux软件厂商继续允许他们的程序员私下从硬件厂商那里得到说明文档,这将会很大程度的限制了更大范围的开源代码社区中的程序员的工作。“我们越来越多的看到驱动程序中充满了魔术般的数字,这让我们无法对其调试或者改进。”德若特告诉本刊,“这的确是一个挑战。但即使那些较大规模的开源软件公司越来越多地采用私下交易方式,他们也无法阻止我们的成长。因为15年前我们本来就没有什么说明文档。”
是的,态度强硬的德若特和这些大型硬件公司的关系并不够好。他根本不相信他们中的任何一个:“这样的公司并不是开源世界的朋友。不要被他们的花言巧语欺骗了。他们作出开放的姿态,像我们一样,但这却是一个大谎言。对他们来说开源软件只是一个值得利用的东西,但他们却不会帮助它成长。” OpenBSD和任何一家大公司都没有关系,在他们的研发机房里面有IBM的机器,但却不是IBM送给他们的。而据说IBM却特别告诉它旗下的RAID公司Mylex不要把他们产品的说明文档交给OpenBSD团队。
事实上,OpenBSD仍是一套非常艰涩难用的操作系统,这并不便于让它更加流行。但德若特并不打算自己来解决这个问题。“我们会花费更多时间来保证它足够棒,而不是把时间用在让大众觉得它更美味可口上。” :-D 太长了 这个故事告诉我们, 不要把"这行代码属于这里"这句注释写到kernel里头....哈哈哈 OpenBSD 4.0今天(2006.11.01)发布了
依然是最安全的系统,OpenBSD 4.0包含了使用ARM芯片的一些设备,以及sharp zaurus C3200的更新,另一个主要的更新是使用OpenRCS来代替GNU RCS,优化的IPsec(并支持IPv6) 这才是我心目中的骨灰级黑客
呵呵 4.11 - What is 'bsd.rd'?
bsd.rd is a "RAM Disk" kernel. This file can be very useful; many developers are careful to keep it on the root of their system at all times.
Calling it a "RAM Disk kernel" describes the root filesystem of the kernel -- rather than being a physical drive, the utilities available after the boot of bsd.rd are stored in the kernel, and are run from a RAM-based filesystem. bsd.rd also includes a healthy set of utilities to allow you to do system maintenance and installation.
On some platforms, bsd.rd is actually the preferred installation technique -- you place this kernel on an existing filesystem, boot it, and run the install from it. On most platforms, if you have a running older version of OpenBSD, you can FTP a new version of bsd.rd, reboot from it, and install a new version of OpenBSD without using any removable media at all.
Here is an example of booting bsd.rd on an i386 system:
Using Drive: 0 Partition: 3
reading boot.....
probing: pc0 com0 com1 apm mem[639k 255M a20=on]
disk: fd0 hd0+
>> OpenBSD/i386 BOOT 2.10
boot> boot hd0a:/bsd.rd
. . . normal boot to install . . .
As indicated, you will be brought to the install program, but you can also drop to the shell to do maintenance on your system.
The general rule on booting bsd.rd is to change your boot kernel from /bsd to bsd.rd through whatever means used on your platform. 5.3.4 - Building the kernel
We will assume you wish to build a standard (GENERIC or GENERIC.MP) kernel here. Normally, this is what you want to do. Do not consider building a custom kernel if you have not mastered the standard building process.
Obviously, the kernel is a VERY hardware dependent portion of the system. The source for the kernel is in the /usr/src/sys directory. Some parts of the OpenBSD kernel code are used on all platforms, others are very specific to one processor or one architecture. If you look in the /usr/src/sys/arch/ directory, you may see some things that look a little confusing -- for example, there are mac68k, m68k and mvme68k directories. In this case, the mvme68k and mac68k systems both use the same processor, but the machines they are based on are very different, and thus require a very different kernel (there is much more to a computer's design than its processor!). However, parts of the kernel are common, those parts are kept in the m68k directory. If you are simply building a kernel, the base architecture directories like m68k are not anything for you to worry about, you will be working exclusively with the "compound architecture" directories, such as mvme68k.
Kernels are built based on kernel configuration files, which are located in the /usr/src/sys/arch/<your platform>/conf directory. Building the kernel consists of using the config(8) program to create and populate a kernel compile directory, which will end up in /usr/src/sys/arch/<your platform>/compile/<KernelName>. For this example, we will assume you are using the i386 platform:
# cd /usr/src/sys/arch/i386/conf
# config GENERIC
# cd ../compile/GENERIC
# make clean && make depend && make
[...lots of output...]
# make install
Replace "i386" in the first line with your platform name. The machine(1) command can tell you what your platform name is, so an obvious generalization would be to use the command "cd /usr/src/sys/arch/`machine`/conf" instead on the first line.
At this point, reboot your machine to activate this new kernel. Note that the new kernel should be running before the next step, though if you have followed the above advice about upgrading to the most recent available snapshot, it may not matter as much. Sometimes, however, APIs change, and the old kernel will be unable to run new applications, but the new kernel will generally support the old ones.
Variation on above process: Read-only source tree
Sometimes, you may wish to ensure your /usr/src/sys directory remains untouched. This can be done by using the following process:
$ cd /somewhere
$ cp /usr/src/sys/arch/i386/conf/GENERIC .
$ config -s /usr/src/sys -b . GENERIC
$ make clean && make depend && make
... lots of output ...
Note that you can build a kernel without root access, but you must have root to install the kernel. NetBSD for S3C2410的简单移植步骤
From Wiki.bsdlife.org
* 1 下载源代码,解压至/usr/src
%wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/source/sets/{src,syssrc,gnusrc,share}.tgz
% foreach file (*.tgz)
? tar -xzf $file -C /
? end
* 2 交叉编译器
%cd /usr/src
%mkdir ../obj
%./build.sh -mevbarm tools
%在~/.cshrc中的path变量添加交叉编译器的执行目录
* 3 内核编译
%cd /usr/src
%vi sys/arch/evbarm/conf/SMDK2410#编辑CONFIG文件
%./build.sh -mevbarm -u kernel=SMDK2410_INSTALL
* 4 制作ramdisk
%wget ftp://ftp.netbsd.org/pub/NetBSD/NetBSD-3.0.1/evbarm/binary/sets/{base,etc}.tgz
%tar -xcf {base,etc}.tgz -C ~/sets
%删除~/sets中所有不需要的命令和文件(一个实例可以参见后面附录)
%cd ~
%nbmakefs -s 3m -t ffs image sets/
* 5 拼装可执行二进制镜像
%cp /usr/obj/sys/arch/evbarm/compile/SMDK2410_INSTALL/netbsd ~
#把你在第三步编译的内核考到home里,便于我们操作
%cd ~
%arm--netbsdelf-mdsetimage -sv netbsd image #把第四步制作的image拷贝到内核里面(见补充:2)
%arm--netbsdelf-objcopy -S -O binary netbsd netbsd.bin
#去掉一些不必要的信息,生成可以直接执行的二进制镜像
* 6 netbsd.bin就是最后的可执行二进制文件,该内核包含所有系统运行所需的内容,包括内核、文件系统、应用程序等,可直接下载到开发版的SDRAM中执行。 杂记 OpenBSD/arm分支概况
by ffxz
----
OpenBSD的arm分支目前主要有三个:
- OpenBSD/cats
- OpenBSD/zaurus
- OpenBSD/armish
OpenBSD/cats是最先移植的分支,最初由Dale Rahn在2004从NetBSD移植过来。目标开发板是Simtec StrongARM 110 Evaluation Board 。
OpenBSD/zaurus,armish都是基于OpenBSD/cats分支后的移植。其中armish能够运行于多个arm平台,而zaurus主要应用于Sharp Zaurus PDA。
在OpenBSD下进行交叉编译
要在OpenBSD/i386状态下进行arm分支的编译必须具备交叉编译器。在OpenBSD下构造GNU的交叉编译器十分简单,假设针对zaurus平台
- 保证你安装了src.tar.gz包
然后在/usr/src下运行
export TARGET=zaurus
make cross-tools
然后生成arm目标代码的binutils & gcc就编译好了,一般没啥错误的
编译OpenBSD的内核
如上几篇文章所述,建立openbsd印象文件的时候有两种,一种GENERIC的,一种RAMDISK,前一个文件名是bsd,后一个文件名是bsd.rd
先说GENERIC的编译
- 保证你安装了sys.tar.gz包(也就是OpenBSD的内核代码)
然后在/usr/src/sys/arch/zaurus/conf下运行
export TARGET=zaurus
export MACHINE=zaurus
export MACHINE_ARCH=arm
config GENERIC
cd ../compile/GENERIC
make
OK,内核编译完成。内核二进制文件是compile/GENERIC目录下的bsd文件。
RAMDISK的编译
为了编译出bsd.rd,需要安装crunsh工具,它在/usr/src/distrib/crunsh目录中,
然后在/usr/src/distrib/machine/ramdisk中运行
make
OK,RAMDISK也编译完成了
然后,慢慢自己研究了
页:
[1]