您的位置:首页 > 运维架构 > 网站架构

浅析BSD起源、差异、系统架构

2006-12-13 21:06 351 查看
==www.cciss.cn.==
==bbs.cciss.cn.==
==CIS技术讨论沙龙==

Simple Analyzing BSD Difference Filiation Kernel

|=---------------=[ 浅析BSD起源、差异、系统架构 ]------------------=|
|=-----------------------------------------------------------------=|
|=---------------=[ 7all<7all7_at_163.com> ]=----------------------=|
|=-----------------------------------------------------------------=|
|=---------------=[ 版权所有:bbs.cciss.cn ]=-----------------------=|

讨论问题列表:
[1] UNIX的历史,乐趣:)
[2] WINDOWS LINUX BSD等系统的讨论.
[3] 大家对FreeBSD OpenBSD NetBSD的意见/问题/讨论
[4] BSD kernel module的技术讨论
[5] 对BSD rootkit的技术讨论(大家的idea)
[6] 对于本次技术话题的意见与建议

--] 概述
由于某些历史的原因,使BSD这个优秀的OS失去了很多发展壮大的机会,虽然目前
国内使用、研究BSD的人群在扩大,但与Linux相比其影响远远不足.对Linux内核的
分析已经到了"热火朝天"的地步,很多针对Linux内核研究书籍的相继出版,给了技
术爱好者更多的空间去探究Linux OS的内核技术.但是针对BSD的研究却还停滞在
某个阶段,前段时间研究BSD的rootkit时就发现很多rootkit的资料都是很多年前
的老资料,虽然这些老资料可用性比较不错,但给我的感觉就是研究BSD的人远远比
研究Linux的人少了很多.在这里我想起一句话,好像是爱因斯坦说过的:)
"If we knew what it was we were doing, it would not be called research,
would it?"
Linux是一个很优秀的OS,也是我的最爱;喜欢在RedHat或debian上面闲逛:)自从
前段时间读过FreeBSD的内核后,就把"学习"的重点放在了BSD上面,之前看过Linux
的内核代码感觉Linux的代码不错,但BSD系统好像比Linux还要优秀了一些,特别是
FreeBSD由于其开发的团队性,导致FreeBSD在各方面都优于其他的BSD系统,不过这里
还是得补充下,OpenBSD的确很安全,但是OpenBSD也存在其不足之处,但OpenBSD的不足
之处多数都因资金问题而困扰,可怜的OpenBSD:-)
本篇的内容准备从以下几个方面来进行简单的阐述:
A: 回顾BSD的历史.
B: FreeBSD OpenBSD NetBSD的差异.
C: FreeBSD OpenBSD NetBSD的kernel module.
D: BSD Rootkit的简单概述.
E: 总结.

