当前位置:   article > 正文

Linux学习之权限管理-ACL权限-简介与开启_/dev/shm支持acl

/dev/shm支持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权限是否打开命令

  1. 查询当前系统分区信息
  2. [root@localhost ~]# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/mapper/VolGroup-lv_root
  5. 18G 7.7G 8.6G 48% /
  6. tmpfs 931M 224K 931M 1% /dev/shm
  7. /dev/sda1 477M 41M 411M 9% /boot
  8. /dev/sr0 3.8G 3.8G 0 100% /media/CentOS_6.10_Final
  9. [root@localhost ~]# dump
  10. dump-acct dumpe2fs dumphint dumpiso dumpkeys dump-utmp
  11. [root@localhost ~]# dumpe2fs -h /dev/s
  12. scd0 sda1 sg0 shm/ snd/ stderr stdout
  13. sda sda2 sg1 snapshot sr0 stdin systty
  14. 查询sda2是否支持ACL权限
  15. [root@localhost ~]# dumpe2fs -h /dev/sda2
  16. dumpe2fs 1.41.12 (17-May-2010)
  17. dumpe2fs: Bad magic number in super-block 当尝试打开 /dev/sda2
  18. 找不到有效的文件系统超级块.
  19. [root@localhost ~]# dumpe2fs -h /dev/sda
  20. dumpe2fs 1.41.12 (17-May-2010)
  21. dumpe2fs: Bad magic number in super-block 当尝试打开 /dev/sda 时
  22. 找不到有效的文件系统超级块.
  23. 通过以上发现,上面都不支持
  24. 执行下面命令,可以发现出来一堆内容,支持ACL分区
  25. [root@localhost ~]# dumpe2fs -h /dev/sda1
  26. dumpe2fs 1.41.12 (17-May-2010)
  27. Filesystem volume name: <none>
  28. Last mounted on: /boot
  29. Filesystem UUID: ae089b3b-ead9-401d-b17f-80d4575f207f
  30. Filesystem magic number: 0xEF53
  31. Filesystem revision #: 1 (dynamic)
  32. 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
  33. Filesystem flags: signed_directory_hash
  34. Default mount options: user_xattr acl
  35. Filesystem state: clean
  36. Errors behavior: Continue
  37. Filesystem OS type: Linux
  38. Inode count: 128016
  39. Block count: 512000
  40. Reserved block count: 25600
  41. Free blocks: 446288
  42. Free inodes: 127977
  43. First block: 1
  44. Block size: 1024
  45. Fragment size: 1024
  46. Reserved GDT blocks: 256
  47. Blocks per group: 8192
  48. Fragments per group: 8192
  49. Inodes per group: 2032
  50. Inode blocks per group: 254
  51. Flex block group size: 16
  52. Filesystem created: Sun Nov 25 22:51:02 2018
  53. Last mount time: Sun Dec 2 17:01:51 2018
  54. Last write time: Sun Dec 2 17:01:51 2018
  55. Mount count: 6
  56. Maximum mount count: -1
  57. Last checked: Sun Nov 25 22:51:02 2018
  58. Check interval: 0 (<none>)
  59. Lifetime writes: 62 MB
  60. Reserved blocks uid: 0 (user root)
  61. Reserved blocks gid: 0 (group root)
  62. First inode: 11
  63. Inode size: 128
  64. Journal inode: 8
  65. Default directory hash: half_md4
  66. Directory Hash Seed: f81eaaf9-d505-402c-a40b-d89b78e49a13
  67. Journal backup: inode blocks
  68. Journal features: (none)
  69. 日志大小: 8M
  70. Journal length: 8192
  71. Journal sequence: 0x00000035
  72. Journal start: 0
  73. [root@localhost ~]#

如上

Default mount options:    user_xattr acl

该行显示,该设备,或者说分区默认支持ACL权限

如果一个设备或者分区默认不支持ACL权限,如何主动开启ACL权限呢?
下面介绍

3、临时开启分区ACL权限

【root@localhost ~】# mount -o remount ,acl /

