Linux学习笔记-6. 权限管理

6.权限管理

6.1.ACL权限

6.1.1.查看分区ACL权限是否开启

dumpe2fs命令是查询指定分区详细文件系统信息的命令

-h 权显示超级块中信息,而不显示磁盘块组的详细信息

 

 

扫描二维码关注公众号,回复: 1080759 查看本文章

查看是否支持ACL时报错了

[root@localhost ~]# df -h

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   17G  1.2G   16G   7% /

devtmpfs                 446M     0  446M   0% /dev

tmpfs                    456M     0  456M   0% /dev/shm

tmpfs                    456M  6.0M  450M   2% /run

tmpfs                    456M     0  456M   0% /sys/fs/cgroup

/dev/sda1               1014M  125M  890M  13% /boot

tmpfs                     92M     0   92M   0% /run/user/0

[root@localhost ~]# dumpe2fs -h /dev/mapper/centos-root

dumpe2fs 1.42.9 (28-Dec-2013)

dumpe2fs: Bad magic number in super-block while trying to open /dev/mapper/centos-root

Couldn't find valid filesystem superblock.

 

 

网上查找的答案:

/dev/sda3,/dev/sda5ext3ext4的文件系统吗?dumpe2fs只能查看ext的文件系统。可以用blkidmount命令确认一下这两个分区的文件系统,说不定是xfs文件系统。

追问

[root@localhost ~]# blkid /dev/sda5

/dev/sda5: UUID="414e3ade-0f81-4978-9508-bee19bb4f48a" TYPE="xfs"

 

xfs文件系统与ext什么区别吗。

他支持acl权限吗

追答

xfs 文件系统也支持acl,一般默认是开启的。

 

 

文件系统确实是xfs的:

[root@localhost ~]# blkid /dev/mapper/centos-root

/dev/mapper/centos-root: UUID="742f070e-35c4-47c4-86bd-af1c99e51c69" TYPE="xfs"

[root@localhost ~]#

 

 

1.查看acl权限是否支持(文件系统是否支持ACL权限):

a.ext4文件系统:使用 dumpe2fs -h /dev/sda3 来查看超级块中的信息,里面有 Default mount options:    user_xattr acl 或者使用 mount 查询

b.xfs文件系统 xfs系统貌似已经强制开启了ACL权限了

 

 

6.1.2.开启分区ACL权限

这个方法教程演示的是ext文件系统

xfs貌似已经开启,网上说如果再加配置,会报错的。

 

 

临时开启分区ACL权限

 

mount –o remount,acl /

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

 

 

永久开启分区ACL权限

在文件/etc/fstab中加入acl,然后重新挂载文件系统或者重启系统,使用修改生效。

 

重新挂载文件系统,根分区

mount –o remount /

 

 

[root@localhost ~]# cat /etc/fstab

 

#

# /etc/fstab

# Created by anaconda on Sun Apr 22 15:57:33 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/centos-root /                       xfs     defaults,acl        0 0

UUID=78f0ef83-074f-45dd-a750-b53ad773ead1 /boot                   xfs     defaults        0 0

/dev/mapper/centos-swap swap                    swap    defaults        0 0

[root@localhost ~]#

 

增加红色部分,acl即可开启。

 

 

 6.1.3.查看与设定

语法:

getfacl 文件名

 

查看ACL权限

 

 

 

setfacl 选项 文件名

 

-m 设定ACL权限

-x 删除指定的ACL权限

-b 删除所有的ACL权限

-d 设定默认的ACL权限

-k 删除默认的ACL权限

-R 递归设定ACL权限

         包括目录的子目录与文件

 

 

创建project目录

[root@localhost tmp]# mkdir project

[root@localhost tmp]# ll

total 4

drwxr-xr-x. 2 root root 6 May  1 11:55 project

-rw-r--r--. 1 root root 3 Apr 29 18:44 test.txt

 

创建组group1,并且将test用户加入该组

[root@localhost tmp]# groupadd group1

[root@localhost tmp]# gpasswd -a test group1

Adding user test to group group1

 

project的所属组修改为group1,并且修改权限为770

[root@localhost tmp]# chgrp group1 project/

[root@localhost tmp]# ll

total 4

drwxr-xr-x. 2 root group1 6 May  1 11:55 project

-rw-r--r--. 1 root root   3 Apr 29 18:44 test.txt

[root@localhost tmp]# chmod 770 project/

[root@localhost tmp]# ll

total 4

drwxrwx---. 2 root group1 6 May  1 11:55 project

-rw-r--r--. 1 root root   3 Apr 29 18:44 test.txt

[root@localhost tmp]#

 

 

 