--] 回顾BSD的历史
1969年的某个春天,很多家company聚集在一起想开发一个分时的OS,并把待开发的这个
OS命名位MULTICS,不久后这个被叫把MULTICS的OS开发完毕,但由于该OS主要进行批处理
的操作,所以其操作也很烦琐,于是这个叫做MULTICS的OS开发的并不是很成功.
由于的MULTICS并不是很成功,后面就发生了一些比较有意思的事情.在这个阶段
的确有几个比较令人开心的事情值得说下,Unix真正意义上的老祖宗按照我自己的理解是
为了玩游戏而设计的,也就是1969年由Ken Thompson在AT&T贝尔实验室实现的,运行在一台
DEC PDP-7计算机上,当年Ken Thompson参与完MULTICS的项目后,一直想找更多的机会玩
游戏,于是在向领导申请计算机失败后,他淘到一台PDP-7然后就开始了Unix的设计与B语言
的设计.有些时候想起来感觉蛮可笑的,如今的Unix难道真的是为了玩游戏而设计的?:))
后来其伙伴根据B语言开发出了C语言,C语言于是开始统治编程语言一直到现在,直到C++
出来,直到一些应用级软件的开始兴起.虽然C语言的使用者在减少,但是其作用却是一直没
有减弱.
玩笑的话讲完,继续我们的文档.直到Unix出来一段时间,AT&T并没有把Unix做为一个商业
软件,因此给研究人员更多的机会来使用/熟悉/完善它.而此时由于很多学术机构的要求,
AT&T也以分发许可证的办法提供给别的学术机构研究和使用Unix,而正是这样才使Unix最初
的源代码分发到了各种学术机构/大学等.AT&T的这一举动其实在无形中促进了Unix的发展,
Unix进入了大学后,培养了不少熟悉使用Unix和编程的学生,对于Unix的发展是有不少促进
作用的.
到了70年代末,在Unix发展到了版本6之后,AT&T认识到了Unix的价值.成立了Unix系统实验
室(Unix System Lab,USL)来继续发展Unix.因此AT&T一方面继续发展内部使用的Unix版本7,
一方面由USL开发对外正式发行的Unix版本,同时AT&T也宣布对Unix产品拥有所有权.几乎在
同时,加州大学伯克利分校计算机系统研究小组(CSRG)使用Unix对操作系统进行研究,因此
他们的研究成果就反映在他们使用的Unix中.他们对Unix的改进相当多,增加了很多当时非常
先进的特性,包括更好的内存管理,快速且健壮的文件系统等,大部分原有的源代码都被重新写
过,以支持这些新特性.很多其他Unix使用者,包括其他大学和商业机构,都希望能得到CSRG改
进的Unix系统.因此CSRG中的研究人员把他们的Unix组成一个完整的Unix系统──BSD Unix
(Berkeley Software Distribution),对外发行.
BSD Unix在Unix的历史发展中具有相当大的影响力,被很多商业厂家采用,成为很多商用Unix
的基础.而AT&T与其同时存在的Unix版本的影响就小得多.同时很多研究项目也是以BSD Unix为
研究系统,例如美国国防部的项目─ARPANET,ARPANET今天发展成为了Internet,而BSD Unix中
最先实现了TCP/IP,使Internet和Unix紧密结合在一起.
而AT&T的Unix系统实验室,同时也在不断改进他们的商用Unix版本,直到他们吸收了BSD Unix
中已有的各种先进特性,并结合其本身的特点,推出了Unix System V版本之后,情况才有了改变.
从此以后,BSD Unix和Unix System V形成了当今Unix的两大主流,现代的Unix版本大部分都是这
两个版本的衍生产品.
Unix的版本号表示方式比较复杂,各种不同的Unix版本有自己的版本标识方式,如最早AT&T开
发的内部Unix使用简单的顺序号来标识版本,从V 1到V 7.
BSD使用主版本加次版本的方法标识,如4.2BSD,4.3BSD,在原始版本的基础上还有派生版本,
这些版本通常有自己的名字,如4.3BSD-Net/1,4.3BSD-Net/2.
AT&T使用罗马数字来标识他们的对外发布的Unix版本,用Release来表示次版本.如Sys tem V
Release 4(简写为SVR4)标识AT&T的Unix System V的第四次发布的 版本.其他商业公司的Unix
使用自己的版本标识,如Sun的Solaris 2.6,IBM的AIX 4.0等.
虽然AT&T的Unix System V也是非常优秀的Unix版本,但是BSD Unix在Unix领域内的影响更大.
AT&T的Unix系统实验室一直关注着BSD的发展,在1992年,Unix系统实验室指控BSDI--一家发行
商业BSD Unix的公司,违反了AT&T的许可权,发布自己的Unix版本,并进一步指控伯克利计算机
系统研究组泄漏了Unix的商业机密(此时的4.3BSD中来自AT&T Unix的代码已经不足10%).这个
官司影响了很多Unix厂商,使他们不得不从BSD Unix转向Unix System V,以避免法律问题.以至
于当今大多数商业Unix版本都是基于Unix System V的.
这件有关Unix版权的案子直到Unix系统实验室被AT&T卖给了Novell公司后才得以解决,Novell
不打算陷入这样的法律纷争中,因此就采用了比较友好的做法.伯克利的CSRG被允许自由发布BSD.
但是其中来自于AT&T的代码必须完全删除.因此CSRG就对他们最新的4.4BSD进行了修改,删除了
那些来自于AT&T的源代码,发布了4.4 BSD Lite版本(该系统是不完整的,尤其对于英特尔386体系
的计算机系统).由于这个版本不存在法律问题,4.4BSD Lite成为了现代BSD系统的基础版本.
Novell的比较友善的做法还不止对BSD,他把自己的Unix改名为Unixware,而将Unix商标赠送给
X/Open--一个由众多Unix厂家组成的联盟,这样这个联盟内的所有成员均可使用Unix商标.从此之
后,Unix不再是专有产品了.后来Novell由于自身的经营问题,又将Unixware卖给SCO公司.同时,由于
BSD系统已经十分成熟,作为对操作系统进行研究的目标已经达到,伯克利计算机系统研究组(CSRG)
在发布了4.4BSD-lite2之后就解散了,小组的科研人员有些进入了Unix商业公司,有些继续进行其
他计算机领域的研究.此时,严格意义上的Unix System V和BSD Unix都不复存在了,存在的只是他们
的各种后续版本.
在这之后,也就出现了FreeBSD,OpenBSD,NetBSD等目前比较流行的BSD Unix系统,而这里面安全性
较高的非OpenBSD莫属,稳定和可用性较高的非FreeBSD莫属.

[Note]: 以上文字内容很多源自网络,由于摘抄故不再声明出处.