#重新挂载根分区,并挂载加入acl权限

  1. [root@localhost /]# mount -o remount,acl /
  2. [root@localhost /]# ls
  3. bin dev home lib64 media mnt opt root selinux sys usr
  4. boot etc lib lost+found misc net proc sbin srv tmp var
  5. [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

  1. [root@localhost /]# vi /etc/fstab
  2. #
  3. # /etc/fstab
  4. # Created by anaconda on Sun Nov 25 22:51:34 2018
  5. #
  6. # Accessible filesystems, by reference, are maintained under '/dev/disk'
  7. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
  8. #
  9. /dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
  10. UUID=ae089b3b-ead9-401d-b17f-80d4575f207f /boot ext4 defaults 1 2
  11. /dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
  12. tmpfs /dev/shm tmpfs defaults 0 0
  13. devpts /dev/pts devpts gid=5,mode=620 0 0
  14. sysfs /sys sysfs defaults 0 0
  15. proc /proc proc defaults 0 0
  16. ~
  17. ~
  18. ~
  19. ~
  20. ~
  21. ~
  22. ~
  23. ~
  24. "/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-
---
  1. [root@localhost /]# getfacl /project/
  2. getfacl: Removing leading '/' from absolute path names
  3. # file: project/
  4. # owner: root
  5. # group: tgroup
  6. user::rwx
  7. user:st:r-x
  8. group::rwx
  9. group:tgroup2:rwx
  10. mask::rwx
  11. other::---

如上:acl用户的权限usr:st:r-x   ,mask的权限为rwx,  因为mask权限为全部权限,所以用户的acl权限为本身的权限,如果更改

mask的权限,则用户(acl用户和用户所属组内用户)真正的acl权限为该用户的权限与mask经过与操作后的结果

  1. [root@localhost /]# setfacl -m m:rx /project/
  2. [root@localhost /]# getfacl /project/
  3. getfacl: Removing leading '/' from absolute path names
  4. # file: project/
  5. # owner: root
  6. # group: tgroup
  7. user::rwx
  8. user:st:r-x
  9. group::rwx #effective:r-x
  10. group:tgroup2:rwx #effective:r-x
  11. mask::r-x
  12. other::---
  13. 注意和上面的对比下mask的值

示例演示:

步骤一、

#创建一个文件夹,添加几个用户,设置一个测试组
#把用户添加到测试组中

最后查看添加组成员的效果

  1. [root@localhost /]# mkdir /project
  2. [root@localhost /]# useradd bimm
  3. [root@localhost /]# useradd cangls
  4. [root@localhost /]# groupadd tgroup
  5. [root@localhost /]# gpasswd -a bimm tgroup
  6. 正在将用户“bimm”加入到“tgroup”组中
  7. [root@localhost /]# gp
  8. gpasswd gpgkey2ssh gpk-application gpk-prefs
  9. gpg gpgparsemail gpk-install-catalog gpk-repo
  10. gpg2 gpgsplit gpk-install-local-file gpk-update-icon
  11. gpg-agent gpgv gpk-install-mime-type gpk-update-viewer
  12. gpgconf gpgv2 gpk-install-package-name gprof
  13. gpg-connect-agent gpg-zip gpk-install-provide-file
  14. gpg-error gpic gpk-log
  15. [root@localhost /]# gpasswd -a cangls tgroup
  16. 正在将用户“cangls”加入到“tgroup”组中
  17. [root@localhost /]# [root@localhost /]# cat /etc/group
  18. root:x:0:
  19. 省略部分
  20. sc:x:501:
  21. tg:x:502:
  22. bimm:x:503:
  23. cangls:x:504:
  24. tgroup:x:505:bimm,cangls

步骤二:为project项目修改相应的所有者 所属组 其他人的相应权限

  1. tgroup:x:505:bimm,cangls
  2. [root@localhost /]# chown root:tgroup /project/
  3. [root@localhost /]# chmode 770 /project/
  4. -bash: chmode: command not found
  5. [root@localhost /]# chmod 770 /project/
  6. [root@localhost /]# ll -d /project/
  7. drwxrwx---. 2 root tgroup 4096 129 00:30 /project/
  8. [root@localhost /]#

步骤三、如果出现一个新用户——试听用户,其权限和所有者、所属组、其他人权限都不同,该怎么办呢?

接下来就是设置一个ACL权限,所以,以下即为添加一个新用户,并为其设置密码;为文件project设置acl权限

  1. [root@localhost /]# useradd st
  2. [root@localhost /]# passwd st
  3. 更改用户 st 的密码 。
  4. 新的 密码:
  5. 无效的密码: 过于简单化/系统化
  6. 无效的密码: 过于简单
  7. 重新输入新的 密码:
  8. 抱歉,密码不匹配。
  9. 新的 密码:
  10. 重新输入新的 密码:
  11. passwd: 所有的身份验证令牌已经成功更新。
  12. [root@localhost /]# setfacl -m u:st:rx /project/
  13. [root@localhost /]# ll -d /project/
  14. drwxrwx---+ 2 root tgroup 4096 129 00:30 /project/
  15. [root@localhost /]# getfa
  16. getfacl getfattr
  17. [root@localhost /]# getfacl /pro
  18. proc/ project/
  19. [root@localhost /]# getfacl /project/
  20. getfacl: Removing leading '/' from absolute path names
  21. # file: project/
  22. # owner: root
  23. # group: tgroup
  24. user::rwx
  25. user:st:r-x #刚设置的acl权限
  26. group::rwx
  27. mask::rwx
  28. other::---
  29. [root@localhost /]#

步骤三、验证上面的设定等是否正确。

方法:切换用户为相应用户,查看其特定权限是否存在即可

比如st用户是否有读权限(即是否可以进入project目录),是否有写权限(即是否能在project目录下创建目录文件等)

  1. [root@localhost /]# su -st
  2. su: t: 没有那个文件或目录
  3. [root@localhost /]# su - st
  4. [st@localhost ~]$ cd /pro
  5. proc/ project/
  6. [st@localhost ~]$ cd /project/
  7. [st@localhost project]$ ls
  8. [st@localhost project]$ touch abc
  9. touch: 无法创建"abc": 权限不够
  10. [st@localhost project]$
  11. #退出st用户
  12. [st@localhost project]$ exit
  13. logout
  14. [root@localhost /]#

7、给用户组设定ACL权限

【root@localhost ~】#groupadd 用户组名             #添加用户组

【root@localhost ~】#setfacl -m g:用户组名:rwx  文件名        为某用户组设置acl权限

步骤四、为用户组设定ACL权限。包括添加新的用户组,并为其设置权限,添加用户到该组,测试该用户权限是否生效

  1. [root@localhost /]# groupadd tgroup2
  2. [root@localhost /]# setfacl -m g:tgroup2:rwx project/
  3. [root@localhost /]# getfacl /project/
  4. getfacl: Removing leading '/' from absolute path names
  5. # file: project/
  6. # owner: root
  7. # group: tgroup
  8. user::rwx
  9. user:st:r-x
  10. group::rwx
  11. group:tgroup2:rwx
  12. mask::rwx
  13. other::---
  14. [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/

  1. [root@localhost /]# getfacl /project/
  2. getfacl: Removing leading '/' from absolute path names
  3. # file: project/
  4. # owner: root
  5. # group: tgroup
  6. user::rwx
  7. user:st:r-x
  8. group::rwx
  9. group:tgroup2:rwx
  10. mask::rwx
  11. other::---

步骤五、

如上:acl用户的权限usr:st:r-x   ,mask的权限为rwx,  因为mask权限为全部权限,所以用户的acl权限为本身的权限,如果更改

mask的权限,则用户(acl用户和用户所属组内用户)真正的acl权限为该用户的权限与mask经过与操作后的结果

  1. [root@localhost /]# setfacl -m m:rx /project/
  2. [root@localhost /]# getfacl /project/
  3. getfacl: Removing leading '/' from absolute path names
  4. # file: project/
  5. # owner: root
  6. # group: tgroup
  7. user::rwx
  8. user:st:r-x
  9. group::rwx #effective:r-x
  10. group:tgroup2:rwx #effective:r-x
  11. mask::r-x
  12. other::---
  13. 注意和上面的对比下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:如下示例

  1. [root@localhost /]# setfacl -x g:tgroup2 /project/
  2. [root@localhost /]# getfacl /project/
  3. getfacl: Removing leading '/' from absolute path names
  4. # file: project/
  5. # owner: root
  6. # group: tgroup
  7. user::rwx
  8. user:st:r-x
  9. group::rwx
  10. mask::rwx
  11. other::---
  12. [root@localhost /]# setfacl -b /project/
  13. [root@localhost /]# getfacl /project/
  14. getfacl: Removing leading '/' from absolute path names
  15. # file: project/
  16. # owner: root
  17. # group: tgroup
  18. user::rwx
  19. group::rwx
  20. other::---
  21. [root@localhost /]#

10、递归ACL权限

递归是父目录在设定ACL权限时,所有的子文件和子目录也会拥有相同的ACL权限。

命令:

【root@localhost ~】#setfacl -m 用户名:权限 -R 文件名

注:这里的文件名包括文件夹和文件

步骤八、看如下示例

  1. [root@localhost /]# setfacl -m u:st:rx /project/
  2. [root@localhost /]# getfacl /project/
  3. getfacl: Removing leading '/' from absolute path names
  4. # file: project/
  5. # owner: root
  6. # group: tgroup
  7. user::rwx
  8. user:st:r-x
  9. group::rwx
  10. mask::rwx
  11. other::---
  12. [root@localhost /]# cd /project/
  13. [root@localhost project]# touch abc
  14. [root@localhost project]# touch bcd
  15. [root@localhost project]# ls
  16. abc bcd
  17. [root@localhost project]# ll
  18. 总用量 0
  19. -rw-r--r--. 1 root root 0 129 02:14 abc
  20. -rw-r--r--. 1 root root 0 129 02:14 bcd
  21. [root@localhost project]# ll -d /project/
  22. drwxrwx---+ 2 root tgroup 4096 129 02:14 /project/
  23. [root@localhost project]# setfacl -m u:st:rx -R /project/
  24. [root@localhost project]# ll
  25. 总用量 8
  26. -rw-r-xr--+ 1 root root 0 129 02:14 abc
  27. -rw-r-xr--+ 1 root root 0 129 02:14 bcd
  28. [root@localhost project]# getfacl abc
  29. # file: abc
  30. # owner: root
  31. # group: root
  32. user::rw-
  33. user:st:r-x
  34. group::r--
  35. mask::r-x
  36. other::r--

11、默认ACL权限

默认ACL权限的作用是如果给父目录设定了默认ACL权限,那么 父目录中所有新建的子文件都会继承父目录的ACL权限

命令:

【root@localhost ~】#setfacl -m d:u:用户名:权限  文件名

  1. [root@localhost project]# ll -d /project/
  2. drwxrwx---+ 2 root tgroup 4096 129 02:14 /project/
  3. [root@localhost project]# setfacl -m u:st:rx -R /project/
  4. [root@localhost project]# ll
  5. 总用量 8
  6. -rw-r-xr--+ 1 root root 0 129 02:14 abc
  7. -rw-r-xr--+ 1 root root 0 129 02:14 bcd
  8. [root@localhost project]# getfacl abc
  9. # file: abc
  10. # owner: root
  11. # group: root
  12. user::rw-
  13. user:st:r-x
  14. group::r--
  15. mask::r-x
  16. other::r--
  17. [root@localhost project]# setfacl -m d:u:st:rx -R /project/
  18. [root@localhost project]# touch def
  19. [root@localhost project]# ll
  20. 总用量 12
  21. -rw-r-xr--+ 1 root root 0 129 02:14 abc
  22. -rw-r-xr--+ 1 root root 0 129 02:14 bcd
  23. -rw-rw----+ 1 root root 0 129 02:21 def

二、文件特殊权限(SetUID、SetGID、SetBID)

1、setUID

1)只有可以执行的二进制程序才能设定SUID权限:即必须改可执行的程序文件进行设置

比如:passwd文件是一个可以执行的命令文件,所以可被赋予SUID权限

2)命令执行者要对该程序拥有x(执行)权限