现在有个新的用户test2,他对project权限是r-x,也就是只读和执行,即5,这个时候该如何设置?

 

如下所示,报权限不足,因为test2不是group1这个组。如果test2加入group1这个组,组的权限是7,那么test2就多了个写权限,不符合我们的要求。这个时候就要用到ACL了。

[test2@localhost tmp]$ cd project/

-bash: cd: project/: Permission denied

 

 

 

设定ACL权限

给用户test2赋予r-x权限,使用格式:u:用户名:权限

[root@localhost tmp]# setfacl -m u:test2:rx project/

 

 

再次查看project目录时,权限后面多了一位加号:+,这个代码还有ACL权限

[root@localhost tmp]# ll -d project/

drwxrwx---+ 2 root group1 6 May  1 11:55 project/

 

 

具体详细权限需要使用getfacl命令来查看

user一行,多了test2的权限

[root@localhost tmp]# getfacl project/

# file: project/

# owner: root

# group: group1

user::rwx

user:test2:r-x

group::rwx

mask::rwx

other::---

 

 

这个时候test2就可以进行project目录,但是没有写权限,所有不能创建目录

[test2@localhost tmp]$ cd project/

[test2@localhost project]$ touch newfile.txt

touch: cannot touch ‘newfile.txt’: Permission denied

 

 

 

给组设定ACL权限

 

setfacl –m g:group2:rwx project

为组group2分配ACL权限,使用格式:g:组名:权限

group一行,多了group2的权限

[root@localhost tmp]# groupadd group2

[root@localhost tmp]# setfacl -m g:group2:rwx project/

[root@localhost tmp]# getfacl project/

# file: project/

# owner: root

# group: group1

user::rwx

user:test2:r-x

group::rwx

group:group2:rwx

mask::rwx

other::---

 

6.1.4.最大有效权限与删除ACL权限

 

 

如下,查看ACL权限里面有一行mask,这个就是最大有效权限

[root@localhost tmp]# getfacl project/

# file: project/

# owner: root

# group: group1

user::rwx

user:test2:r-x

group::rwx

group:group2:rwx

mask::rwx

other::---

 

 

1、最大有效权限mask

mask胆用来指定最大有效权限的。如果我给用户赋予了ACL权限,是需要和mask的权限 “相与” 才能得到用户的真正权限。

 

逻辑与在读权限中运算场景如下:

ACL

User

AND

r

r

r

r

-

-

-

r

-

-

-

-

 

 

默认mask给的是最大的权限rwx,通过调整mask权限,可以设定用户的权限的大小。

 

修改mask权限,去掉写权限,格式相对组和用户的语法有所变化

setfacl –m m:rx project

 

这个修改只影响所属组长,和ACL权限,不影响所有者的权限

 

effective,因为mask的权限有变化,组和用户权限即使设置的比较大,最终还是 逻辑与 的结果。

 

[root@localhost tmp]# setfacl -m m:rx project/

[root@localhost tmp]# getfacl project/

# file: project/

# owner: root

# group: group1

user::rwx

user:test2:r-x

group::rwx                      #effective:r-x

group:group2:rwx                #effective:r-x

mask::r-x

other::---

 

 

2、删除ACL权限

 

删除指定用户的ACL权限

setfacl –x u:用户名 文件名

 

        

         删除指定用户组的ACL权限

         setfacl –x g:组名 文件名

 

         -b 删除所有的ACL权限,包手UserGroup

         setfacl –b 目录名

 

 

 

 

 6.1.5.默认与递归ACL权限

 

 

1、递归ACL权限

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

针对现在的文件或目录递归设定的ACL权限:

setfacl –m u:用户名:权限 –R 文件名

 

-R 选项只能放在-m选项后面

 

递归ACL权限设定以后,新创建的文件和目录不一定是递归设置的权限,如果新的文件和目录也要保持一样,怎么办?

 

在命令中增加d选项即可,相当于默认权限

针对未来出现的文件或目录递归设定的ACL权限:

setfacl –m d:u:用户名:权限 文件名

 

 

 

 

6.2.文件特殊权限

 

6.2.1.SetUID

 

 1、  SetUID的功能

a)   只有可以执行二进制程序才能设定SUID权限,如果非可执行文件,即使设定了也没有用。

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

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

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

 

例如:passwd命令的权限里面多了个s,这个s表示的是SetUID权限

[root@localhost tmp]# whereis passwd

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz

 [root@localhost tmp]# ll /usr/bin/passwd

-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

 

密码文件的权限是000,除了root都没有权限

[root@localhost tmp]# ll /etc/shadow

----------. 1 root root 810 May  1 12:08 /etc/shadow

 

                              

普通用户修改密码时,如果将自己的密码存储在shadow文件中的呢?

