位置:海鸟网 > IT > linux/Unix >

LINUX文件安全与权限

作者:xinyuwuxian

LINUX文件安全与权限



当你创建一个文件的时候,系统保存了有关该文件的全部信息,包括:

? 文件的位置。

? 文件类型。

? 文件长度。

? 哪位用户拥有该文件,哪些用户可以访问该文件。

? i节点。

? 文件的修改时间。

? 文件的权限位。

让我们使用ls -l命令,来看一个典型的文件:

root@ubuntu:~/resource/mini2440/file-system# ls -l

total 11488

drwxr-xr-x 33 root root    4096 2013-04-17 04:29 busybox-1.17.3

-rwxrw-rw-  1 root root 2094550 2013-04-17 03:03 busybox-1.17.3.tar.bz2

-rw-------  1 root root 9660288 2013-04-17 04:30 haitao.img

我们现在看到的上面的打印信息,分析如下:



total 11488:这一行告诉我们该目录中所有文件所占的空间。

d rwx r-x r-x:这是该文件的权限位。这里一共是 10个字符,除了第一位他们分别对应9个权限位。通过这些权限位,可以设定用户对文件的访问权限。这 9个字符可以分

为三组:

rwx:文件属主权限 这是前面三位

r-x :同组用户权限 这是中间三位

r-x :其他用户权限 这是最后三位

后面我们还将对这些权限位作更详细的介绍。出现在 r、w、x位置上的横杠表示相应的访问权限被禁止

33表示该文件硬链接的数目

root 文件的属主

root 文件的属主root所在的缺省组

4096   用字节来表示的文件长度,记住,不是 K字节!

busybox-1.17.3 文件名(这里其实是一个目录名)



文件类型有七种,它可以从 ls -l命令所列出的结果的第一位看出,这七种类型是:

d 目录

l 符号链接(指向另一个文件)。

s 套接字文件。

b 块设备文件。

c 字符设备文件。

p 命名管道文件。

- 普通文件,或者更准确地说,不属于以上几种类型的文件。

所以说上面的busybox-1.17.3是一个目录的名字



文件权限

root@ubuntu:~/resource/study/shell# touch test

root@ubuntu:~/resource/study/shell# ls

test

root@ubuntu:~/resource/study/shell# ls -l

total 0

-rw-r--r-- 1 root root 0 2013-04-18 22:26 test

上面我们用touch新建了一个空文件,可以看到他是一个普通文件,属主权限为可读可写不可执行,用户组权限为可读,不可写,不可执行,其他组权限为可读,不可写,不可执行



我们要做的就是试着去改变这些权限,达到我们想要设定的权限,我们是通过chmod实现的

chmod命令的一般格式为:

chmod [who] operator [permission] filename

w h o的含义是:

u 文件属主权限。

g 同组用户权限。

o 其他用户权限。

a 所有用户(文件属主、同组用户及其他用户 )。

o p e r a t o r的含义:

+ 增加权限。

- 取消权限。

= 设定权限。

p e r m i s s i o n的含义:

r 读权限。

w 写权限。

x 执行权限。

s 文件属主和组s e t - I D。

t 粘性位*。

l 给文件加锁,使其他用户无法访问。

u,g,o 针对文件属主、同组用户及其他用户的操作。

在列文件或目录时,有时会遇到“ t”位。“t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,即使某个同组用户具有和属主同等的权限。不过有的系统在这一规则上并不十分严格。如果在文件列表时看到“ t”,那么这就意味着该脚本或程序在执行时会被放在交换区 (虚

存)。不过由于当今的内存价格如此之低,大可不必理会文件的“ t”的使用

看看实例吧

root@ubuntu:~/resource/study/shell# chmod u+x test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-rwxr--r-- 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod g+x test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-rwxr-xr-- 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod o+x test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-rwxr-xr-x 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod a-x test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-rw-r--r-- 1 root root 0 2013-04-18 22:26 test

我们首先吧属主,用户组,其他用户组的权限都加上了可指向权限,然后又一并去掉了他们的可指行权限



当然还有另外一种方法来更改权限

chmd命令绝对模式的一般形式为:

chmod [mode] file

其中mode是一个八进制数

r    w   x

4   2   1

上面就是对应关系,说明如下:

可读,可写,可执行:4+2+1=7

可读,不可写,可执行:4+1=5

可读,可写,吧可执行:4+2=6

可读,不可写,不可执行:4

就是通过累加方式实现的



下面说说目录的访问权限

目录的权限位和文件有所不同。现在我们来看看其中的区别。目录的读权限位意味着可以列出其中的内容。

写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。执行权限位则意味着搜索和访问该目录

如果把同组用户或其他用户针对某一目录的权限设置为 - - x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。

suid和guid的设置

这里有一个很好的例子。我管理着几个大型的数据库系统,而对它们进行备份需要有系统管理权限。我写了几个脚本,并设置了它们的 g u i d,这样我指定的一些用户只要执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,但是在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。有相当一些U N I X命令也设置了s u i d和g u i d。如果想找出这些命令,可以进入 / b i n或/ s b i n目录,执行下面的命令:

$ ls -l | grep '^...s'

上面的命令是用来查找 s u i d文件的;

$ ls -l | grep '^...s..s'

上面的命令是用来查找 suid和guid的。

