FreeBSD 60 架设管理与应用第四章 使用者管理.docx
《FreeBSD 60 架设管理与应用第四章 使用者管理.docx》由会员分享,可在线阅读,更多相关《FreeBSD 60 架设管理与应用第四章 使用者管理.docx(17页珍藏版)》请在冰豆网上搜索。
FreeBSD60架设管理与应用第四章使用者管理
FreeBSD6.0架设管理与应用
第四章使用者管理
FreeBSD是一个多重使用者的操作系统,在系统可有存在多个使用者。
使用者的管理可以说是系统管理最基本的议题,在系统一安装完成时,我们就必须进行使用者的新增及设定。
本章将介绍和使用者相关的管理知识,包括:
∙如何新增及删除使用者。
∙使用者及群组相关的重要档案设定。
∙如何限制系统资源(如硬盘空间)的使用。
∙如何备份及移转使用者数据。
∙大量新增账号。
∙记录使用者执行过的指令。
∙控制root的使用。
1
4.1账号管理
4.1.1新增使用者
新增使用者时,我们会以adduser这个指令来进行,adduser指令其实是将新增使用者所必须做的事写成一个执行档来自动帮我们做,在FreeBSD4.x是以perl所写成,而FreeBSD5.x改以shellscripts来实作。
为了了解系统对于使用者管理细节,让我们先回顾一下上一章关于使用adduser新增使用者的过程。
在4.x和5.xadduser指令的细节有一点不同,但大同小异。
#adduser
2Username:
jack
复制代码
3执行了adduser之后,首先要输入使用者名称,使用者名称除了英文字、数字及-_外不可以包含其它特殊字符。
Fullname:
Jack
复制代码
4接着我们要输入使用者全名,这个字段可以是空的,如果您不输入则直接按Enter即可。
Uid(Leaveemptyfordefault):
复制代码
5这个字段是使用者编号,直接留白按Enter即可,系统会自动指定。
Logingroup[jack]:
复制代码
6输入使用者群组名称,群组名称预设会自动产生一个和新增的使用者同名的群组,如果要使用不同的群组,必须先手动新增群组。
我们直接按Enter即可。
Logingroupisjack.Invitejackintoothergroups?
[]:
wheel
复制代码
7是否要将新的使用者加入其它群组,由于这是我们新增的第一个一般使用者,所以我们将它加入系统管理者wheel这个群组,让他可以使用su这个指令来切换身份成root。
Loginclass[default]:
复制代码
8登入的类别,这是用来分类控制使用者对于系统资源的使用,请参考下一节系统资源限制的说明。
在这里我们直接按Enter使用默认值即可。
Shell(shcshtcshnologin)[sh]:
tcsh
复制代码
9输入所要使用的Shell,建议输入tcsh,如果您不想让该使用者登入系统,可以输入nologin。
Homedirectory[/home/jack]:
复制代码
10输入使用者的家目录,也就是使用者在系统中的数据夹,所有使用者的目录我们都放在/home下,所以我们直接按Enter即可。
Usepassword-basedauthentication?
[yes]:
复制代码
11是否要使用密码认证的方式,预设为是,我们直接按Enter即可。
Useanemptypassword?
(yes/no)[no]:
复制代码
12是否要使用空密码,预设为否。
Usearandompassword?
(yes/no)[no]:
复制代码
13是否使用随机产生的密码,如果使用随机产生的密码,在新增完毕后,系统会告知我们产生的密码,预设为否。
Enterpassword:
复制代码
14输入该使用者的密码。
Enterpasswordagain:
复制代码
15再输入一次密码,以确认输入无误。
Lockouttheaccountaftercreation?
[no]:
复制代码
在新增完使用者后,是否要先将该账户关闭。
看了adduser指令的过程,您对于新增使用者应有的步骤应该已经有初步的了解了,接下来我们要介绍adduser这个指令到底做了哪些事。
∙在/etc/group中加入使用者的群组
∙在/etc/master.passwd中加入使用者
∙在/home中建立使用者目录,并建立dotfile
∙在/var/mail中建立使用者邮件目录
知道了以上的流程,我们也可以手动自己做上述的步骤,但我们必须先知道group及master.passwd等档案的格式。
所以我们接下来要介绍这些档案。
小提示
在旧版的FreeBSD中,adduser一开始会先问您使用者名称要符合怎样的规则,通常我们会直接按ENTER跳过,您要注意看清楚喔,不要在那个时候输入使用者名称,否则在新增使用者时可能会有问题。
如果您已经输入错了,可以将/etc/adduser.conf删除,就可以恢复原本的设定。
16
4.1.2/etc/group介绍
在使用者的管理方面,FreeBSD大致上可以分为群组管理及账号管理。
每一个账号至少属于一个群组,这样子有利于权限控制。
例如学生的账号就有一个学生群组,而老师的账号就属于教师群组,某几位老师属于管理者的群组。
这样一来,我们除了可以针对个人设定权限外,也可以针对不同群组给予不同的权限。
每个使用者预设都会有一个群组,这个预设群组是设定在/etc/master.passwd,我们会在下一小节中说明。
而您也可以将使用者加入其它群组中,这些其它加入的群组设定是在/etc/group中,在群组后面加上使用者名称即可。
/etc/group这个档案就是记录群组的档案,这是一个文字文件,我们可以使用ee等文字编辑软件打开它。
在group档案中,其格式如下:
wheel:
*:
0:
root,alex
17students:
*:
1000:
18teachers:
*:
1001:
19webadmin:
*:
1002:
alex,john,tom
复制代码
20每一个字段以冒号分开,以最后一行为例,第一个字段代表群组名称为teachers,而群组代号(gid)是1001。
我们可以自行使用文字编辑器加入想要的群组名称及gid,但要注意的是群组名称和gid不能重复。
第一行的最后面是root,alex,表示该群组成员。
由于记录使用者数据的档案中只能记录使用者的预设群组,如果使用者还属于其它群组,则必须记录在/etc/group中。
例如使用者alex的预设群组是alex,我们希望他同时是webadmin群组,则我们必须在webadmin群组后加上该使用者。
在FreeBSD中,如果其它使用者要能使用su变成超级使用者的话,必须将其账号加入wheel群组中。
新增群组时,除了可以使用文字编辑外,也可以使用指令pw来新增群组:
#pwgroupaddnewgroup
21#pwgroupshownewgroup
22newgroup:
*:
1002:
复制代码
23第一个指令是以参数groupadd来新增群组newgroup,再以参数groupshow来显示newgoup的信息。
4.1.3/etc/master.passwd介绍
FreeBSD使用shadowpassword的方式来保护密码文件,只有root才可以读取编码后的密码文件/etc/master.passwd。
但是这并不是系统用来验证的档案,为了加快速度,FreeBSD将该文件做成数据库/etc/spwd.db及/etc/pwd.db,因此在修改完master.passwd后,必须使用指令pwd_mkdb来将master.passwd做成数据库档案。
不过一般而言,我会使用vipw这个指令来修改master.passwd,vipw会先将master.passwd以预设的文书编辑软件打开,修改完存盘后,它会视需要自动更新数据库。
如果您没有修改过~/.cshrc,则预设的文书编辑软件是vi。
vi在使用上比较复杂,如果您要离开编辑器,请依序按[Esc]:
q!
再按Enter即可不存档离开。
关于vi的用法,您可以参考第三章相关章节。
在执行vipw之后,会出现:
#$FreeBSD:
src/etc/master.passwd,v1.25.2.62002/06/3017:
57:
17desExp$
24#
25root:
$1$94sxalyM$w1lBLBGAsRPfdVciGqNfL/:
0:
0:
:
0:
0:
Charlie&:
/root:
/bin/tcsh
26toor:
*:
0:
0:
:
0:
0:
Bourne-againSuperuser:
/root:
27daemon:
*:
1:
1:
:
0:
0:
Ownerofmanysystemprocesses:
/root:
/sbin/nologin
28operator:
*:
2:
5:
:
0:
0:
System&:
/:
/sbin/nologin
29bin:
*:
3:
7:
:
0:
0:
BinariesCommandsandSource:
/:
/sbin/nologin
30tty:
*:
4:
65533:
:
0:
0:
TtySandbox:
/:
/sbin/nologin
31kmem:
*:
5:
65533:
:
0:
0:
KMemSandbox:
/:
/sbin/nologin
32games:
*:
7:
13:
:
0:
0:
Gamespseudo-user:
/usr/games:
/sbin/nologin
33news:
*:
8:
8:
:
0:
0:
NewsSubsystem:
/:
/sbin/nologin
34man:
*:
9:
9:
:
0:
0:
MisterManPages:
/usr/share/man:
/sbin/nologin
35sshd:
*:
22:
22:
:
0:
0:
SecureShellDaemon:
/var/empty:
/sbin/nologin
36smmsp:
*:
25:
25:
:
0:
0:
SendmailSubmissionUser:
/var/spool/clientmqueue:
/sbin/nologin
37mailnull:
*:
26:
26:
:
0:
0:
SendmailDefaultUser:
/var/spool/mqueue:
/sbin/nologin
38bind:
*:
53:
53:
:
0:
0:
BindSandbox:
/:
/sbin/nologin
39uucp:
*:
66:
66:
:
0:
0:
UUCPpseudo-user:
/var/spool/uucppublic:
/usr/libexec/uucp/uucico
40pop:
*:
68:
6:
:
0:
0:
PostOfficeOwner:
/nonexistent:
/sbin/nologin
41www:
*:
80:
80:
:
0:
0:
WorldWideWebOwner:
/nonexistent:
/sbin/nologin
42nobody:
*:
65534:
65534:
:
0:
0:
Unprivilegeduser:
/nonexistent:
/sbin/nologin
43tom:
Bk5AI4MiRKCJ2:
1000:
1000:
:
0:
0:
TomChang:
/home/tom:
/bin/tcsh
复制代码
44master.passwd这个档案内容中,每个使用者都是独立的一行,每个字段使用冒号分开,它的格式是:
name:
password:
UID:
GID:
class:
change:
expire:
fullname:
home:
shell
复制代码
每个字段的说明如下:
∙name:
使用者账号名称,也就是您login时所需输入的名字。
使用者名称长度最长可以是16个字符,但如果您要使用NIS,则最多只可以使用8个字符。
每个使用者名称不可重复。
而且使用者名称中只能包英文字、减号"-"、底线"_"、及数字,而且最好不要使用大写的英文字,而开头的第一个字也不可以是减号"-"。
在master.passwd这个档案中,每个字段都不可以使用冒号":
",因为冒号是用来分割字段的特殊符号。
∙password:
可以是空的,代表不用密码就可以登入,这样很危险;也可以是*,表示不可以登入;上面vipw显示出来的项目中,以使用者root而言,他的密码是使用MD5编码过的,特征是开头为$1且看起来比较长;而使用者tom的密码是使用DES编码过的,DES会将密码编成一串13个字符的符号。
FreeBSD预设使用比较安全的MD5编码,但您也可以修改/etc/login.conf以设定某些使用者改用旧的DES编码。
∙UID:
使用者代号,每个使用者都不一样,不可重复,如果有多个账号使用同样的UID,FreeBSD会将它当成同一个账号。
编号从0到65535。
UID0为系统中超级使用者的代号,内定只有root和toor的UID为0。
toor账号是bash所建立的使用者,内定不能使用该使用者登入。
∙GID:
群组代号,编号从0到65535。
∙class:
除了群组外,class是更有弹性的控制方法,可以针对/etc/login.conf中不同的使用者设定来调整每个使用者的可使用的资源设定。
∙change:
强迫使用者变更密码的时间,以从1970年到所要变更日期所经过的秒数来表示。
你可以使用date+%s来求出从1970年到现在时间所经过的秒数,每天为86400秒,以现在时间的秒数加上86400*天数即为你要设定的时间。
你可以使用指令下列指令来取得30天后的秒数,再将其填入即可。
若设为0则表示不使用此功能:
44expr`date+%s`+86400\*30
复制代码
∙expire:
账号的有效日期,一样是以从1970年到到期日所经过的秒数来代表。
若设为0则表示不使用此功能。
∙fullname:
使用者全名,你可以在此键入真实姓名。
请注意这个字段也不可以使用冒号哦。
∙home:
使用者的家目录,即使用者登入后的所在目录。
∙shell:
使用者的shell。
如果使用/sbin/nologin表示该名使用者不可以登入。
我们可以看到在master.passwd中已经有许多使用者,这些使用者是系统服务的使用者。
例如smmsp是邮件服务器的daemon所使用的使用者名称。
nobody这个使用者是预设无任何权限的使用者,但有很多系统服务软件的预设使用者都是nobody,我们应该要注意不要以nobody负责为太多服务,否则它不就变成了拥有许多权限的使用者了吗!
4.1.4删除使用者
知道了新增使用者的步骤后,您大概已经知道要怎么删除使用者了吧。
只要把新增使用者的步骤反过来即可。
∙如果该使用者有设定使用定时排程的工作,如crontab或at,则先将它移除。
crontab的工作排程会被放在/var/cron/tabs/username,而at的工作排程则放在/var/jobs/username中。
∙如果该使用者有正在执行的程序,则送出SIGKILL给该行程以将它停止。
∙以vipw移除让使用者在/etc/master.passwd中的账号。
∙使用者的家目录/home/username,使用指令rm-rf/home/username。
∙再移除使用者邮件目录/var/mail/username。
∙如果暂存的目录中(/tmp及/var/tmp)有该使用的暂存盘,则将它移除。
∙若该使用者所属群组已无人使用,则编辑/etc/group来移除群组。
45
以上这些步骤其实就是指令rmuser所做的事。
我们可以使用这个指令来快速的移除使用者账号。
以下即为rmusertest的执行结果:
Matchingpasswordentry:
46test:
J7kPK0pKTn2oQ:
1001:
1001:
:
0:
0:
Tom:
/home/test:
/bin/tcsh
47Isthistheentryyouwishtoremove?
y→真的要移除这一个使用者吗?
48Removeuser'shomedirectory(/home/test)?
y→是否要移除使用者家目录?
49#移除使用者正在执行的程序及更新系统数据
50Removinguser'satjobs:
Updatingpasswordfile,updatingdatabases,done.
51#移除使用者群组
52Updatinggroupfile:
(removinggrouptest--personalgroupisempty)done.
53#移除使用者家目录
54Removinguser'shomedirectory(/home/test):
done.
55#移除使用者信件
56Removinguser'sincomingmailfile/var/mail/test:
done.
57#移除使用者暂存目录
58Removingfilesbelongingtotestfrom/tmp:
done.
59Removingfilesbelongingtotestfrom/var/tmp:
done.
60Removingfilesbelongingtotestfrom/var/tmp/vi.recover:
done.
复制代码
614.2系统资源限制
如果您的FreeBSD系统允许多位使用者同时使用,每个使用者可能同时执行许多工作,例如Alex可能会执行庞大的数学运作程序,而Tom在系统中执行占用海量存储器的数据库程序。
如此一来,我们的系统资源将全部被几个使用者耗尽,其它正常的系统服务便无法拥有较高的效能。
我们不能单纯的假设系统中所有使用者都会乖乖的使用单纯的服务,因此,在一个多重使用者的环境中,系统管理者有必要针对每个使用者限于他们所可以使用的系统资源,例如CPU、内存、磁盘空间的使用量等。
4.2.1登入类别
我们在新增使用者时会设定使用者的loginclass,所谓的loginclass就是将使用者分类管理,以限制不同类别的使用者对于系统资源的使用。
/etc/login.conf定义了不同的loginclass。
这个档案中所有对于使用者限制的设定都是以key=value的方式来表示。
这些限制大部份是针对某个使用者所执行的某一个行程(process)所能占用的资源,而非该使用者全部执行的行程所占用的资源总合。
因此,除了每个行程所能占用的资源外,我们还会设定使用者最多可以执行多少个行程。
以下为/etc/login.conf中关于defaultclass的设定:
#defaults
62#Thesesettingsareusedbylogin
(1)bydefaultforclasslessusers
63#Notethatentrieslike"cputime"setboth"cputime-cur"and"cputime-max"
64
65default:
\
66:
passwd_format=md5:
\
67:
copyright=/etc/COPYRIGHT:
\
68:
welcome=/etc/motd:
\
69:
setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:
\
70:
path=/sbin/bin/usr/sbin/usr/bin/usr/games/usr/local/sbin
71:
nologin=/var/run/nologin:
\
72:
cputime=unlimited:
\
73:
datasize=unlimited:
\
74:
stacksize=unlimited:
\
75:
memorylocked=unlimited:
\
76:
memoryuse=unlimited:
\
77:
filesize=unlimited:
\
78:
coredumpsize=unlimited:
\
79:
openfiles=unlimited:
\
80:
maxproc=unlimited:
\
81:
sbsize=unlimited:
\
82:
vmemoryuse=unlimited:
\
83:
priority=0:
\
84:
ignoretime@:
\
85:
umask=022:
86
复制代码
以下为关于系统资源限制的字段说明,每一个字段都有可使用的数值类型,例如size、time等,让我们来看看每个字段的说明:
字段名称
数值类型
说明
coredumpsize
Size
当使用者所执行的程序出了问题(coredump),系统会将该程序的执行状况从内存中写到硬盘上,这个值就是在限制corefile的档案大小。
如果使用者所执行的程序是需要消耗许多内存的程序,则所产生的corefile也会很大。
这个值不应该比使用者的磁盘配额限制大。
cputime
Time
这是一个行程所能使用的最长CPU时间,这个时间指的不是我们在top或ps中看到的CPUusage百分比,而是一个行程所使用的CPU时间。
当超过时间,系统核心会自动停止该行程。
filesize
Size
使用者单一档案的最大容量。
我们对于使用者磁盘配额只能限制使用者对于硬盘的使用总额,而这个设定可以限制单一档案的大小。
maxproc
Number
限制使用者最多可以执行的行程总量。
这个限制包含所有以该使用者名称所执行的程序,有的程序在执行时,会自动产生许多子行程,如果这个值设定的太小,可能会造成使用者的困扰。
memorylocked
Size
FreeBSD系统中有所谓的虚拟内存空间,当物理内存不足时,系统会将某部份的内存数据放到虚拟内存中。
而有的程序会使用mlock()这个系统呼叫要求系统将它所占用的内存空间全部放在物理内存中,memorylocked就是限制使用mlock()的内存大小。
memoryuse
Size
限制行程最大的内存使用量,包含物理内存及虚拟内存。
openfiles
Number
限制使用者同一时间最多可以开启的档案数量。
所谓的档案数量包含了一般的档案及socket。
sbsize
Size
用以限制最大的网络缓冲区的使用量。
stacksize
Size
行程可使用的最大堆栈(stack)空间。
以下为上表中数值类型的说明:
类型
说明
Size
我们可以单纯的以数字来表示Size,预设的单位是byte。
例如1234表示1234bytes。
除此之外,我们也可以在数字之后加上单位。
例如:
b:
表示512-byteblock