这个是因为passwd命令拥有SUID权限,在设置权限时,普通用户的passwd命令暂时获得属主root的权限

 

 

2、设置SetUID的方法

4代表SUID,用户的S权限

2代表SGID,组的S权限

1代表SBID

7

 

语法:

chmod 4755 文件名

chmod u+s 文件名

 

 

 

3、删除SUID权限的语法

chmod 755 文件名,不指定S权限即可

chmod u-s 文件名

 

在命令行中可以看到file1为红底,一般是危险警告,权限过高等等。

示例:

增加S权限

[root@localhost project]# chmod +4755 file1

[root@localhost project]# ll file1

-rwsr-xr-x+ 1 root root 0 May  1 12:43 file1

 

删除S权限,直接重新指定权限即可,去掉了执行权限

[root@localhost project]# chmod 644 file1

[root@localhost project]# ll file1

-rw-r--r--+ 1 root root 0 May  1 12:43 file1

 

再加上S权限,在查看权限时,可以看到S权限相比之前变成大写了,这个代表是错误的S权限,因为他不满足上面说的4个条件。file1没有拥有执行权限。

[root@localhost project]# chmod u+s file1

[root@localhost project]# ll file1

-rwSr--r--+ 1 root root 0 May  1 12:43 file1

 

 

4、危险的SetUID权限

         关键目录应严格控制写权限。例如根目录//usr等。

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

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

 

如果设置错了,容易导致严重错误,灾难性后果。

例如:

vim命令增加SUID权限

如下所示,passwd文件,普通用户是没有写权限的,如果vim有了SUID权限,在普通用户保存passwd文件内容时,vim会临时拥有了root的身份权限,就可以直接写入文件内容了,相当于权限放大了。相当不安全。

[root@localhost project]# ll /etc/passwd

-rw-r--r--. 1 root root 897 May  1 12:07 /etc/passwd

 

 

6.2.2.SetGID

 

 

 

1、SetGID针对文件的作用

a)   只有可执行的二进制程序才能设置SGID权限

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

c)     命令执行在执行程序的时候,组身份升级为该程序文件的属组。

d)    SetGID权限同样只在该程序执行过程当中有效,也就是说组身份改变只在程序执行过程当中有效。

 

非常类似SUID的使用

 

SGID替换的是组权限的位置

 

看一下localte数据库的权限,普通用户对该数据库没有权限,只有rootslocate组才有权限

[root@localhost project]# ll /var/lib/mlocate/mlocate.db

-rw-r-----. 1 root slocate 653338 May  1 12:29 /var/lib/mlocate/mlocate.db

 

看一下locate命令的权限

组的权限位置上多了个s,类似于SUID的方式,当普通用户执行locate命令时,暂时切换身份为slocate组,这时就有了读mlocate.db的权限,命令执行完成后,临时slocate组身份失效。

[root@localhost project]# ll /usr/bin/locate

-rwx--s--x. 1 root slocate 40512 Nov  5  2016 /usr/bin/locate

 

 

2、SetGID针对目录的作用

a)    普通用户必须对此目录拥有r和x权限,才能进入此目录

b)    普通用户在此目录中的有效组会变成此目录的属组

c)    若普通用户对此目拥有w权限时,新建的文件的默认属组是这个目录的属组。

 

 

 

3、设定SetGID

2代码SGID

语法:

         chmod 2755 文件名

         chmod g+s 文件名

 

 

创建目录

[root@localhost tmp]# mkdir dir1

[root@localhost tmp]# chmod 2777 dir1/

 

目录权限,所属组是root

[root@localhost tmp]# ll -d dir1

drwxrwsrwx. 2 root root 6 May  1 17:08 dir1

 

切换到test用户

[root@localhost tmp]# su - test

Last login: Tue May  1 12:08:25 CST 2018 from 192.168.1.101 on pts/1

[test@localhost ~]$ pwd

/home/test

[test@localhost ~]$ cd /tmp/dir1

 

test用户下的/tmp/dir1目录下创建新文件

[test@localhost dir1]$ touch file1

 

 

新文件的所属组默认为目录的所属组

[test@localhost dir1]$ ll

total 0

-rw-rw-r--. 1 test root 0 May  1 17:10 file1

[test@localhost dir1]$

 

 

 

6.2.3.Sticky BIT

 

 

 

1、SBIT粘着位作用

a)    粘着位只对目录有效

b)    普通用户对该目录拥有wx权限,即普通用户可以在此目录拥有写入权限

c)    如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。

 

 

 

/tmp/目录,所有用户都拥有写权限,在Other权限位上多了个t,这个就是粘着位的权限

[test@localhost dir1]$ ll -d /tmp/

