Linux系统中对系统用户如何控制
时间:2006-11-30 来源:elog
作者:tech
最近因为工作需要, 我看了一些有关linux在系统安全上对用户文件授权及系统资源限额的资料,在这里和大家分享我的体会。
当你使用的linux系统用户有一定数目的时候, 系统对用户在文件系统安全方面和在系统资源使用方面的控制就变得越来越重要。例如:在文件的权限,文件的属性,文件系统的限额和系统资源方面,linux都提供相应的控制方法。下面就从这四个方面谈谈Linux。
文件权限
文件权限对于每个linux的使用者来说是最为熟悉了。 它是一种对用户文件访问控制的机制,能限制用户对文件系统活动范围,能降低用户对系统安全威胁。
来看一个简单的例子:
[chase@lustre doc]$ ls -l-rw-rw-r-- 1 chase chase 2 Feb 17 00:17 a.txt
这是运行ls -l 的结果。在这里我们可以清楚的看到一些关于文件a.txt的信息。这些信息主要的含义如下:
-rw-rw-r--(文件权限) 1(文件链接数) chase(拥有者)chase(用户组号) 2(文件大小)Feb 17 00:17(最后修改日期) a.txt(文件名)上面的信息表示文件是由chase拥有和属于chase用户组。而在权限位上,我们可以把它分成四部分:
-(文件类型) rw-(拥有者权限) rw-(用户组权限) r--(其他用户权限)
对于第一部分表示文件的类型,在linux下一共有七种文件类型,包括套接字 (s),符号链接文件(l),普通文件(-),快设备文件(b),目录(d),字符设备(c)和命名管道(P) (括号中是文件在权限位上的表示符)。其他三部份结构类似,都是用三个字符(rwx)表示。r对应的是读权限,w对应的是写权限,x对应的是有运行的权 限。 对于这三部分我们都可以用三位二进制或一位八进制数来表示,当某一位使能时就把这一位符值为1,如rw-就表示读和写位使能,对应的位赋1,所以在这种情 况下可以用二进制110或八进制6表示。
当我们要改变文件权限时既可以用字符方式,又可以用八进制数的方式。改变文件权限的命令是chmod。用字符方式的话,其中u代表拥有者,g代表用户组,o代表其他用户和a代表所有人。例如当你要把上文件a.txt的权限改变为用户组只能读,就可以用
[chase@lustre doc]$ chmod g-w a.txt |
这样用户组就对这个文件只读。如果你运行下面的命令
[chase@lustre doc]$ chmod +x a.txt |
所有的可运行位都会使能,但是
[chase@lustre doc]$ chmod +w a.txt
[chase@lustre doc]$ ls -l-rw-rw-r-- 1 chase chase 2 Feb 17 00:35 a.txt
就不会把可写位全部使能,一定要a+w才可以,主要的原因我不太清楚, 可能出于安全考虑吧。如果用数字方式,同样按上的权限改变顺序,运行命令如下
[chase@lustre doc]$ chmod 644 a.txt |
所有运行位使能
[chase@lustre doc]$ chmod 755 a.txt |
另外还有SUID或SGID,这两个权限位主要是设定用户或用户组的运行ID。SUID功能 是当用户(不一定是该文件的拥有者)执行SUID文件时, 这个文件有效用户号(UID)就会被设定为该文件拥有者的用户号(UID);对于GUID,类似SUID当用户(不一定是该文件的用户组成员)这行 SGID文件时,这个文件的有效用户组号(GID)就会被设定为该文件的用户组号(GIU)。
除了以上说权限位以外,还有一个权限位说一说的,当你运行下面的命令时
[chase@lustre doc]$ ls -ld /tmp/drwxrwxrwt 3 root root 4096 Feb 16 23:42 /tmp/
有没有注意到在权限位中第三部份的最后一位竟然是t,这一权限位的名字叫粘着位 (sticky bit)。我见一些书是这么翻译的:这种权限主要是在目录上出现,它是使用户在这个目录里只能删除属于自己的文件,而不能删除其他人的文件。下面是 Practical UNIX& Internet Security 一书中对粘着位起源的说明:
The Origin of "Sticky"A very long time ago, UNIX ran on |
对于上面说的三个权限位,我们怎样改变呢?对于这三个权限位, chmod有对应的字符和八进制数方式来改变。对于SUID和SGID位我们只能用u+/-s或g+/-s来改变;而粘着位就用+t就可以拉,因为它是对所有的用户授权的,这是用字符方式改变的方法:
SUID改变
[chase@lustre doc]$ ls -l a.txt;chmod u+s a.txt;ls -l a.txt-rwxr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt-rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt
GUID改变
[chase@lustre doc]$ ls -l a.txt;chmod g+s a.txt;ls -l a.txt-rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt-rwsr-sr-x 1 chase chase 2 Feb 17 00:35 a.txt
粘着位改变
[chase@lustre doc]$ ls -l;chmod +t sticky;ls -ldrwxrwxr-x 2 chase chase 4096 Feb 17 04:25 stickydrwxrwxr-t 2 chase chase 4096 Feb 17 04:25 sticky
在用八进制方式改变的话,它们三位都有像读写和可执行位八进制表示法,只不过在文件权限的扩展位,对应的八进制分别为4000(SUID),2000(SGID)和1000(sticky bit)
SUID改变
[chase@lustre doc]$ ls -l a.txt;chmod 4755 a.txt;ls -l a.txt-rwxr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt-rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt
GUID改变
[chase@lustre doc]$ ls -l a.txt;chmod 2755 a.txt;ls -l a.txt-rwsr-xr-x 1 chase chase 2 Feb 17 00:35 a.txt-rwsr-sr-x 1 chase chase 2 Feb 17 00:35 a.txt
粘着位改变
[chase@lustre doc]$ ls -l;chmod 1755 sticky;ls -ldrwxrwxr-x 2 chase chase 4096 Feb 17 04:25 stickydrwxrwxr-t 2 chase chase 4096 Feb 17 04:25 sticky
当然,用户访问该文件时,系统会读取权限位来判断用户对该文件的访问权限。和文件权限有关的系统参数还有用户缺省的文件掩码,了解用户的缺省的文件掩码可以运行命令[chase@lustre doc]$ umask
0002
0002就是用户缺省的文件掩码,它决定当用户建立文件时缺省的文件权限,它和文件权限的关系是:普通文件:666&002=664;目录:777&002=775。
改变缺省的文件掩码只要在umask后加上想要设定的文件掩码就可以拉。 如果你不想每次登陆修改的话,可以在`/.bash_profile加上umask 077。
可能以上说的,对于很多人来说都知道,但是当你的系统用户人数比较多的时候,这些文件权限使用是要特别小心,以免一时不慎,造成对系统不必要破坏。
文件属性是另外一种控制用户对系统访问的手段,这和你所用的文件系统有关,这里涉及的都是 ext3文件系统。文件属性和文件权限很类似,文件属性是和某个特定的文件系统特有的,用来加强对文件的访问控制和安全保护。此外,文件属性是由 sys_open()和sys_truncate()等文件系统调用检查和赋予的不受用户的识别号和其他因素的影响,这和文件权限有根本的区别。因此,这 种文件访问的机制提供比文件权限控制更强的文件控制。可用的文件属性解析如下:
A(don't update atime)
如果文件设定了这个属性,文件系统不会更新最后的访问时间。这对减少磁盘的I/O(尤其在笔记本电脑和NFS上,这个属性对提高文件系统的性能是很有效的)
a(append only)如果文件设定了这个属性,任何程序只能以添加模式打开这个文件。对于目录来说,只能在这个目录下添加新的目录或文件,不能对本目录或者本目录里的子目录或者文件作改名或删除才作。这个属性只有root才能设定或删除。
c(compressed)
如果文件设定了这个属性,系统内核自动压缩该文件。
d(no dump)
如果文件设定了这个属性,对文件系统(dump)备份时忽略该文件,文件系统备份参数在/etc/fstab里。
i(immutable)
如果文件设定了这个属性,这个文件就不能修改,包括文件内容修改,文件删除,改名和 建立符号链接。而对于目录来说,不能在本目录里建立和删除文件,只能对本目录里的文件作修改。值得注意的是,这个属性也会限制对存储时间的限制,因此,设 定这个属性就不必设定A属性。这个属性只有root才能设定或删除。
S(synchronous updates)
如果文件设定了这个属性,这个文件被修改时,文件系统会马上同步同步写入磁盘里。
s(secure deletion)
如果文件设定了这个属性,这个文件被删除时, 原来被占用的区域会被重新填入0来覆盖。
u(undeletable)
如果文件设定了这个属性,这个文件被删除时,文件内容会被保存,用户可以恢复被删除的文件。
文件属性相关的系统命令主要有两个:lsattr和chattr。
lsattr命令是查看文件属性的命令,参数比较少,和ls比较相似,具体可以参照相关的文档。下面看看具体的简单应用。
[chase@linuxtime doc]$ lsattr a-------------- a
上面是lsattr的简单运行结果。
chattr命令是对文件属性修改的命令,文件属性的修改没有像文件权限的修改提供 两种方式,只能使用字符方式。它如何对属性进行设定呢?主要是通过+(添加),-(删除)或=(设定)。对于添加和删除就不多说了,主要说说=(设定)的 使用,它是用来重新设定文件的属性的,下面我们看看具体的例子。
[chase@linuxtime doc]$ lsattr a;chattr +s a;lsattr a;chattr +u a;lsattr a;chattr =SA a;lsattr a |
由上面可以看到,a 开始什么属性也没设定,但使用+(添加)s和u属性后,再使用=(设定)SA后,a的属性就有原来有s和u属性立刻被删除了。还有一点又指出的是
[chase@linuxtime doc]$ lsattr a; chattr = a; lsattr a
--S---A------- a
-------------- a
但我们要删除所有的文件属性时,只要使用=(设定)后什么都不加就可以了。
下面我们看看比较有常用属性对系统用户控制具体的作用。看看A的作用
[chase@linuxtime doc]$ lsattr a; stat a; cat a; stat a |
上面例子看到,对于没有任何文件属性的文件a来说,对它作cat操作会造成Access Time的改变。我们再看看下面设定了A属性的文件a的情况。
[chase@linuxtime doc]$ chattr +A a; lsattr a;stat a; cat a; stat a |
情况就改变,cat前后有文件属性A的文件a的Access Time是不变的。这个属性对于高负荷的文件系统的影响还是比较大的,这个对系统的性能有一定的影响。
对于a属性,我们在从例子出发来看看它的作用,
[root@linuxtime doc]# lsattr a; chattr +a a; lsattr a |
因为a属性只能root来设定,所以先用root把文件a的a属性设定好, 然后再回到普通用户对这个文件作一些操作。我们先对文件a作一个修改的操作,echo "a" > a, 是先删除文件a的内容,然后再把"a"字符写入文件a,因为文件a只能以添加模式打开,因此第一步就出错,相应的出错信息是"bash: a: Operation not permitted";然后,我们做一个添加的操作echo "b" >> a,这个只对文件a以添加模式打开,并写入内容。最后我们可以看到文件a里只有字符"b"没有字符"a",这就是a属性起的作用。
对于剩下的属性都需要内核的支持才能起作用,而且对于主流的内核都没有支持。因而在这里就不多说啦。
linux 对系统用户控制
我就废话少说,先来介绍文件系统限额方式:soft: 就它的名字你可以了解到,这种方式不是硬性的,是具有弹性的限额方式。换句话说,用户的以达到这个配额,并在一定的条件下超过,但是必须在一定时间内把占用的空间减少到指定的soft的限额以下。
hard:这用方式就没有弹性可言啦,是一种硬性的不可逾越的限额上限。与soft相比,我们可以知道,如果我们设定限额时,soft的大小应比hard的大小小。而在用户达到soft的限制的时候系统会产生警告信息,以免用户达到hard的限额才被警告。
时限:所谓是时限就是在soft方式提到的, 当用户所占用的空间超过soft但还没达到hard的时候,这个时限就会被启动,用户必须在这个时限内把所占用的空间减少到soft的限额以下。
还有另外的一类的文件系统限额方式:
user: 这种方式是针对系统中个别用户进行文件系统限额。
group: 有针对用户的自然会有针对用户组的文件系统限额方式。
现在,你对文件系统限额的方式有一定的了解。好!下面我们就进入实战阶段, 真真正正来配置系统的限额。
首先,quota是需要linux内核支持才行,而现在使用的Linux Kernel 2.4.XX都支持quota也就是说只要你使用linux distributions,例如Mandrake 9.0或Redhat 8.0 就可以配置文件系统的限额。接着,我们了解与quota有关的系统命令,它们是quota,quotacheck,edquota,quotaon和 quotaoff,它们的详细说明如下:
quota: 主要是用来查询用户的限额配置清况。下面是一个例子:
[root@lustr root]# quota -u chase |
上面每一项具体的意思会在后面相关的地方会解释。
quotacheck: 这个命令主要是用来扫描要实现限额的文件系统,并在第一次运行时建立必要的限额配置文件,如果在建立quota后运行,它就会更新这两个文件。通常情况 下,quotacheck扫描文件系统时,它先把文件系统挂载成只读方式,因为当在扫描的过程中出现文件的增加或减少都会使quotacheck出错。当 扫描完毕后,它又会把文件系统挂载成读写方式。linux还特别强调在文件系统quota on或off都要运行quotacheck。下面是一个例子;
root@lustr root]# quotacheck -uvg /home/ |
这个例子是扫描/home下面的文件系统其中参数u和g是表示要对user和group的限额都要扫描,结果是在这个目录下有3个目录和7个文件。v就不用多说了, 除此之外还有一个参数是a,它表示对所有在配置了quota的分区都要进行扫描。
edquota: 这个命令是主要的文件配额命令, 它可以配置用户或用户组的文件系统限额。除此之外,edquota还可以建立一个用户限额配置的拷贝, 并用于其他用户的限额配置。下面是一个例子;
[root@lustr root]# edquota -u chase
当运行上命令后,edquota缺省调用vi来编辑quota文件, 如果你不想使用vi来编辑quota的文件,你可以设定环境变量EDITOR或VISUAL为你希望的编辑器。 下面是vi的输出结果;
Disk quotas for user chase (uid 500): |
上面的结果和我们先前所运行quota的结果很类似的, 我在这里说说上面每一项的具体意思以帮助大家理解quota的输出结果。
Filesystem: 这个就不用多说啦。
blocks: 这个是当前用户在这个分区里所使用的空间大小,单位是Kbyte。 这个是文件系统自己计算出来的,所以在编辑该文件时不要修改这个参数。
soft: 这个在一开始就介绍过了,就是soft限额方式的限额值。单位也是KBytes。
hard: 这个在一开始就介绍过了,就是hard限额方式的限额值。单位也是KBytes。
inodes: 这个是当前用户使用文件系统节点的个数。和blocks类似,它也是文件系统自己计算出来的,所以在编辑该文件时不要修改这个参数。
注意: 当soft,hard设定为0,0时,这表示没有限额。第一和第二对的soft和hard时对block和inode的不同限额数,而在quota的输出结果就分别是blocks和files的限额数。
下面有两个例子
[root@lustr root]# quota -u test;edquota -p chase -u test;quota -u test |
上面是一个用chase用户限额的拷贝实施在test用户上。
[root@lustr root]# edquota -t
下面是vi的输出结果:
Grace period before enforcing soft limits for users: |
上面是一个设定超过soft限额时所允许的时限。从上面的例子看出:对于Block和 Inode的soft限额的时限为7天。如果你要不同的时间单位,你就可以用seconds,minutes,hours,days,weeks和 months来表示。quotaon: 这个命令是用来启动quota的,如果你还没有建立aquota.user和aquota.group两个文件的话,运行这个命令就会出错,所以在此之前 一定要完成quotacheck的工作,然后直接运行quota -a就可以了。你还可以制定启动的是用户限额(u)或是用户组限额(g),还有指定特定的以配置限额的分区启动。
[root@lustr root]# quotaon -uv /home
上面就是指定目录/home启动用户限额。
quotaoff: 这个命令就是关闭quota,参数同上。
好了,我说了一大堆的东西。下面说说配置限额的步骤:
1. 先要启动文件系统的限额功能。这一步主要是要编辑/etc/fstab文件。
在通常的没启动限额功能的文件系统的fstab文件内容如下:
LABEL=/ / ext3 defaults 1 1 |
如果你想对/home这个目录下,也就是/dev/sda5分区启动限额功能的话,我们可以修改对应的home项为:
LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2
你可以看到,在home对应项增加usrquota和grpquota(注意拼写)来实现用户和用户组的限额功能,然后重新启动linux。重起后,你要检查/etc/mtab是否在对应的home项加上usrquota和grpquota,如下:
|
你是不是觉得有点奇怪,我刚才不是只编辑fstab,那和mtab有什么关系呢? 主要原因是quota真正读取的文件是mtab,所以你一定要确认mtab在你修改fstab文件重起后一定更新为上面,这样才可以确认你对fstab的修改成功。
2. 首次扫描文件系统的使用情况。
主要使用quotacheck来扫描文件系统。如上所说,在扫描完毕后,就会在对应的目录下产生aquota.user和aquota.group, 这两个文件的位置都是在顶层的目录里,例如你对/home启动quota功能,那么这两个文件就会位于/home/下面。
[root@lustr home]# ls -l |
既然这两个文件都产生了,我们就可以启动文件系统限额功能对特定的用户或用户组实行限额。
3. 启动quota。
我们可以用前面介绍的quotaon来启动。
[root@lustr root]# quotaon -av |
这是一个启动的输出结果。
4. 配置用户或用户组的限额
这一步可以参考edquota命令的说明。
上面基本把与quota配置相关的命令和文件都介绍了。