当前位置:   article > 正文

Linux权限管理_$uid -gt 199

$uid -gt 199

Linux系统权限管理

把一个用户加入了一个组,该用户就拥有了该组的权限,当一个用户要操作某个文件时,系统会依次检索该用户是否是该文件的拥有者,其次是组成员,最后是其他人,如果扫描到是拥有者,则具备拥有者的权限,不必往后扫描,以此类推

一 文件权限管理

1.1 基本权限介绍

基本权限类型

  • r:可读=》4
  • w:可写=》2
  • x:可执行=》1

权限的归属

  • 属主:u
  • 属组:g
  • 其他人:o

例如

[root@aliyun ~]# ls -l a.txt
-rw-r--r-- 1 root root 1146 Jul 16 18:42 a.txt

文件类型:
	-:文本文档
    d:目录
    b:设备block
    c:字符设备
    s:套接字文件
	l:软链接

权限
    
硬链接个数

属主

属组

文件所占用的空间(以字节为单位)

文件(目录)最近访问(修改)时间

文件名
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

1.2 设置权限

修改属主、属组

[root@aliyun ~]# chown alice.hr	file1 		    # 改属主、属组
[root@aliyun ~]# chown alice     	file1 		# 只改属主
[root@aliyun ~]# chown        .hr 	file1		# 只改属组

[root@aliyun ~]# chown -R /test  # 递归修改
  • 1
  • 2
  • 3
  • 4
  • 5

修改u、g、o对应的权限

# 加减法
chmod u+x,g-w,o+r a.txt

# 赋值
chmod a=rwx a.txt
chmod a=- a.txt
chmod ug=rw,o=r file1

# 数字
chmod 644 file1
chmod -R 777 xxx/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人

1.3 权限对文件or目录的意义

  • 文件:ls -l 文件名
-rw-r--r-- 1 root root 1488 512 16:13 /etc/passwd

- r:# 可以cat读取文件内容
- w:# 可以修改文件
- x:# 可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 目录:ls -dl 文件名
drwxr-xr-x. 91 root root 8192 512 16:25 /etc

- r:# 可以ls浏览文件下的内容
- w:# 可以在目录下创建新文件or目录
- x:
     # 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
     # 可以正常切换到目录下
     # 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 总结
一:对文件夹的操作(不操作文件内容),需要当前用户具备的权限
	1、对沿途所有文件夹有x权限
    2、对目标文件夹有r或w权限
    	r-》可以浏览
        w-》可以创建、删除、移动子文件和子目录
        
二:对文件的操作(操作文件内容),需要当前用户具备的权限
	1、对沿途所有文件夹有x权限
    2、对目标文件有r或w权限
    	r-》可以读取文件内容
        w-》可以修改文件内容
        
!!!注意!!!
储备知识:vim修改的原理是将源文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文件名
例子:
1、当前用户对沿途所有文件夹都有x权限
2、并且当前用户对目标文件夹有w权限
3、但是当前用户对目标文件没有w权限
此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以通过查看前后操作的文件inode号来确定
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

1.4 案例

例1:要想在目录下创建\删除内容:对目录的x权限+对目录的w权限

# 1、设置权限
[root@aliyun ~]# mkdir -p /a/b/c
[root@aliyun ~]# chmod -R o=x /a  # 其他人o对当前目录及其子目录都有x权限
[root@aliyun ~]# chmod o+w /a/b/c # 其他人o对/a/b/c目录有w权限

# 2、查看权限
[root@aliyun ~]# ls -dl /a
drwxr-x--x 3 root root 4096 Aug 11 16:24 /a
[root@aliyun ~]# ls -dl /a/b
drwxr-x--x 3 root root 4096 Aug 11 16:24 /a/b
[root@aliyun ~]# ls -dl /a/b/c
drwxr-x-wx 2 root root 4096 Aug 11 16:25 /a/b/c
    
# 3、验证
[root@aliyun ~]# 
[root@aliyun ~]# su - gg
Last login: Tue Aug 11 16:17:28 CST 2020 on pts/2
[gg@aliyun ~]$ touch /a/b/c/1.txt
[gg@aliyun ~]$ exit
logout
[root@aliyun ~]# ls /a/b//c/
1.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

例2:要浏览目录下内容:对目录的x权限+对目录的r权限