drwxrwxrwt. 9 root root 136 May  1 17:08 /tmp/

 

然而test用户并不能删除test.txt,因为test.txt不是test用户创建的。

[test@localhost tmp]$ rm -rf test.txt

rm: cannot remove ‘test.txt’: Operation not permitted

[test@localhost tmp]$ ll test.txt

-rw-r--r--. 1 root root 3 Apr 29 18:44 test.txt

 

 

2、设置与取消粘着位

a)    设置粘着位

chmod 1755 目录名

chmod o+t 目录名

b)  取消粘着位

chmod 777 目录名

chmod o-t 目录名

 

 

 

6.3.chattr权限

 

 

英文描述:

       chattr - change file attributes on a Linux file system

        

         这具设置对root用户也有效,也可 以限制到root用户的操作。也这个修改主要是为了防止误操作的。

 

1、设置文件系统属性

命令格式

chattr [+-=] [选项] 文件或目录名

 

+ 增加权限

- 删除权限

= 等于某权限

 

选项:

         i:如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,那么只能修改目录下 文件的数据,但是不允许建立和删除文件。

         a:如果对文件设置a属性,那么只在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录建立和修改文件 ,但是不允许删除。

 

 

 

2、查看文件系统属性

         llsattr 选项 文件名

 

         -a 显示所有文件和目录

         -d 若目标是目录,仅列出目录本身的属性,而不是子文件的。

 

 

写文件内容

[root@localhost tmp]# echo 123 >> test.txt

[root@localhost tmp]# cat test.txt

aa

123

 

对文件增加i属性

[root@localhost tmp]# chattr +i test.txt

[root@localhost tmp]# ll test.txt

-rw-r--r--. 1 root root 7 May  1 17:42 test.txt

[root@localhost tmp]#

 

查看文件系统属性,只有一个i属性权限

[root@localhost tmp]# lsattr -a test.txt

----i----------- test.txt

 

增加了i属性后的文件,相当于锁定了,仅能查看,不能删除和修改。

[root@localhost tmp]# echo 234 >> test.txt

-bash: test.txt: Permission denied

[root@localhost tmp]# rm -rf test.txt

rm: cannot remove ‘test.txt’: Operation not permitted

[root@localhost tmp]# cat test.txt

aa

123

 

 

 

 6.4.sudo权限

 

 

 

 

 

1sudo权限的作用:

root把本来只能超级用户执行的命令赋予普通用户执行。

sudo的操作对象是系统命令

 

 

2sudo使用

         由管理员使用命令visudo给普通用户赋予权限,这个命令实际上修改的是/etc/sudoers文件

 

 

root           ALL=(ALL)                   ALL

用户名     被管理主机的地址=(可使用的身份)       授权命令(绝对路径)

 

 

%wheel             ALL=(ALL)                   ALL

%组名      被管理主机的地址=(可使用的身份)       授权命令(绝对路径)

 

 

 

普通用户不能赋予vim命令,容易导致权限放大,普通用户本来的vim是限制在普通用户权限范围内的,sudo vim的命令,运行的是root用户的命令,属于超级权限了。

 

 

3、授权test用户可以重启服务器

 

visudo

 

test ALL=/sbin/shutdown –r now

把权限限制到最小,指定上-r参数

 

ALL是指本机和本网段的任何IP,这个IP是指的服务器的IP或网段,不是客户端的。

 

 

4、普通用户使用sudo权限

 

 

查看可用的sudo命令

sudo –l

 

 

看红色部分,test用户已经用了sudo赋予的重启命令

[test@localhost ~]$ sudo -l

[sudo] password for test:

Sorry, try again.

[sudo] password for test:

Matching Defaults entries for test on localhost:

    !visiblepw, always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR

    LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE

    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE",

    env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin

 

User test may run the following commands on localhost:

    (root) /sbin/shutdown -r now

 

普通用户执行shutdown –r now时,已经执行不了。

[test@localhost ~]$ shutdown -r now

User root is logged in on sshd.

Please retry operation after closing inhibitors and logging out other users.

Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.

[test@localhost ~]$

 

 

要想使用sudo权限,需要加sudo命令前缀,普通用户test执行sudo赋予的重启命令

sudo /sbin/shutdown –r now

 

 

如下所示shutdown –h命令已经被限制了,不能执行,只能执行-r选项。

[test@localhost ~]$ sudo /sbin/shutdown -h now

Sorry, user test is not allowed to execute '/sbin/shutdown -h now' as root on localhost.localdomain.

[test@localhost ~]$ sudo /sbin/shutdown -r now

 

 

 

猜你喜欢

转载自wlcacc.iteye.com/blog/2422652