Linux管理员手册(6)--登录和注销
7 ~6 F" g! R, n% V8 P. d2006-06-01
; W1 @8 w2 n- ]( w2 w0 {1 }4 m* `. {. P5 }, \, P
+ `% ]4 i" ^- x4 L说明当一个用户登录和注销时发生了什么。较详细地说明后台进程的各种交互、log文件、配置文件等
& R% D6 {1 B' @9 R& `
: W5 K2 D) I" w0 u6 @, Q* f 通过终端登录
. G4 x# w0 {" }: o/ s
# v5 _- S8 x, V v( Z9 ?! D) w# s
首先,init确认有一个getty
程序提供给终端连接(或控制台)。getty侦听终端等候用户告知它要登录(这通常意味着用户必然键入些什么)。当它注意到一个用户,getty输出一个欢迎
信息(存在/etc/issue中),并提示用户名,最后运行login程序。login作为一个参数得到用户名,并提示用户输入口令。如果正确,login启动给此用户设置的
shell;否则退出并终止进程(可能在再给用户一个机会输入用户名和口令之后)。init注意到进程终止,就给这个终端启动一个新的getty。
% l& n7 C; ~* y4 t
7 c" _, O5 j* `/ c& e" ? 注意唯一的新进程是由init产生的(用fork
系统调用);getty和login只是替代进程运行的程序(使用exec系统调用)。
9 N, \, B2 Z( @( \! n$ \ S
' W @' x( t" \
为注意用户,串行线需要一个单独的程序,因为终端活动时可以(传统上也是)变得复杂。getty也适应连接的
速度和其他设置,这对拨号连接特别重要,因为连接和连接的参数可能不同。
, ^ ]' g6 Y; j0 ]& I0 f7 r. p7 N. t" t
% Z" d- K7 z2 b6 s getty和init有多个版本在使用,各有优缺点。学习你的系统的版本也了解其他版本是个好主意(你可以用LinuxSoftwareMap来找。)如果你没有拨入,可能不必考虑getty,但init仍然很重要。
. D8 d. v L: ^ u& {8 w6 {4 P
' i' k9 k# R" w. C7 ?
通过
网络登录
6 Y1 L8 a, @; s I
* r0 Y8 r/ k# W0 o& y& ?& Q% a2 S( s: G 一个网络中的2台
计算机通常通过一个
物理电缆连接。当他们通过网络
通信是,参与通信的每个计算机里的程序通过虚拟连接virtualconnection通信,即一些虚构的电缆。虚拟连接的每端的程序,独占自己的(虚拟)电缆。然而,因为这电缆不是真的,只是虚构的,所有计算机的
操作系统可以在同一物理电缆上有多条虚拟连接。这样,只用一条电缆,多个程序可以不必考虑其他通信而相互通信。使用同一电缆使多台计算机是可能的;2台计算机间存在的虚拟连接,其他计算机会忽略他们不参加的连接。
5 [0 T5 @, u" [9 J2 X0 H1 C
5 T* f1 @: p, [: E/ r; Z. D 那是一个复杂和抽象的真实
描述。但可能足够理解网络登录与普通登录的不同的重要原因。不同计算机上的2个程序要通信时,虚拟连接建立。由于
理论上可能从网络上的任何一台计算机登录到任何一台计算机,因此可能有极大数量的潜在的虚拟通讯。因此,为每个潜在的login启动一个getty是不现实的。
5 Y! H4 _: ?" u0 a8 ^* i( t' Y$ K; C: B0 l0 E4 H
有一个进程inetd(与getty协同)处理所有的网络登录。当它发现一个进来的网络登录(即发现某台其他计算机来的新的虚拟连接),它启动一个新进程来处理那个登录。原来的进程继续侦听新的登录。
5 X2 `6 f/ s8 H
% x% [! @1 Z; Y2 r2 M( ^: W0 o% C5 h 更复杂的是,网络登录有多个通讯协议。2个最重要的协议是telnet和rlogin。除了登录,还有许多其他虚拟连接可能建立(为
FTP、
Gopher、HTTP和其他网络服务)。为要侦听的每种
类型的连接提供一个进程不是很有效,因此,只用一个侦听器来识别连接的种类,能启动正确的程序来提供服务。这个侦听器叫inetd;更多的信息请见《Linux
网络管理指南》。
$ n4 o) n0 s7 G
login干了些什么
7 z1 v0 U0 z& @
1 v$ ~* a3 y( M* B6 { login程序负责认证用户(确认用户名和口令相配),并建立串行线,启动shell,建立用户的初始
环境。
2 W7 R2 W7 s' h3 `9 @$ U* i: F8 b3 V X- t# C0 M4 R. K8 J
部分初始化设置是输出文件/etc/motd(每天的
短信息)的内容,并检查
电子邮件。可以在用户家目录中产生一个叫.hushlogin的文件来是上面所述的失效。
, b& P- R' Q1 w3 R# g! K# U8 H! G, O. ]5 K
如果存在文件/etc/nologin,就不允许登录。这个文件一般由shutdown及其相关的东西产生。login检查这个文件,如果这个文件存在,就拒绝接受登录。如果这个文件确实存在,login就会在退出之前,将它的内容输出到终端。
+ g, c; p- I' t/ k/ c t+ ^# M X9 n& Y/ w
login将所有失败的登录企图登记在系统log文件中(通过syslog)。它也登记所有的root的登录。这些都对跟踪入侵者有用。
& Y! ]6 k8 D8 f" J( s% w
: f3 c& w/ I. O3 b) _ 当前登录着的用户列在/var/run/utmp中。这个文件直到系统下次启动或关机前有效。系统刚启动时它被清空。它列出了每个用户和用户使用的终端(或网络连接),及一些有用的信息。who、w及其他类似的命令查看utmp文件得到都有谁登录着。
\, S- h) ?0 g/ ~* _8 i- Z/ L* h2 M$ z2 P5 x- J
所有成功的登录记录在/var/log/wtmp中。这个文件将无限制地增大,所以必须有规律的清除,例如有个每周的cron任务来清除它。last命令浏览wtmp文件。
: S' p9 b d; K4 V5 H) d5 h
* Q/ a d8 z2 H& y7 S% n
utmp和wtmp都是二进制格式(见utmp的man页);不幸的是,没有特殊的程序无法查看它们。
. z5 f8 P: `; m7 Y. T9 E6 [+ _0 a7 k* g8 _( i7 f" I
X和xdm
( Y7 n0 _4 O& w7 ^; G4 g" O
3 W6 Y7 K5 D0 m0 ~" O& V META:Ximplementsloginsviaxdm;also:xterm-ls
) G, d# v& m) M; n6 `/ K9 l
7 z n3 [) K4 T, X$ j8 K+ s6 E
存取控制
2 h; z! _; Q' U! w3 |$ I' f% K
% i1 N3 `" E. m# m/ g 用户
数据库传统上包含在/etc/passwd文件中。有些系统使用影子口令shadowpasswords,并把口令移到/etc/shadow中。许多计算机的场所可以用NIS或其他存储用户数据库的方法
共享帐户;它们可能也自动从中心位置复制数据库到所有其他计算机。
; _" Z( G- U3 A/ D, m( f
, N2 k1 E& X" @
用户数据库不仅包含口令,还包括有用户的其他信息,比如其真实姓名、家目录、登录shell等。这其他信息需要公用,使所有人都能读。因此口令是加密保存的。这有缺点,任何人取得加密的口令,可以用不同的加密方法猜试口令,而不用试着真正登录到计算机。影子口令试图用把口令移动到其他文件的办法避免这种情况,只有root能读(口令还是加密保存的)。However,installingshadowpasswordslaterontoasystemthatdidnotsupportthemcanbedifficult.
; P& s5 }' p, M$ _' ~, ?1 M: ?+ h
5 W/ o1 E% W! [6 i/ T 不管有没有口令,确认系统中的所有口令是好的是很重要的,即不易猜。crack程序可用于破解口令;任何可以精确地找到的口令都不是好的口令。同时crack可以为入侵者运行,也可由系统管理员运行以避免坏的口令。好的口令也可以被passwd程序强制实现;这样对
CPU周期来说很有效,因为破解口令需要许多计算。
o: [) o7 f) k4 o: {6 N% ^$ B; L7 Y8 y0 I) Y- e b1 L6 W
用户组数据库保存在/etc/group文件中;有影子口令的系统,是/etc/shadow.group。
7 P- Z( W1 e2 {! H$ D/ Z V8 M {- E% [5 o2 A
root通常不能通过更多的终端或网络登录,只能通过列在/etc/securetty文件中的终端登录。这使得必须能够物理存取这其中的一个终端。当然也可能通过任何终端用任何拥护登录,然后使用su命令变成root。
- @; ^ i& [6 O$ J! K
6 e& v0 N* U7 Q2 w1 w( ~ Shell启动
8 S& y9 v# I# J% P! t3 D5 h
$ b# U/ \) h O* h* F, T6 J( @9 ?' j 当一个交互的登录shell启动时,它自动执行一个或更多预定义的文件。不同的shell执行不同的文件;更多的信息见每个shell的文档。
f# L6 w! z" f9 `
L! a, h! q$ }# M4 P4 c9 j 多数shell首先运行一些全局文件,例如,Bourneshell(/bin/sh)和它引出执行的/etc/profile;另外,它们执行用户家目录中的.profile。/etc/profile允许系统管理员建立一个公用的用户环境,特别是建立PATH,以包括本地命令目录。另外,.profile允许用户通过覆盖按照自己的口味客户化环境,如果必要,使用确省环境。