3)命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)

    即任何一个普通用户在执行SUID文件的执行权限时,会自动拥有执行权限

4)SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

例如:

passwd命令拥有SetUID权限,所以普通用户可以修改自己的密码

  1. [root@localhost /]# ll /usr/bin/passwd
  2. -rwsr-xr-x. 1 root root 30768 1124 2015 /usr/bin/passwd

注意这里所说的SetUID,即如上  所有者的权限为-rwsr  中的“ s ”

  1. [zhouxueli@localhost dev]$ ll /etc/shadow
  2. ----------. 1 root root 1342 129 00:47 /etc/shadow

普通用户对于/etc/shadow文件没有任何权限,但普通用户可以更改自己的密码,并长久生效

可见普通用户肯定写入了内容到/etc/shadow文件中

为何会这样呢?

原因就在于passwd 命令的所有者权限为rwsr,即使用passwd命令的用户拥有了SetUID权限

普通用户在往/etc/shadow文件中写内容时,被临时赋予了读写权限,进而能实现。

 

cat 命令没有SetUID权限,所以普通用户不能查看/etc/shadow文件内容

如下,与上方同理,cat命令的所有者权限为rwxr  没有" s ”,所以普通用户无法使用该命令

如,root用户可以看到如下内容

  1. [root@localhost /]#
  2. [root@localhost /]# ll /bin/cat
  3. -rwxr-xr-x. 1 root root 48568 619 23:15 /bin/cat
  4. [root@localhost /]#
  5. [root@localhost /]# cat /etc/shadow
  6. root:$6$4U2qaEjT2hXXufY6$pBFzSMgMs8z/y/jtfqlPew22BFejME73ea8vJWY2JfJhhaAmFX631DgP0kaP40LvXJWe1Z5I4SEunYyh0utcu0:17860:0:99999:7:::
  7. bin:*:17246:0:99999:7:::
  8. daemon:*:17246:0:99999:7:::
  9. adm:*:17246:0:99999:7:::
  10. lp:*:17246:0:99999:7:::
  11. sync:*:17246:0:99999:7:::
  12. shutdown:*:17246:0:99999:7:::
  13. halt:*:17246:0:99999:7:::
  14. mail:*:17246:0:999

