文章翻译:Bibby
Controlling User Logins 控制用户登陆
06/28/2001
原文出处:
www.onlamp.com
翻译:
MichaelBibby@gmail.com
翻译日期:2005/09/26
一些服务器拥有成百上千个各有不同意图的用户,如果要为他们分配不同的权限,该如何做呢?FreeBSD有一些不同的的方法来控制用户访问。/sbin/nologin 程序用来限制帐户非常有用,更多常用的控制则是通过/etc/login.access来处理。
一个最常见的例子就是,管理员希望允许一个用户可以访问FTP,但是不能访问shell。如果这是个别的例子,可以简单地用 /sbin/nologin 来完成。你所要做的是把 /sbin/nologin 添加到 /etc/shells 中,这样 ftpd 会允许这个用户的连接。
当一个用户的shell是/sbin/nologin时,他的 telnet 和 SSH 连接请求将是这样:
login: loserusername
Password:
Last login: Tue Mar 27 20:33:59 from localhost
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 5.0-CURRENT (TURTLEDAWN) #3: Wed Mar 28 14:24:46 EST 2001
This account is currently not available.
Connection closed by foreign host.
这种方法存在的问题是,系统需要对连接进行处理,并为用户建立一个环境。这会花费一些处理器时间,当系统最终实现用户不具有一个shell时,已经做了许多的工作。
如果有大量的CPU时间,/sbin/nologin足够好。在Unix世界这也已经是一个为大家所接受的标准。还有一个更高级的版本在/usr/ports/sysutils/no-login,它会记录被拒绝的连接。
然而,/sbin/nologin在大范围的部署中将变得难以处理。打字错误、管理员缺少经验,或者一个明显的错误,可能会将用户的shell设置错。FreeBSD在login.access文件中提供了一个更为简单的方法。每次尝试连接一个FreeBSD系统时,系统会检查login.access文件。正确地配置login.access文件,可以以一个更简洁的方式提供所有你需要的功能。
/etc/login.access文件的内容是三个以分号分隔的域。第一个域为授权(+)或拒绝(-)连接。第二个域是用户或组(group)的列表。第三个域是连接资源( connection source )的列表。这个文件允许"all"和"all except"语法,允许管理员创建基本的规则和除了给出的规则外的基本规则。
当系统发现同时匹配group和connection source的第一个规则时,它会马上接受或拒绝连接。这使得规则的次序很重要。
例如,只允许wheel组和root登陆到物理终端,可以这样制定规则:
+:wheel root:console
这条规则有趣的是,其它的规则也会被继续执行。它只说它接受的,而不说那些拒绝的。毕竟,Joe Average用户尝试登陆终端并不匹配这条规则。如果使用相反的表达,可以更迅速地拒绝连接,并且降低管理员出错的风险。
-:ALL EXCEPT wheel root:console
Joe Average匹配这条规则,他立即就被拒绝了。这样就不会匹配一个轻率的,允许无意访问的规则。基于被拒绝的用户而不是被允许的用户来创建规则会更好。
最好的组合是最后一个域,connection source。你可以在这里使用一些不同的类型:主机名(host names),主机地址(host addresss),网络号(network numbers),域名(domain names),LOCAL和ALL。
首先,ALL总是匹配的,在和EXCEPT组合时格外有用,就象我们在文章后面会看到的。
主机名(host name)依赖DNS和/或hosts文件。如果怀疑DNS可能会受到攻击,那么你可能不想用它。但你可以这么做:
-:ALL EXCEPT wheel:fileserver.mycompany.com
wheel组可以从file server登陆,其它用户都不可以。
主机地址(host address)和这差不多,但是它不受DNS影响。
-:ALL EXCEPT wheel:169.254.8.3
网络号(network number)以一个句号结尾的,就象这样:
-:ALL EXCEPT wheel:169.254.8.如果不希望除了受管理的工作站之外的任何人访问防火墙,可以象这样做:
-:ALL EXCEPT wheel:ALL EXCEPT 192.168.89.128 192.168.170.33最麻烦的是LOCAL。它匹配任何一个不带“点”的主机名。这通常表示本地域里的任何主机。比如,
www.blackhelicopters.org会认为任何带“blackhelicopters.org”字符串的主机名匹配LOCAL。它由DNS反向查询来完成。尽管我的手提电脑可能要求的是一个“pedicular.blackhelicopters.org”的主机,但是它的IP却是指向home.com网络的某个位置。我不使用LOCAL的验证方法。
那么,我们如何把这些都结合起来?login.access的这一行将允许管理员们登陆到服务器,并且拒绝其它所有远程的连接:
-:ALL EXCEPT wheel:ALL这在你的环境中可能受到太多的限制,许多公司都有不同的部门。我以前建立了有组dns(允许编辑域名配置文件的用户)和组www(允许编辑服务器配置文件的用户)的环境。它的login.access文件看起来就象这样:
-:ALL EXCEPT wheel dns www:ALL我的系统的login.access文件看起来象这样:
-:ALL EXCEPT wheel:console
-:ALL EXCEPT wheel dns www:ALL
一次只改变一行,除非你有意识地将你的用户添加到一个被允许的组中,否则他们都无法登陆。设置shell为/sbin/nologin并不能起到作用,但是已经不再需要它了。FreeBSD使得它可以更容易地通过一个文件来控制成百上千的用户帐户。