[root@aliyun ~]# mkdir -p /a/b/c
[root@aliyun ~]# chmod -R o=x /a
[root@aliyun ~]# chmod o+r /a/b/c
[root@aliyun ~]# 
[root@aliyun ~]# touch /a/b/c/{1..3}.txt
[root@aliyun ~]# 
[root@aliyun ~]# su - gg
Last login: Tue Aug 11 16:27:33 CST 2020 on pts/2
[gg@aliyun ~]$ ls /a/b/c
1.txt  2.txt  3.txt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

例3:要执行目录下程序:对目录的x权限+对文件的x权限,如果文件是解释型语言的脚本程序,还需要对文件有r权限

[root@aliyun ~]# mkdir -p /a/b/c
[root@aliyun ~]# chmod -R o=x /a/b/c
[root@aliyun ~]# cp /bin/echo /a/b/c
[root@aliyun ~]# chmod o=x /a/b/c/echo
[root@aliyun ~]# 
[root@aliyun ~]# su - gg
Last login: Tue Aug 11 16:30:17 CST 2020 on pts/2
[gg@aliyun ~]$ /a/b/c/echo "hello egon"
hello egon
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二 文件权限管理之特殊权限

详解:https://www.cnblogs.com/linhaifeng/articles/13357542.html

suid 4
sgid 2
sticky 1

2.1 SUID

普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限

[root@aliyun ~]# ll /etc/shadow
---------- 1 root root 1109 Aug 11 16:11 /etc/shadow
  • 1
  • 2

但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,如何实现的???

[root@aliyun ~]# ll `which passwd`
-rwsr-xr-x 1 root root 27856 Aug  9  2019 /bin/passwd
  • 1
  • 2

可以看到一个s权限,s权限的特殊之处

  • SUID 权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
  • 本权限仅在执行该二进制可执行文件的过程中有效

示例

[root@localhost ~]# ll `which cat`
-rwxr-xr-x. 1 root root 54160 1031 2018 /usr/bin/cat
[root@localhost ~]# chmod 4755 `which cat`  # 或者 chmod u+s `which cat`
[root@localhost ~]# ll `which cat`
-rwsr-xr-x. 1 root root 54160 1031 2018 /usr/bin/cat


[root@localhost ~]# su - egon
[egon@localhost ~]$ cat /etc/shadow  # 可以看到内容
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

了解:

# 1、在没有设置suid的情况下,我们登录了一个用户,来执行操作目标文件的命令
会依次比对当前登录用户是否是目标文件的属主、属组、其他人来确定是否拥有操作权限
    
# 2、在设置了suid的情况下,我们登录了一个用户,来执行操作目标文件的命令
当前用户会转换成命令文件的属主身份,然后拿着该身份去对应目标文件,如果该身份不是目标文件的主人,那么就直接被归为其他人一栏,不会检索组
sgid一样
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

案例

# 准备
mkdir /test
chmod 777 /test/
echo 1111 > /test/a.txt
chmod 000 /test/a.txt
chown user1.group1 /test/a.txt
chown egon.devops /usr/bin/cat
chmod u+s /usr/bin/cat

# 实验
[root@egon ~]# ll /test/a.txt  # 目标文件的属主:user1,属组:group1
----------. 1 user1 group1 4 1029 18:31 /test/a.txt
[root@egon ~]# 
[root@egon ~]# 
[root@egon ~]# ll /usr/bin/cat # 命令文件的属主:egon
-rwxr-xr-x. 1 egon devops 54160 1031 2018 /usr/bin/cat
[root@egon ~]# 
[root@egon ~]# 
[root@egon ~]# su - lili -c "cat /test/a.txt"  # lili切换为egon用户执行,egon用户没有对上a.txt的属主,所以直接被当成其他人,没有任何权限
cat: /test/a.txt: 权限不够
[root@egon ~]# chmod o+r /test/a.txt
[root@egon ~]# su - lili -c "cat /test/a.txt" 
111
[root@egon ~]# 
[root@egon ~]# 
[root@egon ~]# chmod o-r,g+r /test/a.txt
[root@egon ~]# ll /test/a.txt
----r-----. 1 user1 group1 4 1029 18:31 /test/a.txt
[root@egon ~]# usermod -a -G group1 egon
[root@egon ~]# ll /usr/bin/cat  # 确保suid还在
-rwsr-xr-x. 1 egon devops 54160 1031 2018 /usr/bin/cat
[root@egon ~]# id egon
uid=1005(egon) gid=1005(egon)=1005(egon),1003(group1)
[root@egon ~]# 
[root@egon ~]# su - lili -c "cat /test/a.txt"  # lili--->egon,egon用户没有对上a.txt的属主,所以直接被当成其他人,虽然此时egon属于文件a.txt的属组group1的成员,但是对suid来说那没用
cat: /test/a.txt: 权限不够
[root@egon ~]# 

