赞
踩
权限简介与开启:
基本权限:用户对文件拥有的所有者、所属组、其他人三类身份;
每个身份都有都有读、写、执行三种文件读写权限;
还有对系统的umask 权限(新添加的用户,默认拥有的权限设置)
其他权限:
一、ACL权限
1、ACL权限简介
1)如上,有个项目需要某开发组项目组长、该组的成员共同完成,于是组长创建了一个项目目录/project,组长对该文件具有最
高权限,成员拥有基本的读写执行权限,其他人对该项目只有比如读的权限。所以组长为文件的所有者,具有读写执行权限,为
了该组其他成员也可以参与进来,而文件所有者只能有一个人,为了实现以上需求,为该组成员创建了一个所属组tgroup,把该组
其他成员都作为附加组,加入到该组中,为该组赋予读写执行权限。而对于其他人,设置一个读权限。
而突然有一天,有个测试组成员需要加入到该项目开发组中,但是权限和所有者、所属组、其他人的权限都不同,怎么办?
此时,就用到了ACL权限,专门用于身份不足的问题。
解决方案原理:类似于Windows中的权限管理,忽略一个用户的身份,只要找到某个文件,为该文件为某个用户自定义添加权限
即可。这个思路就和Linux中的ACL权限一致。但是,ACL权限需要文件所在的磁盘分区支持ACL权限,才可使用这一功能,
那如何查看磁盘是否支持ACL权限呢???
下面继续
读写执行权限是用户权限操作文件的权限,ACL权限本身也是用户操作文件的权限,但是是否支持ACL权限,指的是文件所在的
分区是否支持ACL权限
df -h 命令是用来查看当前系统有哪些分区,分区占用资源、使用的情况
2)查看分区ACL权限是否开启
dumpe2fs -h /dev/sda3
#dumpe2fs 命令是查询指定分区详细文件系统信息的命令
选项:
-h 仅显示超级块中信息,而不显示磁盘块组的详细信息
注:读写执行权限是用户操作文件的权限:
ACL权限也是用户操作文件的权限,但是是否支持ACL权限,需要文件所在的分区支持ACL权限
示例:
df -h 查询当前系统分区信息
dumpe2fs -h /dev/sda 查询分区ACL权限是否打开命令
- 查询当前系统分区信息
-
- [root@localhost ~]# df -h
- Filesystem Size Used Avail Use% Mounted on
- /dev/mapper/VolGroup-lv_root
- 18G 7.7G 8.6G 48% /
- tmpfs 931M 224K 931M 1% /dev/shm
- /dev/sda1 477M 41M 411M 9% /boot
- /dev/sr0 3.8G 3.8G 0 100% /media/CentOS_6.10_Final
-
- [root@localhost ~]# dump
- dump-acct dumpe2fs dumphint dumpiso dumpkeys dump-utmp
- [root@localhost ~]# dumpe2fs -h /dev/s
- scd0 sda1 sg0 shm/ snd/ stderr stdout
- sda sda2 sg1 snapshot sr0 stdin systty
-
- 查询sda2是否支持ACL权限
- [root@localhost ~]# dumpe2fs -h /dev/sda2
- dumpe2fs 1.41.12 (17-May-2010)
- dumpe2fs: Bad magic number in super-block 当尝试打开 /dev/sda2 时
- 找不到有效的文件系统超级块.
- [root@localhost ~]# dumpe2fs -h /dev/sda
- dumpe2fs 1.41.12 (17-May-2010)
- dumpe2fs: Bad magic number in super-block 当尝试打开 /dev/sda 时
- 找不到有效的文件系统超级块.
-
- 通过以上发现,上面都不支持
-
- 执行下面命令,可以发现出来一堆内容,支持ACL分区
- [root@localhost ~]# dumpe2fs -h /dev/sda1
- dumpe2fs 1.41.12 (17-May-2010)
- Filesystem volume name: <none>
- Last mounted on: /boot
- Filesystem UUID: ae089b3b-ead9-401d-b17f-80d4575f207f
- Filesystem magic number: 0xEF53
- Filesystem revision #: 1 (dynamic)
- Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
- Filesystem flags: signed_directory_hash
- Default mount options: user_xattr acl
- Filesystem state: clean
- Errors behavior: Continue
- Filesystem OS type: Linux
- Inode count: 128016
- Block count: 512000
- Reserved block count: 25600
- Free blocks: 446288
- Free inodes: 127977
- First block: 1
- Block size: 1024
- Fragment size: 1024
- Reserved GDT blocks: 256
- Blocks per group: 8192
- Fragments per group: 8192
- Inodes per group: 2032
- Inode blocks per group: 254
- Flex block group size: 16
- Filesystem created: Sun Nov 25 22:51:02 2018
- Last mount time: Sun Dec 2 17:01:51 2018
- Last write time: Sun Dec 2 17:01:51 2018
- Mount count: 6
- Maximum mount count: -1
- Last checked: Sun Nov 25 22:51:02 2018
- Check interval: 0 (<none>)
- Lifetime writes: 62 MB
- Reserved blocks uid: 0 (user root)
- Reserved blocks gid: 0 (group root)
- First inode: 11
- Inode size: 128
- Journal inode: 8
- Default directory hash: half_md4
- Directory Hash Seed: f81eaaf9-d505-402c-a40b-d89b78e49a13
- Journal backup: inode blocks
- Journal features: (none)
- 日志大小: 8M
- Journal length: 8192
- Journal sequence: 0x00000035
- Journal start: 0
-
- [root@localhost ~]#
如上
Default mount options: user_xattr acl
该行显示,该设备,或者说分区默认支持ACL权限
如果一个设备或者分区默认不支持ACL权限,如何主动开启ACL权限呢?
下面介绍
3、临时开启分区ACL权限
【root@localhost ~】# mount -o remount ,acl /
#重新挂载根分区,并挂载加入acl权限
- [root@localhost /]# mount -o remount,acl /
- [root@localhost /]# ls
- bin dev home lib64 media mnt opt root selinux sys usr
- boot etc lib lost+found misc net proc sbin srv tmp var
- [root@localhost /]#
4、永久开启分区ACL权限
【root@localhost ~】# vi /etc/fstab
UUID=ae089b3b-ead9-401d-b17f-80d4575f207f /boot ext4 defaults 1 2
UUID=ae089b3b-ead9-401d-b17f-80d4575f207f / ext4 defaults,acl 1 2
- [root@localhost /]# vi /etc/fstab
-
-
- #
- # /etc/fstab
- # Created by anaconda on Sun Nov 25 22:51:34 2018
- #
- # Accessible filesystems, by reference, are maintained under '/dev/disk'
- # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
- #
- /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
- UUID=ae089b3b-ead9-401d-b17f-80d4575f207f /boot ext4 defaults 1 2
- /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
- tmpfs /dev/shm tmpfs defaults 0 0
- devpts /dev/pts devpts gid=5,mode=620 0 0
- sysfs /sys sysfs defaults 0 0
- proc /proc proc defaults 0 0
- ~
- ~
- ~
- ~
- ~
- ~
- ~
- ~
- "/etc/fstab" 15L, 779C
【root@localhost ~】# mount -o remount /
# 重新挂载文件系统或重启系统,使修改生效
#重新挂载根分区,并挂载加入acl权限
ACL权限——查看与设定
5、查看ACL命令
【root@localhost ~】# getfacl 文件名
#查看acl权限
6、设定ACL权限的命令
【root@localhost ~】# setfacl 【选项】 文件名
选项:
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
7、给用户组设定ACL权限
【root@localhost ~】#groupadd 用户组名 #添加用户组
【root@localhost ~】#setfacl -m g:用户组名:rwx 文件名 为某用户组设置acl权限
8、最大有效权限mask
mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要
和mask的权限做“与操作”才能得到用户的真正权限。
即如果文件最大有效权限mask为读 r 和执行 x 权限,即便用户拥有对文件的读 r 写 w 执行 x 权限,
经过与操作,该用户对该文件的acl权限为读 r 和执行 x 权限。
A | B | AND |
r | r | r |
r | - | - |
- | r | - |
- | - | - |
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx
- group:tgroup2:rwx
- mask::rwx
- other::---
-
如上:acl用户的权限usr:st:r-x ,mask的权限为rwx, 因为mask权限为全部权限,所以用户的acl权限为本身的权限,如果更改
mask的权限,则用户(acl用户和用户所属组内用户)真正的acl权限为该用户的权限与mask经过与操作后的结果
-
- [root@localhost /]# setfacl -m m:rx /project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx #effective:r-x
- group:tgroup2:rwx #effective:r-x
- mask::r-x
- other::---
-
- 注意和上面的对比下mask的值
示例演示:
步骤一、
#创建一个文件夹,添加几个用户,设置一个测试组
#把用户添加到测试组中
最后查看添加组成员的效果
-
- [root@localhost /]# mkdir /project
- [root@localhost /]# useradd bimm
- [root@localhost /]# useradd cangls
- [root@localhost /]# groupadd tgroup
- [root@localhost /]# gpasswd -a bimm tgroup
- 正在将用户“bimm”加入到“tgroup”组中
- [root@localhost /]# gp
- gpasswd gpgkey2ssh gpk-application gpk-prefs
- gpg gpgparsemail gpk-install-catalog gpk-repo
- gpg2 gpgsplit gpk-install-local-file gpk-update-icon
- gpg-agent gpgv gpk-install-mime-type gpk-update-viewer
- gpgconf gpgv2 gpk-install-package-name gprof
- gpg-connect-agent gpg-zip gpk-install-provide-file
- gpg-error gpic gpk-log
- [root@localhost /]# gpasswd -a cangls tgroup
- 正在将用户“cangls”加入到“tgroup”组中
- [root@localhost /]# [root@localhost /]# cat /etc/group
- root:x:0:
- 省略部分
-
- sc:x:501:
- tg:x:502:
- bimm:x:503:
- cangls:x:504:
- tgroup:x:505:bimm,cangls
-
步骤二:为project项目修改相应的所有者 所属组 其他人的相应权限
- tgroup:x:505:bimm,cangls
- [root@localhost /]# chown root:tgroup /project/
- [root@localhost /]# chmode 770 /project/
- -bash: chmode: command not found
- [root@localhost /]# chmod 770 /project/
- [root@localhost /]# ll -d /project/
- drwxrwx---. 2 root tgroup 4096 12月 9 00:30 /project/
- [root@localhost /]#
步骤三、如果出现一个新用户——试听用户,其权限和所有者、所属组、其他人权限都不同,该怎么办呢?
接下来就是设置一个ACL权限,所以,以下即为添加一个新用户,并为其设置密码;为文件project设置acl权限
- [root@localhost /]# useradd st
- [root@localhost /]# passwd st
- 更改用户 st 的密码 。
- 新的 密码:
- 无效的密码: 过于简单化/系统化
- 无效的密码: 过于简单
- 重新输入新的 密码:
- 抱歉,密码不匹配。
- 新的 密码:
- 重新输入新的 密码:
- passwd: 所有的身份验证令牌已经成功更新。
- [root@localhost /]# setfacl -m u:st:rx /project/
- [root@localhost /]# ll -d /project/
- drwxrwx---+ 2 root tgroup 4096 12月 9 00:30 /project/
- [root@localhost /]# getfa
- getfacl getfattr
- [root@localhost /]# getfacl /pro
- proc/ project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x #刚设置的acl权限
- group::rwx
- mask::rwx
- other::---
-
- [root@localhost /]#
步骤三、验证上面的设定等是否正确。
方法:切换用户为相应用户,查看其特定权限是否存在即可
比如st用户是否有读权限(即是否可以进入project目录),是否有写权限(即是否能在project目录下创建目录文件等)
- [root@localhost /]# su -st
- su: t: 没有那个文件或目录
- [root@localhost /]# su - st
- [st@localhost ~]$ cd /pro
- proc/ project/
- [st@localhost ~]$ cd /project/
- [st@localhost project]$ ls
- [st@localhost project]$ touch abc
- touch: 无法创建"abc": 权限不够
- [st@localhost project]$
- #退出st用户
- [st@localhost project]$ exit
- logout
- [root@localhost /]#
-
7、给用户组设定ACL权限
【root@localhost ~】#groupadd 用户组名 #添加用户组
【root@localhost ~】#setfacl -m g:用户组名:rwx 文件名 为某用户组设置acl权限
步骤四、为用户组设定ACL权限。包括添加新的用户组,并为其设置权限,添加用户到该组,测试该用户权限是否生效
- [root@localhost /]# groupadd tgroup2
- [root@localhost /]# setfacl -m g:tgroup2:rwx project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx
- group:tgroup2:rwx
- mask::rwx
- other::---
-
- [root@localhost /]#
8、最大有效权限mask
mask是用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限做“与操作”才能得到用户的真正权限。
即如果文件最大有效权限mask为读 r 和执行 x 权限,即便用户拥有对文件的读 r 写 w 执行 x 权限,经过与操作,该用户对该文件的acl权限为读 r 和执行 x 权限。
A | B | AND |
r | r | r |
r | - | - |
- | r | - |
- | - | - |
设定最大有效权限:mask
[root@localhost /]# setfacl -m m:rx /project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx
- group:tgroup2:rwx
- mask::rwx
- other::---
-
步骤五、
如上:acl用户的权限usr:st:r-x ,mask的权限为rwx, 因为mask权限为全部权限,所以用户的acl权限为本身的权限,如果更改
mask的权限,则用户(acl用户和用户所属组内用户)真正的acl权限为该用户的权限与mask经过与操作后的结果
-
- [root@localhost /]# setfacl -m m:rx /project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx #effective:r-x
- group:tgroup2:rwx #effective:r-x
- mask::r-x
- other::---
-
- 注意和上面的对比下mask的值
此时请注意文件中的#effective:r-x
也就是用户的acl权限和用户组的权限会受到影响。
9、删除ACL权限
【root@localhost ~】#setfacl -x u:用户名 文件名
#删除指定用户的ACL权限
【root@localhost ~】#setfacl -x g:用户名 文件名
#删除指定用户组的ACL权限
【root@localhost ~】#setfacl -b 文件名
#删除文件下所有的ACL权限
步骤7:如下示例
- [root@localhost /]# setfacl -x g:tgroup2 /project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx
- mask::rwx
- other::---
-
- [root@localhost /]# setfacl -b /project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- group::rwx
- other::---
-
- [root@localhost /]#
10、递归ACL权限
递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。
命令:
【root@localhost ~】#setfacl -m 用户名:权限 -R 文件名
注:这里的文件名包括文件夹和文件
步骤八、看如下示例
- [root@localhost /]# setfacl -m u:st:rx /project/
- [root@localhost /]# getfacl /project/
- getfacl: Removing leading '/' from absolute path names
- # file: project/
- # owner: root
- # group: tgroup
- user::rwx
- user:st:r-x
- group::rwx
- mask::rwx
- other::---
-
- [root@localhost /]# cd /project/
- [root@localhost project]# touch abc
- [root@localhost project]# touch bcd
- [root@localhost project]# ls
- abc bcd
- [root@localhost project]# ll
- 总用量 0
- -rw-r--r--. 1 root root 0 12月 9 02:14 abc
- -rw-r--r--. 1 root root 0 12月 9 02:14 bcd
- [root@localhost project]# ll -d /project/
- drwxrwx---+ 2 root tgroup 4096 12月 9 02:14 /project/
- [root@localhost project]# setfacl -m u:st:rx -R /project/
- [root@localhost project]# ll
- 总用量 8
- -rw-r-xr--+ 1 root root 0 12月 9 02:14 abc
- -rw-r-xr--+ 1 root root 0 12月 9 02:14 bcd
- [root@localhost project]# getfacl abc
- # file: abc
- # owner: root
- # group: root
- user::rw-
- user:st:r-x
- group::r--
- mask::r-x
- other::r--
11、默认ACL权限
默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么 父目录中所有新建的子文件都会继承父目录的ACL权限
命令:
【root@localhost ~】#setfacl -m d:u:用户名:权限 文件名
- [root@localhost project]# ll -d /project/
- drwxrwx---+ 2 root tgroup 4096 12月 9 02:14 /project/
- [root@localhost project]# setfacl -m u:st:rx -R /project/
- [root@localhost project]# ll
- 总用量 8
- -rw-r-xr--+ 1 root root 0 12月 9 02:14 abc
- -rw-r-xr--+ 1 root root 0 12月 9 02:14 bcd
- [root@localhost project]# getfacl abc
- # file: abc
- # owner: root
- # group: root
- user::rw-
- user:st:r-x
- group::r--
- mask::r-x
- other::r--
-
- [root@localhost project]# setfacl -m d:u:st:rx -R /project/
- [root@localhost project]# touch def
- [root@localhost project]# ll
- 总用量 12
- -rw-r-xr--+ 1 root root 0 12月 9 02:14 abc
- -rw-r-xr--+ 1 root root 0 12月 9 02:14 bcd
- -rw-rw----+ 1 root root 0 12月 9 02:21 def
二、文件特殊权限(SetUID、SetGID、SetBID)
1、setUID
1)只有可以执行的二进制程序才能设定SUID权限:即必须改可执行的程序文件进行设置
比如:passwd文件是一个可以执行的命令文件,所以可被赋予SUID权限
2)命令执行者要对该程序拥有x(执行)权限
3)命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
即任何一个普通用户在执行SUID文件的执行权限时,会自动拥有执行权限
4)SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
例如:
passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码
- [root@localhost /]# ll /usr/bin/passwd
- -rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd
注意这里所说的SetUID,即如上 所有者的权限为-rwsr 中的“ s ”
- [zhouxueli@localhost dev]$ ll /etc/shadow
- ----------. 1 root root 1342 12月 9 00:47 /etc/shadow
普通用户对于/etc/shadow文件没有任何权限,但普通用户可以更改自己的密码,并长久生效
可见普通用户肯定写入了内容到/etc/shadow文件中
为何会这样呢?
原因就在于passwd 命令的所有者权限为rwsr,即使用passwd命令的用户拥有了SetUID权限
普通用户在往/etc/shadow文件中写内容时,被临时赋予了读写权限,进而能实现。
cat 命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容
如下,与上方同理,cat命令的所有者权限为rwxr 没有" s ”,所以普通用户无法使用该命令
如,root用户可以看到如下内容
- [root@localhost /]#
- [root@localhost /]# ll /bin/cat
- -rwxr-xr-x. 1 root root 48568 6月 19 23:15 /bin/cat
- [root@localhost /]#
- [root@localhost /]# cat /etc/shadow
- root:$6$4U2qaEjT2hXXufY6$pBFzSMgMs8z/y/jtfqlPew22BFejME73ea8vJWY2JfJhhaAmFX631DgP0kaP40LvXJWe1Z5I4SEunYyh0utcu0:17860:0:99999:7:::
- bin:*:17246:0:99999:7:::
- daemon:*:17246:0:99999:7:::
- adm:*:17246:0:99999:7:::
- lp:*:17246:0:99999:7:::
- sync:*:17246:0:99999:7:::
- shutdown:*:17246:0:99999:7:::
- halt:*:17246:0:99999:7:::
- mail:*:17246:0:999
但是普通用户
- [zhouxueli@localhost dev]$ ll /bin/cat
- -rwxr-xr-x. 1 root root 48568 6月 19 23:15 /bin/cat
- [zhouxueli@localhost dev]$
- [zhouxueli@localhost dev]$ vim /etc/shadow
-
-
- ~
- ~
- ~
-
- ~
- ~
- ~
- "/etc/shadow" [权限不足]
5)设定SetUID的方法
命令中4代表SUID
》chmod 4755 文件名 (4 特殊权限 7表示所有者权限 5 所属组权限 5其他人的权限)
》chmod u+s 文件名
补充
chmod 4755 文件名 (4 特殊权限 7表示所有者权限 5 所属组权限 5其他人的权限)
赋予UID特殊权限,即赋予所有者特殊权限
chmod 2755 文件名 (2 特殊权限 7表示所有者权限 5 所属组权限 5其他人的权限)
赋予GID权限,即赋予所属组特殊权限
chmod 1755 文件名 (1 特殊权限 7表示所有者权限 5 所属组权限 5其他人的权限)
赋予BIT权限 ,赋予其他人特殊权限
- [root@localhost /]# touch abc
- [root@localhost /]# ll abc
- -rw-r--r--. 1 root root 0 12月 9 03:12 abc
- [root@localhost /]# chmod 4755 abc
- [root@localhost /]# ll
- 总用量 106
- -rwsr-xr-x. 1 root root 0 12月 9 03:12 abc
- [root@localhost /]# chmod 644 abc
- [root@localhost /]# lk
- -bash: lk: command not found
- [root@localhost /]# ll
- 总用量 106
- -rw-r--r--. 1 root root 0 12月 9 03:12 abc
- dr-xr-xr-x. 2 root root 4096 12月 2 03:41 bin
但是,注意以下,给abc文件所有者增加 SUID权限,注意 命令提示符会出现大写的S,
这个S和普通的passwd文件自带的小写的s是不一样的,这里的S是不起作用的
因为该目录本身,没有x(执行)权限,所以给该文件赋予SUID权限,是无用的
- [root@localhost /]# chmod u+s abc
- [root@localhost /]# ll abc
- -rwSr--r--. 1 root root 0 12月 9 03:12 abc
6)危险的SetUID:
》关键目录应严格控制写权限。比如“/” 、“/usr”等
》用户的密码设置要严格遵守密码三原则
》对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限
普通用户默认使用的都是vim权限,root用户可以随意切换vi vim
如果给vim赋予SUID (4755)权限,那么是一件危险的事,
- [root@localhost /]# chmod 4755 /usr/bin/vim
- [root@localhost /]# ll /usr/bin/vim
- -rwsr-xr-x. 1 root root 2324712 12月 22 2016 /usr/bin/vim
实际上如上,Linux命令行中会显示后面/usr/bin/vim 为红色突出显示,表示危险警告
同时,所有者等的权限有s 符号,也就是SUID权限,这里的所有者为root,也就是会更改所有者为root,
那么,此时无论用户是谁(root还是普通用户)通过使用vim去更改只有root权限才有权限查看更改的文件都能生效
所以为了防止出现以上情况,现在实验完毕立马更换回来
- [root@localhost /]# chmod 755 /usr/bin/vim
- [root@localhost /]# ll /usr/bin/vim
- -rwxr-xr-x. 1 root root 2324712 12月 22 2016 /usr/bin/vim
2、SetGID (SGID权限)
》》》》SGID针对文件的作用,和SUID非常类似,SUID是可以针对目录的
1)只有可执行的二进制程序才能设置SGID权限
2)命令执行者要对该程序拥有x(执行)权限
3)命令执行在执行程序的时候,组身份升级为该程序文件的所属组
4)SetGID权限同样只在改程序执行的过程中有效,也即是说组身份改变只在程序执行过程中有效
以locate命令示例:
5)【root@localhost ~】# ll /usr/bin/locate
- [root@localhost /]#
- [root@localhost /]# ll /usr/bin/locate
- -rwx--s--x. 1 root slocate 38464 3月 12 2015 /usr/bin/locate
- [root@localhost /]# ll /var/lib/mlocate/mlocate.db
- -rw-r-----. 1 root slocate 3141779 12月 9 03:23 /var/lib/mlocate/mlocate.db
- [root@localhost /]#
如上,普通用户搜索该数据库,普通用户是没有权限搜索mlocate.db文件的
注意,以上可以看出,locate命令所属组默认有s 权限,也就是locate命令有SGID权限,并且其他人有x权限
普通用户组中用户使用locate命令时,
- [root@localhost /]# whereis locate
- locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
- [root@localhost /]# ll /usr/bin/locate
- -rwx--s--x. 1 root slocate 38464 3月 12 2015 /usr/bin/locate
- [root@localhost /]#
以上实现原理:
》/usr/bin/locate是可执行二进制程序,可以赋予SGID
》执行用户/lamp对/usr/bin/locate命令拥有执行权限
》执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db
数据库拥有 r 权限,所以普通用户可以使用locate命令查询mloate.db数据库
》命令结束,lamp用户的组身份返回为lamp
》》》》SetGID针对目录的作用
1)普通用户必须对此目录拥有 r 和 x 权限,才能进入此目录
2)普通用户在此目录中的有效组会变成此目录的所属组
3)若普通用户对此目录拥有权限时,新建的文件的默认所属组是这个目录的所属组
示例:
>>>设定SetGID
注意:2代表GID
》chmod 2755 文件名
》chmod g+s 文件名
示例:
步骤一、创建一个test目录并进入
步骤二、进入该目录后再创建一个文件dtest
步骤三、查看该目录的权限等信息
步骤四、更改dtest目录的读写权限为2777,即让普通用户对该文件拥有读写执行权限
步骤五、切换进入一个普通用户登录
步骤六、让该普通用户进入dtest目录中,并创建文件
- [root@localhost ~]#
- [root@localhost ~]# chmod 2777 /tmp/test/
- [root@localhost ~]# ll -d /tmp/test/
- drwxrwsrwx. 2 root root 4096 12月 9 04:14 /tmp/test/
- [root@localhost ~]# su - lamp
- [lamp@localhost ~]$ pwd
- /home/lamp
- [lamp@localhost ~]$ touch abc
- [lamp@localhost ~]$ ll
- 总用量 0
- -rw-rw-r--. 1 lamp lamp 0 12月 9 04:25 abc
- [lamp@localhost ~]$ cd /tmp/test/
- [lamp@localhost test]$ touch bcd
- [lamp@localhost test]$ ll
- 总用量 0
- -rw-rw-r--. 1 lamp root 0 12月 9 04:26 bcd
- [lamp@localhost test]$
注意如上,abc文件和bcd文件所属组的不同
4)取消SetGID
》chmod 755 文件名
》chmod g-s 文件名
3、Sticky BIT(黏着位权限)——SBIT黏着位作用
1)黏着位目前只对目录有效
2)普通用户对该目录拥有w和x 权限,即普通用户可以在此目录拥有写入权限
3)如果没有黏着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的 文件。一旦赋予了黏着
位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
示例:
/tmp 目录默认拥有1777权限
如果给/tmp赋予1777权限,则A用户只能删除自己创建的文件,无法删除其他人创建的目录,当然只针对于普通用户
如果给/tmp赋予7777权限,则A用户可以删除任何人在/tmp下创建的任何文件
4)设置黏着位的方法
》chmod 1755 目录名
》chmod o+t 目录名
5)取消黏着位
》chmod 777 目录名
》chmod o-t 目录名
总结:
SUID 可以针对文件,只针对二进制文件
SGID可以针对文件和目录,但是作用不同
SBIT只能针对目录
所以无论赋予某个文件7777权限也无意义,所以一般会赋予一个目录或者文件4 2 1 权限
4表示UID 2 表示GID 1 表示BIT
注意:定时检查是否多出来一个SUID的文件,有的话,特别注意
三、文件系统属性chattr权限
1、chattr 命令格式
【root@localhost ~】# chattr [+ - =]【选项】 文件或目录名
+ :增加权限
- :删除权限
= :等于某权限
选项:
》i :如果对文件设置 i 属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;相当于把文件锁起来,对root权限也生效。即root也不能看
如果对目录设置 i 属性,那么只能修改目录下文件的数据,但不允许建立和删除文件;
》a : 如果对文件设置 a 属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;
如果对目录设置 a 属性,那么只允许在目录中建立和修改文件,但是不允许 删除。
- [root@localhost ~]# ls
- anaconda-ks.cfg install.log.syslog 模板 图片 下载 桌面
- install.log 公共的 视频 文档 音乐
- [root@localhost ~]# touch abc
- [root@localhost ~]# ll
- 总用量 100
- -rw-r--r--. 1 root root 0 12月 9 06:11 abc
- -rw-------. 1 root root 1612 11月 25 23:12 anaconda-ks.cfg
- -rw-r--r--. 1 root root 46832 11月 25 23:12 install.log
- -rw-r--r--. 1 root root 11504 11月 25 23:07 install.log.syslog
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 公共的
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 模板
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 视频
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 图片
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 文档
- drwxr-xr-x. 5 root root 4096 12月 2 05:28 下载
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 音乐
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 桌面
- [root@localhost ~]# echo 111 >> abc
- [root@localhost ~]# cat abc
- 111
- [root@localhost ~]# ll
- 总用量 104
- -rw-r--r--. 1 root root 4 12月 9 06:11 abc
- -rw-------. 1 root root 1612 11月 25 23:12 anaconda-ks.cfg
- -rw-r--r--. 1 root root 46832 11月 25 23:12 install.log
- -rw-r--r--. 1 root root 11504 11月 25 23:07 install.log.syslog
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 公共的
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 模板
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 视频
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 图片
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 文档
- drwxr-xr-x. 5 root root 4096 12月 2 05:28 下载
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 音乐
- drwxr-xr-x. 2 root root 4096 11月 25 23:29 桌面
- [root@localhost ~]# lsattr -a abc
- -------------e- abc
- [root@localhost ~]# chattr +i abc
- [root@localhost ~]# lsattr -a abc
- ----i--------e- abc
- #如上,出现了一个 i 属性
-
- [root@localhost ~]# cat abc
- 111
-
- 再次写数据,无法写入,文件也无法被删除,即便当前用户是root
-
- [root@localhost ~]# echo 4444 >> abc
- -bash: abc: 权限不够
- [root@localhost ~]# rm abc
- rm:是否删除普通文件 "abc"?y
- rm: 无法删除"abc": 不允许的操作
- [root@localhost ~]#
使用场景:如果某个目录防止用户误操作,可以通过添加 i 属性,增加保护。
注:如果想要恢复,使用 chattr - i或者-a 文件或者目录名即可
即i属性相当于加了一把锁,文件完全不可动,目录是指只能在目录中的文件内添加数据,但不可删除或添加文件
a 属性相比于 i 属性稍微宽松,允许增加数据,但原内容不可修改和删除;对于目录,可以在其内添加文件,但不可删除。
2、查看文件系统属性
【root@localhost ~】# lsattr 【选项】 文件名
选项:
-a 显示所有文件和目录
-d 若目标是目录,仅列出目录本身的属性,而不是文件的
四、系统命令sudo权限
1、sudo 权限
》root把本来只能超级用户执行的命令 赋予普通用户执行
》sudo的操作对象是系统命令。命令文件也是文件,但是是特殊的文件
2、sudo使用
【root@localhost ~】# visudo
# 实际修改的是/etc/sudoers 文件
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
#%wheel ALL=(ALL) ALL
#%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
3、授权sc用户可以重启服务器
【root@localhost ~】# visudo
sc ALL=/sbin/shutdown -r now
4、普通用户执行sudo赋予的命令
【root@localhost ~】# su - sc
【root@localhost ~】# sudo -l
# 查看可用的sudo命令
【root@localhost ~】# sudo /sbin/shutdown -r now
# 普通用户执行sudo赋予的命令
特别注意:千万不能把vim 命令赋给普通用户,极其危险
因为这样,普通用户会拥有和root一样的能力
示例:
- [root@localhost ~]# cd /tmp/
- [root@localhost tmp]# ls
- dtest keyring-CiiiEC orbit-root virtual-root.4b6x5W
- gconfd-gdm keyring-ezWj0w orbit-zhouxueli virtual-root.DAJQBL
- gconfd-root keyring-QdfnOj pulse-jx3uTY1OwmLg virtual-root.iH8OBu
- gconfd-zhouxueli keyring-vlJ6ai pulse-kGStbLy1xGsu virtual-root.OWCe77
- keyring-5lWOtJ keyring-YABvNr pulse-XO0xTHUNAOA1 virtual-zhouxueli.kdrfZP
- keyring-9AGKSr keyring-ZAwFhT test virtual-zhouxueli.Xc6jGV
- keyring-AyTbpD orbit-gdm virtual-root.2GIIay
- [root@localhost tmp]# toucha vitest
- -bash: toucha: command not found
- [root@localhost tmp]# touch vitest
- [root@localhost tmp]# ls
- dtest keyring-CiiiEC orbit-root virtual-root.4b6x5W
- gconfd-gdm keyring-ezWj0w orbit-zhouxueli virtual-root.DAJQBL
- gconfd-root keyring-QdfnOj pulse-jx3uTY1OwmLg virtual-root.iH8OBu
- gconfd-zhouxueli keyring-vlJ6ai pulse-kGStbLy1xGsu virtual-root.OWCe77
- keyring-5lWOtJ keyring-YABvNr pulse-XO0xTHUNAOA1 virtual-zhouxueli.kdrfZP
- keyring-9AGKSr keyring-ZAwFhT test virtual-zhouxueli.Xc6jGV
- keyring-AyTbpD orbit-gdm virtual-root.2GIIay vitest
- root@localhost ~]# cd /tmp/
- [root@localhost tmp]# chmod 600 vitest
- [root@localhost tmp]# su - sc
- [sc@localhost ~]$ cd /tmp/
- [sc@localhost tmp]$ vi vitest
-
-
- ~
- ~
- ~
- "vitest" [权限不足]
-
- [sc@localhost tmp]$ sudo /usr/bin/vim vitest
-
- We trust you have received the usual lecture from the local System
- Administrator. It usually boils down to these three things:
-
- #1) Respect the privacy of others.
- #2) Think before you type.
- #3) With great power comes great responsibility.
-
- [sudo] password for sc:
- Sorry, try again.
- [sudo] password for sc:
- Sorry, try again.
- [sudo] password for sc:
- Sorry, try again.
- sudo:3 次错误密码尝试
- [sc@localhost tmp]$ su - zhouxueli
- 密码:
- su: 密码不正确
- [sc@localhost tmp]$ su - zhouxueli
- 密码:
- su: 密码不正确
- [sc@localhost tmp]$ su - zhouxueli
- 密码:
- [zhouxueli@localhost ~]$ cd /tmp/
- [zhouxueli@localhost tmp]$ vi vitest
- ~
- ~
- ~
- ~
- ~
- "vitest" [权限不足]
- [zhouxueli@localhost tmp]$ sudo /usr/bin/vim vitest
-
- We trust you have received the usual lecture from the local System
- Administrator. It usually boils down to these three things:
-
- #1) Respect the privacy of others.
- #2) Think before you type.
- #3) With great power comes great responsibility.
-
- [sudo] password for zhouxueli:
- zhouxueli 不在 sudoers 文件中。此事将被报告。
- [zhouxueli@localhost tmp]$
-
- 因为以上zhouxueli用户不在sudoers文件中,所以如果该用户被写入文件中,则
- vim将会拥有强大的权限,极可能产生巨大破坏
-
- 如果想实验成功,需要如下操作:在visudo中添加如下
-
- zhouxueli 192.168.1.132=/usr/bin/vim
- 具体如下:
- [root@localhost ~]#
- [root@localhost ~]#
- [root@localhost ~]#
- [root@localhost ~]# visudo
-
- ## Sudoers allows particular users to run various commands as
- ## the root user, without needing the root password.
- ##
- ## Examples are provided at the bottom of the file for collections
- ## of related commands, which can then be delegated out to particular
- ## users or groups.
-
- ## Host Aliases
- ## Groups of machines. You may prefer to use hostnames (perhaps using
- ## wildcards for entire domains) or IP addresses instead.
- # Host_Alias FILESERVERS = fs1, fs2
- # Host_Alias MAILSERVERS = smtp, smtp2
-
- ## User Aliases
- ## These aren't often necessary, as you can use regular groups
- ## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
- ## rather than USERALIAS
- # User_Alias ADMINS = jsmith, mikem
-
-
- ## Command Aliases
- ## These are groups of related commands...
-
- ## Networking
-
- ## Installation and management of software
- # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
-
- ## Services
- # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
-
- ## Updating the locate database
- # Cmnd_Alias LOCATE = /usr/bin/updatedb
-
- ## Storage
-
- ## Delegating permissions
- # Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
-
- ## Processes
- # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
-
- ## Drivers
- # Cmnd_Alias DRIVERS = /sbin/modprobe
-
- # Defaults specification
-
- #
- # Refuse to run if unable to disable echo on the tty.
- #
- Defaults !visiblepw
-
- #
- # Preserving HOME has security implications since many programs
- # use it when searching for configuration files. Note that HOME
- # is already set when the the env_reset option is enabled, so
- # this option is only effective for configurations where either
- Defaults always_set_home
-
- Defaults env_reset
- Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
- Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
- Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
- Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
- Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
-
- #
- # Adding HOME to env_keep may enable a user to run unrestricted
- # commands via sudo.
- #
- # Defaults env_keep += "HOME"
-
- Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
-
- ## Next comes the main part: which users can run what software on
- ## which machines (the sudoers file can be shared between multiple
- ## systems).
- ## Syntax:
- ##
- ## user MACHINE=COMMANDS
- ##
- ## The COMMANDS section may have other options added to it.
- ##
- ## Allow root to run any commands anywhere
- root ALL=(ALL) ALL
- zhouxueli 192.168.1.132=/usr/bin/vim
-
-
- 如果以上修改完成,保存退出,实验将成功
【root@localhost ~】#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。