Linux学习之权限管理-ACL权限-简介与开启

权限简介与开启:

基本权限:用户对文件拥有的所有者、所属组、其他人三类身份;

                    每个身份都有都有读、写、执行三种文件读写权限;

                   还有对系统的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 BAND
rrr
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 BAND
rrr
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 ~】#

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值