说明当一个用户登录和注销时发生了什么。较详细地说明后台进程的各种交互、log文件、配置文件等
% a+ Z9 e: z5 k) b0 i- b
通过终端登录
' @* `# R' b: M ]" K& P8 j 首先,init确认有一个getty
程序提供给终端连接(或控制台)。getty侦听终端等候用户告知它要登录(这通常意味着用户必然键入些什么)。当它注意到一个用户,getty输出一个欢迎
信息(存在/etc/issue中),并提示用户名,最后运行login程序。login作为一个参数得到用户名,并提示用户输入口令。如果正确,login启动给此用户设置的
shell;否则退出并终止进程(可能在再给用户一个机会输入用户名和口令之后)。init注意到进程终止,就给这个终端启动一个新的getty。
/ }( U: ^! [8 n! C* i) x
2 |* W4 N) }/ r! R% P' c( o2 \" z' c 注意唯一的新进程是由init产生的(用fork
系统调用);getty和login只是替代进程运行的程序(使用exec系统调用)。
; ^/ | u1 O. C7 u3 W. d 为注意用户,串行线需要一个单独的程序,因为终端活动时可以(传统上也是)变得复杂。getty也适应连接的
速度和其他设置,这对拨号连接特别重要,因为连接和连接的参数可能不同。
' l8 V3 y' p+ B[color=#FFFFFF']
' D/ W7 v7 W* r/ A
7 z+ S1 z% d7 v& Y2 A4 g% R6 y8 T getty和init有多个版本在使用,各有优缺点。学习你的系统的版本也了解其他版本是个好主意(你可以用
LinuxSoftwareMap来找。)如果你没有拨入,可能不必考虑getty,但init仍然很重要。
- D! I3 J" E V5 x3 y7 g- j. z
通过
网络登录
1 W: F Q; R- K, _: d3 Q 一个网络中的2台
计算机通常通过一个
物理电缆连接。当他们通过网络
通信是,参与通信的每个计算机里的程序通过虚拟连接virtualconnection通信,即一些虚构的电缆。虚拟连接的每端的程序,独占自己的(虚拟)电缆。然而,因为这电缆不是真的,只是虚构的,所有计算机的
操作系统可以在同一物理电缆上有多条虚拟连接。这样,只用一条电缆,多个程序可以不必考虑其他通信而相互通信。使用同一电缆使多台计算机是可能的;2台计算机间存在的虚拟连接,其他计算机会忽略他们不参加的连接。
( b; k! u( I5 F! ]/ o[color=#FFFFFF']
' H# F9 V$ W, e4 z! r ^) O$ `5 L+ Z- G7 P3 m* d, o7 u
那是一个复杂和抽象的真实
描述。但可能足够理解网络登录与普通登录的不同的重要原因。不同计算机上的2个程序要通信时,虚拟连接建立。由于
理论上可能从网络上的任何一台计算机登录到任何一台计算机,因此可能有极大数量的潜在的虚拟通讯。因此,为每个潜在的login启动一个getty是不现实的。
% d8 U' F( c3 G$ Z: U, x( I! j
有一个进程inetd(与getty协同)处理所有的网络登录。当它发现一个进来的网络登录(即发现某台其他计算机来的新的虚拟连接),它启动一个新进程来处理那个登录。原来的进程继续侦听新的登录。
* H5 F# Q+ y( [! G" A. x 更复杂的是,网络登录有多个通讯协议。2个最重要的协议是telnet和rlogin。除了登录,还有许多其他虚拟连接可能建立(为
FTP、
Gopher、HTTP和其他网络服务)。为要侦听的每种
类型的连接提供一个进程不是很有效,因此,只用一个侦听器来识别连接的种类,能启动正确的程序来提供服务。这个侦听器叫inetd;更多的信息请见《Linux网络
管理指南》。
! @9 @9 K- ^+ S- q* s) C
login干了些什么
' s" n1 N8 l v% m
login程序负责认证用户(确认用户名和口令相配),并建立串行线,启动shell,建立用户的初始
环境。
1 ~, R) O X% ]7 g- l2 O 部分初始化设置是输出文件/etc/motd(每天的
短信息)的内容,并检查
电子邮件。可以在用户家目录中产生一个叫.hushlogin的文件来是上面所述的失效。
; V" l, H- I9 a% o 如果存在文件/etc/nologin,就不允许登录。这个文件一般由shutdown及其相关的东西产生。login检查这个文件,如果这个文件存在,就拒绝接受登录。如果这个文件确实存在,login就会在退出之前,将它的内容输出到终端。
% t a* S R# O f! m login将所有失败的登录企图登记在系统log文件中(通过syslog)。它也登记所有的root的登录。这些都对跟踪入侵者有用。
+ l2 z9 X/ d- [, q* y[color=#FFFFFF']
2 U4 j# F* E" F0 d' j/ Z0 d7 n' _9 n ^6 P) S' N' K
当前登录着的用户列在/var/run/utmp中。这个文件直到系统下次启动或关机前有效。系统刚启动时它被清空。它列出了每个用户和用户使用的终端(或网络连接),及一些有用的信息。who、w及其他类似的命令查看utmp文件得到都有谁登录着。
, p( K# i7 D/ X; H6 L W 所有成功的登录记录在/var/log/wtmp中。这个文件将无限制地增大,所以必须有规律的清除,例如有个每周的cron任务来清除它。last命令浏览wtmp文件。
$ q W$ n3 W2 }, @; ?. u utmp和wtmp都是二进制格式(见utmp的man页);不幸的是,没有特殊的程序无法查看它们。
+ H8 J6 n- n) U3 M- f
X和xdm
! ]1 P! w+ r" `' u
META:Ximplementsloginsviaxdm;also:xterm-ls
6 [ q7 j+ l# d. {5 M) S
存取控制
8 \+ c5 K3 _' e [* S[color=#FFFFFF']
' { N1 \" |$ G3 ?9 N' V
; i0 I7 t3 R2 ^% C- r 用户
数据库传统上包含在/etc/passwd文件中。有些系统使用影子口令shadowpasswords,并把口令移到/etc/shadow中。许多计算机的场所可以用NIS或其他存储用户数据库的方法
共享帐户;它们可能也自动从中心位置复制数据库到所有其他计算机。
$ ^) b+ q& ?/ `9 Y3 H4 N4 Q2 c
用户数据库不仅包含口令,还包括有用户的其他信息,比如其真实姓名、家目录、登录shell等。这其他信息需要公用,使所有人都能读。因此口令是加密保存的。这有缺点,任何人取得加密的口令,可以用不同的加密方法猜试口令,而不用试着真正登录到计算机。影子口令试图用把口令移动到其他文件的办法避免这种情况,只有root能读(口令还是加密保存的)。However,installingshadowpasswordslaterontoasystemthatdidnotsupportthemcanbedifficult.
4 Q0 w) ]* f1 H
[color=#FFFFFF']
1 S! T( A, ]2 _1 ?7 |5 h& L: J- Z3 `5 U
- ?; G# k, B" r9 m 不管有没有口令,确认系统中的所有口令是好的是很重要的,即不易猜。crack程序可用于破解口令;任何可以精确地找到的口令都不是好的口令。同时crack可以为入侵者运行,也可由系统管理员运行以避免坏的口令。好的口令也可以被passwd程序强制实现;这样对
CPU周期来说很有效,因为破解口令需要许多计算。
, n* ^2 u) P( [; ?( |& ]4 \
用户组数据库保存在/etc/group文件中;有影子口令的系统,是/etc/shadow.group。
( q- \; H; P+ \: Z
root通常不能通过更多的终端或网络登录,只能通过列在/etc/securetty文件中的终端登录。这使得必须能够物理存取这其中的一个终端。当然也可能通过任何终端用任何拥护登录,然后使用su命令变成root。
" H5 X: I& v) ?. n) j[color=#FFFFFF']
+ o0 ~1 i/ L4 R" I( w3 n3 j& u
& w5 i/ {% l9 w3 D* {9 h Shell启动
9 Q3 V) l$ K+ }, s* U 当一个交互的登录shell启动时,它自动执行一个或更多预定义的文件。不同的shell执行不同的文件;更多的信息见每个shell的文档。
' Y4 n# }: \3 l' l% {9 N1 x/ [
多数shell首先运行一些全局文件,例如,Bourneshell(/bin/sh)和它引出执行的/etc/profile;另外,它们执行用户家目录中的.profile。/etc/profile允许系统管理员建立一个公用的用户环境,特别是建立PATH,以包括本地命令目录。另外,.profile允许用户通过覆盖按照自己的口味客户化环境,如果必要,使用确省环境。