[root@egon ~]# su - egon -c "cat /test/a.txt"  # 如果当前用户与suid的用户重叠,那么就无所谓用户转换,同样会按照:属主、属组、其他人的次序依次对照
1111

# 注意:
sgid规则同suid
同时设置suid与sgid的情况下,suid优先级高于sguid
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

2.2 SGID

  • 当SGID 作用于普通文件时,和 SUID 类似,在执行该文件时,用户将获得该文件所属组的权限。

  • 当 SGID 作用于目录时,意义就非常重大了:

    当一个用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件

    如果该目录同时用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

    [root@localhost ~]# mkdir /test
    [root@localhost ~]# chmod g+s /test/  # 等同于chmod 2755 /test/
    [root@localhost ~]# ll -dl /test/
    drwxr-sr-x 2 root root 6 811 17:06 /test/
    [root@localhost ~]# 
    [root@localhost ~]# chown .egon /test/  # 后期任何人在该目录下创建的文件or目录的属组都是egon
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

2.3 SBIT

其实 SBIT 与 SUID 和 SGID 的关系并不大。
SBIT 是 the restricted deletion flag or sticky bit 的简称,有时也称为Sticky。
SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:

[root@localhost ~]# ls -dl /tmp/
drwxrwxrwt. 13 root root 4096 811 17:09 /tmp/
[root@localhost ~]# chmod o+t /test/   # 或者 chmod 1755 /test
  • 1
  • 2
  • 3

权限信息中最后一位 t 表明该目录被设置了 SBIT 权限。SBIT 对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和 root 才有权力删除,主要作用于一个共享的文件夹。

三 文件权限管理之umask

新建文件、目录的默认权限是由umask决定的

1、uid>199并且属主与数组相等的用户下,umask: 0002

  • 文件 664
  • 目录 775

2、除1之外的其他用户下,比如root用户,umask: 0022

  • 文件 644
  • 目录 755
    linux中文件默认权限为666、目录权限默认为777

文件权限计算方法:偶数位直接相减,奇数位相减后加1

文件的起始权限值umask值操作计算后文件权限
666022 (每位如果都是偶数)直接相减即可644
666033 (每位如果有奇数或偶数)相减(奇数位相减后在其原奇数位加1)644
666325(每位如果有奇数或偶数)相减(奇数位相减后在其原奇数位加1)442

目录权限计算方法:直接相减即可

文件的起始权限值umask值操作计算后文件权限
777022相减755
777033相减744
777325相减452

总结:umask设置的越小,权限越大,慎用
临时设置umask

[root@localhost ~]# umask 000		// 设置umask权限
  • 1

永久设置umask

[root@localhost tmp]# vim /etc/profile  # 或者/etc/bashrc内容一样
......
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
   umask 002	//表示uid大于等于199的默认umask值,表示普通用户
else
   umask 022	//表示uid小于199的默认umask值,表示root
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

高级权限

一 文件权限管理ACL权限

用命令setfacl设置的ACL(Access Control List) 权限是UGO权限的扩展,ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。

ps:UGO中的O即其他人,涵盖了非常大的范围,我们使用setfacl可以将用户对文件的权限进行进一步细化
	文件一旦设置了acl权限后,查看信息会出现一个加号,以后包括UGO在内的权限都可以用setfacl来设置

		修改属主的权限
			setfacl -m u::权限 a.txt
		
		修改属组的权限
			setfacl -m g::权限 a.txt
			
		修改其他人的权限
			setfacl -m o::权限 a.txt
			
		修改具体某一个用户的权限
			setfacl -m u:用户名:权限 a.txt
		
		修改具体某一个组的权限
			setfacl -m g:组名:权限 a.txt  # 组必须存在
                        
        # 也可以给目录设置,都一样     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

查看与删除

# 查看
getfacl /opt/a.txt

# 删除
setfacl -x g:group1 /opt/a.txt  # 删除组hr的权限
setfacl -b /opt/a.txt  #删除所有acl权限
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

