Linux用户和权限管理
一、Linux用户和组的定义
1.1 用户和组概念的引入
-
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
-
为了更加方便的管理多个用户,就出现了用户组的概念,关于用户和用户组☆☆☆
- 系统上的每个进程(运行的程序)都是作为特定用户运行
- 每个文件是由一个特定的用户拥有
- 访问文件和目录受到用户的限制
- 与正在运行的进程相关联的用户确定该进程可访问的文件和目录
-
实现用户账号的管理,要完成的工作(相关命令)主要有如下几个方面:
- 用户账号的添加、删除与修改
- 用户口令(密码)的管理
- 用户组的管理
1.2 用户的相关属性
1.2.1 用户uid
- Linux操作系统会依据用户的uid数值来判定这个用户的角色,分别如下
0
:超级管理员root,在Linux系统中拥有所有权利Centos6:1-499,Centos7:1-999
:系统用户,系统用户往往用来约束系统中的服务Centos6:500+,Centos7:1000+
:普通用户,可以用来登录和使用Linux系统
1.2.2 root用户
- uid是0
- 拥有操作系统的所有权力
- 该用户有权利覆盖文件系统上的普通权限
- 安装或删除软件并管理文件和目录
- 大多数设备只能由root控制
1.2.3 /etc/passwd
用户属性
/etc/passwd
:用户及其属性信息
- 字段解释(以第一行root为例)
字段 | 解释 |
---|---|
第一列root | 用户名称username |
第二列x | 密码占位符,会去/etc/shadow 中查找 |
第三列0 | 用户id(uid),root用户为0 |
第四列0 | 用户主组id(gid),root组id为0 |
第五列root | 这里一般写对此用户的描述,作用等 |
第六列/root | 记录用户家目录的位置 |
第七列/bin/bash | 用户登录的默认shell |
- passwd中的常见的两种shell
/bin/bash
:这个是Linux的命令行工具,我们正常登陆之后默认就是进入命令行/sbin/nologin
:如果写成nologin,那么用户将无法登录,有些用户是作为进程权限管理而存在的,不需要登录。如果提供登录的功能反而不安全,所以写成nologin(常用于不用登录的系统用户)
1.2.4 /etc/shadow
密码属性
/etc/shadow
:用户密码以密码期限文件
- 字段解释(以第一行root为例)
字段列数 | 说明 |
---|---|
第一列root | 用户名 |
第二列...一大串 | 使用sha-512 加密后的密码 |
第三列 | 最后一次修改密码的时间last change date |
第四列0 | 最小修改时间间隔,0表示随时修改min days |
第五列99999 | 密码有效期,99999表示不会过期max days |
第六列7 | 密码警告时间天数warn days |
第七列 | 密码过期后的宽限时间inactive days |
第八列 | 账号过期时间password expiration |
第九列 | 保留字段 |
1.2.5 /etc/login.defs
文件
/etc/login.defs
文件是用来创建用户时进行一定的限制,但是优先级低于/etc/passwd
和/etc/shadow
,如果有冲突的地方,系统会以/etc/passwd
和/etc/shadow
为准
[root@localhost ~]# egrep -v '^[ ]*$|^#' /etc/login.defs
MAIL_DIR /var/spool/mail # 系统消息(邮件)文件夹
PASS_MAX_DAYS 99999 # 密码有效最大天数
PASS_MIN_DAYS 0 # 密码有效最小天数
PASS_MIN_LEN 5 # 密码长度
PASS_WARN_AGE 7 # 密码失效警告倒计时
UID_MIN 1000 # 用户UID最小1000
UID_MAX 60000 # 用户UID最大60000
SYS_UID_MIN 201 # 系统用户UID最小201
SYS_UID_MAX 999 # 系统用户UID最大999
GID_MIN 1000 # 用户组GID最小1000
GID_MAX 60000 # 用户组GID最大60000
SYS_GID_MIN 201 # 系统组最小GID
SYS_GID_MAX 999 # 系统组最大GID
CREATE_HOME yes # 创建家目录
UMASK 077 # 创建文件/目录的权限掩码
USERGROUPS_ENAB yes # 创建用户时同时生成组,如果此处是no 创建的用户会是gid=100(users)groups=100(users)即users系统组
ENCRYPT_METHOD SHA512 # 加密方法sha512这个方法生成的密码在/etc/shadow里面的第二列会以$6$开头
1.4 组的相关属性
1.4.1 组id与类别
- 管理员组:
root 0
- 普通组:
- 系统组
- 登录用户组
- 组类别:
- 基本组(主组):组名同用户名,且仅包含一个用户,私有组
- 附加组(额外组):一个用户可以属于多个额外组
1.4.2 /etc/group
组属性
/etc/group
:组及其属性信息
字段列数 | 说明 |
---|---|
第一列 | 组名 |
第二列 | 组密码占位符 |
第三列 | 组id(gid),root的gid默认是0 |
第四列 | 在此组的成员列表(不包括默认以此为主组的同名用户) |
- 注:
/etc/gshadow
:组密码及其相关属性 (了解就行了,很少用)
1.5 用户与组的关系
- 用户一定有且只有一个主组,若不指定,默认为同名组(自动创建)
- 附加组可以有多个,需要手动指定
- 主要作用:用户加入组中,即可获得此组的权限(例如:想拥有文件属组的权限,则指定此用户为此属组的附加组。参看下文权限管理)
二、用户管理(增删改查)
2.1 用户属性查看
2.1.1 id命令
- 语法:
id [选项] 用户名
- 功能:用于显示用户的uid,主组gid和附加组id
- 常用选项:
参数 | 说明 |
---|---|
-g | 显示用户所属群组id |
-G | 显示用户所属附加组id |
-n | 显示用户,所属群组或附加群组的名称 |
-r | 显示实际ID |
-u | 显示用户ID |
[root@server1 ~]# id mysql
uid=1000(mysql) gid=1000(mysql) groups=1000(mysql)
[root@server1 ~]# id -g mysql
1000
[root@server1 ~]# id -G mysql
1000
[root@server1 ~]# id -u mysql
1000
# id会显示用户以及所属群组的实际与有效ID。若两个ID相同,则仅显示实际ID。若仅指定用户名称,则显示目前用户的ID。
[root@server1 ~]# id -r mysql
id: cannot print only names or real IDs in default format
2.1.2 查看相关配置文件
- 就是查看1.2.3和1.2.4介绍的两个文件,配合文件管理的文件查看命令
2.1.3 查看文件属主、属组(严格来说属于文件的属性)
2.1.4 其他相关命令
w
查看活动用户及其相关信息
last
查看用户登录日志
crontab -l
:查看当前用户的计划任务(后面章节会讲)who am i
或whoami
:查看当前登录用户信息
[root@server1 ~]# whoami
root
[root@server1 ~]# who am i
root pts/0 2022-05-18 09:13 (192.168.180.1)
logname
:查看自己登录的用户名
2.2 用户创建相关
2.2.1 创建用户useradd
- 语法:
useradd 用户名 [[选项] [参数]]
- 功能:创建用户并指定用户的属性
- 常见选项
选项 | 说明 |
---|---|
-u | 指定uid |
‐g | 指定gid |
‐c | 用户注释信息 |
‐d | 家目录 |
‐s | 指定shell(/etc/shells) |
‐G | 附加组 |
‐r | 创建系统用户 |
- 默认设置:
/etc/default/useradd
- 示例:
[root@server1 ~]# useradd zhangsan -G group1 -s /bin/csh -c '张三的信息'
[root@server1 ~]# id zhangsan
uid=1007(zhangsan) gid=1010(zhangsan) 组=1010(zhangsan),1009(group1)
[root@server1 ~]# cat /etc/passwd | grep zhangsan
zhangsan:x:1007:1010:张三的信息:/home/zhangsan:/bin/csh
2.3 用户修改相关
2.3.1 修改用户组usermod
- 语法:
usermod 用户名 [[选项] [参数]]
- 功能:修改/添加用户的组
- 常见选项
选项 | 说明 |
---|---|
-a | 追加,一般和-aG 连用,将用户添加到附加组 |
-G | 指定用户的附加组,会覆盖其他附加组 |
-d | 指定用户的新家目录 |
-m | 将家目录内容移到新位置,仅可和-dm 一起使用 |
-L | 锁定用户 |
-U | 解锁用户 |
[root@server1 ~]# usermod -G it user01 #覆盖附加组
[root@server1 ~]# id user01
uid=1000(user01) gid=1000(user01) 组=1000(user01),1011(it)
[root@server1 ~]# usermod -aG hr user01 #追加附加组
[root@server1 ~]# id user01
uid=1000(user01) gid=1000(user01) 组=1000(user01),1004(hr),1011(it)
2.3.2 修改用户密码passwd
- 语法:
passwd 用户名 [[选项] [参数]]
- 功能:设置/修改密码,同时指定密码的属性
- 常见选项
选项 | 说明 |
---|---|
‐n | 指定最短使用期限mindays |
‐x | 最大使用期限 maxdays |
‐w | 提前多少天开始警告warndays |
‐i | 非活动期限 inactivedays |
‐‐stdin | 从标准输入接收用户密码。例:`echo “PASSWD” |
-k | 保持身份验证令牌不过期 |
-d | 删除已命名帐号的密码 |
-l | 锁定指名帐户的密码 |
-u | 解锁指名账户的密码 |
-S | 报告已命名帐号的密码状态 |
- 示例
[root@server1 ~]# passwd zhangsan
更改用户 zhangsan 的密码 。
新的 密码:
无效的密码: 密码是一个回文
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
2.3.3修改用户密码属性change命令
-
语法:
change [选项] 用户名
-
功能:chage是用于更改用户密码过期信息
-
常见选项
参数 | 说明 |
---|---|
-d | 将最近一次密码设置时间设为“最近日期” |
-E | 过期日期:将帐户过期时间设为“过期日期” |
-I INACITVE | 过期 INACTIVE 天数后,设定密码为失效状态 |
-l | 显示帐户年龄信息 |
-m | 最小天数:将两次改变密码之间相距的最小天数设为“最小天数” |
-M | 最大天数:将两次改变密码之间相距的最大天数设为“最大天数” |
-W | 警告天数:将过期警告天数设为“警告天数” |
- 示例
[root@server1 ~]# chage -d 0 zhangsan
[root@server1 ~]# logout
# 尝试登录zhangsan
You are required to change your password immediately (root enforced)
Last login: Wed May 18 15:19:45 2022
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user zhangsan.
Changing password for zhangsan.
(current) UNIX password:
2.4 用户删除相关
2.4.1 删除用户userdel
- 语法:
userdel [选项] 用户名
- 功能:删除用户 [家目录]
- 常见选项
-r
:连同家目录一起删除-f
:强制删除用户
[root@server1 home]# ls
user01 user02 user03 user04 zhangsan
[root@server1 home]# userdel -r zhangsan
[root@server1 home]# ls
user01 user02 user03 user04
三、用户组管理(增删改查)
3.1 创建组groupadd
- 语法:
groupadd [选项] 组名
- 功能:创建用户组/系统组
- 常见选项
‐g
:指定gid‐r
:创建系统组
[root@server1 ~]# groupadd -g 1002 lisi
[root@server1 ~]# tail -1 /etc/group
lisi:x:1002:
3.2 删除组groupdel
- 语法:
groupdel [选项] 组名
- 功能:删除组
[root@server1 ~]# groupdel lisi
[root@server1 ~]# tail -3 /etc/group
ntp:x:38:
mysql:x:1000:
slocate:x:21:
3.3 修改组groupmod
- 语法:
groupmod [选项] 组名
- 功能:修改用户组的属性
- 常见选项
参数 | 说明 |
---|---|
-g | 将组ID 改为GID |
-n | 改名为NEW_GROUP |
-o | 允许使用重复的GID |
- 示例
[root@server1 ~]# groupmod -n zs zhangsan
3.4 组查询
- 即查看1.4.2介绍的相关配置文件
[root@server1 ~]# tail -n 5 /etc/group
postdrop:x:90:
postfix:x:89:
ntp:x:38:
mysql:x:1000:
slocate:x:21:
四、文件权限管理
4.1 权限设置原因
-
服务器中的数据价值
-
员工的工作职责和分工不同
-
应对自外部的攻击(挂马)
-
内部管理的需要
4.2 三种基本权限
-
文件的权限对象:
owner
:属主,ugroup
:属组,gother
:其他,o
-
root不受权限限制,拥有所有权限
-
文件的三种权限:
权限 | 对文件 | 对目录 |
---|---|---|
r(Readable 4) | 可读文件内容 | 可以使用ls 查看此目录中的文件列表 |
w(Writeable 2) | 可修改其内容 | 可在此目录中创建mkdir ,touch ,也可以删除rmdir ,rm -rf 此目录中的文件 |
x(Excutable 1) | 可作为命令执行 | 可以cd 进入此目录 |
-
注:一般给予目录读权限时,也将会给其执行权限
-
ll
命令的前面2-10列的rwx或-
分别表示此文件对属主、属组、其他人的权限,-
表示无此权限
4.3 基本权限管理(u,g,o)
4.3.1 更改属主(组)chown
-
语法:
chown [选项] [所有者][:[组]] 文件
-
功能:用于设置文件所有者和文件关联组的命令,需要root的权限才能执行
-
常见选项
-R
: 处理指定目录以及其子目录下的所有文件-v
: 显示详细的处理信息
-
示例
# 设置所有者为root
[root@server1 ~]# chown root anaconda-ks.cfg
# 将属主设置为user01,属组设置为it
[root@server1 ~]# chown user01:it file.txt
# 将目录下的所有文件属主为user01,属组it
[root@server1 ~]# chown -R user01:it dir/*
4.3.2 更改属组chgrp
[root@server1 ~]# chown alice:hr file1#改属主,属组
[root@server1 ~]# chown alice file1 #改属主
[root@server1 ~]# chown :hr file1 #改属组
[root@server1 ~]# chgrp g1 file1#改文件属组
[root@server1 ~]# ll file1
-rw-r--r--. 1 alice g1 0 7月 12 18:01 file1
[root@server1 ~]# chgrp -R g1 dir1#改文件夹属组
[root@server1 ~]# ll
总用量 16
-rw-------. 1 root root 1241 3月 16 17:52 anaconda-ks.cfg
-rwxr-xr-x. 1 root root 9024 5月 24 12:11 a.out
drwxr-xr-x. 2 root g1 6 7月 12 18:10 dir1
4.3.3 更改文件权限chmod
- 语法:
chmod [选项] 模式[,模式] 文件
- 功能:控制用户对文件的权限
- 模式说明:
- mode : 权限设定字串,格式如下
[ugoa][[+-=][rwx]...][,...]
u
表示该文件的拥有者,g
表示与该文件的拥有者属于同一个群体(group)者,o
表示其他以外的人,a
表示这三者皆是。+
表示增加权限、-
表示取消权限、=
表示唯一设定权r
表示可读取,w
表示可写入,x
表示可执行
- 常见选项
‐R
:递归设置,针对文件夹(目录)-v
:显示权限变更的详细资料-f
: 若该文件权限无法被更改也不要显示错误讯息
- 八进制语法
chmod
命令可以使用八进制数来指定权限。- 文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件所有者(User)的读、写、执行,用户组(Group)的读、写、执行以及其它用户(Other)的
读、写、执行。 - 历史上,文件权限被放在一个比特掩码中,掩码中指定的比特位设为1,用来说明一个类具有相应的优先级。
[root@server1 ~]# chmod u=rwx,g=r,o=r file1
[root@server1 ~]# ll file1
-rwxr--r--. 1 alice g1 0 7月 12 18:01 file1
[root@server1 ~]# chmod u-x file1
[root@server1 ~]# ll file1
-rw-r--r--. 1 alice g1 0 7月 12 18:01 file1
[root@server1 ~]# chmod a-w file1
[root@server1 ~]# ll file1
-r--r--r--. 1 alice g1 0 7月 12 18:01 file1
[root@server1 ~]# chmod 764 file1
[root@server1 ~]# ll file1
-rwxrw-r--. 1 alice g1 0 7月 12 18:01 file1
- 删除文件失败如何解决?
- 可检查用户对所在目录是否有
w权限
(能否删除此文件要看所在目录的权限) sudo
提权- 查看是否有特殊权限或锁定
- 可检查用户对所在目录是否有
4.4 ACL权限
4.4.1ACL权限引入
ACL
是 Access Control List
的缩写,是Linux开的一套新的文件系统权限管理方法。
- 传统的Linux文件系统的权限控制是通过user、group、other与r(读)、w(写)、x(执行)的不同组合来实现的。
- 随着应用的发展,这些权限组合已不能适应现时复杂的文件系统权限控制要求。例如,我们可能需把一
个文件的读权限和写权限分别赋予两个不同的用户或一个用户和一个组这样的组合。传统的权限管理设置起来就力不从心了。
- 在
Linux
系统中,ACL
可以针对文件单独设置某个用户或者用户组的管理权限。优势就是让权限控制更加的精准。
4.4.2 getfacl获取ACL权限
- 语法:
getfacl [选项] file
- 功能:获取文件访问控制列表的详细内容
- 常用选项
参数 | 说明 |
---|---|
-a | 仅显示文件访问控制列表 |
-d | 仅显示默认的访问控制列表 |
-c | 不显示注释表头 |
-e | 显示所有的有效权限 |
-E | 显示无效权限 |
-R | 递归显示子目录 |
-t | 使用制表符分隔的输出格式 |
- 示例
[root@server1 ~]# getfacl anaconda-ks.cfg
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rw-
group::---
other::---
# 查看acl权限列表,不显示注释表头
[root@server1 ~]# getfacl -c anaconda-ks.cfg
user::rw-
group::---
other::---
4.4.3 setfacl管理ACL权限
- 语法:
setfacl [选项] [u/g/m/o:name[:权限]] file
- 功能:获取文件访问控制列表的详细内容
- 常用选项
餐数 | 选项 |
---|---|
‐m | 修改ACL设定参数 |
-M | 从文件读取ACL条目更改 |
‐x | 删除ACL设定参数 |
-X | 从文件读取ACL条目并删除 |
‐b | 移除所有的ACL设定 |
‐d | 添加默认的ACL权限 |
-k | 移除默认ACL |
-R | 递归操作子目录 |
- 删除ACL权限
# 删除用户权限:
setacl ‐x u:username filename
# 删除组权限:
setacl ‐x g:groupname filename
# 删除整个acl权限:
setacl ‐b filename
- 用户设定ACL权限:
setfacl -m u:username:权限 filename
# 设定alice对file1有rwx权限
[root@server1 ~]# setfacl -m u:alice:rwx file1
[root@server1 ~]# getfacl file1
# file: file1
# owner: alice
# group: g1
user::rwx
user:alice:rwx
group::rw-
mask::rwx
other::r--
#设定user对testdirectory目录下所有文件有rwx权限
[root@server1 ~]# setfacl ‐R ‐m u:user:rwx testdirectory
# 去掉user对testdirectory的x权限
[root@server1 ~]# setfacl ‐x u:user testdirectory/
#去掉所有acl权限
[root@server1 ~]# setfacl -b file1
[root@server1 ~]# getfacl file1
# file: file1
# owner: alice
# group: g1
user::rwx
group::rw-
other::r--
# 为testdirectory目录添加默认的acl权限,此目录下创建目录和文件,user都有rwx权限
[root@server1 ~]# setfacl ‐d ‐m u:user:rwx testdirectory/
- 组设定ACL权限:
setfacl -m g:groupname:权限 filename
# 给acl_test1文件添加mygropu1组rx权限设定
[root@study ~]# setfacl ‐m g:mygroup1:rx acl_test1
[root@study ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:rx
group::r‐‐ group:mygroup1:rx # 组权限设定
mask::rx
other::r‐‐
4.4.4 mask有效权限
- mask 权限:指的是用户或群组能拥有的最大 ACL 权限,也就是说,给用户或群组设定的 ACL 权限不能超过mask 规定的权限范围,超出部分做无效处理。
# 修改mask值
[root@localhost ~]# setfacl -m m::rwx /workdir/newfile
[root@localhost ~]# getfacl -c /workdir/newfile
user::rw-
user:user1:r-x
group::rwx
mask::rwx
other::---
4.5 特殊权限
- 文件除
rwx
三个普通权限之外,还有三个特殊权限 - 文件的特殊权限包括:
SUID
、SGID
、SBIT (sticky)
4.5.1 SUID:冒险位S(4)
suid
属性只能运用在可执行文件上,含义是开放文件所有者的权限给其他用户,即当用户执行该执行文件时,会拥有该执行文件所有者的权限。- 如果给一个非二进制文件文件附加
suid
权限,则会显示大写S(即不可执行),属于无效。(可执行文件拥有suid
权限显示小写s
)
查询命令所在的路径
[root@server1 ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
[root@server1 ~]# type passwd
passwd is /usr/bin/passwd
[root@server1 ~]# which passwd
/usr/bin/passwd
-
举例
-
普通用户
zhangsan
修改密码=> 调用passwd
命令=> 执行/usr/bin/passwd
=> 修改/etc/shadow
文件 -
详细说明
普通用户能够执行
passwd
命令修改自己的密码,修改密码其实就是修改/etc/shadow
这个文件,查看/etc/shadow
这个文件的权限,发现除了root
其他人没有写权限,但是普通用户能够成功执行passwd
命令 ,其原因就在于passwd
这个命令的权限是rwsrw----
,其中s
的作用就是让执行命令的人具有和该命令拥有者相同的权限。
-
#普通用户没有直接修改/etc/shadow中密码的权利,只有root可以
[root@server1 ~]# ll /etc/shadow
----------. 1 root root 1100 7月 12 17:44 /etc/shadow
#普通用户可以通过使用具有s权限的passwd命令,借用root的权利来修改自己的密码
[root@server1 ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
4.5.2 SGID:强制位S(2)
sgid
属性可运用于文件或者目录,运用在文件的含义是开放文件所属组的权限给其他用户,即当用户执行该可执行文件时,会拥有该可执行文件所属组用户的权限。- 如果给一个非二进制文件文件附加 sgid 权限,则会显示大写S,属于无效。
- 运用在目录上的含义是,在该目录下所有用户创建的文件或者目录的所属组都和其一样(统一属组)。即如果
/home/user1
目录具有sgid
权限,且所属组是user1
,则任何用户在/home/user1
下创建的子目录或者文件的所属组都是user1
。(仅对设置后新创建的文件有效,对已经存在的文件则不会修改其属组) - 示例
[root@server1 ~]# chown :zhangsan test/
[root@server1 ~]# ll -d test/
drwxr-xr-x 2 root zhangsan 6 May 18 14:26 test
[root@server1 ~]# chmod g+s test/
[root@server1 ~]# ll -d test/
drwxr-sr-x 2 root zhangsan 6 May 18 14:26 test/
# 在test下创建的文件默认和test目录同一属组
[root@server1 test]# touch file1
[root@server1 test]# ll
total 0
-rw-r--r-- 1 root zhangsan 0 May 18 14:28 file1
4.5.3 SBIT:粘滞位T(1)
- sticky 权限只能运用于目录上,含义是该目录下所有的文件和子目录只能由所属者删除,即使其的权限是777
或者其他。- 同一用户组的多个用户拥有共同的目录(公共目录,可设置为777),在创建文件时该用户组的所有用户都有相同的权利操作文件。用户创建该目录时,只有自己或root可以删除该目录下的文件,其他用户不可以修改或删除此文件。
[root@server1 ~]# ll -d /tmp
drwxrwxrwt. 9 root root 264 7月 12 14:01 /tmp#t表示具有SBIT权限
4.5.4 设置或修改特殊文件
# 若使用八进制数字,第一位表示特殊权限,后三位为基本权限
chmod u+s file1
chmod 4644 file1
chmod u-s file1
chmod 0644 file1
chmod g+s dir1
chmod 2755 dir1
chmod g-s dir1
chmod 0755 dir1
chmod o+t dir1
chmod 1755 dir1
chmod o-t dir1
chmod 0755 dir1
[root@server1 ~]# chmod 7644 file1
[root@server1 ~]# ll
-rwSr-Sr-T. 1 alice g1 0 7月 12 18:01 file1
注:
- 大写的高级权限表示普通权限没有
x
执行权限 - 小写的高级权限表示普通权限有
x
执行权限 - 特殊权限生效的前提:
SUID/SGID
必须要求可执行的二进制文件,而SBIT
必须要求目录
4.6 进程umask
umask可用来设定[权限掩码]。[权限掩码]是由3个八进制的数字所组成,将现有的存取权限减掉权限掩码后,即可产生建立文件时预设的权限。
umask
:文件或目录的遮掩码 ,进程新建文件、目录的默认权限会收到umask的影响,umask
表示要减掉得到权限。(实际文件权限 = 现有的最高存取权限 - umask的值
)- File文件:
666 ‐ umask
,root创建的文件权限默认为644
,普通用户创建的文件权限默认为664
- Dir目录:
777 ‐ umask
,root创建的目录权限默认为755
,普通用户创建的目录权限默认为775
- 创建一个普通文件最高权限
666
(预设没有x权限)。而创建一个目录其最高权限777
- File文件:
- 查看:
umask
值-S
:以文字的方式来表示权限掩码
[root@server1 ~]# umask
0022 #root默认为022
[zhangsan@server1 ~]$ umask
0002 #普通用户默认为022
[root@server1 test]# umask -S
u=rwx,g=rx,o=rx
- 临时设定:
umask 设置值
(不建议修改) - 永久设定:修改相关配置文件
~/.bashrc
(不建议修改),在文件中追加 :umask 设置值
五、sudo提权
5.1 sudoers
- Linux是多用户多任务的操作系统, 共享该系统的用户往往不只一个。出于安全性考虑, 有必要通过
useradd
创建一些非root用户, 只让它们拥有不完全的权限; 如有必要,再来提升权限执行。 sudo
就是来解决这个需求的: 这些非root用户不需要知道root的密码,就可以提权到root,执行一些root才能执行的命令。
5.2 sudo命令执行过程
- 当用户执行
sudo
时,系统会主动寻找/etc/sudoers
文件,判断该用户是否有执行sudo
的权限 - 确认用户具有可执行
sudo
的权限后,让用户输入用户自己的密码确认 - 若密码输入成功,则开始执行
sudo
后续的命令
5.3 赋予用户sudo操作的权限
- 通过
useradd
添加的用户,并不具备sudo
权限。在ubuntu/centos
等系统下, 需要将用户加入admin
组或者wheel
组或者sudo
组。- 以root用户身份执行如下命令, 将用户加入
wheel/admin/sudo
组。如果提示wheel
组不存在, 则还需要先创建该组
- 以root用户身份执行如下命令, 将用户加入
- 配置文件
sudo
的权限控制可以在/etc/sudoers
文件中查看到。一般来说,通过cat /etc/sudoers
指令来查看该文件, 会看到如下几行代码。
# 去除空行和注释
[root@server1 test]# egrep -v '^$|^#' /etc/sudoers
.....
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
-
对 /etc/sudoers 文件进行编辑的代码公式可以概括为
授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...
字段1 字段2 =[(字段3)] [字段4] 字段5
-
解释说明
- 凡是[ ]中的内容, 都能省略;
- 命令和命令之间用
,
号分隔,字段3、字段4,是可以省略的。 字段1
不以%
号开头的表示"将要授权的用户",以%
号开头的表示"将要授权的组"。字段2
表示允许登录的主机,ALL表示所有;如果该字段不为ALL,表示授权用户只能在某些机器上登录本服务器来执行sudo命令- 比如:
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示: 普通用户jack
在主机(或主机组)mycomputer
上, 可以通过sudo
执行reboo
t和shutdown
两个命令(命令路径通过之前讲的方式查询)
- 比如:
字段3
如果省略, 相当于(root:root)
,表示可以通过sudo
提权到root
,如果为(ALL)
或者(ALL:ALL)
, 表示能够提权到(任意用户:任意用户组)
。字段4
的可能取值是NOPASSWD:
。请注意NOPASSWD
后面带有冒号:
。表示执行sudo
时可以不需要输入密码。字段5
是使用逗号分开一系列命令,这些命令就是授权给用户的操作;ALL
表示允许所有操作。命令都是使用绝对路径, 这是为了避免目录下有同名命令被执行,从而造成安全隐患。- 如果你将授权写成如下安全性欠妥的格式:
lucy ALL=(ALL) chown,chmod,useradd
那么用户
就有可能创建一个他自己的程序, 也命名为useradd
, 然后放在它的本地路径中, 如此一来他就能够使用root
来执行这个名为useradd的程序(删库警告)
。这是相当危险的!
- 如果你将授权写成如下安全性欠妥的格式:
-
示例
[root@server1 ~]# id alice
uid=1004(alice) gid=1006(alice) 组=1006(alice)
[root@server1 ~]# su - alice
#普通用户alice尝试创建用户wanger,被拒绝
[alice@server1 ~]$ useradd wanger
useradd: Permission denied.
useradd:无法锁定 /etc/passwd,请稍后再试。
#修改sudo提权配置文件
[root@server1 ~]# vim /etc/sudoers #visudo命令也行
将107行的%whee ALL=(ALL) NOPASSWD:ALL前面的#和%删除
:wq!保存强制退出
[root@server1 ~]# gpasswd -a alice wheel # 将alice添加到wheel组,usermod也行
正在将用户“alice”加入到“wheel”组中
[root@server1 ~]# id alice
uid=1004(alice) gid=1006(alice) 组=1006(alice),10(wheel)
#重新登录alice用户,sudo提权
[root@server1 ~]# su - alice
#sudo提权并创建用户,成功
[alice@server1 ~]$ sudo useradd wanger
[sudo] alice 的密码:
[alice@server1 ~]$ ls /home
alice wanger