10Linux之用户权限管理
- 10Linux之用户权限管理
-
10 用户权限管理
-
10.1 用户权限管理之用户与组管理
- 10.1.1 用户基本信息
- 10.1.2 与用户、组相关文件
- 10.1.3 用户管理命令
- 10.1.4 组管理命令
- 10.1.5 手动创建用户
- 10.1.6 哈希算法
-
10.2 用户权限管理之基本权限rwx管理
- 10.2.1 基本概念
- 10.2.2 设置
- 10.2.3 权限的作用(文件、文件夹)
-
10.3 用户权限管理之特殊权限
- 10.3.1 SUID
- 10.3.2 SGID
- 10.3.3 SBIT(Sticky)
-
10.4 用户权限管理之umask
- 10.4.1 umask作用
- 10.4.2 设置umask
-
10.5 用户权限管理之高级权限
-
10.6 su与sudo
- 10.6.1 su
- 10.6.2 sudo
- 10.6.3 总结
10 用户权限管理
10.1 用户权限管理之用户与组管理
10.1.1 用户基本信息
10.1.2 与用户、组相关文件
-
相关文件
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
-
/etc/passwd
以root: x:0:0:root:/root:/bin/bash为例
root 用户名称 |
x 密码占位符 |
0 用户UID |
0 用户GID |
root 注释信息 |
/root 用户家目录 |
/bin/bash 登录shell |
第一列 |
第二列 |
第三列 |
第四列 |
第五列 |
第六列 |
第七列 |
root:x:0:0:root:/root:/bin/bash
第一字段:用户名
第二字段:口令,x代表密码已经被映射到/etc/shadow文件中
第三字段:UID
第四字段:GID
第五字段:描述信息(可不写)
第六段:用户家目录所在位置
第七段:用户所用shell类型
-
/etc/shadow
以zzz:!!:18561:0:99999:7:::为例
定位 |
|
作用 |
第一列 |
zzz |
用户名称 |
第二列 |
!! |
密码是一长串字符串,!!表示没有密码 |
第三列 |
18561 |
最近一次变更密码,距1970年过了多少天 |
第四列 |
0 |
密码最少使用天数,0表示无限制 |
第五列 |
99999 |
密码最常使用天数,99999表示无限制 |
第六列 |
7 |
密码过期预警天数 |
第七列 |
|
密码过期的宽恕天数,即密码过期后未及时修改密码,用户还可使用的天数 |
第八列 |
|
账号失效日期,过了这个日期账号就无法使用 |
第九列 |
|
保留,没有被使用 |
user05:!!:18563:0:99999:7:::
root:$6$8Pjcu5JO$PbL98SMmUWvlEFu7iRBPVgKtRl3mRJpT3kA0nPuAkSkbKGKQOl1fVA76gW/4Py887etb/U5X8EenYm/H5DG7m1:18554:0:99999:7:::
第一字段:用户名(登录名),在/etc/shadow中,用户名和/etc/passwd是相同的,这样就把passwd和shadow中用的用户记录联系在一起,这个字段是非空的。
第二字段:密码(已被加密),如果是x,代表这个用户不能登陆到系统,这个字段是非空格的。
第三字段:上次修改密码的时间,是1970.01.01至最近修改的时间间隔(天)
第四字段:两次修改密码间隔最少天数;0代表禁用此功能
第五字段:两次修改密码间隔最多天数;增强管理员管理用户口令的时效性(增强系统安全性)
第六字段:提前多少天警告用户口令将过期
第七字段:在口令过期之后多少天禁用此用户;即作废多少天后系统不会提示用户过期,完全禁用,系统不会再让此用户登录。
第八字段:用户过期日期,指定用户作废的天数(1970.1.1开始的天数),为空代表永久可用
第九字段:保留字段,供将来Linux发展之用
-
/etc/group 组文件
以
[root@ccc ~]# head -1 /etc/group
root: x:0:
为例
定位 |
|
解释 |
第一列 |
root |
用户组的名称 |
第二列 |
x |
用户组的密码占位符 |
第三列 |
0 |
用户组的ID/GID |
第四列 |
|
显示该用户组作为哪个用户的附加组,用逗号分割 |
-
/etc/gshadow 组密码文件
以
[root@ccc ~]# head -1 /etc/gshadow
root:::
为例
定位 |
|
解释 |
第一列 |
root |
用户组的名称 |
第二列 |
|
用户组密码,可为空或!,空或!代表没有密码 |
第三列 |
|
用户组管理者,也可为空,多个管理者用逗号分隔 |
第四列 |
|
显示该用户组作为哪个用户的附加组,多个用逗号分割 |
-
/etc/skel # 用户家目录的模板
/home/xxx # 用户家目录
/var/spool/mail/xxx # 用户邮箱文件
10.1.3 用户管理命令
-
增删改查
useradd # 添加用户
userdel # 删除用户
usermod # 修改用户信息
-
创建用户useradd
[root@ccc ~]# useradd user01
[root@ccc ~]#
-
查看用户id
[root@ccc ~]# id user01 # 查看user01的用户信息
uid=1001(user01) gid=1001(user01) 组=1001(user01)
[root@ccc ~]# who # 查看所有登陆的用户信息
root pts/1 2020-10-28 14:50 (192.168.29.2)
[root@ccc ~]# whoami # 查看当前登录的用户名
root
当创建一个用户时,没有指定用户的主组,将会创建一个同名的组作为用户的主组
-
删除用户userdel
[root@ccc ~]# userdel user01 # 删除用户user01,但不删除用户家目录和mail
[root@ccc ~]# userdel -r user02 # -r彻底删除
-
useradd命令(创建用户的同时指定选项)
# 在Linux系统中添加一个新的用户账户(useradd)
-u # 指定用户的UID
-g # 指定用户所属的主组
-G # 指定用户所属的附加组
-d # 指定用户的家目录
-c # 指定用户的备注信息
-s # 指定用户所用的shell
-e # 修改过期时间
-M # 不创建家目录
-r # 创建系统账户,UID处于系统用户范围内,默认就没有家目录
# 示例
# 系统中新增一个fox用户
[root@ccc ~]# useradd fox
# 系统中新增一个用户user01,属组为police,UID为600
[root@ccc ~]# useradd -u 600 -g police user01
useradd:“police”组不存在
[root@ccc ~]# groupadd police # 创建组police
[root@ccc ~]# useradd -u 600 -g police user01 # 按要求新增user01用户
[root@ccc ~]# id user01
uid=600(user01) gid=1007(police) 组=1007(police)
# 练习
[root@ccc ~]# useradd user01 # 创建默认用户user01
[root@ccc ~]# useradd -u 555 user02 # 指定02用户UID为555
[root@ccc ~]# id user02
uid=555(user02) gid=1008(user02) 组=1008(user02)
[root@ccc ~]# useradd -d /home/我是03指定的 user03 # 指定03用户的家目录
[root@ccc ~]# useradd -M user04 # 指定04用户不创建家目录
[root@ccc ~]# ll /home/
总用量 0
drwx------ 2 user01 user01 62 10月 28 19:23 user01
drwx------ 2 user02 user02 62 10月 28 19:23 user02
drwx------ 2 zzz zzz 83 10月 26 16:07 zzz
drwx------ 2 user03 user03 62 10月 28 19:24 我是03指定的
[root@ccc ~]# useradd -s /sbin/nologin user05 # 指定05用户的shell
[root@ccc ~]# tail -1 /etc/passwd
user05:x:1004:1004::/home/user05:/sbin/nologin
[root@ccc ~]# useradd -g hr user06 # 指定06用户的主组为hr
[root@ccc ~]# id user06
uid=1005(user06) gid=1009(hr) 组=1009(hr)
[root@ccc ~]# useradd -G sale user07 # 指定07用户的附加组为sale
[root@ccc ~]# id user07
uid=1006(user07) gid=1011(user07) 组=1011(user07),1010(sale)
-
usermod命令
usermod参数与useradd一致
# 常用参数
-u # 指定要修改用户的UID
-g # 指定要修改用户的主组
-a # 将用户添加到附加组,只可与-G组合使用
-G # 指定要修改用户的附加组,用逗号隔开多个附加组,-G是覆盖,-a -G是添加
-d # 指定要修改用户的家目录
-c # 指定要修改用户的注释信息
-s # 指定要修改用户的bash shell
# 其他选项
-m # 将用户主目录内容移动到新位置。若当前主目录不存在则不会创建新的主目录。
-l # 指定要修改用户的登录名
-L # 指定要锁定的用户
-U # 指定要解锁的用户
-
设定与修改密码
passwd # 默认给当前用户设定密码
passwd 用户名 # root用户可以给自己以及其他用户设定密码,普通用户只能设定自己的密码
echo "密码" | passwd --stdin 用户名 # 非交互式设定密码
-
补充
# 使用系统内置变量生成随机字符串来充当密码
[root@ccc ~]# echo $RANDOM | md5sum | cut -c 1-10
c0ab942940
[root@ccc ~]# echo $RANDOM | md5sum | cut -c 1-10
a1880bb783
10.1.4 组管理命令
-
组管理基本命令
groupadd # 新建组
groupmod # 修改组信息
groupdel # 删除组
groupwd # 设置组密码
newgrp # 切换主组(临时给其他用户组的权限)
-
创建组
[root@ccc ~]# groupadd gg1 # 创建基本组,不指定GID
[root@ccc ~]# tail -1 /etc/group
gg1:x:1001:
[root@ccc ~]# groupadd -g 6666 gg2 # 指定GID为6666
[root@ccc ~]# tail -1 /etc/group
gg2:x:6666:
[root@ccc ~]# groupadd -r gg3 # 创建系统组,GID范围201~999
[root@ccc ~]# tail -1 /etc/group
gg3:x:995:
-
修改组(-g:修改GID -n:修改组名称)
[root@ccc ~]# groupadd nice # 新建组nice
[root@ccc ~]# tail -1 /etc/group
nice:x:1001:
[root@ccc ~]# groupmod -g 6666 nice # 将组nice的GID改为6666
[root@ccc ~]# tail -1 /etc/group
nice:x:6666:
[root@ccc ~]# groupmod -n NICE nice # 将组nice名称修改为NICE
[root@ccc ~]# tail -1 /etc/group
NICE:x:6666:
-
删除组
# 当一个组作为某一个用户的主组时,该组不能被删除
# 删掉用户会默认一起删掉与用户同时创立的同名主组
# 创建用户cjx
[root@ccc ~]# useradd cjx
# 创建组liuliuliu
[root@ccc ~]# groupadd liuliuliu
# 将liuliuliu作为用户cjx的附加组
[root@ccc ~]# usermod -G liuliuliu cjx
# 查看用户cjx的信息,此时有liuliuliu附加组
[root@ccc ~]# id cjx
uid=1001(cjx) gid=1001(cjx) 组=1001(cjx),1002(liuliuliu)
# 删除组liuliuliu,成功
[root@ccc ~]# groupdel liuliuliu
# 查看用户cjx的信息,此时liuliuliu附加组被删除
[root@ccc ~]# id cjx
uid=1001(cjx) gid=1001(cjx) 组=1001(cjx)
# 无法删除组cjx,因为组cjx是用户cjx的主组
[root@ccc ~]# groupdel cjx
groupdel:不能移除用户“cjx”的主组
-
组成员管理
组的分类:
①主组(基本组),用户只能有一个基本组,创建时可通过-g指定,未指定则创建一个与用户同名的默认组
②附加组,用户可以属于多个附加组,加入一个组后就拥有该组的权限
任命组长:gpasswd -A 用户 组
# gpasswd针对已存在的用户,将用户添加到组或从组中删除
# 组长可以往组里增加或删除用户
[root@ccc ~]# useradd user01
[root@ccc ~]# useradd user02
[root@ccc ~]# useradd user03
[root@ccc ~]# useradd user04
[root@ccc ~]# useradd user05
[root@ccc ~]# groupadd it
[root@ccc ~]# gpasswd -M user01,user02,user03 it # 给010203添加附加组it
[root@ccc ~]# id user01
uid=1001(user01) gid=1001(user01) 组=1001(user01),1006(it)
[root@ccc ~]# id user02
uid=1002(user02) gid=1002(user02) 组=1002(user02),1006(it)
[root@ccc ~]# id user03
uid=1003(user03) gid=1003(user03) 组=1003(user03),1006(it)
[root@ccc ~]# gpasswd -A user01 it # 指定01为it组组长
[root@ccc ~]# su - user01
[user01@ccc ~]$ gpasswd -a user04 it
正在将用户“user04”加入到“it”组中
[user01@ccc ~]$ exit
登出
[root@ccc ~]# id user04
uid=1004(user04) gid=1004(user04) 组=1004(user04),1006(it)
[root@ccc ~]# su - user02
[user02@ccc ~]$ gpasswd -a user05 it
gpasswd:没有权限。
[user02@ccc ~]$ exit
登出
[root@ccc ~]# gpasswd -d user04 it
正在将用户“user04”从“it”组中删除
[root@ccc ~]# id user04
uid=1004(user04) gid=1004(user04) 组=1004(user04)
[root@ccc ~]# su - user01
上一次登录:三 10月 28 16:49:23 CST 2020pts/1 上
[user01@ccc ~]$ gpasswd -d user02 it
正在将用户“user02”从“it”组中删除
[user01@ccc ~]$ gpasswd -d user03 it
正在将用户“user03”从“it”组中删除
[user01@ccc ~]$ exit
登出
[root@ccc ~]# id user02
uid=1002(user02) gid=1002(user02) 组=1002(user02)
[root@ccc ~]# id user03
uid=1003(user03) gid=1003(user03) 组=1003(user03)
[root@ccc ~]# id user04
uid=1004(user04) gid=1004(user04) 组=1004(user04)
[root@ccc ~]# id user05
uid=1005(user05) gid=1005(user05) 组=1005(user05)
[root@ccc ~]# su - user01
上一次登录:三 10月 28 16:53:48 CST 2020pts/1 上
[user01@ccc ~]$ gpasswd -d user01 it
正在将用户“user01”从“it”组中删除
[user01@ccc ~]$ exit
登出
[root@ccc ~]# id user01
uid=1001(user01) gid=1001(user01) 组=1001(user01)
为组设置密码,可以让非组成员的用户通过命令"newgrp 组"临时切换到组内
? 以输入密码的方式获取该用户组的权限和特性
# 创建一个对/mnt/a.py有w权限的且有密码的组group1
[root@ccc ~]# groupadd group1
[root@ccc ~]# gpasswd group1
正在修改 group1 组的密码
新密码:
请重新输入新密码:
[root@ccc ~]# touch /mnt/a.py
[root@ccc ~]# ll /mnt/a.py
-rw-r--r-- 1 root root 0 10月 28 21:00 /mnt/a.py
[root@ccc ~]# chown .group1 /mnt/a.py
[root@ccc ~]# !ll
ll /mnt/a.py
-rw-r--r-- 1 root group1 0 10月 28 21:00 /mnt/a.py
[root@ccc ~]# chmod g+w /mnt/a.py
[root@ccc ~]# ll /mnt/a.py
-rw-rw-r-- 1 root group1 0 10月 28 21:00 /mnt/a.py
# 切换到一个对/mnt/a.py是其他用户的zzz用户,来修改a.py
[root@ccc ~]# su - zzz
上一次登录:一 10月 26 16:07:44 CST 2020pts/1 上
[zzz@ccc ~]$ echo 520 >> /mnt/a.py
-bash: /mnt/a.py: 权限不够
[zzz@ccc ~]$ newgrp group1 # 临时切换到组group1下,拥有其权限
密码:
[zzz@ccc ~]$ echo 520 >> /mnt/a.py
[zzz@ccc ~]$ cat /mnt/a.py
520
[zzz@ccc ~]$ exit # 第一次exit是退出组group1
exit
[zzz@ccc ~]$ exit # 第二次exit才是退出用户登录
登出
[root@ccc ~]#
10.1.5 手动创建用户
-
准备用户信息(/etc/passwd /etc/shadow)
[root@ccc ~]# vim /etc/passwd # 用户名底下新增一行(内容如下)
[root@ccc ~]# tail -1 /etc/passwd
cjx:x:5200:5200::/home/cjx:/bin/bash
[root@ccc ~]# openssl passwd -1 -salt 'cjxcjxcjx' # 手动制作密码
Password:
$1$cjxcjxcj$e9/G6tp0yKw7gcywyOTSZ/
[root@ccc ~]# vim /etc/shadow # 用户密码新增如下一行
[root@ccc ~]# tail -1 /etc/shadow
cjx:$1$cjxcjxcj$e9/G6tp0yKw7gcywyOTSZ/:18561:0:99999:7:::
-
准备组信息(/etc/group /etc/gshadow)
[root@ccc ~]# vim /etc/group # 组名新增如下一行
[root@ccc ~]# tail -1 /etc/group
cjx:x:1001:
[root@ccc ~]# vim /etc/gshadow # 组密码新增如下一行
[root@ccc ~]# tail -1 /etc/gshadow
cjx:!::
-
准备家目录(/home/xxx 模板/etc/skel)
[root@ccc ~]# mkdir /home/cjx # 新建家目录文件夹
[root@ccc ~]# cp -r /etc/skel/.[!.]* /home/cjx/ # 将模板文件复制过来
[root@ccc ~]# chmod 700 /home/cjx/ # 更改/home/cjx权限
[root@ccc ~]# chown -R cjx.cjx /home/cjx/ # 更改/home/cjx的属主属组
[root@ccc ~]# ll -a /home/cjx/
总用量 12
drwx------ 2 cjx cjx 62 10月 28 21:26 .
drwxr-xr-x. 4 root root 28 10月 28 21:26 ..
-rw-r--r-- 1 cjx cjx 18 10月 28 21:26 .bash_logout
-rw-r--r-- 1 cjx cjx 193 10月 28 21:26 .bash_profile
-rw-r--r-- 1 cjx cjx 231 10月 28 21:26 .bashrc
-
准备邮箱(/var/spool/mail/xxx)
[root@ccc ~]# touch /var/spool/mail/cjx
[root@ccc ~]# chmod 660 !$ # 更改权限
chown 660 /var/spool/mail/cjx
[root@ccc ~]# chown cjx.mail /var/spool/mail/cjx # 更改属主属组
[root@ccc ~]# ll /var/spool/mail/
总用量 0
-rw-rw---- 1 cjx mail 0 10月 28 21:29 cjx
10.1.6 哈希算法
10.2 用户权限管理之基本权限rwx管理
10.2.1 基本概念
-
权限的类型
r --> 4
w -->2
x -->1
-
权限的归类
u -->属主
g -->属组
o -->其他人
-
文件类型
- # 文本文档
d # 目录
b # 设备block块
c # 字符设备
s # 套接字文件
l # 软链接
10.2.2 设置
-
chmod权限修改
加减法
[root@ccc test]# ll c.txt
-rw-r--r-- 1 root root 158 10月 21 22:52 c.txt
[root@ccc test]# chmod u+x,g+wx,o-r c.txt
[root@ccc test]# ll c.txt
-rwxrwx--- 1 root root 158 10月 21 22:52 c.txt
赋值
[root@ccc test]# ll b.txt
-rw-r--r-- 1 root root 0 10月 21 22:46 b.txt
[root@ccc test]# chmod u=rw,g=wx,o=x b.txt
[root@ccc test]# ll b.txt
-rw--wx--x 1 root root 0 10月 21 22:46 b.txt
数字
[root@ccc test]# ll a.txt
-rw-r--r-- 1 root root 158 10月 21 22:50 a.txt
[root@ccc test]# chmod 777 a.txt
[root@ccc test]# ll a.txt
-rwxrwxrwx 1 root root 158 10月 21 22:50 a.txt
-R递归修改
[root@ccc ~]# chmod o=x -R /a
[root@ccc ~]# ll -d /a
drwxr-x--x 3 root root 15 10月 29 15:21 /a
[root@ccc ~]# ll -d /a/b/
drwxr-x--x 3 root root 15 10月 29 15:21 /a/b/
[root@ccc ~]# ll -d /a/b/c/
drwxr-x--x 2 root root 20 10月 29 15:21 /a/b/c/
[root@ccc ~]# ll /a/b/c/111.py
-rw-r----x 1 root root 23 10月 29 15:20 /a/b/c/111.py
-
chown用户与组修改
更改文件属性
[root@ccc ~]# chown cjx. /test/a.txt # 只改属主时,属组随之一起改动
[root@ccc ~]# ll /test/a.txt
-rwxrwxrwx 1 cjx 5200 158 10月 21 22:50 /test/a.txt
[root@ccc ~]# chown .zzz /test/b.txt # 只改属组,属主不改变
[root@ccc ~]# ll /test/b.txt
-rw--wx--x 1 root zzz 0 10月 21 22:46 /test/b.txt
更改文件夹属性(-R递归)
[root@ccc ~]# chown -R cjx.5200 /test/
[root@ccc ~]# ll -d /test/
drwxr-xr-x 2 cjx 5200 99 10月 27 09:42 /test/
[root@ccc ~]# ll /test/
总用量 45824
-rwxrwxrwx 1 cjx 5200 158 10月 21 22:50 a.txt
-rw-r--r-- 1 cjx 5200 46902355 10月 27 09:42 bak.zip
-rw--wx--x 1 cjx 5200 0 10月 21 22:46 b.txt
-rwxrwx--- 1 cjx 5200 158 10月 21 22:52 c.txt
-rw-r--r-- 1 cjx 5200 158 10月 21 22:52 d.txt
-rw-r--r-- 1 cjx 5200 158 10月 21 22:52 e.txt
-rw-r--r-- 1 cjx 5200 158 10月 21 22:49 hosts
10.2.3 权限的作用(文件、文件夹)
-
针对文件(ll 文件名)
r:读取文件的内容
w:修改文件内容
x:可以把文件当成一个命令/程序运行,解释型的脚本程序还需要文件的r程序
-
针对目录(ll -d 文件名)
r:可以浏览该目录下的子目录名和子文件名字
w:创建、删除、移动文件
x:可以进去该目录(只要我们要操作目录下的内容,一定要对该目录有x权限)
-
查看文件内容的权限
[root@ccc ~]# mkdir -p /a/b/c
[root@ccc ~]# touch /a/b/c/d.py
[root@ccc ~]# vim /a/b/c/d.py
[root@ccc ~]# ll /a/b/c/d.py
-rw-r--r-- 1 root root 0 10月 29 11:34 /a/b/c/d.py
[root@ccc ~]# chmod o=- /a/b/c/d.py
[root@ccc ~]# su - zzz -c "cat /a/b/c/d.py"
/usr/bin/id: cannot find name for group ID 5200
cat: /a/b/c/d.py: 权限不够
[root@ccc ~]# chmod o=r /a/b/c/d.py
[root@ccc ~]# su - zzz -c "cat /a/b/c/d.py"
qqqqq
-
想操作文件或文件夹必须要有对沿途所有文件夹的x执行权限
想要在文件夹下添加文件要有w写权限和x执行权限
想浏览文件夹下内容必须要有r读权限和x执行权限
想编辑文件必须对沿途文件夹有x,对该文件有w或r
-
对文件的执行权限
对解释性语言的脚本,不仅需要x权限,还需要r权限
[root@ccc ~]# mkdir -p /a/b/c
[root@ccc ~]# vim /a/b/c/111.py
[root@ccc ~]# ll /a/b/c/111.py
-rw-r--r-- 1 root root 23 10月 29 15:20 /a/b/c/111.py
[root@ccc ~]# chmod o=x -R /a
[root@ccc ~]# ll -d /a
drwxr-x--x 3 root root 15 10月 29 15:21 /a
[root@ccc ~]# ll -d /a/b/
drwxr-x--x 3 root root 15 10月 29 15:21 /a/b/
[root@ccc ~]# ll -d /a/b/c/
drwxr-x--x 2 root root 20 10月 29 15:21 /a/b/c/
[root@ccc ~]# ll /a/b/c/111.py # 此时仅有x权限
-rw-r----x 1 root root 23 10月 29 15:20 /a/b/c/111.py
[root@ccc ~]# su - zzz -c "/a/b/c/111.py"
bash: /a/b/c/111.py: 权限不够
[root@ccc ~]# chmod o+r /a/b/c/111.py # 此时其他用户权限为rx
[root@ccc ~]# su - zzz -c "/a/b/c/111.py"
nice
666
10.3 用户权限管理之特殊权限
10.3.1 SUID
-
普通用户不是root也不属于root组,所以他对/etc/shadow文件没有任何权限
[root@ccc ~]# ll /etc/shadow
---------- 1 root root 666 10月 28 21:22 /etc/shadow
-
但是普通用户可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件
[root@ccc ~]# ll `which passwd`
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
-
原因是passwd有一个s权限
SUID权限仅对二进制可执行的文件有效
若执行者对该二进制可执行文件有x权限,执行者将具有该文件的所有者权限
本执行权限仅在执行该二进制可执行文件的过程有效
-
示例
[root@ccc ~]# su - zzz -c "cat /etc/shadow"
cat: /etc/shadow: 权限不够
[root@ccc ~]# ll `which cat`
-rwxr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# chmod u+s `which cat` # 或者chmod 4755 `which cat`来增加s权限
[root@ccc ~]# ll `which cat`
-rwsr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# su - zzz -c "cat /etc/shadow"
root:$6$8Pjcu5JO$PbL98SMmUWvlEFu7iRBPVgKtRl3mRJpT3kA0nPuAkSkbKGKQOl1fVA76gW/4Py887etb/U5X8EenYm/H5DG7m1:18554:0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
...
zzz:!!:18561:0:99999:7:::
cjx:$1$cjxcjxcj$e9/G6tp0yKw7gcywyOTSZ/:18561:0:99999:7:::
[root@ccc ~]# chmod 755 `which cat` # 或者chmod u-s `which cat`来取消s权限
[root@ccc ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
↓↓↓↓↓↓↓↓↓↓没有x权限,光有S权限也没用(注意此时为S非s)↓↓↓↓↓↓↓↓↓↓
# 没有x权限,光有S权限也没用(注意此时为S非s)
[root@ccc ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# chmod a-x /usr/bin/cat # a代表所有用户,此时取消所有用户的x执行权限
[root@ccc ~]# ll !$
ll /usr/bin/cat
-rw-r--r--. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# chmod u+s /usr/bin/cat
[root@ccc ~]# ll !$
ll /usr/bin/cat
-rwSr--r--. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# su - zzz -c "cat /etc/shadow"
-bash: /bin/cat: 权限不够
[root@ccc ~]# chmod a+x /usr/bin/cat # 此时加上所有用户的x执行权限
[root@ccc ~]# ll !$
ll /usr/bin/cat
-rwsr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# su - zzz -c "cat /etc/shadow"
root:$6$8Pjcu5JO$PbL98SMmUWvlEFu7iRBPVgKtRl3mRJpT3kA0nPuAkSkbKGKQOl1fVA76gW/4Py887etb/U5X8EenYm/H5DG7m1:18554:0:99999:7:::
bin:*:18353:0:99999:7:::
...
zzz:!!:18561:0:99999:7:::
cjx:$1$cjxcjxcj$e9/G6tp0yKw7gcywyOTSZ/:18561:0:99999:7:::
[root@ccc ~]# chmod 755 /usr/bin/cat # 还原环境
[root@ccc ~]# ll !$
ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
10.3.2 SGID
-
普通做法
当SGID作用于普通文件时于SUID类似,在执行该文件时用户获得该文件所属组的权限
-
重要用法
1、当一个用户对某一目录有写和执行权限时,该用户就可在该目录下建立文件
2、如果该目录同时用SGID修饰,则该用户在此目录下建立的文件都属于这个目录所在的组
[root@ccc ~]# mkdir /test
[root@ccc ~]# touch /test/a.py
[root@ccc ~]# echo 666 >> /test/a.py
[root@ccc ~]# chmod 000 /test/a.py
[root@ccc ~]# ll /test/a.py
---------- 1 root root 0 10月 29 19:50 /test/a.py
[root@ccc ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# chmod g+s /usr/bin/cat
[root@ccc ~]# ll -d !$
ll -d /usr/bin/cat
-rwxr-sr-x. 1 root root 54080 8月 20 2019 /usr/bin/cat
[root@ccc ~]# su - zzz -c "cat /test/a.py"
cat: /test/a.py: 权限不够
[root@ccc ~]# chmod g+r /test/a.py
[root@ccc ~]# ll /test/a.py
----r----- 1 root root 0 10月 29 19:50 /test/a.py
[root@ccc ~]# su - zzz -c "cat /test/a.py"
666
[root@ccc ~]# mkdir /test
[root@ccc ~]# ll -d /test/
drwxr-xr-x 2 root root 6 10月 29 19:31 /test/
[root@ccc ~]# chmod g+s /test/ # 给/test目录的组加上s权限
[root@ccc ~]# groupadd it
[root@ccc ~]# chown .it /test/ # 为了区分,将目录/test的组改为it
[root@ccc ~]# ll -d /test/
drwxr-sr-x 2 root it 6 10月 29 19:31 /test/
[root@ccc ~]# su - zzz -c "touch /test/a.py"
touch: 无法创建"/test/a.py": 权限不够 # 要在目录下创建文件必须对该目录有w写权限
[root@ccc ~]# chmod o+w /test/
[root@ccc ~]# su - zzz -c "touch /test/a.py"
[root@ccc ~]# touch /test/b.py
[root@ccc ~]# ll /test
总用量 0
-rw-rw-r-- 1 zzz it 0 10月 29 19:36 a.py
-rw-r--r-- 1 root it 0 10月 29 19:37 b.py
# 在目录被SGID修饰后,所有用户在此目录下创建的文件的组都属于这个目录所在的组
10.3.3 SBIT(Sticky)
-
目前仅对目录有效,用来阻止非文件的所有者删除文件,常见的就是/tmp目录
[root@ccc ~]# ll -d /tmp/
drwxrwxrwt. 28 root root 4096 10月 29 09:09 /tmp/
-
权限信息最后一位t表明目录被设置SBIT权限,表明自己和root才有权力删除,主要作用于共享文件夹。
-
用o+t或1755增加权限
===================目录未设置SBIT权限,任意用户都可删除目录下文件======================
[root@ccc ~]# mkdir /share
[root@ccc ~]# chmod 777 /share/
[root@ccc ~]# useradd user01
[root@ccc ~]# useradd user02
[root@ccc ~]# useradd user03
[root@ccc ~]# useradd user04
[root@ccc ~]# su - user01 -c "touch /share/1.py" # 用户01创建1.py
[root@ccc ~]# su - user02 -c "touch /share/2.py" # 用户02创建2.py
[root@ccc ~]# su - user03 -c "touch /share/3.py" # 用户03创建3.py
[root@ccc ~]# su - user04 -c "touch /share/4.py" # 用户04创建4.py
[root@ccc ~]# ll /share/
总用量 0
-rw-rw-r-- 1 user01 user01 0 10月 29 20:07 1.py
-rw-rw-r-- 1 user02 user02 0 10月 29 20:08 2.py
-rw-rw-r-- 1 user03 user03 0 10月 29 20:08 3.py
-rw-rw-r-- 1 user04 user04 0 10月 29 20:08 4.py
[root@ccc ~]# su - user04
上一次登录:四 10月 29 20:08:17 CST 2020pts/1 上
[user04@ccc ~]$ rm -rf /share/1.py # 用户04可以删除1.py
[user04@ccc ~]$ rm -rf /share/2.py # 用户04可以删除2.py
[user04@ccc ~]$ rm -rf /share/3.py # 用户04可以删除3.py
[user04@ccc ~]$ rm -rf /share/4.py # 用户04可以删除4.py
[user04@ccc ~]$ exit
登出
[root@ccc ~]# ll /share/
总用量 0
===================目录设置SBIT权限,用户只可删除自己创建的文件=======================
[root@ccc ~]# chmod o+t /share/
[root@ccc ~]# ll -d /share/
drwxrwxrwt 2 root root 6 10月 29 20:09 /share/
[root@ccc ~]# su - user01 -c "touch /share/1.py"
[root@ccc ~]# su - user02 -c "touch /share/2.py"
^[[A[root@ccc su - user03 -c "touch /share/3.py"
[root@ccc ~]# su - user04 -c "touch /share/4.py"
[root@ccc ~]# su - user04
上一次登录:四 10月 29 20:14:57 CST 2020pts/1 上
[user04@ccc ~]$ rm -rf /share/1.py
rm: 无法删除"/share/1.py": 不允许的操作 # 不能删除其他用户创建的文件
[user04@ccc ~]$ rm -rf /share/2.py
rm: 无法删除"/share/2.py": 不允许的操作
[user04@ccc ~]$ rm -rf /share/3.py
rm: 无法删除"/share/3.py": 不允许的操作
[user04@ccc ~]$ rm -rf /share/4.py # 只能删除自己创建的文件
[user04@ccc ~]$ exit
登出
[root@ccc ~]# rm -rf /share/* # root用户可以删除无论谁创建的一切文件
[root@ccc ~]# ll /share/
总用量 0
================================必须要有x执行权限=================================
[root@ccc ~]# chmod o+t /share/
[root@ccc ~]# chmod o-x /share/
[root@ccc ~]# ll -d /share/
drwxrwxrwT 2 root root 6 10月 29 20:16 /share/
[root@ccc ~]# su - user01 -c "touch /share/1.py"
touch: 无法创建"/share/1.py": 权限不够
10.4 用户权限管理之umask
10.4.1 umask作用
-
新建文件、目录的默认权限都是由umask决定的
UID>199并且属主与属组相等的用户下,umask:0002
①文件664
②目录775
其他用户,如root用户,umask:0022
①文件644
②目录755
-
Linux中文件默认权限666,目录默认权限777
-
文件权限计算方法:偶数位直接相减,奇数位相减后加1
文件起始权限值 |
umask值 |
操作 |
计算后文件权限 |
666 |
022(都是偶数) |
相减 |
644 |
666 |
033(都是奇数) |
相减,奇数位相减后+1 |
644 |
666 |
325(有奇数和偶数) |
相减,奇数位相减后+1 |
442 |
-
目录权限计算方法:直接相减
文件起始权限值 |
umask值 |
操作 |
计算后文件权限 |
777 |
022 |
相减 |
755 |
777 |
033 |
相减 |
744 |
777 |
325 |
相减 |
452 |
-
umask设置的值越小,权限越大,要慎用
-
示例
[root@ccc ~]# umask 777
[root@ccc ~]# umask
0777
[root@ccc ~]# touch 1.py
[root@ccc ~]# mkdir 1
[root@ccc ~]# ll 1.py
---------- 1 root root 0 10月 29 20:39 1.py
[root@ccc ~]# ll -d 1
d--------- 2 root root 6 10月 29 20:39 1
10.4.2 设置umask
-
临时设置
[root@ccc ~]# umask 777
[root@ccc ~]# umask
0777
-
永久设置
[root@ccc ~]# vim /etc/profile
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002 # 表示uid>=199的默认umask值,普通用户
else
umask 022 # 表示uid<199的默认umask值,表示root
fi
10.5 用户权限管理之高级权限
10.5.1 ACL
-
定义
用命令setfacl设置的ACL权限就是ugo权限的扩展,可以用来细分Linux下的权限
可以让某一用户对某一文件具有某种权限
ACL:(Access Control List)独立于传统的ugo的rwx权限之外的具体权限设置,可以针对单一用户、单一文件或目录来进行rwx的权限控制,对于需要特殊权限的使用状况有一定帮助。
-
基本用法
修改属主的权限setfacl -m u::权限 文件
修改属组的权限setfacl -m g::权限 文件
修改其他的权限setfacl -m o::权限 文件
修改具体某一用户的权限setfacl -m u:用户名:权限 文件
修改具体某一组的权限setfacl -m g:组名:权限 文件
清除所有acl权限setfacl -b 文件
清除某一acl权限 setfacl -x u:用户名/g:组名 文件
特殊情况:
1、当其他人对文件没有权限,单独设置user01有r权限,user02有w权限,且不高于mask最高权限,user01、user02执行文件会按照单独设置的权限来执行(user01-->r,user02-->w)
2、当其他人对文件有rw权限,单独设置user01有r权限,user02有w权限,且不高于mask最高权限,user01、user02执行文件还是会按照单独设置的权限来执行(user01-->r,user02-->w)
3、当其他人对文件有rw权限,单独设置user01有r权限,user02有w权限,但高于mask最高权限,user01、user02执行文件会按照其他人权限来执行(user01-->rw,user02-->rw)
=========================修改具体某一用户的权限==========================
[root@ccc ~]# echo 111 >> /a.py
[root@ccc ~]# chmod o=- /a.py # 将其他用户的权限去掉,制造实验环境
[root@ccc ~]# ll /a.py
-rw-r----- 1 root root 4 10月 30 09:30 /a.py
[root@ccc ~]# getfacl /a.py
getfacl: Removing leading '/' from absolute path names
# file: a.py
# owner: root
# group: root
user::rw-
group::r--
other::---
[root@ccc ~]# setfacl -m u:zzz:r /a.py # 单独给其他用户zzz加上文件/a.py的r读权限
[root@ccc ~]# getfacl /a.py
getfacl: Removing leading '/' from absolute path names
# file: a.py
# owner: root
# group: root
user::rw-
user:zzz:r--
group::r--
mask::r--
other::---
[root@ccc ~]# useradd cjx
[root@ccc ~]# setfacl -m u:cjx:w /a.py # 单独给其他用户cjx加上文件/a.py的w写权限
[root@ccc ~]# su - zzz -c "cat /a.py"
111
[root@ccc ~]# su - cjx -c "echo 222 >> /a.py"
[root@ccc ~]# su - zzz -c "cat /a.py"
111
222
==========================修改具体某一组的权限===========================
[root@ccc ~]# setfacl -m g:nice:r /a.py
setfacl: Option -m: 无效的参数 near character 3 # 设置的组必须存在
[root@ccc ~]# groupadd nice
[root@ccc ~]# setfacl -m g:nice:r /a.py # 单独给组nice加上文件/a.py的r读权限
[root@ccc ~]# setfacl -m g::- /a.py # 将文件/a.py的主组权限全部拿掉,制作环境
[root@ccc ~]# getfacl /a.py
getfacl: Removing leading '/' from absolute path names
# file: a.py
# owner: root
# group: root
user::rw-
user:zzz:r--
user:cjx:-w-
group::---
group:nice:r--
mask::rw-
other::---
[root@ccc ~]# useradd user01
[root@ccc ~]# useradd user02
[root@ccc ~]# gpasswd -a user01 root
正在将用户“user01”加入到“root”组中
[root@ccc ~]# gpasswd -a user02 nice
正在将用户“user02”加入到“nice”组中
[root@ccc ~]# su - user01 -c "cat /a.py" # 主组root的用户user01没有任何权限
cat: /a.py: 权限不够
[root@ccc ~]# su - user02 -c "cat /a.py" # 组nice的用户user02有读权限
111
222
333
============================mask值的作用===============================
[root@ccc ~]# chmod g=- /a.py # chmod改权限会导致一系列问题,应用setfacl修改
[root@ccc ~]# ll /a.py
-rw-------+ 1 root root 8 10月 30 09:38 /a.py
[root@ccc ~]# getfacl /a.py
getfacl: Removing leading '/' from absolute path names
# file: a.py
# owner: root
# group: root
user::rw-
user:zzz:r-- #effective:---
user:cjx:-w- #effective:---
group::r-- #effective:---
mask::---
other::---
[root@ccc ~]# su - zzz -c "cat /a.py"
cat: /a.py: 权限不够
[root@ccc ~]# su - cjx -c "echo 333 >> /a.py"
-bash: /a.py: 权限不够
[root@ccc ~]# setfacl -m m:rwx /a.py # mask决定能达到的最高权限
[root@ccc ~]# getfacl /a.py
getfacl: Removing leading '/' from absolute path names
# file: a.py
# owner: root
# group: root
user::rw-
user:zzz:r--
user:cjx:-w-
group::r--
mask::rwx
other::---
[root@ccc ~]# su - cjx -c "echo 333 >> /a.py"
[root@ccc ~]#
[root@ccc ~]# su - zzz -c "cat /a.py"
111
222
333
-
default继承
仅改用户对某文件夹的权限不会作用到以后创建的子文件或子文件夹
要用d赋予继承权限
注:仅作用到之后创建的文件,对已经创建的不做修改
[root@ccc ~]# mkdir /test
[root@ccc ~]# setfacl -m u:cjx:rwx /test/ # 仅改文件夹ACL
[root@ccc ~]# getfacl /test
getfacl: Removing leading '/' from absolute path names
# file: test
# owner: root
# group: root
user::rwx
user:cjx:rwx # 注意此行
group::r-x
mask::rwx
other::r-x
[root@ccc ~]# mkdir /test/aaa
[root@ccc ~]# getfacl /test/aaa # 可以看到对创建的文件没有继承ACL
getfacl: Removing leading '/' from absolute path names
# file: test/aaa
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
[root@ccc ~]# setfacl -m d:u:cjx:rwx /test # d赋予继承权限
[root@ccc ~]# mkdir /test/bbb
[root@ccc ~]# touch /test/1.py
[root@ccc ~]# getfacl /test/bbb/ # 可以看到新创建的目录有ACL
getfacl: Removing leading '/' from absolute path names
# file: test/bbb/
# owner: root
# group: root
user::rwx
user:cjx:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:cjx:rwx
default:group::r-x
default:mask::rwx
default:other::r-x
[root@ccc ~]# getfacl /test/1.py # 新建的文件也有ACL
getfacl: Removing leading '/' from absolute path names
# file: test/1.py
# owner: root
# group: root
user::rw-
user:cjx:rwx #effective:rw-
group::r-x #effective:r--
mask::rw-
other::r--
[root@ccc ~]# getfacl /test/aaa # 对之前创建的目录或文件不做修改
getfacl: Removing leading '/' from absolute path names
# file: test/aaa
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
10.5.2 特殊属性
10.6 su与sudo
root拥有所有权限 -------->sudo------分配部分管理权限 ------------->普通用户
普通用户在经过sudo授权后,执行命令时必须加上sudo前缀,如果需要输入密码,输入的是用户的密码
10.6.1 su
-
切换用户身份:从一个用户切换到另一个用户
-
Linux中shell分为两种级别:
登陆级别shell:
输入账号密码登陆进来
su - 用户名(管理员root切换到普通用户无需输入密码,反之需要)
非登录级别shell:
su 用户名
-
登陆级别不同,加载的配置文件不一样
登陆级别shell:/etc/profile--->/etc/profile.d/*.sh--->/.bash_profile--->/.bashrc--->/etc/bashrc
非登录级别shell:~/.bashrc--->/etc/bashrc--->/etc/profile.d/*.sh
如果想针对所有用户,以及登陆与非登录shell设置统一的配置,应写到/etc/bashrc,后加export PATH
生效方式:①source /etc/bashrc ②重启
/etc/profile---------------------------->登陆级别的所有用户
-
切换身份执行命令
su - 用户名 -c "命令"
10.6.2 sudo
-
提权:不切换用户,即用户身份不变,但是可以获取root的部分权限
-
在管理员下修改配置文件/etc/sudoers来分配
vim /etc/sudoers # 风险高
visudo # 不用接文件路径
格式:用户 主机ip或主机名=(转换的用户身份) 管理命令
如: ccc ALL=(ALL) /usr/sbin/ifconfig
? ccc ALL=(ALL) NOPASSWD:/usr/ifconfig
? ccc ALL=(ALL) NOPASsWD:命令的别名
? ccc ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt # 以root身份运行所有除了/test/a.txt
? ALL代表的是服务端的IP地址,与客户端无关
格式:组 主机ip或主机名=(转换的用户身份) 管理命令
如:%devops ALL=(ALL) /usr/sbin/ifconfig # 系统里建组,将用户加进去
? ADMINS ALL=(ALL) NOPASSWD:/usr/ifconfig # 别名,不用将用户加组
-
visudo -c # 检查配置是否正确
-
sudo -l # 查看权限
10.6.3 总结
-
su
①特点:直接切换到root账号下进行操作,输入的是root的密码
②优点:简单粗暴
③缺点:root密码泄露,普通用户获取了所有管理员权限
-
sudo
①特点:在当前普通用户下进行操作,不需要切换到root账号下,执行命令格式为:sudo 命令,输入的是普通用户自己的密码
②优点:root密码没有泄露,普通用户有部分root权限
③缺点:相对复杂
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|