应用:当前用户如果检索不到对应的acl权限或者检索到后发现权限为空,都会对应到other权限上

# 应用场景1: 其他人对文件没有任何权限,然后单独设置其他人里的egon01对文件有r权限、egon02对文件有w权限
			setfacl -b b.txt  # 可以先清理掉所有的acl权限,保证实验环境干净
			
			setfacl -m o::- b.txt
			setfacl -m u:egon01:r b.txt
			setfacl -m u:egon02:w b.txt
			
            # egon01 对 b.txt的权限为r
            # egon02 对 b.txt的权限为w
            # 剩余的其他人中:
            #       例如egon03 对 b.txt的权限为-
			
# 应用场景2:其他人对文件有rw权限,然后单独设置其他人里的egon01对文件有r权限、egon02对文件有w权限
			setfacl -b b.txt  # 可以先清理掉所有的acl权限,保证实验环境干净
			
			setfacl -m o::rw b.txt
			setfacl -m u:egon01:r b.txt
			setfacl -m u:egon02:w b.txt
                    
            # egon01 对 b.txt的权限为r
            # egon02 对 b.txt的权限为w
            # 剩余的其他人中:
            #       例如egon03 对 b.txt的权限为rw
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

应用示例

[root @ web01 ~]# pwd
/ root
[root @ web01 ~]# echo 1111 > b.txt
[root @ web01 ~]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::rw -
group::r - -
other::r - -

[root @ web01 ~]# setfacl -m o::- b.txt 
[root @ web01 ~]# setfacl -m u:egon01:r b.txt
[root @ web01 ~]# setfacl -m u:egon02:w b.txt
[root @ web01 ~]# getfacl b.txt
# file: b.txt
# owner: root
# group: root
user::rw -
user: egon01:r - -
user: egon02:-w -
group::r - -
mask::rw -
other::---

[root @ web01 ~]# su - egon01 -c "cat /root/b.txt"
1111
[root @ web01 ~]# su - egon01 -c "echo 222 >> /root/b.txt"
-bash: / root / b.txt: 权限不够
[root @ web01 ~]# su - egon02 -c "cat /root/b.txt"
cat: / root / b.txt: 权限不够
[root @ web01 ~]# su - egon02 -c "echo 222 >> /root/b.txt"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

=>ACL高级用法<==
1、mask
设置mask命令如下

setfacl -m m:rw /opt/a.txt

设置完mask后除了所有者和other不受影响,其他都会受到mask的影响,mask决定了他们的最高权限
mask值就像一个筛子,文件属主和other之外的所有权限都需要被它筛一遍,
如果mask值为rw-则代表该筛子只放行rw权限。
本质原理是权限A需要与mask值B进行按位与运算,得到的结果才是effective有效权限
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
建议:为了方便管理文件权限,其他人的权限置为空:chmod o=- /opt/a.txt

# 1、保证其他人对/opt/a.txt没有权限,然后展开实验
[root@egon ~]# echo 111 > /opt/a.txt
[root@egon ~]# setfacl -m o::- /opt/a.txt
[root@egon ~]# getfacl /opt/a.txt 
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
group::r--
other::---


# 2、添加acl权限
[root@egon opt]# setfacl -m u:egon:rw /opt/a.txt  # 其他人egon对a.txt有rw权限
[root@egon opt]# setfacl -m u:lili:r /opt/a.txt   # 其他人lili对a.txt有r权限
[root@egon opt]# getfacl /opt/a.txt  # 可以看到mask默认值为rw-
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
user:lili:r--
user:egon:rw-
group::r--
mask::rw-
other::---

[root@egon opt]# ll /opt/a.txt
-rw-rw----+ 1 root root 4 1029 19:33 /opt/a.txt
[root@egon opt]# 
        
    
# 3、按位与运算
lili权限:r--
mask权限:rw-
lili最终权限: r--
[root@egon opt]# su - lili -c "cat /opt/a.txt"
111
222
[root@egon opt]# su - lili -c "echo 666 >> /opt/a.txt"
-bash: /opt/a.txt: 权限不够
[root@egon opt]# 

egon权限:rw-
mask权限:rw-
最终权限: rw-
[root@egon opt]# su - egon -c "cat /opt/a.txt"
111
[root@egon opt]# su - egon -c "echo 222 >> /opt/a.txt"
[root@egon opt]# 

