unix中root登陆安全的dirty case
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
http://blog.devep.net/virushuo/2005/11/15/unixrootdirty_case.html
我相信很多人不同意这是个dirty case。不过我仍然归为此类。其实dirty case并非贬义,甚至还带有一点点褒扬的意味,一点点hack的幽默。
unix最早是可以用root进行远程登陆的。后来这招有点麻烦,因为无数人用程序来猜测密码,任你密码再强,这种愚公移山的精神也不得不怕。
假如我们不知道后面的故事,这时候,解决方案大概有几种:
1 禁止root远程登录
2 设置验证次数,超过一定次数失败就封ip
3 设置ip过滤,只允许某些ip连接
4 要求root密码不的短于10个字母
5 ...
其实以上所述都在不同的地方用到。但是我最欣赏的,还是freebsd目前采用的方法。
freebsd设置了一个叫做wheel的组,然后禁止了root的远程登录,允许用户的远程登录,但只有wheel组的用户才能在登录之后通过su命令获得root权限。
这个办法简单粗暴,但是效果出奇的好。用户几乎没有成本,只是多记了一个用户账号。好处很大,禁止了root远程登录之后,就很难猜测了。首先要猜到属于wheel组的用户,然后才能有机会猜测root密码。猜root密码大概还容易点,猜测用户就不太可能了,谁知道用户名会用什么呢?
相比起来用证书来验证登录,或是限制ip,或是检测入侵等等相对正统的思路,这个办法真的要算个dirty case。效果如何呢?
假设第一个用户的用户名长度为6个字母,6位长的密码,那么就是猜测到这个用户的机会就是1/(1!+2!+...+6!)^2,于是,有可能猜测到root密码的几率就增大了(1!+2!+...+6!)^2倍。效果很可怕吧?
这个思路的形成,我简单的推测一下,大概是这样的(未必符合历史本来面目,只是猜测):
1 root登录危险
|
|--禁止root登录 (1)
|--允许登录但有限制 (2)
这是第一个分支,选择1还是选择2?
这时候,选择1,似乎简单一点。如果选择2,我们马上面临规则问题,而规则是非常难制定的,要引入大量的逻辑判断,引入逻辑判断则不可避免的要带来bug。两者相较,选择1似乎好一点。
于是,禁止了root登录。
2 禁止root登录
|
|--改良(1)
|--创造一种新方法(2)
选择2,就要创造一种不用密码登录的方法。这个方法也是成功的。就是通过rsa密钥访问。这个方法是最正规的,不过对于用户的要求也多了不少。
通过(1)是否能够演化出折衷的方案呢?这时候应该可以比较容易想到先要允许一个较为难以猜测的账号登录,然后神不知鬼不觉得让他具有root的权限。于是,wheel组这个方案就出台了。
虽然未必真正符合历史,想必也能提供一些思路上的帮助吧。




Comments
此文让我受益颇多
Posted by: 尚北京 | January 15, 2006 5:54 AM
很好 思路清晰 受益
Posted by: kxhu | March 15, 2006 11:34 AM
更有效的办法是不允许password 认证,只能用public key登陆。
Posted by: Rocky | August 25, 2006 6:53 PM