但是普通用户

  1. [zhouxueli@localhost dev]$ ll /bin/cat
  2. -rwxr-xr-x. 1 root root 48568 619 23:15 /bin/cat
  3. [zhouxueli@localhost dev]$
  4. [zhouxueli@localhost dev]$ vim /etc/shadow
  5. ~
  6. ~
  7. ~
  8. ~
  9. ~
  10. ~
  11. "/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权限  ,赋予其他人特殊权限

  1. [root@localhost /]# touch abc
  2. [root@localhost /]# ll abc
  3. -rw-r--r--. 1 root root 0 129 03:12 abc
  4. [root@localhost /]# chmod 4755 abc
  5. [root@localhost /]# ll
  6. 总用量 106
  7. -rwsr-xr-x. 1 root root 0 129 03:12 abc
  1. [root@localhost /]# chmod 644 abc
  2. [root@localhost /]# lk
  3. -bash: lk: command not found
  4. [root@localhost /]# ll
  5. 总用量 106
  6. -rw-r--r--. 1 root root 0 129 03:12 abc
  7. dr-xr-xr-x. 2 root root 4096 122 03:41 bin

但是,注意以下,给abc文件所有者增加 SUID权限,注意 命令提示符会出现大写的S,

这个S和普通的passwd文件自带的小写的s是不一样的,这里的S是不起作用的