# 4、设置mask
[root@egon opt]# setfacl -m m:- /opt/a.txt
[root@egon opt]# getfacl /opt/a.txt
getfacl: Removing leading '/' from absolute path names
# file: opt/a.txt
# owner: root
# group: root
user::rw-
user:lili:r--			#effective:---
user:egon:rw-			#effective:---
group::r--			#effective:---
mask::---
other::---

[root@egon opt]# su - egon -c "cat /opt/a.txt"
cat: /opt/a.txt: 权限不够
[root@egon opt]# su - lili -c "cat /opt/a.txt"
cat: /opt/a.txt: 权限不够
[root@egon opt]# 

    
# ps:我们一般不更改 mask 权限,只要赋予 mask 最大权限(也就是 rwx),则给用户或群组设定的 ACL 权限本身就是有效的。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

2、default: 继承(默认)

# 要求: 
	   希望egon能够对/home以及以后在/home下新建的文件有读、写、执行权限

# 思路:
步骤一: 赋予egon对/home读、写、执行权限
[root@localhost ~]# setfacl -m u:egon:rwx /home

步骤二: 赋予egon对以后在/home下新建的文件有读、写、执行权限 (使egon的权限继承)注意:是作用到子目录,对当前文件没有相应权限
[root@localhost ~]# setfacl -m d:u:egon:rwx /home
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 测试:
[root@egon opt]# mkdir /test
[root@egon opt]# setfacl -m u:egon:rwx /test
[root@egon opt]# setfacl -m d:u:egon:rwx /test
[root@egon opt]# getfacl /test
getfacl: Removing leading '/' from absolute path names
# file: test
# owner: root
# group: root
user::rwx
user:egon:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:egon:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

[root@egon opt]# mkdir /test/aaa
[root@egon opt]# touch /test/b.txt
[root@egon opt]# getfacl /test/aaa/
getfacl: Removing leading '/' from absolute path names
# file: test/aaa/
# owner: root
# group: root
user::rwx
user:egon:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:egon:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

[root@egon opt]# getfacl /test/b.txt  
getfacl: Removing leading '/' from absolute path names
# file: test/b.txt
# owner: root
# group: root
user::rw-
user:egon:rwx			#effective:rw-  # 权限已经继承过来了,但是因为mask的影响,变成了rw-
group::r-x			#effective:r--
mask::rw-
other::r--
[root@egon opt]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

二 文件属性(权限)

[root@localhost ~]# touch /opt/{1..3}.txt
[root@localhost ~]# chmod 000 /opt/*
[root@localhost ~]# lsattr /opt/
---------------- /opt/1.txt
---------------- /opt/2.txt
---------------- /opt/3.txt
[root@localhost ~]# 
[root@localhost ~]# chattr +a /opt/1.txt  # 允许追加内容
[root@localhost ~]# chattr +i /opt/2.txt  # 禁止任何修改,有些病毒程序会对文件加上该权限
[root@localhost ~]# chattr +A /opt/3.txt  # 不更改文件访问时间
[root@localhost ~]# 
[root@localhost ~]# lsattr /opt/
-----a---------- /opt/1.txt
----i----------- /opt/2.txt
-------A-------- /opt/3.txt

# 验证
[root@localhost ~]# echo 111 >> /opt/1.txt 
[root@localhost ~]# cat /opt/1.txt 
111
[root@localhost ~]# rm -rf /opt/1.txt 
rm: 无法删除"/opt/1.txt": 不允许的操作
        

# 去掉
[root@localhost ~]# chattr -a /opt/1.txt 
[root@localhost ~]# chattr -i /opt/2.txt  
[root@localhost ~]# chattr -A /opt/3.txt 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

实验

[root@localhost ~]# echo 123131231 > e.txt
[root@localhost ~]# chattr +A e.txt 
[root@localhost ~]# stat e.txt 
  文件:"e.txt"
  大小:10        	块:8          IO 块:4096   普通文件
设备:803h/2051d	Inode:17154806    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2020-08-11 19:15:15.548257742 +0800
最近更改:2020-08-11 19:15:15.548257742 +0800
最近改动:2020-08-11 19:15:22.494283808 +0800
创建时间:-
[root@localhost ~]# cat e.txt 
123131231
[root@localhost ~]# stat e.txt 
  文件:"e.txt"
  大小:10        	块:8          IO 块:4096   普通文件
