“Unix 至少设立了三层内部边界来防范恶意用户或有缺陷的程序。一层是内存管理:Unix 用硬件自身的内存管理单元(MMU)来保证各自的进程不会侵入到其它进程的内存地址空间。第二层是为多用户设置的真正权限组——普通用户(非 root用户)的进程未经允许,就不能更改或者读取其他用户的文件。第三层是把涉及关键安全性的功能限制在尽可能小的可信代码块上。在 Unix 中,即使是 shell(系统命令解释器)也不是什么特权程序。”----《Unix编程艺术》:小即是美,这个词有两个例子可以证实,一个是古希腊的城邦,另一个是unix的进程设计原则。小,对于协作,可以最大化最简易地排列组合(DNA/两仪-四象-八卦);对于故障,可以最小化的影响其它;对于恩惠,可以最小化聚集和最大化扩散...小,可以更容易地由简入繁,由繁化简,在功能强大之后更简单地寻求高效。
     unix/linux中的pam机制是通过动态库来实现的,之所以采用动态库是因为它的“可替换性”,然后同样的事情在windows却成了尽量要避免的了,很多windows上开发的软件都有认证功能,很多有经验的人都会建议说,不要用dll实现认证,因为恶意者会替换掉这个实现认证的dll,这种说法也不无道理,看起来动态库认证的可替换性在unix/linux和windows上的价值截然不同,一个因之使用它而另一个却因之避免使用它,这就不得不扯到两类系统的设计原则。unix/linux有着严格的用户/组-权限的映射,而windows要么不实现,要么实现得很弱,如果不谈用户群习惯的话,这里已经可以说明windows的设计弊端了,可是深入研究一下就会发现,windows如此实现还是有道理的,那就是用户体验简单。windows的用户主要个人用户,使用操作系统的人很多时候就是一个人,而微软在设计windows的时候并没有将网络考虑在内,最起码没有在网络上花太大的力气,因此windows中的用户当然就不包括那些通过网络连接进来的人们了,微软操作系统的用户的概念就是那个正在使用计算机的人的抽象,而unix中用户却只是一个抽象的执行者,想 建立文件,读文件,写文件,远程登录等都需要一个合法的用户,在这等意义上,windows当然就没有必要去完善用户-权限的映射了,如果说unix/linux是和网络绑定在一起的话,那么windows则是和不联网的单台计算机绑定在一起的,所以一般的人都会使用administrator来登录机器,甚至计算机主人的朋友也会得到这个用户的密码,甚至windows机器是可以不设置密码就可以登入的(linux则必须输入root密码)。因此在windows上工作,学习或者娱乐,如果你拔掉网线,然后查杀一下病毒和木马,接下来的经历将是美好的,如果你插上了网线,那几乎是噩梦的开始,任何东西都是不安全的,这是因为如此,实现认证的dll才会被轻易的替换掉,如此一来,可替换性反倒成了一个容易攻破的漏洞了。在unix/linux上工作时,由于这操作系统在设计和改良之初本身就集成了网络,因此使用计算机的用户可就不仅仅是机器前面的那个人了,早在unix设计之初,终端的意义非常之大,实现一个分时的操作系统目的就是让很多用户可以通过终端连接在一台处理机上,可见unix的用户概念的持久性和重要性,linux就更不必说了,后来者的优势在于省去了当初unix集成TCP/IP时的那些争论,在unix/linux上,用户,权限,进程间通信,套接字,网络这些概念是一体的,而不是分离的。既然unix/linux中有如此强大的用户-权限映射功能,那么“可替换性”也就是成了一种灵活性而不是一个漏洞了。
     在unix/linux中,如果你删除/修改一个文件失败,那么原因几乎就是一个“无权限”,而在windows中,答案就是“此文件正在被使用”了,被谁使用呢?哪个进程,当前是哪个用户使用了它?...总之,很多因素揉在了一起。同样一个机制,在设计原则不同的情况下,一个系统视此机制为祸,而另一个系统却视此机制为福...两类系统有时也会相互影响,比如用惯了windows的人总受不了linux的限制,于是他们总是使用root来登录系统。