因为该目录本身,没有x(执行)权限,所以给该文件赋予SUID权限,是无用的

  1. [root@localhost /]# chmod u+s abc
  2. [root@localhost /]# ll abc
  3. -rwSr--r--. 1 root root 0 129 03:12 abc

6)危险的SetUID:

    》关键目录应严格控制写权限。比如“/” 、“/usr”等

    》用户的密码设置要严格遵守密码三原则

    》对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

普通用户默认使用的都是vim权限,root用户可以随意切换vi vim

如果给vim赋予SUID (4755)权限,那么是一件危险的事,

  1. [root@localhost /]# chmod 4755 /usr/bin/vim
  2. [root@localhost /]# ll /usr/bin/vim
  3. -rwsr-xr-x. 1 root root 2324712 1222 2016 /usr/bin/vim

实际上如上,Linux命令行中会显示后面/usr/bin/vim 为红色突出显示,表示危险警告

同时,所有者等的权限有s 符号,也就是SUID权限,这里的所有者为root,也就是会更改所有者为root,

那么,此时无论用户是谁(root还是普通用户)通过使用vim去更改只有root权限才有权限查看更改的文件都能生效

所以为了防止出现以上情况,现在实验完毕立马更换回来

  1. [root@localhost /]# chmod 755 /usr/bin/vim
  2. [root@localhost /]# ll /usr/bin/vim
  3. -rwxr-xr-x. 1 root root 2324712 1222 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

  1. [root@localhost /]#
  2. [root@localhost /]# ll /usr/bin/locate
  3. -rwx--s--x. 1 root slocate 38464 312 2015 /usr/bin/locate
  4. [root@localhost /]# ll /var/lib/mlocate/mlocate.db
  5. -rw-r-----. 1 root slocate 3141779 129 03:23 /var/lib/mlocate/mlocate.db
  6. [root@localhost /]#

