权限简介与开启:
基本权限:用户对文件拥有的所有者、所属组、其他人三类身份;
每个身份都有都有读、写、执行三种文件读写权限;
还有对系统的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:
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 ()
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 ~】#