设备:803h/2051d	Inode:17154806    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2020-08-11 19:15:15.548257742 +0800
最近更改:2020-08-11 19:15:15.548257742 +0800
最近改动:2020-08-11 19:15:22.494283808 +0800
创建时间:-
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

su切换用户与sudo提权

一 sudo介绍

因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止root用户直接登录的,而运维组的小伙伴通常使用的都是普通用户,但是运维组内的小伙伴们在进行日常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下的命令。
那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢,有两种方案
​ 1、su切换用户身份

特点:使用普通用户登录,然后使用su命令切换到root账户下
优点:简单粗暴
缺点:
	1、需要知道root密码
    2、权限控制不精细:每次都是获取所有root权限
  • 1
  • 2
  • 3
  • 4
  • 5

​ 2、sudo提取部分管理员权限

特点:
	1、使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
    2、不需要切换到root账户下
    
优点:相对复杂
缺点:
	1、不需要知道root密码,输入的是用户自己的密码
    2、权限控制更为精细:可以控制普通用户只获取部分root权限
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

二 su切换用户

储备知识

  • linux中shell可以分两类
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种

非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
  • 1
  • 2
  • 3
  • shell的使用方式有两种
交互式,等待用户输入执行的命令(终端操作,需要不断提示)

非交互式,执行shell脚本, 脚本执行结束后shell自动退出
  • 1
  • 2
  • 3
  • bash shell配置文件介绍
    文件主要保存用户的工作环境