--] FreeBSD OpenBSD NetBSD的差异
FreeBSD无疑是这三个BSD当中的老大哥,无论其历史及目前的发展趋势,再加上FreeBSD也是目前BSD
里面开发团队最完善,资金支持比较及时.FreeBSD的资金支持与技术开发团队的优势,导致了它是目前
3个BSD系统里面最完善的一个OS.
NetBSD我自己认为是上述三个BSD里面支持硬件平台最多的BSD系统,从其官方FTP的下载地址可以看
到NetBSD对各种硬件平台的支持最完善,虽然FreeBSD也在朝这个方向发展,但我估计还是需要一段时间
的完善过程的.NetBSD是OpenBSD的老大哥,因为希欧.德若特在准备开发OpenBSD前是在NetBSD小组进行
OS项目的开发.所以OpenBSD在某种程度上也继承了NetBSD的一些特点.不过NetBSD在针对不同硬件平台
的支持上,的确很出色.而且即使做为I386平台的用户,如果想学习BSD系统的话,那么NetBSD也是不错的
学习BSD系统的一个OS系统.
OpenBSD,这个可爱的OS的安全性已经差不多快成为网络上面的一个传奇,直到目前为止OpenBSD还是大
家公认的内核最安全的OS,我自己的感觉是如果抛弃一些其他程序的BUG,OpenBSD的内核可以到无懈可击
的地步了.OpenBSD无疑创造了OS界的安全传奇,4年没有任何一个BUG出现.前面提到OpenBSD继承了NetBSD
的某些特性,为什么会这么说呢?我们把这个问题放在另起一段来分析下.
前段时间在看BSD系列的kernel module,因为有了写BSD系列rootkit的想法后,就一直在考虑是否可以
写通用的BSD系列rootkit.开始在想的就是毕竟都属于BSD系统,可能会在内核存在一些相似的地方.当然
研究的结果不是很乐观:)FreeBSD/OpenBSD/NetBSD存在了些许差别,这可能导致需要书写三份的代码
来完成BSD系列的rootkit.在分析OpenBSD和NetBSD后我发现,虽然OpenBSD与NetBSD有些差别,但其
kernel module的写法与加载模块是基本类似的,类似还是需要继续的改装,但是很容易看到OpenBSD具备
一些从NetBSD上面继承下来的特性.如:他们的内核加载命令都为:modload / modstat / modunload,而
其kernel module的写法也是有些类似的.(在下面的章节,会针对NetBSD OpenBSD书写简单的kernel module)

备注: 由于我没有使用过BSD4.4最后的那个发行版本,至于是否NetBSD/OpenBSD具备的这些共同点是来自
BSD的原始发行版本,还是OpenBSD在开发前就准备以NetBSD为框架进行扩展开发,这种情形不得而知.我
上面的一些想法大家可以认为是猜测或者猜想:)深知在OS这块的语言禁忌性,稍有不对的地方即会导致
众多UNIX/LINUX fans的口水之争,故这里以备注的形式说明:)

由于历史及每个BSD OS注重的发展方向不同,导致这三个BSD系统在不断朝着自己的个性化发展.如果非
要给这三个BSD OS下个定义,我希望FreeBSD可以吸取OpenBSD的优点,并集合进NetBSD的多平台特性.那么
FreeBSD就是王者拉:)) 我同样希望可怜的OpenBSD可以得到更多的资助,以使OpenBSD可以得到更大的发展.
可怜的OpenBSD目前我的感觉就是缺乏资金的资助.至于NetBSD,真的没有什么感情,只是偶尔进它的内核里
面闲逛而已:-)
其实FreeBSD还是比较不错的OS,比起OpenBSD和NetBSD它有其优点及优势,除了可以做为服务器外,它
也蛮适合做个人用户的操作系统,性能决定不会比Linux差:)而OpenBSD/NetBSD的安装和配置有些麻烦,
的确不太适合刚学习的朋友,而OpenBSD的确是安全服务器的首选,如果你希望自己的Server安全,而你又
懒得做很多的管理,那么OpenBSD当然是个首选,不过值得注意的是OpenBSD的内核是很安全的,但是其使用
的一些其他服务软件还是难免也会存在漏洞出现的,只要及时的解决了这个问题.我想OpenBSD是可以给你
一份很满意的答卷:)
值得一提的是目前FreeBSD已经有嵌入式的FreeBSD系统,不过估计目前的使用率不会太大.毕竟在嵌入式
这块领域来说,国内的很多公司都采用的是Linux.从人力等各种资源来考虑,那个公司能够下决心转移到
FreeBSD的嵌入式OS的话,也的确需要下不小的决心.