如上,普通用户搜索该数据库,普通用户是没有权限搜索mlocate.db文件的

注意,以上可以看出,locate命令所属组默认有s 权限,也就是locate命令有SGID权限,并且其他人有x权限

普通用户组中用户使用locate命令时,

  1. [root@localhost /]# whereis locate
  2. locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
  3. [root@localhost /]# ll /usr/bin/locate
  4. -rwx--s--x. 1 root slocate 38464 312 2015 /usr/bin/locate
  5. [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目录中,并创建文件

  1. [root@localhost ~]#
  2. [root@localhost ~]# chmod 2777 /tmp/test/
  3. [root@localhost ~]# ll -d /tmp/test/
  4. drwxrwsrwx. 2 root root 4096 129 04:14 /tmp/test/
  5. [root@localhost ~]# su - lamp
  6. [lamp@localhost ~]$ pwd
  7. /home/lamp
  8. [lamp@localhost ~]$ touch abc
  9. [lamp@localhost ~]$ ll
  10. 总用量 0
  11. -rw-rw-r--. 1 lamp lamp 0 129 04:25 abc
  12. [lamp@localhost ~]$ cd /tmp/test/
  13. [lamp@localhost test]$ touch bcd
  14. [lamp@localhost test]$ ll
  15. 总用量 0
  16. -rw-rw-r--. 1 lamp root 0 129 04:26 bcd
  17. [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  属性,那么只允许在目录中建立和修改文件,但是不允许 删除。

  1. [root@localhost ~]# ls
  2. anaconda-ks.cfg install.log.syslog 模板 图片 下载 桌面
  3. install.log 公共的 视频 文档 音乐
  4. [root@localhost ~]# touch abc
  5. [root@localhost ~]# ll
  6. 总用量 100
  7. -rw-r--r--. 1 root root 0 129 06:11 abc
  8. -rw-------. 1 root root 1612 1125 23:12 anaconda-ks.cfg
  9. -rw-r--r--. 1 root root 46832 1125 23:12 install.log
  10. -rw-r--r--. 1 root root 11504 1125 23:07 install.log.syslog
  11. drwxr-xr-x. 2 root root 4096 1125 23:29 公共的
  12. drwxr-xr-x. 2 root root 4096 1125 23:29 模板
  13. drwxr-xr-x. 2 root root 4096 1125 23:29 视频
  14. drwxr-xr-x. 2 root root 4096 1125 23:29 图片
  15. drwxr-xr-x. 2 root root 4096 1125 23:29 文档
  16. drwxr-xr-x. 5 root root 4096 122 05:28 下载
  17. drwxr-xr-x. 2 root root 4096 1125 23:29 音乐
  18. drwxr-xr-x. 2 root root 4096 1125 23:29 桌面
  19. [root@localhost ~]# echo 111 >> abc
  20. [root@localhost ~]# cat abc
  21. 111
  22. [root@localhost ~]# ll
  23. 总用量 104
  24. -rw-r--r--. 1 root root 4 129 06:11 abc
  25. -rw-------. 1 root root 1612 1125 23:12 anaconda-ks.cfg
  26. -rw-r--r--. 1 root root 46832 1125 23:12 install.log
  27. -rw-r--r--. 1 root root 11504 1125 23:07 install.log.syslog
  28. drwxr-xr-x. 2 root root 4096 1125 23:29 公共的
  29. drwxr-xr-x. 2 root root 4096 1125 23:29 模板
  30. drwxr-xr-x. 2 root root 4096 1125 23:29 视频
  31. drwxr-xr-x. 2 root root 4096 1125 23:29 图片
  32. drwxr-xr-x. 2 root root 4096 1125 23:29 文档
  33. drwxr-xr-x. 5 root root 4096 122 05:28 下载
  34. drwxr-xr-x. 2 root root 4096 1125 23:29 音乐
  35. drwxr-xr-x. 2 root root 4096 1125 23:29 桌面
  36. [root@localhost ~]# lsattr -a abc
  37. -------------e- abc
  38. [root@localhost ~]# chattr +i abc
  39. [root@localhost ~]# lsattr -a abc
  40. ----i--------e- abc
  41. #如上,出现了一个 i 属性
  42. [root@localhost ~]# cat abc
  43. 111
  44. 再次写数据,无法写入,文件也无法被删除,即便当前用户是root
  45. [root@localhost ~]# echo 4444 >> abc
  46. -bash: abc: 权限不够
  47. [root@localhost ~]# rm abc
  48. rm:是否删除普通文件 "abc"?y
  49. rm: 无法删除"abc": 不允许的操作
  50. [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一样的能力

示例:

  1. [root@localhost ~]# cd /tmp/
  2. [root@localhost tmp]# ls
  3. dtest keyring-CiiiEC orbit-root virtual-root.4b6x5W
  4. gconfd-gdm keyring-ezWj0w orbit-zhouxueli virtual-root.DAJQBL
  5. gconfd-root keyring-QdfnOj pulse-jx3uTY1OwmLg virtual-root.iH8OBu
  6. gconfd-zhouxueli keyring-vlJ6ai pulse-kGStbLy1xGsu virtual-root.OWCe77
  7. keyring-5lWOtJ keyring-YABvNr pulse-XO0xTHUNAOA1 virtual-zhouxueli.kdrfZP
  8. keyring-9AGKSr keyring-ZAwFhT test virtual-zhouxueli.Xc6jGV
  9. keyring-AyTbpD orbit-gdm virtual-root.2GIIay
  10. [root@localhost tmp]# toucha vitest
  11. -bash: toucha: command not found
  12. [root@localhost tmp]# touch vitest
  13. [root@localhost tmp]# ls
  14. dtest keyring-CiiiEC orbit-root virtual-root.4b6x5W
  15. gconfd-gdm keyring-ezWj0w orbit-zhouxueli virtual-root.DAJQBL
  16. gconfd-root keyring-QdfnOj pulse-jx3uTY1OwmLg virtual-root.iH8OBu
  17. gconfd-zhouxueli keyring-vlJ6ai pulse-kGStbLy1xGsu virtual-root.OWCe77
  18. keyring-5lWOtJ keyring-YABvNr pulse-XO0xTHUNAOA1 virtual-zhouxueli.kdrfZP
  19. keyring-9AGKSr keyring-ZAwFhT test virtual-zhouxueli.Xc6jGV
  20. keyring-AyTbpD orbit-gdm virtual-root.2GIIay vitest
  21. root@localhost ~]# cd /tmp/
  22. [root@localhost tmp]# chmod 600 vitest
  23. [root@localhost tmp]# su - sc
  24. [sc@localhost ~]$ cd /tmp/
  25. [sc@localhost tmp]$ vi vitest
  26. ~
  27. ~
  28. ~
  29. "vitest" [权限不足]
  30. [sc@localhost tmp]$ sudo /usr/bin/vim vitest
  31. We trust you have received the usual lecture from the local System
  32. Administrator. It usually boils down to these three things:
  33. #1) Respect the privacy of others.
  34. #2) Think before you type.
  35. #3) With great power comes great responsibility.
  36. [sudo] password for sc:
  37. Sorry, try again.
  38. [sudo] password for sc:
  39. Sorry, try again.
  40. [sudo] password for sc:
  41. Sorry, try again.
  42. sudo:3 次错误密码尝试
  43. [sc@localhost tmp]$ su - zhouxueli
  44. 密码:
  45. su: 密码不正确
  46. [sc@localhost tmp]$ su - zhouxueli
  47. 密码:
  48. su: 密码不正确
  49. [sc@localhost tmp]$ su - zhouxueli
  50. 密码:
  51. [zhouxueli@localhost ~]$ cd /tmp/
  52. [zhouxueli@localhost tmp]$ vi vitest
  53. ~
  54. ~
  55. ~
  56. ~
  57. ~
  58. "vitest" [权限不足]
  59. [zhouxueli@localhost tmp]$ sudo /usr/bin/vim vitest
  60. We trust you have received the usual lecture from the local System
  61. Administrator. It usually boils down to these three things:
  62. #1) Respect the privacy of others.
  63. #2) Think before you type.
  64. #3) With great power comes great responsibility.
  65. [sudo] password for zhouxueli:
  66. zhouxueli 不在 sudoers 文件中。此事将被报告。
  67. [zhouxueli@localhost tmp]$
  68. 因为以上zhouxueli用户不在sudoers文件中,所以如果该用户被写入文件中,则
  69. vim将会拥有强大的权限,极可能产生巨大破坏
  70. 如果想实验成功,需要如下操作:在visudo中添加如下
  71. zhouxueli 192.168.1.132=/usr/bin/vim
  72. 具体如下:
  73. [root@localhost ~]#
  74. [root@localhost ~]#
  75. [root@localhost ~]#
  76. [root@localhost ~]# visudo
  77. ## Sudoers allows particular users to run various commands as
  78. ## the root user, without needing the root password.
  79. ##
  80. ## Examples are provided at the bottom of the file for collections
  81. ## of related commands, which can then be delegated out to particular
  82. ## users or groups.
  83. ## Host Aliases
  84. ## Groups of machines. You may prefer to use hostnames (perhaps using
  85. ## wildcards for entire domains) or IP addresses instead.
  86. # Host_Alias FILESERVERS = fs1, fs2
  87. # Host_Alias MAILSERVERS = smtp, smtp2
  88. ## User Aliases
  89. ## These aren't often necessary, as you can use regular groups
  90. ## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
  91. ## rather than USERALIAS
  92. # User_Alias ADMINS = jsmith, mikem
  93. ## Command Aliases
  94. ## These are groups of related commands...
  95. ## Networking
  96. ## Installation and management of software
  97. # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
  98. ## Services
  99. # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
  100. ## Updating the locate database
  101. # Cmnd_Alias LOCATE = /usr/bin/updatedb
  102. ## Storage
  103. ## Delegating permissions
  104. # Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
  105. ## Processes
  106. # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
  107. ## Drivers
  108. # Cmnd_Alias DRIVERS = /sbin/modprobe
  109. # Defaults specification
  110. #
  111. # Refuse to run if unable to disable echo on the tty.
  112. #
  113. Defaults !visiblepw
  114. #
  115. # Preserving HOME has security implications since many programs
  116. # use it when searching for configuration files. Note that HOME
  117. # is already set when the the env_reset option is enabled, so
  118. # this option is only effective for configurations where either
  119. Defaults always_set_home
  120. Defaults env_reset
  121. Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
  122. Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
  123. Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
  124. Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
  125. Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
  126. #
  127. # Adding HOME to env_keep may enable a user to run unrestricted
  128. # commands via sudo.
  129. #
  130. # Defaults env_keep += "HOME"
  131. Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
  132. ## Next comes the main part: which users can run what software on
  133. ## which machines (the sudoers file can be shared between multiple
  134. ## systems).
  135. ## Syntax:
  136. ##
  137. ## user MACHINE=COMMANDS
  138. ##
  139. ## The COMMANDS section may have other options added to it.
  140. ##
  141. ## Allow root to run any commands anywhere
  142. root ALL=(ALL) ALL
  143. zhouxueli 192.168.1.132=/usr/bin/vim
  144. 如果以上修改完成,保存退出,实验将成功

【root@localhost ~】#

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号