用户身份
UID(即User IDentification的缩写):每个用户都有对应的UID值,并且不相同,帐户名称与UID保存在/etc/passwd文件中,而帐户密码则保存在/etc/shadow文件中
-
root只是个名字,真正让它成为超级用户的是其UID值
- 超级用户UID 0:root用户默认为0。
- 系统用户UID 1-999:系统中系统服务由不同用户运行,更加安全,默认被限制登陆系统。
- 普通用户UID 1000~:即管理员创建的用于日常工作而不能管理系统的普通用户。
GID(即Group IDentification的缩写):可将多个用户加入某个组中,方便指派任务或工作, 每个用户在被创建时均会创建一个默认组(其GID与UID相同,俗称基本组)而后加入的则叫扩展组
文件权限组成
文件类型
-
当执行ls -l 或 ls -all 命令后显示的结果中,第一个字符一般用来区分文件和目录:后面的第2~10个字符是用来表示权限。
- -:表示这是一个普通的文件。
- d:表示是一个目录,事实上在ext2fs中,目录是一个特殊的文件。
- l: 表示这是一个符号链接文件,实际上它指向另一个文件。
- b:表示块设备文件
- c: 表示字符设备文件
- p:表示管道
- s:表示套接字
每个用户都拥有自己的专属目录,通常集中放置在/home目录下,这些专属目录的默认权限为rwx------,表示目录所有者本身具有所有权限,其他用户无法进入该目录
执行mkdir命令所创建的目录,其默认权限为rwxr-xr-x
一般权限
-
第2~10个字符当中的每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限
r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,可以读取目录结构和权限
w(Write,写入):对文件而言,具有编辑、新增、修改文件内容的权限;对目录来说,可以更改目录结构列表,具有新增、删除、移动目录内文件的权限。
x(Execute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
-
一般权限示例
-rwx------: 文件所有者对文件具有读取、写入和执行的权限,其它用户限完全没有权限 -rwxr--r--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。 -rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。 drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据 drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。
特殊权限
SUID(setuid)
- 只对二进制程序有效;执行者对于程序需要有x权限;在程序运行过程中,执行者拥有程序拥有者的权限
- 示例:以/etc/passwd和/usr/bin/passwd为例。/etc/passwd的权限为 -rw-r--r--,也就是说:该文件的所有者拥有读写的权限,而用户组成员和其它成员只有查看的权限。我们知道,在系统中我们要修改一个用户的密码,root用户和普通用户均可以用"/usr/bin/passwd 用户名" 这个命令来修改这个/etc/passwd这个文件,root用户本身拥有对/etc/passwd的写权限,可以理解;那普通用户没有写权限,那他怎么也能修改呢?这里就用到了setuid,setuid的作用是让执行该命令的用户以该命令拥有者的权限去执行,就是普通用户执行passwd时会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例如/etc/passwd的权限为:-rwsr-xr-x
SGID
- 功能一:SGID对于二进制程序有用;程序执行着要有x权限;执行者在执行过程中会获得该程序用户组的权限(相当于临时加入了程序的用户组)
- 功能二:用户对此目录有rx权限可以进入目录;用户进入此目录后,有效用户组会变成该目录的用户组;若用户在此目录有w权限,则用户创建的文件用户组与该目录用户组相同
- 功能二示例:一个团队想在linux某个目录下协同工作来做一个项目,那么每个团队成员都得对这个目录下的所有文件具有rwx权限。于是我们首先新建一个用户组,再新建几个账号,每个账号的用户组都加入刚才新建的那个用户组。再新建工作目录,权限设为770,把目录的用户组加上上一步新建的用户组。到这里为止,我们思考下会有什么问题?现在账号A新建一个文件,新建文件的拥有者和用户组都会是A!重要的是其他用户都无法访问这个文件!所以我们需要给这个目录加入SGID权限,之后任意一个用户创建的文件,文件用户组都会是这个目录的用户组
SBID
- 只针对目录有效,当用户对目录拥有wx权限时,用户在该目录创建的文件或目录,只有自己与root才可以删除、
- 也就是说只可管理自己的数据而不能删除他人文件
- 示例:一般老师希望学生可以将作业上传到某个特定目录,但为了避免某些小破坏份子,想限制删除其他人文件的话,就需要设置目示为SBID,用户只能管理自己的数据
查看特殊权限
查看特殊权限的方法就是普通的ls命令:SUID会在所属用户权限本应是x的地方显示s,SGID会在所属用户组权限本应是x的地方显示s,SBIT在其它用户权限本应是x的地方显示t
因为SUID、SGID、Sticky占用x的位置来表示,所以在表示上会有大小写之分。
加入同时开启执行权限和SUID、SGID、Sticky,则权限表示字符是小写的: -rwsr-sr-t 1 root root 4096 6月 23 08:17 conf
如果关闭执行权限,则表示字符会变成大写: -rwSr-Sr-T 1 root root 4096 6月 23 08:17 conf
数字表示文件权限
- 有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需三个数字。 r: 对应数值4 w: 对应数值2 x:对应数值1 -:对应数值0
- 数字设定的关键是mode的取值,我们将rwx看成二进制数,如果有则有1表示,没有则有0表示,那么**rwx r-x r--则可以表示成为 111 101 100 再将其每三位转换成为一个十进制数,就是754
chmod命令
chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限
命令格式:chmod [-cfvR] [--help] [--version] mode file
-
命令参数
-c 当发生改变时,报告处理信息 -f 错误信息不输出 -R 处理指定目录以及其子目录下的所有文件 -v 运行时显示详细处理信息
-
权限相关参数
- --reference=<目录或者文件> 设置成具有指定目录或者文件具有相同的权限
- --version 显示版本信息
- <权限范围>+<权限设置> 使权限范围内的目录或者文件具有指定的权限
- <权限范围>-<权限设置> 删除权限范围的目录或者文件的指定权限
- <权限范围>=<权限设置> 设置权限范围内的目录或者文件的权限为指定的值
-
权限范围:
- u :目录或者文件的当前的用户
- g :目录或者文件的当前的群组
- o :除了目录或者文件的当前用户或群组之外的用户或者群组
- a :所有的用户及群组
-
权限代号:
- r :读权限,用数字4表示
- w :写权限,用数字2表示
- x :执行权限,用数字1表示
- - :删除权限,用数字0
- s :特殊权限
-
文字设定法与数字设定法
chmod [who] [+ | - | =] [mode] 文件名 chmod [mode] 文件名
-
示例
-
增加文件所有用户的可执行权限
chmod a+x log2012.log
-
同时修改不同用户的权限
chmod ug+w,o-x log2012.log
-
删除文件权限
chmod a-x log2012.log
-
使用"="设置权限
chmod u=x log2012.log
-
对于一个止录和其子目录所有文件添加权限
chmod -R u+x test01
-
给file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限
chmod 751 file chmod u=rwx,g=rx,o=x file
-
为所有用户分配读权限
chmod =r file chmod 444 file
-
chown命令
通过chown改变文件的拥有者和群组。在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员
chown [选项]... [所有者][:[组]] 文件.
-
命令参数
-c 显示更改的部分的信息 -f 忽略错误信息 -h 修复符号链接 -R 处理指定目录以及其子目录下的所有文件 -v 显示详细的处理信息 -deference 作用于符号链接的指向,而不是链接文件本身
--reference=<目录或文件> 把指定的目录/文件作为参考,把操作的文件/目录设置成参考文件/目录相同拥有者和群组
--from=<当前用户:当前群组> 只有当前用户和群组跟指定的用户和群组相同时才进行改变
-
示例
-
改变文件拥有者和群组
chown mail:mial log2012.log
-
改变拥有
chown root: log2012.log
-
改变群组
chown :mail log2012.log
-
递归改变指定目录和其子目录下所有文件的拥有者和群组
chown -R -v root:mail test6
-
文件的隐藏属性
文件权限除了读写执行与SUID、SGID、SBIT外还有一种隐藏权限,例如明明有权限删除某个文件却报错了,或者仅能为某个文件追加内容而不能减少内容,遇到这种很"奇怪"的文件,就要怀疑是文件被设置隐藏权限了
-
lsattr命令用于显示文件的隐藏权限,格式为:"lsattr [参数] 文件"。
a 显示所有文件和目录。 l 显示隐藏属性的全称(默认简写成一个字母)。 R 递归处理,将指定目录下的所有文件及子目录一并处理。 d 若目标文件为目录,请加此参数。
chattr命令用于设置文件的隐藏权限,格式为:"chattr [参数] 文件
-
命令参数
i 将无法对文件进行修改,若对目录设置后则仅能修改子文件而不能新建或删除。 a 仅允许补充(追加)内容.无法覆盖/删除(Append Only)。 S 文件内容变更后立即同步到硬盘(sync)。 s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)。 A 不再修改这个文件的最后访问时间(atime)。 b 不再修改文件或目录的存取时间。 D 检查压缩文件中的错误。 d 当使用dump命令备份时忽略本文件/目录。 c 默认将文件或目录进行压缩。 u 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复。 t 让文件系统支持尾部合并(tail-merging)。 X 可以直接访问压缩文件的内容。
su命令与sudo服务
su命令用于变更使用者的身份(切换登陆者),格式为:"su [-] 用户名"。
sudo命令用于给普通用户提供额外权利来完成原本超级用户才能完成的任务,格式为:"sudo [参数] 命令名称"
我们使用sudo程序可以仅将特定的命令/程序执行权限赋予给指定的用户,同时也避免了过多使用root身份,只要合理的配置sudo功能便可以合理的兼顾系统的安全性和用户便捷性,给读者的原则: 在保证普通用户完成工作的前提下,尽可能少的给予额外的权限。
-
sudo命令的特色
- 限制用户执行指定的命令。
- 记录用户执行的每一条命令。
- 配置文件(/etc/sudoers)提供集中的管理用户、权限与主机等参数。
- 验证过密码后5分钟(默认值)内无须再让用户验证密码,更加的方便。
-
sudo命令参数
- -h 列出帮助信息。
- -l 列出当前用户可执行的命令。
- -u 用户名或UID值 以指定的用户身份执行命令。
- -k 清空安全时间,下次执行sudo时需要再次密码验证。
- -b 在后台执行指定的命令。
- -p 更改询问密码的提示语。
只有超级用户才可以使用visudo命编缉sudo程序的配置文件,具体的命令格式为:允许使用sudo服务的主机 以谁的身份执行命令 具体可执行命令的列表
-
示例:允许linuxprobe用户能够从任意主机执行任意命令的参数
visudo linuxprobe ALL=(ALL)ALL
-
示例:仅允许linuxprobe用户以root用户身份执行cat命令
linuxprobe ALL=(root) /bin/cat
-
示例:允许linuxprobe用户以任意身份执行命令,且每次都不需要密码验证
linuxprobe ALL=NOPASSWD: ALL
文件访问控制列表
如果希望对某个指定的用户进行单独的权限设置,那么就需要用文件的访问控制列表来实现
我们可以基于普通文件或目录设置进行设置ACL,通俗来说ACL就是设置指定的特定用户或用户组对某个文件的操作权限。并且如果对某个目录设置了访问控制策略,那么子文件则继承其访问策略,而若对文件设置了访问控制策略则不再继承上级目录的控制策略。
getfacl命令用于显示文件的ACL规则,格式为:"getfacl 文件"
setfacl命令用于增加或者修改ACL规则,格式为:"setfacl [参数] 文件"。
-
setfacl命令参数
- -R 递归(对目录使用)
- -m 设置文件的acl规则
- -b 删除acl规则
-
示例:一般情况下不能进入其它用户的的目录,如果设置了acl,则可以进入其目录
cd /root -bash: cd: /root: Permission denied setfacl -Rm u:linuxprobe:rwx /root su - linuxprobe cd /root ls