现在我们明白了什么是 suid,可是如何设置它呢?下面就来介绍这个问题。如果希望设置s u i d,那么就将相应的权限位之前的那一位设置为 4;如果希望设置g u i d,那么就将相应的权限位之前的那一位设置为2;如果希望两者都置位,那么将相应的权限位之前的那一位设置为4+2。一旦设置了这一位,一个 s将出现在 x的位置上。记住:在设置 s u i d或g u i d的同时,相应的执行权限位必须要被设置。例如,如果希望设置 g u i d,那么必须要让该用户组具有执行权限。

看看下面的例子

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-xr-xr-x 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod 4555 test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-sr-xr-x 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod 555 test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-xr-xr-x 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod 2555 test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-xr-sr-x 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod 555 test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-xr-xr-x 1 root root 0 2013-04-18 22:26 test

root@ubuntu:~/resource/study/shell# chmod 6555 test 

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-sr-sr-x 1 root root 0 2013-04-18 22:26 test

下面我们看一下chowm这个命令,这个命令用来改变文件的属主

chown命令的一般形式为:

chown -R -h owner file

- R选项意味着对所有子目录下的文件也都进行同样的操作。 - h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-xr-xr-x 1 hai-tao root 0 2013-04-18 22:26 test

-rw-r--r-- 1 root    root 0 2013-04-18 23:20 test1

root@ubuntu:~/resource/study/shell# cd ..

root@ubuntu:~/resource/study# chown -R root shell

root@ubuntu:~/resource/study# ls -l shell

total 0

-r-xr-xr-x 1 root root 0 2013-04-18 22:26 test

-rw-r--r-- 1 root root 0 2013-04-18 23:20 test1

root@ubuntu:~/resource/study# cd ..

root@ubuntu:~/resource# cd study/shell

root@ubuntu:~/resource/study/shell# chown hai-tao test

root@ubuntu:~/resource/study/shell# ls -l

total 0

-r-xr-xr-x 1 hai-tao root 0 2013-04-18 22:26 test

-rw-r--r-- 1 root    root 0 2013-04-18 23:20 test1

文件test的所有权现在由用户root交给了用户hai-tao了



chgrp命令和chown命令的格式差不多,他用来改变用户所属的组

找出自己所属的用户组,书上说通过group获得,我使用的时候出现错,使用groups是ok的

root@ubuntu:~/resource/study/shell# groups

root

root@ubuntu:~/resource/study/shell# groups hai-tao

hai-tao : hai-tao adm dialout cdrom plugdev lpadmin admin sambashare

上面的命令告诉我们用户hai-tao属于后面的那么多用户组



umask的讲解

当最初登录到系统中时, umask命令确定了你创建文件的缺省模式。这一命令实际上和chmod命令正好相反。你的系统管理员必须要为你设置一个合理的umask值,以确保你创建的

文件具有所希望的缺省权限,防止其他非同组用户对你的文件具有写权限。在已经登录之后,可以按照个人的偏好使用umask命令来改变文件创建的缺省权限。相应的改变直到退出该shell或使用另外的umask命令之前一直有效。

一般来说,umask命令是在/etc/profile文件中设置的,每个用户在登录时都会引用这个文件,所以如果希望改变所有用户的umask,可以在该文件中加入相应的条目。如果希望永久性地设置自己的umask值,那么就把它放在自己 $HOME目录下的. profile或. bash_profile文件中。

如何计算umask值

umask命令允许你设定文件创建时的缺省模式,对应每一类用户 (文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。对于文件来说,这一数字的最大值分别是 6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来说, u m a s k中各个数字最大可以到 7。

该命令的一般形式为:

umask nnn,其中nnn为umask置000-777。

列出了与权限位相对应的umask值。

umask值与权限

umask   文件    目录

0           6         7

1           6         6

2           4         5

3           4         4

4           2         3

5           2         2

6           0         1

7           0         0

在计算umask值时,可以针对各类用户分别在这张表中按照所需要的文件 /目录创建缺省权限查找对应的umask值。

例如,umask值002 所对应的文件和目录创建缺省权限分别为 6 6 4和7 7 5。

还有另外一种计算umask值的方法。我们只要记住umask是从权限中“拿走”相应的位即例如,对于umask值0 0 2,相应的文件和目录缺省创建权限是什么呢?

第一步,我们首先写下具有全部权限的模式,即 7 7 7 (所有用户都具有读、写和执行权限 )。

第二步,在下面一行按照umask值写下相应的位,在本例中是 0 0 2。

第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。稍加练习就能够记住这种方法。

第四步,对于文件来说,在创建时不能具有文件权限,只要拿掉相应的执行权限比特即可。

使用软链接来保存文件的多个映像

下面我们就解释一下符号链接是怎么回事。比方说在一个目录下有一个含有销售信息的文件,销售部门的每一个人都想看这份文件。你可以在每一位用户的 $HOME目录下建立一个指向该文件的链接,而不是在每个目录下拷贝一份。这样当需要更改这一文件时,只需改变一个源文件即可。每个销售 $ H O M E目录中的链接可以起任何名字,不必和源文件一致。

如果有很多子目录,而进入这些目录很费时间,在这种情况下链接也非常有用。可以针对$ H O M E目录下的一个很深的子目录创建一个链接。

该命令的一般形式为:

ln [-s] source_path target_path

其中的路径可以是目录也可以是文件。

看一下以下示例:

root@ubuntu:~/resource/study/shell# ls

folder

root@ubuntu:~/resource/study/shell# cat folder/one/one 

123456

root@ubuntu:~/resource/study/shell# ln folder/one/one one_link

root@ubuntu:~/resource/study/shell# cat one_link 

123456