--] FreeBSD OpenBSD NetBSD的kernel module
在下面的部分,会书写简单的kernel module source code,并进行简单的安装和测试,同时也会针对这些
简单的source code进行简单的讲解,因为这方面的资料较少,文章难免有出错的地方,希望大家能够指正.
A: FreeBSD的kernel module
[1] FreeBSD提供的kernel module的编译及测试.
如果你想在FreeBSD下面书写简单的kernel module,可以去/usr/share/examples/kld/syscall目录下面
去找寻FreeBSD开发团队提供的简单示例代码.
#cd /usr/share/examples/kld/syscall
#cd module /*该文件夹为kernel module的实现代码*/
#make /*make生成*.ko的连接文件*/
#ls -l syscall.ko
#[...will print some syscall.ko messages...]
#kldload /usr/share/examples/kld/syscall/module/syscall.ko
syscall loaded at 210 /*Now kernel module loaded success*/
#kldstat
Id Refs Address Size Name
1 3 0xc0100000 40ddc4 kernel
2 1 0xc12da000 14000 linux.ko
3 1 0xc1365000 2000 syscall.ko /*kernel module loaded success*/

上面我们已经把FreeBSD自身提供的简单的kernel module进行了编译并加载到了内核中去,下面我们编译其
测试程序看加载的kernel module是否可以被使用:)
#cd ../test /*test目录为测试该示例kernel module的程序*/
#cc -o call call.c /*Also can use make*/
#./call
hello kernel /*ok:-)*/

到这里基本的kernel module示例程序也已经可以运行,但我们没有看他的source code,也没有去理解基本的
kernel module编程需要的一些知识:)下面我们自己来写个简单的kernel module,并加载调试使其成功:)

[2] DIY简单的kernel module
大家可以参考FreeBSD本身提供的简单的例子程序,我相信稍微的看下就会知道kernel moduled的写法.
下面的代码是我写的一个简单的kernel module,如果您对于kernel module的书写很熟悉,希望得到指教:)
Makefile 文件的内容如下:
/*
KMOD= kern1
SRCS= kern.c
.include <bsd.kmod.mk>
*/
/*
* A simple kernel module example
* Use Makefile :-)
*/
#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>
/*
* The function for implementing the syscall.
*/
static int
mynm (struct proc *p, void *arg)
{
printf("my kernel module:)/n");
printf("kernel module example work success!/n");
return 0;
}
/*
*The 'sysent' for the new syscall
*/
/*
struct sysent { // system call table
int sy_narg; // number of arguments
sy_call_t *sy_call; // implementing function
};
*/
static struct sysent nm_sysent = {
0, /* sy_narg */
mynm /* sy_call */
};
/*
*The offset in sysent where the syscall is allocated.
*/
static int offset_mynm = NO_SYSCALL;
static int
load_mynm (struct module *module, int cmd, void *arg)
{
int error = 0;

switch (cmd) {
case MOD_LOAD :
printf ("syscall_mynm loaded at %d/n", offset_mynm);
break;
case MOD_UNLOAD :
printf ("syscall_mynm unloaded from %d/n", offset_mynm);
break;
default :
error = EINVAL;
break;
}
return error;
}
SYSCALL_MODULE(syscall_mynm, &offset_mynm, &nm_sysent, load_mynm, NULL);

/*
* Example test kernel module
* prog.c
* cc -o prog prog.c
*/
#include <stdio.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <sys/module.h>

int
main(int argc, char **argv)
{
char *endptr;
int syscall_num;
/*
struct module_stat {
int version; //set to sizeof(struct module_stat)
char name[MAXMODNAME];
int refs;
int id;
modspecific_t data;
};
*/
struct module_stat stat;
stat.version = sizeof(stat);
/*
int modstat(int _modid, struct module_stat* _stat);
//通过modstat函数把syscall的信息存放入module_stat
int modfind(const char *_name);
//根据syscall name,寻找syscall的信息,并把信息放入module_stat
*/
modstat(modfind("syscall_myshell"), &stat);
syscall_num = stat.data.intval;
return syscall (syscall_num);
}

B: OpenBSD的kernel module
[1] OpenBSD提供的kernel module的编译测试.
#cd /usr/share/lkm/syscall
#ls
Makefile README module test
#uname -a
OpenBSD 0penbsd.0pen.bsd 3.9 GENERIC#617 i386
#make
//i don't write finish!

C: NetBSD的kernel module
[1] NetBSD提供的kernel module的编译测试.
//i don't write finish!

--] BSD Rootkit的简单概述
rootkit技术可以说是深入了系统内核的心脏,下面大家可以讨论rootkit如何写才可以更
安全.我考虑了以下几个方面:)
A: 实现文件隐藏
如:逃避ls -la
B: 替换/截获syscall
如:替换系统的ptrace系统调用,并隐藏
C: 截获网络传输,并隐藏开启的端口等信息
如:netstat -aa
D: 端口复用
如:通过截获inetd来实现端口复用
E: 如何远程启用rootkit
如:通过端口复用连接,通过SSH的方式接入

--] 总结
针对该文出现的问题,希望看到该文档的朋友给以指点:)7all7_at_163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: