Linux系统文件权限

来源:互联网 发布:用友软件咨询电话 编辑:程序博客网 时间:2024/05/19 12:11

关于Linux系统安全的本质部分,学习以下命令:

id ——— 显示用户身份号
chmod – 更改文件模式
umask -– 设置默认的文件权限
su ——-– 以另一个用户的身份来运行 shell
sudo –—- 以另一个用户的身份来执行命令
chown –– 更改文件所有者
chgrp –— 更改文件组所有权
passwd -– 更改用户密码


拥有者,组成员,和其他人

试图查看一个像/etc/shadow 那样的文件的时候,我们会遇到一个问题。

[me@linuxbox ~]$ file /etc/shadow/etc/shadow:  regular file, no read permission[me@linuxbox ~]$ less /etc/shadow/etc/shadow:  Permission denied

产生这种错误信息的原因是,作为一个普通用户,我们没有权限来读取这个文件。

在 Unix 安全模型中,一个用户可能拥有文件和目录
当一个用户拥有一个文件或目录时, 用户对这个文件或目录的访问权限拥有控制权。

用户又属于一个由一个或多个 用户组成的用户组,用户组成员由文件和目录的所有者授予对文件和目录的访问权限。

除了 对一个用户组授予权限之外,文件所有者可能会给每个人一些权限,在 Unix 术语中,用 id 命令,来找到关于你自己身份的信息:

[me@linuxbox ~]$ iduid=500(me) gid=500(me) groups=500(me)

让我们看一下输出结果:当用户创建帐户之后,系统会给用户分配一个号码,叫做用户 ID 或者 uid,然后,为了符合人类的习惯,这个 ID 映射到一个用户名。

那么这些信息来源于哪里呢?
用户帐户定义在/etc/passwd 文件里面,用户组定义在/etc/group 文件里面。

当用户帐户和用户组创建以后, 这些文件随着文件/etc/shadow 的变动而修改,文件/etc/shadow 包含了关于用户密码的信息。
对于每个用户帐号,文件/etc/passwd 定义了用户(登录)名,uid,gid,帐号的真实姓名,家目录, 和登录 shell。
现在的 Linux 会创建一个独一无二的,只有一个成员的用户组,这个用户组与用户同名。这样使某种类型的 权限分配更容易些。


读取,写入,和执行

对于文件和目录的访问权力是根据读访问,写访问,和执行访问来定义的。如果我们看一下 ls 命令的输出结果:

[me@linuxbox ~]$ > foo.txt[me@linuxbox ~]$ ls -l foo.txt-rw-rw-r-- 1 me   me   0 2015-10-28 14:52 foo.txt

列表的前十个字符是文件的属性。
第一个字符表明文件类型。
下表是经常看到的文件类型:
这里写图片描述

剩下的九个字符,叫做文件模式,代表着文件所有者,文件组所有者,和其他人的读,写,执行权限。


chmod - 更改文件模式

更改文件或目录的模式(权限),可以利用 chmod 命令。
注意只有文件的所有者或者超级用户才 能更改文件或目录的模式。

chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法,或 符号表示法。

通过八进制表示法,我们使用八进制数字来设置所期望的权限模式。因为每个八进制数字代表了 3个二进制数字,这种对应关系,正好映射到用来存储文件模式所使用的方案上。下表展示了 我们所要表达的意思:
这里写图片描述

通过使用3个八进制数字,我们能够设置文件所有者,用户组,和其他人的权限:

[me@linuxbox ~]$ > foo.txt[me@linuxbox ~]$ ls -l foo.txt-rw-rw-r-- 1 me    me    0  2015-10-28 14:52 foo.txt[me@linuxbox ~]$ chmod 600 foo.txt[me@linuxbox ~]$ ls -l foo.txt-rw------- 1 me    me    0  2015-10-28 14:52 foo.txt

通过传递参数 “600”,我们能够设置文件所有者的权限为读写权限,而删除用户组和其他人的所有权限。
虽然八进制到二进制的映射看起来不方便,但通常只会用到一些常见的映射关系: 7 (rwx),6 (rw-),5 (r-x),4 (r–),和 0 (—)。

chmod 命令支持一种符号表示法,来指定文件模式。
符号表示法分为三部分:更改会影响谁, 要执行哪个操作,要设置哪种权限。通过字符 “u”,“g”,“o”,和 “a” 的组合来指定要影响的对象
,命令符号表示法
这里写图片描述

如果没有指定字符,则假定使用”all”。
执行的操作可能是一个“+”字符,表示加上一个权限。
一个“-”,表示删掉一个权限。
或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除。
权限由 “r”,“w”,和 “x” 来指定。

chmod 符号表示法实例:
这里写图片描述

符号表示法的优点是,允许你设置文件模式的单个组成部分的属性,而没有影响其他的部分。

要注意”–recursive”选项: 它可以同时作用于文件和目录,所以它并不是如我们期望的那么有用处,因为我们很少希望文件和目录拥有同样的权限。


umask - 设置默认权限

当创建一个文件时,umask 命令控制着文件的默认权限。
umask 命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。
大多数情况下,你不必修改掩码值,系统提供的默认掩码值就很好了。然而,在一些高 安全级别下,你要能控制掩码值。


更改身份

有三种方式,可以拥有多重身份:
1. 注销系统并以其他用户身份重新登录系统。
2. 使用 su 命令。
3. 使用 sudo 命令。

su 命令允许你,假定为另一个用户的身份,以这个用户的 ID 启动一个新的 shell 会话,或者是以这个用户的身份来发布一个命令。

sudo命令允许一个管理员设置一个叫做/etc/sudoers 的配置文件,并且定义了一些具体命令,在假定的身份下,特殊用户可以执行这些命令。


su - 以其他用户身份和组 ID 运行一个 shell

su 命令用来以另一个用户的身份来启动 shell。这个命令语法看起来像这样:

su [-[l]] [user]

如果包含”-l”选项,那么会为指定用户启动一个需要登录的 shell。
这意味着会加载此用户的 shell 环境, 并且工作目录会更改到这个用户的家目录。
如果不指定用户,那么就假定是超级用户。注意,选项”-l”可以缩写为”-“,这是经常用到的形式。
启动超级用户的 shell, 我们可以这样做:

[me@linuxbox ~]$ su -Password:[root@linuxbox ~]#

按下回车符之后,shell 提示我们输入超级用户的密码。
如果密码输入正确,出现一个新的 shell 提示符, 这表明这个 shell 具有超级用户特权(提示符的末尾字符是”#”而不是”$”),并且当前工作目录是超级用户的家目录 (通常是/root)。

一旦进入一个新的 shell,我们能执行超级用户所使用的命令。
当工作完成后, 输入”exit”,则返回到原来的 shell:

[root@linuxbox ~]# exit[me@linuxbox ~]$

以这样的方式使用 su 命令,也可以只执行单个命令,而不是启动一个新的可交互的 shell:

su -c 'command'

使用这种模式,命令传递到一个新 shell 中执行。把命令用单引号引起来很重要,因为我们不想 命令在我们的 shell 中展开,但需要在新 shell 中展开。

[me@linuxbox ~]$ su -c 'ls -l /root/*'Password:-rw------- 1 root root    754 2007-08-11 03:19 /root/anaconda-ks.cfg/root/Mail:total 0[me@linuxbox ~]$

sudo - 以另一个用户身份执行命令

sudo 命令在很多方面都相似于 su 命令,但是 sudo 还有一些非常重要的功能。
sudo 命令不要求超级用户的密码。
使用 sudo 命令时,用户使用他/她自己的密码 来认证。比如说,例如,sudo 命令经过配置,允许我们运行一个虚构的备份程序,叫做”backup_script”, 这个程序要求超级用户权限。通过 sudo 命令,这个程序会像这样运行:

[me@linuxbox ~]$ sudo backup_scriptPassword:System Backup Starting...

按下回车键之后,shell 提示我们输入我们的密码(不是超级用户的)。一旦认证完成,则执行具体的命令。

su 和 sudo 之间的一个重要区别是 sudo 不会重新启动一个 shell,也不会加载另一个 用户的 shell 运行环境。
这意味者命令不必用单引号引起来。

想知道 sudo 命令可以授予哪些权限,使用”-l”选项,列出所有权限:

[me@linuxbox ~]$ sudo -lUser me may run the following commands on this host:(ALL) ALL

chown - 更改文件所有者和用户组

chown 命令被用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限。chown 命令 的语法看起来像这样:

chown [owner][:[group]] file...

chown 命令可以更改文件所有者和/或文件用户组,依据于这个命令的第一个参数。
比方说,我们有两个用户,janet,拥有超级用户访问权限,而 tony 没有。用户 jant 想要从 她的家目录复制一个文件到用户 tony 的家目录。因为用户 jant 想要 tony 能够编辑这个文件, janet 把这个文件的所有者更改为 tony:

[janet@linuxbox ~]$ sudo cp myfile.txt ~tonyPassword:[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt-rw-r--r-- 1 root  root 8031 2015-10-28 14:30 /home/tony/myfile.txt[janet@linuxbox ~]$ sudo chown tony: ~tony/myfile.txt[janet@linuxbox ~]$ sudo ls -l ~tony/myfile.txt-rw-r--r-- 1 tony  tony 8031 2015-10-28 14:30 /home/tony/myfile.txt

这里,我们看到用户 janet 把文件从她的目录复制到 tony 的home目录。下一步,janet 把文件所有者 从 root(使用 sudo 命令的原因)改到 tony。通过在第一个参数中使用末尾的”:”字符,janet 同时把 文件用户组改为 tony 登录系统时,所属的用户组,碰巧是用户组 tony。

注意,第一次使用 sudo 命令之后,为什么(shell)没有提示 janet 输入她的密码?
这是因为,在 大多数的配置中,sudo 命令会相信你几分钟,直到计时结束。


chgrp - 更改用户组所有权

在旧版 Unix 系统中,chown 命令只能更改文件所有权,而不是用户组所有权。为了达到目的, 使用一个独立的命令,chgrp 来完成。除了限制多一点之外,chgrp 命令与 chown 命令使用起来很相似


知识来源:http://billie66.github.io/TLCL/book/zh/chap10.html

0 0
原创粉丝点击