分类:
2010-06-23 10:57:41
在 Linux系统中,主要使用/etc目录下的两到三个文件来维护用户及用户组(一种类型的用户可以分在一个用户组中)的相关信息。/etc /passwd文件中存放关于账户相关的信息,/etc /group文件中存放关于用户组相关的信息资料,大部分Linux系统(例如,Redhat Linux 最近几年发行的版本)都使用/etc/shadow文件来存放用户的加密口令。
通过手工编辑这三个文件,系统管理员可以对系统中的用户及用户组进行有效的添加和管理。当然,通过使用传递信息到这些文件的命令行或是利用像Linuxconf一样的GUI工具也可以达到同样的目的。不过,希望大家对这三个文件中的内容和格式要仔细的了解一下,这样才能对Linux系统用户管理原理有更深刻的认识。
每位用户的相关信息都存放在/etc/passwd文件中,作为一个系统管理员,清楚的了解这个文件的内容和以及内容的格式是非常关键的。下面运行vi命令后显示的信息是passwd文件的部分内容:
[root@lab root]# vi /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
:
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
zyn:x:500:500::/home/zyn:/bin/bash
xzh:x:501:501::/home/xzh:/bin/bash
lab:x:503:502::/home/lab:/bin/bash
xyd:x:504:503::/home/xyd:/bin/bash
大家可以看到 超级用户(root账号)的信息列在第一行,用户root常被指定用户ID(UID)0和组ID(GID)0; 与进程和服务相关的特殊用户账号,会被列与root之后,并且常常拥有低于500的UID和GID值;而新建立的普通用户,会被列于上面这些特殊账号之后,并且拥有的UID和GID值,从500数值开始,以用户建立的先后顺序累计加1。下面我们以root账户这一行的信息为例,介绍此行每一段信息的含义:root:x:0:0:root:/root:/bin/bash
要注意到root用户这行信息(和/etc/passwd文件中其它行信息)都用冒号将信息分隔成7个区域。这7个区域代表的含义为:用户名(Longin Name)、加密密码(Encrypted Password)、用户ID (UID)、用户组ID (GID)、用户信息(User Info)、用户主目录(Home Directory)以及登陆shell(Login Shell)。
我们可以参看下面的图6-1:
1 2 3 4 5 6 7
用户名|加密密码|用户ID|用户组ID|用户信息|用户主目录|登陆shell
图6-1
(1) 用户名(Longin Name):/etc/passwd文件中的用户名称必须是唯一的,而且不能超过8个字节,用户名虽然可以大小写混合,但一般而言,为了避免大小写字母互相混淆,平常的情况下都用小写来表示。
(2) 加密密码(Encrypted Password):从技术上讲,该字段是接收用户口令的,Linux系统使用了隐藏口令方式(shadow passwdors),
口令存放在文件/etc/shadow中。因此在文件的第二区域中,用
x符号来表示,作为登陆的指示,实际的口令却隐藏了起来。
(3) 用户ID(UID):与系统启动的进程相互联系,通常它是某个用户启动程序的UID,就像当人们办理某种手续时,需要本人的身份证号一般。
(4) 用户组ID (GID): 每一个用户正常情况都属于某一个组,也可以同时指定多个群组。例如root用户登陆时,所有的文件都由root用户和root组同时拥有。
(5) 用户信息(User Info):这个区域是有关用户的描述信息,在这里可以写上用户的姓名、电话或住址等,用Finger命令可以去读出这个地方的资料,当然用户可以用手工方式去更改,或是也可用chfn命令来改变这项内容。
(6) 用户主目录(Home Directory):用户通过验证后,Login程序就利用此区域的信息,将用户指定到/home/$USERNAME的目录中。
例如:当root用户登陆后,默认指定到/home/root的目录中。
(7) 登陆shell (Login Shell):这个区域会设置用户所使用的shell环境(关于shell 的概念将会在本书的第十三章讲解),一个新用户登陆的shell将会默认设置为/bin/bash,即Bourne shell。当然管理员可以改成csh或tcsh,用户也可执行chsh改变自己的Login Shell。当然如果用户不需要登陆系统,我们可以将此区域设置为不可登陆的信息。
/etc/shadow文件主要是用来隐藏用户口令的文件,因为/etc/passwd文件是从系统中存储的UID和GID中获取用户名和组名,所以该文件对于系统中的任何人来说都是可读的,这样任何人都可以将一位用户的加密口令串复制出来,并利用一些字典对照、编码转换的工具,很容易就可以将其他用户的口令破解出来。为了消除这种安全隐患,便使用隐藏(shadow)的技术,系统通过将/etc/passwd文件重定位口令到另外一个文件中,就是我们说的/etc/shadow文件,进行口令的隐藏,只有root用户才能对此文件进行读写,这样就避免了刚才所说的现象。例如,经过隐藏后,/etc/passwd文件中的root这一行将变成如下:
root:x:0:0:root:/root:/bin/bash
其中root用户的口令被用x来代替,已表示隐藏。而/etc/shadow文件中包含了root用户口令的被加密的版本以及其他一些信息,如下:
root:$1$NM5JS82Z$W0.E2AFQsKiTQN1/JbqG41:12309:0:99999:7:::
像root用户在/etc/passwd文件中显示的一行信息类似,在/etc/shadow文件中也用冒号将每一行用户口令的信息分隔成几个区域。我们用下面的图6-2表示如下:
1 2 3 4 5
用户名|加密口令|上次更新时间|允许更改时间|要求更改时间|取消口
6 7 8 9
令之前的警告时间|取消和停用之间的时间|账户终止时间|特殊标志
图6-2
上面这9个区域中,每个区域含义如下:
(1) 用户名:用户的账户名称,与/etc/passwd文件中的内容相互匹配。
(2) 加密口令:这是利用隐藏口令的技术,将加密口令串存放的区域。
(3) 上次更新时间:表示自1970年1月1日以来至最后一次更改口令的天数。
(4) 允许更改时间:表示现在到下次允许更改口令的天数,一般设置为0,以便用户可以随时更改口令。
(5) 要求更改时间:表示用户被迫要求更改口令之前距今的天数,一般设置为99999,代表不强制更改口令。
(6) 取消口令之前的警告时间:表示系统在取消用户口令之前,要提前通知用户的天数,一般设置为7,代表提前1周通知用户。
(7) 取消和停用之间的时间:表示用户账户到期至系统自动取消用户口令的天数,一般设置为-1或空白,代表不使账户自动取消。
(8) 账户终止时间:表示自1970年1月1日以后的账户将被终止的天数,此项对于系统中类似学校毕业生,兼职人员的用户的设置是很有用的。但一般设置为-1或空白,代表不使用自动失效的方式来终止用户账户。
(9) 特殊标志:此区域预留为了将来使用,一般设置为空白。
请大家熟悉掌握shadow文件每一个区域的含义,这样可以很方便的进行用户密码的监视、管理和主动通知。此外口令是最重要的单个用户标识符。通过它,系统可验证一个账户的身份,以便允许该用户访问系统。由于口令在被使用、存储或已知的情况下容易泄露,因此必须始终秘密保存和账户配置相关的文件。
应用实例:注意/etc/shadow文件的保护
虽然/etc/shadow文件可以隐藏用户的口令,但是如果此文件被黑客非法获取,通过一些破解密码的crack工具,黑客也可以将系统中用户的密码获取。简单的举个例子,例如使用一款叫做John The Ripper的crack工具,可以非常奏效的破译Linux或Unix系统的密码文档,很多主机当文件passwd或shadow文件因为某种原因外泄后,黑客们就用类似这种破译密码的工具将主机系统中的所有账号和密码破解,从而导致这些被非法用户获得passwd或shadow文件的主机完全被非法用户控制。
John The Ripper的运行方法:首先将加密的passwd和shadow文件进行整合,命令如下:
# cd john-1.6/run/
# ./unshadow/etc/passwd /etc/shadow > passwd.1
上面的命令行运行后,就可以将passwd和shadow文件进行整合,并输出一个名为 passwd.1 的文件,这是一个未经过shadow加密的密码文件,下面对于这样的文件就很容易破解了。例如继续使用命令:
# cd john-1.6/run/
# ./john passwd.1
然后,只需耐心等待,就会显示类似下面的内容:
Loaded 7 passwords with 6 different salts(Standard
DES [32/32 BS])
mike (mike)
123456 (yani)
hellobeida (root)
上面右边一列是系统的用户名,左边一列就是用户的密码了(如果John The Ripper和密码字典结合使用,那么威胁更大)!
可见,系统中的shadow文件,包括passwd文件如果不幸泄漏,那将面临很大的危险。我们平时一定要注意保护好这些文件,不要将这些文件的信息泄漏给其它非管理系统的用户。例如利用我们可以使用chmod命令将这两个文件的读写权限只授予root用户。命令行如下:
# chmod 600 /etc/shadow /etc/passwd
每个用户组的相关信息都存放在/etc/group文件中,和/etc/passwd文件一样,清楚地了解这个文件的内容和以及格式对一个系统管理员来说是非常重要的。下面运行vi命令后显示的信息是group文件的部分内容:
[root@lab /]# vi group
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
tty:x:5:
disk:x:6:root
lp:x:7:daemon,lp
mem:x:8:
kmem:x:9:
wheel:x:10:root
mail:x:12:mail
news:x:13:news
users:x:100:
zyn:x:500:
xzh:x:501:
lab:x:502:
xyd:x:503:
命令添加用户
使用useradd或是adduser命令可以添加用户,这两个命令的功能和参数完全一样,我们使用ls–l命令操作,那么会发现adduser只不过是指向useradd命令的一个符号链接。我们利用useradd命令的基本的语法如下:useradd + [用户名],例如:
# useradd mike
# useradd tom
上面的两条命令,分别建立了名为mike和tom的例两个用户。此时系统向用户mike和tom各自分配一个可用的用户ID(UID),并分配一个与用户名相同的用户组ID(GID),并在/home目录下创建各自的用户主目录为/home/mike以及/home/tom,最后指定一种默认的shell。以上这些过程是由/etc/default/useradd的文件指定默认的,当然我们可以对此文件修改,不过只有root用户才可以操作。该文件的具体内容如下所示:
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
从上面的内容可以看出,添加用户时,创建的新用户的用户主目录默认的前缀为/home,默认的shell为/bin/bash,出现在用户主目录中的内容是从/etc/skel 目录中复制过来的,这是一个模型目录,用来作为一种默认的框架,useradd命令用这种框架来决定为新用户创建那些文件。当然改命令还有其他一些常用的参数选项,如下所示:
-d : 指定用户主目录。
-u : 可以指定用户ID。
-g : 可以指定用户组。
-G : 指定用户组列表,如:student1、student2 ……
-mk : 复制其他用户主目录下的文件和配置信息来创建用户。
举例:
# useradd -d /student joan
# useradd -g student mike
# useradd -mk /home/joan tom
# useradd -G student1 student2 martin
上面的首行命令选-d参数来表示创建用户joan时,指定他的用户主目录为/student目录;第二行命令选用-g参数表示创建用户mike时,指定mike用户属于student组;接着下面一行的命令选用-mk参数,指创建用户tom,并让他得到的文件与配置信息和用户joan的主目录下现有的文件和配置信息相同。最后一行命令,选用-G参数时,创建用户martin,并将此用户归为student1和student2的用户组中。
注意:
使用useradd命令添加用户后,如果不使用passwd命令为用户设置密码,此用户将无法登陆。
手动添加用户
前面介绍的内容是采用Linux的用户管理命令来添加用户,然而通过编辑用户账号文件也可以添加用户,不过这种方法较为复杂,而且操作过程中容易出现失误,可能导致系统所有用户无法登陆,所以,只有对于熟练的系统管理员才建议这样去做。完整的手动用户添加方法如下:
步骤一:首先要使用vi命令编辑/etc/passwd文件,并加入下面这一行:
用户名:加密密码:用户ID:用户组ID:用户信息:用户主目录:shell
比如添加mike用户,运行vi /etc/passwd命令行后,加入如下信息:
mike:500:100::/home/blue:/bin/bash
注意:
(1) 加密密码区域不要填写任何内容。
(2) 用户ID是唯一的,不要和其它用户ID重复。
(3) 用户主目录一定要在下面的步骤中建立,否则用户无法登陆。
(4) 如果要添加新的用户组,需要编辑/etc/group文件。
步骤二:在编辑/etc/passwd文件之后,要建立用户的主目录/home/username,并用chown/chgrp这两个命令设置用户主目录的权限,具体命令如下:
# cd /home
# mkdir mike
# chown mike /home/mike
# chgrp student /home/mike
步骤三:如果密码是经过shadow隐藏并加密的,首先需要执行一下pwconv命令,此命令将更新和创建/etc/shadow文件,使其与/etc/passwd文件同步,让两个文件的条目相符,并以便把新加的密码转换成正确的格式存放在shadow文件中;然后需要执行passwd username 命令行,为用户添加密码。具体命令如下:
# pwconv
# passwd mike
Changing password for user mike
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully
这样密码设置完成后,就可以使用mike账户进行登陆了。以上就是完整的手动添加用户操作。
批量添加用户
在上面的内容中给大家介绍了命令添加用户、手动添加用户添加用户的方法,做为一名系统管理员可以有效的添加某个系统用户。但是,如果某个企业需要添加大量用户时,上面的操作方法将将会需要重复很多次,大大降低了管理员的工作效率,这时我们可以使用批量加入新用户的newusers命令,并结合手工编辑的账户文件和密码文件来一次完成任务。例如下面的实例:
应用实例:一次批量添加100个用户
例如,我们需要一次建立名为u01至u100的普通系统用户。我们首先手工编辑需要添加用户的帐号文件,每一行须按密码文件的格式书写。(在编辑过程中,请熟练使用vi编辑器的拷贝复制功能来大量产生)
为了方便记忆,我们编辑的帐号文件可以名为:new_users,编辑后的内容如下:
u001::600:600:student001:/home/u001:/bin/bash
u002::601:601:student002:/home/u002:/bin/bash
u003::602:602:student003:/home/u003:/bin/bash
u004::603:603:student004:/home/u004:/bin/bash
……
u099::604:604:student099:/home/u099:/bin/bash
u100::605:605:student100:/home/u100:/bin/bash
然后使用批量添加用户的newusers命令,并执行pwunconv命令,此命令可以根据/etc/shadow和/etc/passwd文件建立新的/etc/passwd文件,并删除旧的/etc/shadow文件。命令行如下:
# newusers < new_users
# pwunconv
??
命令执行后,此时我们可以查看/etc/passwd,发现u01至u100的用户信息已经被添加。接下来我们还需要编辑一个密码对照文件,用来给这些新添加的用户授权口令,并恢复/etc/shadow文件,比如密码对照文件可以名为new_password,添加如下信息:
??u001:1q2w3e
u002:1q2w3e
u003:1q2w3e
u004:1q2w3e
……
u099:1q2w3e
u100:1q2w3e
??
上面信息中左列为用户名,右列为这些用户相应的密码,这里假设密码都设置为“1q2w3e”,然后我们执行chpasswd命令,此命令可以从标准输入读取用户名及其密码的信息,并用这个信息更新一组现有的用户信息:
??
# chpasswd < new_password
??
最后我们执行 pwconv命令,这个命令会根据/etc/passwd文件建立新的/etc/shadow文件,命令行如下:
# pwconv
经过上面几步的操作,100个用户添加完毕,测试一下,使用u001用户,密码为“1q2w3e”登陆系统,提示成功。这样我们就一次完成批量添加100个用户的任务了。
当我们需要添加单个服务的用户,例如电子邮件用户、FTP用户时不需要给这种类型的用户授予系统登陆的权限,所以在添加账户时,还需要手工修改/etc/passwd文件中用户登陆shell的区域。关于电子邮件用户和FTP用户帐户的具体添加方法,请阅读《Linux网络管理》相应的章节。
应用实例:禁止FTP用户的登陆
对于FTP用户本身而言,如果不需要登陆系统来工作,并不必指定一个Login Shell,这样可以通过修改用户登陆shell的区域,屏蔽FTP用户的登陆。我们将Login Shell的区域改为/bin/false或/sbin/nologin的信息,这样FTP用户被禁止登陆。例如修改passwd文件的信息如下所示:
mike:x:500:100::/home/mike:/sbin/nologin
提示:
nologin的意思就是指定用户mike没有任何Shell 控制台登陆的权限。当用户mike试图以本地login或远程telnet程序登录系统时,会因为没有授予登陆权限而被禁止。
禁止邮件用户的登陆
通过修改用户登陆shell的区域,我们可以屏蔽用户的登陆。在此值得一提的用法是如果企业中有大量用户需要通过POP Mail Server收信,而对于一位POP用户或虚拟的POP用户,根本不需要登陆系统来工作,即不需要指定一个Login Shell,例如我们可以将Login Shell的区域改为/bin/false的信息。这样这些邮件用户被禁止,从而无法使用Ftp或Telnet命令来登陆系统,修改passwd文件的信息如下所示:
mike:x:500:100::/home/mike:/bin/false
提示:
False的意思就是指定用户mike没有任何Shell可以使用。当用户mike试图以telnet或ftp程序登录系统时,会因系统没有给他指定任何的Shell来执行,而被禁止。
做为管理员,我们可以使用 passwd 命令来修改用户的密码,语法如下所示:
语法:passwd username
只有 root 用户可以用 passwd 修改其他用户的密码。输入完命令后,系统将提示您输入并确认您要设置的密码。如果两次输入一致,用户的标识就会更新,密码修改成功。从控制台输入 passwd,用户可以修改自己的密码;在这种情况下,系统会向用户询问原来的密码,验证通过后才可以输入新密码。
大多数的 Linux 发行版本安装时都会启用 password cracker 模块,用于修改密码。这个模块将检查密码是否遵循了良好的密码设置习惯。如果用户使用了不安全的密码,它将自动警告用户。您可以将系统配置为要求用户必须使用安全的密码。root 在设置不安全的密码时也会被警告,但是仍然可以设置成功。
如果是普通用户,也可以使用这个命令来改变自己的口令,但只能用不带参数的passwd命令修改自己的口令。
该命令的使用方法如下:
# passwd
在(current) UNIX passwd:下输入当前的口令
在new password:提示下输入新的口令(在屏幕上看不到这个口令):
系统提示再次输入这个新口令。
输入正确后,这个新口令被加密并放入/etc/shdow文件。选取一个不易被破译的口令是很重要的。
选取口令应遵守如下规则: 口令应该至少有六位(最好是八位)字符,应该是大小写字母、标点符号和数字混杂的。
在Linux中,我们还可以通过使用/etc/shadow文件中的设置来对密码的使用进行管理。该文件的组成说明如下:
loginID:password:lastchg:min:max:warn:inactive:expire:
loginID – 包含用户的登录名
password – 加密后的密码,总共有13个字符,如果是字符串*LK*,表示该帐号已经被Locked住了,需要Unlock才能使用。如果为字符串NP,表示该帐号没有密码。不要指望从加密后的字符串来得到密码明文,一般这个过程都是不可逆的。
lastchg – 说明自January 1, 1970到最近一次密码修改时间之间的天数;一般都是6000多。
min – 密码两次修改之间的最少天数
max – 最大天数
warn – 密码失效是给出警告的天数
inactive – 在用户帐号锁住之前允许的非激活天数
expire – 用户无效日期
最后一个是保留域,供将来使用的
我们可以利用“min”、“max”、“warn”中的天数来对用户使用密码的行为进行限制。如在这里输入7:21:14,可以规定一个新密码最短需要使用7天后,才可以进行更改;使用21天之后必须更改;在使用了14天之后,会提到系统“可以更改密码”的提示信息。
通过使用usermod命令,我们可以修改默认设置各项用户属性,例如:用户ID、用户组、用户主目录、shell、账号过期日期等。改命令的具体格式如下:
usermod [-选项] [参数] 用户名
下面介绍usermod命令一些常用的参数(详细的参数请使用man命令查看):
-d : 修改用户主目录。
-e : 修改用户过期日期。
-g : 修改用户组名。
-G : 修改户组列表名,如:student1、student2 ……
-s : 修改用户登陆shell。
-u : 修改用户ID。
举例:
# usermod -g tom mike
# usermod -d /home/tom joan
# usermod -s /bin/csh mike
看来usermod命令与useradd命令有些相似,第一行命令可以将mike用户的组名改为tom用户组;下面一行命令会将joan用户的主目录修改为/home/tom;最后一行命令将mike的登陆shell修改为/bin/csh环境(csh指 C shell)。当然上面这些操作通过手动修改账户配置文件的方法也可以完成。
如果需要将用户的账户失效,但又觉得可能以后此用户还会用到,那么我们可以将用户账户禁用,而不是删除。禁止某一个用户继续使用系统,最简单的方法就是确保用户口令终止,我们可以手工更改/etc/shadow文件中的账户终止时间字段区域。就像前面介绍的一样,这个字段中的日期是自1970年1月1日以后的账户将被终止的天数,而shadow文件中第三个子段区域表示表示自1970年1月1日以来至最后一次更改口令的天数。所以,我们首先变更用户的口令,然后第三字段将显示出新的日期数字。将该数字减1,并在账户终止时间字段区域(第八区域)插入运算的结果,然后保存文件即可。
tom:$1$pwRQlmhs$dMEwbK40Gu/U:12311:0:99999:7:::
将12311减去1得到12310,然后将上面信息改成下面的内容,就可以将用户tom禁用,如下:
tom:$1$pwRQlmhs$dMEwbK40Gu/U:12311:0:99999:7::12310:
有时我们需要禁止一个用户账户,而不是删除它,此时可以这样做:在etc/passwd文件中关于这个用户的passwd域的第一个字符前面加上一个“*”号。这样将这行的用户信息注释掉,则可以达到暂停用户使用的效果。
如果我们确定不在需要某个用户了,便可将他删除。Userdel命令可以轻松的完成这项任务,此命令有一个常用的参数选项:-r。如下所示:
userdel –r 用户名
这个–r选项告诉userdel命令不仅要删除用户,还要删除用户的全部用户主目录,如果省略了这个选项,那么我们必须要手工才能清除用户的主目录。如果想彻底将用户的所有信息和文件从系统删除,仅仅删除用户的主目录还是不行的,因为与用户相关的其他文件,如邮件或crontab文件(定时任务)可能并不在该用户的主目录下,需要我们手工来删除。这个命令行:find / -user username -ls,可以找到系统中与该用户相关的文件,这样只需要我们在删除用户前,将这些文件存放位置的信息记录下来,就可以删除它们了。
注意:
当使用命令行: find / -user username -ls,在 /etc/passwd文件中必须有username的记录。如果用户已经删除(例如,使用userdel命令)了,那么passwd文件中的该用户记录也会消失,此时我们要改用这行命令: find / -uid number -ls,number是已经删除用户的UID。
在Linux系统中,每个文件或目录都会属于某个用户,该用户对这些文件享有所有权,如果要改变这些文件的所有权,可以使用chown命令,此命令我们在属性与权限命令在第三章中已经给大家介绍过,可以翻回书去再仔细阅读chmown命令。
用户在使用系统时,可以随时使用su命令来转换成其它用户的身份。
su的用法如下:su username,其中username是要切换的用户名,如果
省略username,系统默认将用户切换到root用户,root用户一般用于
系统的管理,管理员在使用root账户时必须特别谨慎,以防由于误操作,
将系统损坏。使用su命令时,还有一个经常要用到的参数:-l, 例如:
# su -l mike
提示:
通过使用参数-l,su命令不仅将当前用户切换为mike用户,而且将当前的工作目录也切换到 mike用户的主目录环境中,比如切换到/home/mike 目录下。
在Linux系统中,由于可能会有很多用户来使用系统,但是对用户使用空间的大小如果不加以限制,每个用户都可以无限制大小、无限制数量的上传文件,这样的结果将造成系统硬盘空间不够使用或是系统文件数量过多的情况。比如,如果我们的系统正好用来提供虚拟主机业务,每一台服务器上可能会有几百甚至上千个用户,如果这么多的用户都不加以限制,可以随意的上传网站文件或其它工具,那么后果将更加不堪想象。
如果系统能规定用户可以使用多大的硬盘空间,当超出这个空间的限制,此用户就不可再上传或写入文件,这样就不会出现某些用户占用过多硬盘空间,导致系统总空间告急的情况了。在Linux系统中可以通过磁盘限额 (disk quota) 的设置来来完成限制用户硬盘空间配额的任务。
下面我们开始介绍一下给用户限制磁盘配额的原理和方法。
(1) 首先需要编辑/etc/fstab文件,运行vi /etc/fstab命令行,
显示如下信息:
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
LABEL=/home /home ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
/dev/hdb7 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,kudzu,ro 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
然后我们需要在要求限制的分区中加入usrquota和grpquota参数,中间以逗号隔开,常见需要限制的分区/home。例如将上面信息中的第四行/home分区修改为如下:
LABEL=/home /home ext3 defaults ,usrquota,grpquota 1 2
说明:/etc/fstab文件中的每一行由六个字段组成:第一个字段,是文件系统(分区)的注释;第二个字段是文件系统的装载点;第三个字段是文件系统类型;第四个字段是装载文件系统时使用的选项,如果只想实现基于用户的磁盘配额,就加入usrquota关键字,如果想实现基于组的磁盘配额,就加入grpqouta关键字,如果两者都需要,就全写入,中间可以用逗号分隔;第五个字段表明该文件系统(分区)是否为只读,如果是0就表示只读,1表示可以读写;最后一个字段表示系统启动执行fsck时检查的顺序。
注意:
请特别注意上面的拼写,是usrquota和grpquota,不要写成userquota和groupquota。而且在编辑/etc/fstab文件时要注意多检查几次,看看有没有拼写错误,因为一旦出现错误,系统可能将无法启动或者分区信息无法再继续挂载!
(2)接着对/home分区进行quota的规则,并使用quotacheck命
令生成aquota.group和aquota.user文件。执行下面的命令行:
# quotacheck –avug /home
常用的参数:
-a : 扫描所有在/etc/mtab文件中已经挂载并配置quota
-v : 显示扫描过程的信息
-u : 记录磁盘上各个用户(User)的使用的文件和目录
-g : 记录磁盘上各个群组(Group)的使用的文件和目录
-m : 强制执行quotacheck
quotacheck这个命令的功能就是对已经使用过的磁盘空间做扫描,分析已使用磁盘上的每一个目录和文件属于哪一个用户和群组,然后分别在做quota规则的分区目录下产生aquota.group和aquota.user这两种记录文件。不过有些时候,在新版的 Linux 分区中, quotacheck 命令运行时,可能会出现类似 “Cannot get quotafile name for /dev/hda5 ”的错误提示,没关系,这是新版本quota设计的问题,解决方法可以如下:
加上 -m 的参数来强制运行:
# quotacheck -auvgm /home
或者是先手工建立aquota.group和aquota.user这两个记录文件,然后重新运行quotacheck即可:
# touch /home/aquota.user; touch /home/aquota.group
# quotacheck -auvg /home
(3)然后我们来设置用户的quota,对磁盘配额的限制一般是从
一个用户占用磁盘大小和所有文件的数量两个方面来进行的。在具体操作之前,我们先了解一下磁盘配额的两个基本概念:软限制和硬限制。
软限制:一个用户在文件系统可拥有的最大磁盘空间和最多文件数量,在某个宽限期内可以暂时超过这个限制。
硬限制:一个用户可拥有的磁盘空间或文件的绝对数量,绝对不允许超过这个限制。
在上面的操作中产生每一个用户和群组所使用的目录和文件记录文件之后,接着就要给定每一个群组和每一个用户可以使用多大的硬盘空间。使用命令行“edquota –u username”可以来完成,如下所示(假设想限制用户test的使用空间):
# edquota -u test
上面的命令执行后,就会自动进入一个vi的编辑画面,如下:
Disk quotas for user test (uid 505): Filesystem blocks soft hard inodes soft hard /dev/hdb5 48 0 0 11 0 0 |
这表示test用户在/dev/hdb5分区(该分区已经在usrquota的控制之下)中的数据区,已经使用了48个数据块(以K为单位),并且磁盘容量没有设限制(包括软限制soft和硬限制hard),同样,在文件节点区,test用户在这个分区目前已经存在共11个文件及目录,并且使用的文件节点数(文件数)也没有任何软限制soft和硬限制hard(0,代表没有任何限制)。
如果,我们想对用户进行磁盘容量的限制的话,只需要修改数据区行的软限制soft和硬限制hard部分就可以了,注意单位使用的是K(
1K=1024 Byte)。例如要为test用户分配10M磁盘的软限制,40M硬限制,可以更改内容如下:
Disk quotas for user test (uid 505): Filesystem blocks soft hard inodes soft hard /dev/hdb5 48 10240 40980 11 0 0 |
同样的,要对文件目录的数量限制可以相应的修改文件节点区的软限制soft和硬限制hard部分。我们也可以同时对这两项都作出限制。只需要如下的修改即可:
Disk quotas for user test (uid 505): Filesystem blocks soft hard inodes soft hard /dev/hdb5 48 10240 40980 11 1000 10000 |
上面的内容表示除了相应的容量的限制外,还对文件及目录的数量做了1000个的软限制和10000个的硬限制。在保存新的配置后,test用户的磁盘使用就不能超过硬限制40M。如果test用户使用的磁盘空间将要超出40M,该操作会被取消,然后得到一个错误信息。
然而实际上,以上的限制只是对用户设定的硬限制在起作用。如果需要使软限制也起作用的话,还需要对用户的软限制设定宽限期,默认的软限制的宽限期是无穷大,我们这可以使用edquota命令的-t选项来实现。运行下面的命令:
# edquota -t
上面的命令行将打开缺省编辑器,并显示如下内容:
Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/hdb3 7days 7days |
我们可以使用天、小时、分、秒为单位来设定宽限期,格式如7 days、6hours、5minutes、3secomnds等。例如,在下面这个例子中,磁盘空间限制的宽限期为三天,而文件数量限制的宽限期只有5个小时。则需要将内容修改如下:
Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/hdb3 3days 5hours |
(4)设定系统自动启动quota,在“/etc/rc.d/rc.local”这个文件里面加入一行命令:
/usr/sbin/quotaon –avug
这样在以后启动系统时,Linux系统就会自动启动quota,以便限制每一位用户的空间。
到此就完成设置用户磁盘配额的设置了,如果我们每次重新启动quota,在启动过程中看到类似下面一行的信息:
/dev/hdb5:user uqotas turned on |
就表示我们已经成功地启动了quota。启动quota之后,我们可以使用命令“requota -a”,来查看系统上所有用户的quota限制是否设置正确。
9.5.12 用户进程限制ulimit
在Linux中,有一个称为ulimit的 命令可以设置或报告用户进程资源的极限。通过 ulimit 命令,用户可将软极限更改到硬极限的最大设置值。要更改资源硬极限,必须拥有 root 用户权限。
很多系统不包括以上一种或数种极限。特定资源的极限在指定 Limit参数时设定。Limit参数的值可以是每个资源中指定单元中的数字,或者为unlimited。要将特定的ulimit设置为unlimited,可使词 unlimited设置。使用方法如下:
# ulimit -n 1024
将每个进程可以打开的文件数目设置为2048
# ulimit -m 4096
限制每个进程使用的内存数。
9.5.13 9.5.13 umask用户权限掩码
umask是Linux系统中的一个值,决定了在创建新文件和目录的时候为它赋予的默认权限。每个用户可以改变自己的umask值。在创建文件或者目录的时候,它以数值形式决定了默认情况下将不会赋予这个文件或者目录哪些权限,例如,有个用户的umask设置为027,这个数值可以分解为0、2、7。0表示用户将获得所有权限;2表示用户所在的组将不会被赋予2-写权限;7表示其他用户将不会赋予任何权限。
没有任何限制的情况,用户创建文件时产生的默认权限是666,创建目录时是777,而真正生效的权限就应该是666或777减去当前用户的umask值。如当umask是022的时候,创建出文件的权限是644,创建出目录的权限是755。
在上面讲用户管理的过程中,其实我们已经涉及了一些关于用户组的概念。组的管理要比用户的管理简单一些。Linux 系统中,每个用户账号都至少属于一个组,每个用户组可以包括多个用户。属于同一用户组的用户享有该组共有的权限,比如,系统管理员可以创建一个print组,使该组的所有用户都享有系统中的打印权限。
添加组是一个简单而轻松的过程,相应的命令是groupadd,后面跟着组名即可添加组,语法:groupadd groupname, 其中groupname为要添加的组名,例如命令:
# groupadd student
运行上面的命令即可添加student用户组。我们也可使用-g参数来指定用户组ID,否则在默认的情况下,系统将按顺序指定一个用户组ID,除非有特殊的需要,否则使用默认的用户组ID可能是最好的办法。
删除用户组的方法和上面讲的删除用户方法类似,只不过管理员通常会忘记组的删除,对此要加以注意。如果用户账户或组不再需要,那么应该将其删除。要删除组,我们可以使用groupdel命令,其语法为:groupdel groupname, 其中groupname为要删除的组名,例如命令:
# groupdel student
然而上面的命名行还不能完全删除用户组的信息,如果想要将该组的信息全部删除,必须使用find命令来完成。语法如:find / -gid GID,其中GID为要删除组的用户组ID值。比如,student的组ID为501,那么可以运行下面的命令,查出所有和student相关的文件,并删除即可。
# find / -gid 501
如果要修改组的信息,例如要修改组的名称、用户组ID以及组成员
等,我们可以使用groupmod命令。groupmod命令可选的参数有:
-g : 更改用户组ID,用户组ID必须唯一。
-n : 更改用户组名称。
-o : 强制更改用户组ID为重复的值。
例如,如果要将用户组student的名称变更为student1, 运行的命令行会如下所示:
# groupmod –n student student1