全局配置文件:
	/etc/profile 
    /etc/profile.d/*.sh 
    /etc/bashrc

个人配置文件: 
	~/.bash_profile 
    ~/.bashrc


profile类文件, 设定环境变量, 登陆前运行的脚本和命令。

bashrc类文件, 设定本地变量, 定义命令别名

PS: 如果全局配置和个人配置产生冲突,以个人配置为准。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 配置文件的应用顺序
如果执行的是登录式shell,那么配置文件执行顺序是:

/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc

如果执行的是非登录式shell,那么配置文件执行顺序是:
~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh

PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 执行登录与非登录shell
# 执行登录shell:身份与环境都切换
su - 用户

# 执行非登录shell:只切换用户身份
su 用户 

# 补充:
# 1、从root往普通用户下切换无需输入密码,反之则需要
# 2、切换身份执行命令:su - 用户 -c “命令”
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

三 sudo提权

​在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。
通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。

二 配置

  • 两种编辑方式

  • 1、visudo(会提示语法错误,推荐使用)

[root@egon ~]# visudo -c  # 检查配置是否正确
/etc/sudoers:解析正确
  • 1
  • 2
  • 2、vim /etc/sudoers
# sudo 语法
user    MACHINE=COMMANDS      
 
# 示如
# root    ALL=(ALL)       ALL        
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令,通常设置为ALL,如果设置为localhost代表在本机上执行指令。
	也可以设置为本机以外的其他IP地址或主机名,此时该/etc/sudoers虽然是在本机上配置的,但用户登录到本机
    后仍然是无法执行命令的,如果把/etc/sudoers这个配置文件赋值到指定ip或主机名的那台机器上,就好用了
    配置文件中讲到:
    ## Next comes the main part: which users can run what software on 
	## which machines (the sudoers file can be shared between multiple
	## systems)./etc/sudoers文件可以在多个系统之间共享,如果我们设置成ALL的话就省事了,该文件复制到人任意一台机器
    上的完成的权限配置都一样

3(All):表示允许用户以哪个用户的权限做事情
4、ALL:所有命令

最终解释:root用户可以在所有主机上以任意用户身份执行所有命令


tom      ALL=(ALL)       ALL   # egon用户在任何机器上,可以以任何用户身份执行任何命令等同于root用户
lili     ALL=(ALL)     NOPASSWD: ALL #  免密
egon     ALL=(ALL)   /bin/cp,/bin/touch   # 只允许tom用户以root用户的身份执行cp,touch命令

egon01  ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt  # !代表取反
egon02  ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim /test/a.txt # 可以编辑所有文件,除了/test/a.txt

# 可以测试
[root@egon ~]# su - egon02
上一次登录:二 1220 11:21:01 CST 2022pts/0[egon02@egon ~]$ 
[egon02@egon ~]$ sudo vim /test/b.txt 
[egon02@egon ~]$ sudo vim /test/a.txt 
对不起,用户 egon02 无权以 root 的身份在 egon 上执行 /bin/vim /test/a.txt。 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

测试

[root@egon ~]# su - egon
上一次登录:四 910 20:27:09 CST 2020pts/0[egon@egon ~]$ ll -d /etc/
drwxr-xr-x. 146 root root 8192 910 20:27 /etc/
[egon@egon ~]$ touch /etc/a.txt  # =================> 没有权限
touch: 无法创建"/etc/a.txt": 权限不够
[egon@egon ~]$ sudo touch /etc/a.txt  # =================> 使用sudo提权

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] egon 的密码:
[egon@egon ~]$ ll /etc/a.txt 
-rw-r--r-- 1 root root 0 910 20:28 /etc/a.txt
    
ps: sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存

2.如果存在则不需要输入密码, 否则需要输入用户与密码

3.输入密码会检测是否该用户是否拥有该权限

4.如果有则执行,否则报错退出
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Sudo 常用参数

sudo常用参数:
     -l : 登录用户下面,执行sudo -l  显示当前用户有哪些权限
     -k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
                --> 系统默认也是5分钟失效
                --> 配置免密是另一种情况  NOPASSWD: ALL远程sudo(有条件限制的)
  • 1
  • 2
  • 3
  • 4
  • 5

其他配置详见配置文件

三 sudo实例

企业生产环境用户权限集中管理方案实例

根据角色的不同,给不同的用户分配不同的角色

# 1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个
批量创建用户
for user in chuji{01..03} net01 senior01 manager01 
do
  useradd $user
 echo "111111"|passwd --stdin $user
done;

# 2.创建5个开发人员,属于phpers组
groupadd -g 999 phpers
for n in `seq 5`
do
    useradd -g phpers php0$n
done

# 3.创建开发经理,中级phper
for user in kaifaManager seniorPhper
do
 useradd $user
 echo "111111"|passwd --stdin $user
done

# 4.编辑配置文件
[root@localhost ~]# vim /etc/sudoers
########################Cmnd_Alias By FTL ###################################
Cmnd_Alias CY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname, /sbin/ifconfig, /bin/netstat, /sbin/route
Cmnd_Alias GY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname, /sbin/ifconfig, /bin/netstat, /sbin/route, /sbin/iptables, /etc/init.d/network, /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /bin/rpm, /usr/bin/updatedb, /usr/bin/yum, /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
Cmnd_Alias CK_CMD_1=/usr/bin/tail, /bin/grep, /var/log/messages*
Cmnd_Alias GK_CMD_1=/sbin/service, /sbin/chkconfig, /bin/tail, /var/log/*, /bin/grep, /bin/cat, /bin/ls, /bin/sh
Cmnd_Alias GW_CMD_1= /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /sbin/iwconfig, /sbin/mii-tool, /bin/cat, /var/log/*
 
########################User Aliases By FTL ###################################
 
User_Alias  CHUJI_YUNWEI_ADMINS=chuji01,chuji02,chuji03
User_Alias  CHUJI_KAIFA_ADMINS=php01,php02,php03,php04,php05
User_Alias  GAOJI_WANG_ADMINS=net01
 
########################Runas_Alias By FTL ###################################
 
Runas_Alias  OP = root     -->未来切换到某个角色执行任务
 
########################Config By FTL ###################################
 
senior01            ALL=(OP)      GY_CMD_1
manager01           ALL=(ALL)   NOPASSWD:ALL
kaifaManager        ALL=(ALL)   ALL, /usr/bin/passwd [A-Za-z], !/usr/bin/passwd root, !/usr/sbin/visudo,\
                                !/usr/bin/vi *sudoer*,  !/usr/bin/sudo su -, !/bin/su
seniorPhper         ALL=(OP)    GK_CMD_1
CHUJI_YUNWEI_ADMINS ALL=(OP)    CY_CMD_1
CHUJI_KAIFA_ADMINS  ALL=(OP)    CK_CMD_1
GAOJI_WANG_ADMINS   ALL=(OP)    GW_CMD_1


命令的路径要全路径
别名需要大写
超过一行,用"\"换行  
排除的命令一定在最后面写
kaifaManager 因为有ALL,所以可以直接su - 切换root,但是 sudo su -切换不了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/602354
推荐阅读
相关标签
  

闽ICP备14008679号