账户和文件权限管理和设置acl访问控制
目录:
- Linux基于用户身份对资源访问进行控制
- Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
- 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;
- 另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
- 每个用户账号都拥有一个唯一的用户名和各自的口令。
- 用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
UID:User IDentity,用户标识号。UID号用于唯一系统中的用户,是一个32位的无符号整数
root用户账号的UID为固定值0
程序用户账号的UID默认为Centos5,6: 1~499, Centos7: 1~999
普通用户的UID默认为Centos5, 6: 500~60000, Centos7: 1000~60000
用户账号
超级用户:root 用户是Linxu操作系统中默认的超级用户账号,对本机拥有最高的权限。系统中超级用户是唯一的。
普通用户:由root用户或者其他管理员用户创建,拥有的权限会受到限制,一帮只在自己的家目录中拥有完全权限
程序用户:在安装Linux操作系统及部分应用程序时,会添加一些特定的低权限用户账号,这些用户一般不允许登录到系统,仅用于维持系统或某个程序的正常运行
用户账号信息保存在/etc/pssswd 中,里面的每一行对应一个账号记录。每个账号使用冒号":"分隔为7个字段
用户账号:密码占位符:用户账号ID:组账号ID:用户说明:家目录:登录shell
密码站位符:x,处于安全考虑,用户的密码信息保存在/etc/shadow里。/etc/passwd只保留占位符x
登录shell:/bin/bash 为可登录系统。 /sbin/nologin 和 /bin/false 为禁止用户登录
/etc/shadow 里存放了用户的密码,账号有效期等信息。每一行对应一个用户的密码记录。此文件内容默认只有root可以读取,且不允许直接编辑该文件的内容。每一个 记录使用冒号”:“分隔为9个字段
用户账号名称:加密密码字符串:上次修改密码时间:密码最短有效天数:密码最长有效天数:密码过期提醒时间:密码过期后禁用账号时间:账号失效时间:保留字段
加密密码字符串:使用MD5加密的密码字串信息,当为"*"或"!!"时表示此用户不能登录到系统。若该字段内容为空,则该用户无须密码即可登录系统
上次修改密码时间:从1970年01月01日开始算到最近一次修改密码的间隔天数
密码的最短有效天数,:自本次修改密码后,必须至少经过该天数才能再次修改密码。默认值为0,表示不进行限制
密码的最长有效天数: 自本次修改密码后,经过该天数以后必须再次修改密码。默认值为99999,表示不进行限制
密码过期提醒时间:提前多少天警告用户密码将过期,默认值为7
账号失效时间:此字段指定了用户作废的天数(从1970年01月01日起计算) ,默认值为空,表示账号永久可用。
useradd [选项] 用户名 (或者使用adduser也可以)
常用选项:
-u :指定用户的UID号,要求该UID号码未被其他用户使用。
-d :指定用户的宿主目录位置(当与-M一起使用时,不生效)。只能用绝对路径指定目录,且不需要事先创建目录
-e :指定用户的账户失效时间,可使用YYYY-MM-DD的日期格式。
-g :指定用户的基本组名(或使用GID号) ,对应的组名必须已存在。
-G :指定用户的附加组名(或使用GID号) ,对应的组名必须已存在。
-M :不建立宿主目录。
-s :指定用户的登录Shell, (比如/bin/bash为可登陆系统, /sbin/nologin和/bin/false为禁止用户登陆系统) 。
#添加用户后,此用户并不能直接登录,因为没有设置密码去激活此用户,所以在/etc/shadow中,此用户的第二个字段是不能登录的"!!"
[root@localhost opt]# useradd -u 2000 zhangsan #创建用户zhangsan,指定id号为2000 [root@localhost opt]# tail -1 /etc/passwd zhangsan:x:2000:2000::/home/zhangsan:/bin/bash [root@localhost opt]# useradd -d /opt/lisi lisi #创建用户lisi,指定家目录在/opt/lisi [root@localhost opt]# ls lisi rh [root@localhost opt]# tail -1 /etc/passwd lisi:x:2001:2001::/opt/lisi:/bin/bash [root@localhost opt]# useradd -e 2021-06-18 wangwu #创建用户wangwu ,设定账号过期时间为 2021-06-18 [root@localhost opt]# tail -2 /etc/shadow lisi:!!:18795:0:99999:7::: wangwu:!!:18795:0:99999:7::18796: [root@localhost opt]# useradd -g zhangsan zhaoliu #创建用户zhaoliu ,设置基本组为 zhangsan [root@localhost opt]# cat /etc/passwd |grep zhangsan zhangsan:x:2000:2000::/home/zhangsan:/bin/bash [root@localhost opt]# cat /etc/passwd |grep zhaoliu zhaoliu:x:2003:2000::/home/zhaoliu:/bin/bash [root@localhost opt]# useradd -G lisi teacher #创建用户teacher ,添加附加组 lisi [root@localhost opt]# tail -1 /etc/passwd teacher:x:2004:2004::/home/teacher:/bin/bash [root@localhost opt]# id teacher uid=2004(teacher) gid=2004(teacher) 组=2004(teacher),2001(lisi) [root@localhost home]# ls teacher test wangwu zhangsan zhaoliu [root@localhost home]# useradd -M student #创建用户student ,并不创建家目录 [root@localhost home]# ls teacher test wangwu zhangsan zhaoliu [root@localhost home]# tail -1 /etc/passwd student:x:2005:2005::/home/student:/bin/bash [root@localhost home]# useradd -s /sbin/nologin docter #创建用户docter,设置登录shell 为/sbin/nologin [root@localhost home]# tail -1 /etc/passwd docter:x:2006:2006::/home/docter:/sbin/nologin
方法一:交互式设置密码
passwd [选项] [用户名]
-d :清空指定用户的密码,仅使用用户名即可登录系统。
-l:锁定用户账户,锁定的用户账号将无法再登录系统。
-S :查看用户账户的状态(是否被锁定)。
-u :解锁用户账户。
-f 强制操作。(解锁空密码用户时需要添加使用)
#passwd 设置密码时,管理员用户可以设置自己和普通用户的密码,普通用户只能设置自己的密码。不加用户名参数,就是设置当前用户
方法二:非交互式设置密码
echo "密码" | passwd --stdin 用户名
[root@localhost opt]# passwd zhangsan #设置zhangsan的密码。交互式设置,虽然繁琐,但是密码不会显示,更加安全 更改用户 zhangsan 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 #因为密码简单,所以报警。可以不用管 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 [root@localhost opt]# passwd -d lisi #清空lisi的密码,使lisi用户可以无密码登录 清除用户的密码 lisi。 passwd: 操作成功 [root@localhost opt]# passwd -l zhangsan #锁定用户zhangsan,zhangsan账户不可登录 锁定用户 zhangsan 的密码 。 passwd: 操作成功 [root@localhost opt]# passwd -S zhangsan #查看用户zhangsan账户状态 zhangsan LK 2021-06-17 0 99999 7 -1 (密码已被锁定。) [root@localhost opt]# passwd -u zhangsan #解除用户zhangsan的账户锁定, 解锁用户 zhangsan 的密码。 passwd: 操作成功 [root@localhost opt]# passwd -l lisi 锁定用户 lisi 的密码 。 passwd: 操作成功 [root@localhost opt]# passwd -S lisi lisi LK 2021-06-17 0 99999 7 -1 (密码已被锁定。) [root@localhost opt]# passwd -u lisi #因为lisi 用户是无密码,所以解除锁定失败 解锁用户 lisi 的密码。 passwd: 警告:未锁定的密码将是空的。 passwd: 不安全的操作(使用 -f 参数强制进行该操作) [root@localhost opt]# passwd -uf lisi #加上 -f 选项,强制解锁 解锁用户 lisi 的密码。 passwd: 操作成功 [root@localhost opt]# echo "123" | passwd --stdin zhaoliu #非交互式设置用户密码。但是,密码是以明文的方式显示在屏幕上 更改用户 zhaoliu 的密码 。 passwd:所有的身份验证令牌已经成功更新。
usermod [选项] 用户名
常用选项
-u :修改用户的UID号。
-d :修改用户的宿主目录位置。
-e :修改用户的账户失效时间,可使用YYYY-MM-DD的日期格式。
-g :修改用户的基本组名(或使用GID号)。
-G :修改用户的附加组名(或使用GID号)。
-S :指定用户的登录Shell.
-l :更改用户账号的登录名称。
-L:锁定用户账户。
-U:解锁用户账户。
#usermod -l 修改的只是用户名,但是家目录等信息没有改变
#usermod -U 解锁,无法介解锁空密码用户,因为 usermod 没有-f 选项
[root@localhost opt]# cat /etc/passwd | grep abc abc:x:1001:1001::/home/zhangsan:/bin/bash #用户账户名已经变成了abc ,但是家目录等信息没有改变
userdel [-r] 用户名
# userdel 删除时,只删除了用户账号,但是家目录等没有删除。添加-r 选项表示连用户家目录和邮件池一起删除
[root@localhost home]# ls test wangwu zhaoliu [root@localhost home]# userdel wangwu #删除用户wangwu [root@localhost home]# ls #发现wangwu 用户的家目录依旧存在 test wangwu zhaoliu [root@localhost home]# id wangwu #查看wangwu用户是否存在 id: wangwu: no such user [root@localhost home]# rm -rf wangwu/ #用rm 命令删除用户wangwu 的家目录 [root@localhost home]# ls test zhaoliu [root@localhost home]# ls test zhaoliu [root@localhost home]# userdel -r zhaoliu #删除用户zhaoliu ,连同它的家目录和邮件池一起删除 [root@localhost home]# id zhaoliu id: zhaoliu: no such user [root@localhost home]# ls #zhaoliu的家目录已经被删除 test
文件来源
useradd 命令添加一个新的用户账号后会在该用户的宿主目录中建立一些初始配置文件。
这些文件来自于账号模板目录/etc/skell,基本上都是隐藏文件。
每个用户家目录中都有用户的初始配置文件。这些文件只对当前用户有效
~/.bash_profile :只在用户每次登陆时被执行,会设置一些环境变量,并且会调用该用户的~/.bashrc 文件
~/.bashrc :每次打开新的bash shell 时(包括的登录系统) 会被执行。并会调用/etc/bashrc 文件
~/.bash logout :此文件中的命令将在用户每次退出登录或退出bash shell时执行
在/etc/目录下,还有针对所有用户有效的全局配置文件
/etc/profile : 在登录时加载。 这个文件是为系统全局变量配置文件,可通过 重启系统或者执行source /etc/profile 命令使profile文件被读取
/etc/profile.d/ :这个文件实际上是/etc/profile的子目录,存放的是一些应用程序所需的启动脚本 ,会随着/etc/profile 一起被读取
/etc/bashrc : 在登录和切换新的 bash shell 读取。每一个运行bash shell的用户都会执行此文件,可通过执行bash命令打开一个新的bash shell时,使bashrc文件被读取
使用pstree 命令查看bash
Linux支持用户组,每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。一个组可以包含多个用户,每个用户也可以属于不同的组。
用户组在Linux中扮演着重要的角色,方便管理员对用户进行集中管理
GID: Group IDentity , 组标识号。对于组的唯一标识
root用户账号的GID号为固定值0
程序用户账号的GID号默认为Centos5,6: 1~499, Centos7: 1~999
普通用户的GID号默认为Centos5, 6: 500~60000, Centos7: 1000~60000
/etc/group 保存组账号的基本信息,每一行都是一个账号,用分号“:” 分隔为四个字段
组账号名称:密码占位符x :组账号GID:组账号包含的用户成员
#:组账号包含的用户成员(一般不包括基本组对应的用户帐号) ,多个成员之间以逗号","分隔
/etc/gshadow 保存组密码,每一行都是一个账号,用分号“:“ 分隔为四个字段
gourpadd [-g GID] 组账号名
[root@localhost ~]# groupadd develop #添加组develop [root@localhost ~]# tail -1 /etc/group develop:x:1002:
gpasswd [选项] 组账号名
常用选项:
-a :向组内添加一个用户
-d :从组内删除一个成员用户
-M :定义组成员列表,以逗号分隔 (如果使用 -M 选项管理组成员,会覆盖原来的组成员列表)
[root@localhost home]# gpasswd -a zhangsan develop #将用户zhangsan 添加到develop组中 正在将用户“zhangsan”加入到“develop”组中 [root@localhost home]# cat /etc/group | grep develop develop:x:1002:zhangsan [root@localhost home]# gpasswd -d zhangsan develop #将用户zhangsan从组develop 中删除 正在将用户“zhangsan”从“develop”组中删除 [root@localhost home]# cat /etc/group | grep develop develop:x:1002: [root@localhost home]# gpasswd -M zhangsan,lisi,wangwu develop #设置develop组的成员为zhangsan,lisi,wangwu [root@localhost home]# cat /etc/group | grep develop develop:x:1002:zhangsan,lisi,wangwu
groupdel 组账号名
[root@localhost home]# groupdel develop #删除组develop
[root@localhost home]# cat /etc/group | grep develop
groups [用户名]
[root@localhost ~]# groups zhangsan #查询zhangsan用户的所属组
zhangsan : zhangsan
id 用户名
[root@localhost ~]# id zhangsan #查询zhangsan账号信息 uid=1001(zhangsan) gid=1001(zhangsan) 组=1001(zhangsan) #zhangsan用户存在,并给出详细信息 [root@localhost ~]# id abc #查询用户abc账号信息 id: abc: no such user #abc 用户不存在
3.3.1 finger [用户名]
#需要先安装finger 软件包
[root@localhost ~]# yum list | grep finger finger.x86_64 0.17-52.el7 base finger-server.x86_64 0.17-52.el7 base [root@localhost ~]# yum -y install finger [root@localhost ~]# finger zhangsan Login: zhangsan Name: Directory: /home/zhangsan Shell: /bin/bash Never logged in. No mail. No Plan. #显示了登录名,家目录,登录shell ,邮件,计划任务等信息
w 命令
#w 命令不仅可以查看到登录信息,还可以查看到cpu 负载
[root@localhost ~]# w 11:10:30 up 1:48, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.23.1 09:22 6.00s 0.35s 0.02s w
up: 系统运行时间
1 user :当前一个用户登录
load average:cpu 的负载情况。 第一个是1分钟, 第二个是5分钟, 第三个15分钟
user :登录的用户
tty :登录方式 pts/0 表示远程登录
FROM : 远程登录地址
LOGIN@ :登录时间
IDLE :用户空闲时间,从用户上一次任务结束开始
JCPU :表示正在某段时间内,所有与该终端相关的进程任务所耗费的CPU时间
PCPU :指WHAT 区域的任务执行后耗费的CPU时间
WHAT :表示当前执行的任务
who 命令
[root@localhost ~]# who root pts/0 2021-06-17 09:22 (192.168.23.1)
users命令
[root@localhost ~]# users
root
访问权限:读取,写入,执行
读取r:允许查看文件内容,显示目录列表
写入w:允许修改文件内容,允许在目录中新建或删除文件和子目录
可执行x:允许运行程序,切换目录
归属(所有权):属主和属组
属主:拥有该文件或目录的用户账号
属组:拥有该文件或目录的组账号
[root@localhost opt]# ls -l abc.txt -rw-r--r--. 1 root root 0 6月 17 11:19 abc.txt
权限项
|
读
|
写
|
执行
|
读
|
写
|
执行
|
读
|
写
|
执行
|
字符表示
|
r
|
w
|
x
|
r
|
w
|
x
|
r
|
w
|
x
|
数字表示
|
4
|
2
|
1
|
4
|
2
|
1
|
4
|
2
|
1
|
权限分配
|
文件所有者
|
文件所属组
|
其他用户
|
方法一,字符表示
chmod [ugoa] [+-=] [rwx] 文件或目录
#u,g,o,a 分别表示 属主,属组,其他用户 ,所有用户 。如果都不写,默认使用a
#+ , - ,= 分别表示 添加,去除,设置权限
# r , w , x 分别表示 读,写,执行
[root@localhost opt]# ll abc.txt -rw-r--r--. 1 root root 0 6月 17 12:25 abc.txt [root@localhost opt]# chmod +x abc.txt #所有用户添加执行权限 [root@localhost opt]# ll abc.txt -rwxr-xr-x. 1 root root 0 6月 17 12:25 abc.txt [root@localhost opt]# chmod g+w abc.txt #属组添加写入权限 [root@localhost opt]# ll abc.txt -rwxrwxr-x. 1 root root 0 6月 17 12:25 abc.txt [root@localhost opt]# chmod u-w abc.txt #属主去除写入权限 [root@localhost opt]# ll abc.txt -r-xrwxr-x. 1 root root 0 6月 17 12:25 abc.txt [root@localhost opt]# chmod o=r abc.txt #其他用户权限设置为 可读 [root@localhost opt]# ll abc.txt -r-xrwxr--. 1 root root 0 6月 17 12:25 abc.txt
chmod nnn 文件或目录 (数字为 7654321,0表示没有权限)
[root@localhost opt]# ll abc.txt -rw-r--r--. 1 root root 0 6月 17 18:28 abc.txt [root@localhost opt]# chmod 777 abc.txt #将所有人的权限都设置为可读可写可执行 [root@localhost opt]# ll abc.txt -rwxrwxrwx. 1 root root 0 6月 17 18:28 abc.txt [root@localhost opt]# chmod 000 abc.txt [root@localhost opt]# ll abc.txt #所有人都没有任何权限 ----------. 1 root root 0 6月 17 18:28 abc.txt
常用选项: -R 递归修改指定目录下所有子选项的权限
[root@localhost opt]# mkdir -p aa/bb/cc/ [root@localhost opt]# touch aa/bb/cc/abc.txt [root@localhost opt]# chmod -R 777 aa #递归修改目录aa 及所有子目录和文件的权限 [root@localhost opt]# ls -lR aa aa: 总用量 0 drwxrwxrwx. 3 root root 16 6月 17 18:35 bb aa/bb: 总用量 0 drwxrwxrwx. 2 root root 21 6月 17 18:35 cc aa/bb/cc: 总用量 0 -rwxrwxrwx. 1 root root 0 6月 17 18:35 abc.txt
设置特殊权限



chown 属主 文件或目录
chown :属组 文件或目录
chown 属主:属组 文件或目录 #也可以用点” .“ 替换 冒号”:“
常用选项:
[root@localhost opt]# ll abc.txt -rw-r--r--. 1 root root 0 6月 17 18:40 abc.txt [root@localhost opt]# chown test abc.txt #将属主改为test用户 [root@localhost opt]# ll abc.txt -rw-r--r--. 1 test root 0 6月 17 18:40 abc.txt [root@localhost opt]# chown :test abc.txt #将属组改为test 组 [root@localhost opt]# ll abc.txt -rw-r--r--. 1 test test 0 6月 17 18:40 abc.txt [root@localhost opt]# chown root:root abc.txt #将属主和属组改为root用户root组 [root@localhost opt]# ll abc.txt -rw-r--r--. 1 root root 0 6月 17 18:40 abc.tx [root@localhost opt]# ls -lR aa aa: 总用量 0 drwxr-xr-x. 3 root root 16 6月 17 18:43 bb aa/bb: 总用量 0 drwxr-xr-x. 2 root root 6 6月 17 18:43 cc aa/bb/cc: 总用量 0 [root@localhost opt]# chown -R test:test aa #递归修改aa目录及所有子目录文件的属主和属组为test用户test组 [root@localhost opt]# ls -lR aa aa: 总用量 0 drwxr-xr-x. 3 test test 16 6月 17 18:43 bb aa/bb: 总用量 0 drwxr-xr-x. 2 test test 6 6月 17 18:43 cc aa/bb/cc: 总用量 0
umask 作用:
控制新建文件或目录的权限
默认权限去除umask 的权限为新建的文件或者目录的权限
文件的默认权限最大是666,即rw-rw-rw。也就是说任何用户都没有执行(x)的权限
目录的最大权限是777,即rwx-rwx-rwx
umask 查看:
[root@localhost opt]# umask 0022 #默认权限是022,第一个0是特殊权限(SetUID、SetGID、Sticky BIT)
umask 设置
[root@localhost opt]# umask 0444 #设置umask 值为 0444 [root@localhost opt]# touch 123.txt [root@localhost opt]# mkdir abc [root@localhost opt]# ls -l 123.txt --w--w--w-. 1 root root 0 6月 17 18:52 123.txt #文件最大权限666 减去umask值,得222,即w-w-w [root@localhost opt]# ls -ld abc d-wx-wx-wx. 2 root root 6 6月 17 18:52 abc #目录最大权限777 减去umask 值得到333,即wx-wx-wx
umask 设置时,可能因为最后得到的结果不与想象一样。因为文件最大是666,它是由读写(rw)组成的,没有执行(x)。所以,如果最后得到结果是111,即 x-x-x,那么会发生变化
[root@localhost opt]# umask 555 [root@localhost opt]# touch abc.txt [root@localhost opt]# ll abc.txt --w--w--w-. 1 root root 0 6月 17 18:56 abc.txt #虽然结果是111,但是,最终权限是222
4.5.3 设置acl 策略
getfacl 文档名
##查看文档的acl 策略
setfacl [-R] -x u:用户名:文档
setfacl [-R] -x g:组名:文档
##删除指定用户/组 的acl 策略
setfacl [-R] -b 文档
##删除所有的acl 策略
[root@localhost develop]# touch abc.txt [root@localhost develop]# ll abc.txt -rw-r--r--. 1 root root 0 6月 18 10:28 abc.txt [root@localhost develop]# setfacl -m u:zhangsan:rwx abc.txt #为文件abc.txt设置zhangsan用户的acl 策略为可读可写可执行(rwx) [root@localhost develop]# getfacl abc.txt #查看文件abc.txt 的acl 策略 # file: abc.txt # owner: root # group: root user::rw- user:zhangsan:rwx group::r-- mask::rwx other::r--
[root@localhost develop]# setfacl -m u:zhangsan:rwx abc.txt #为abc.txt 文件设置zhangsan组 acl策略为 可读可写可执行(rwx)
[root@localhost develop]# getfacl abc.txt
# file: abc.txt
# owner: root
# group: root
user::rw-
user:zhangsan:rwx
group::r--
group:zhangsan:rwx
mask::rwx
other::r--
[root@localhost develop]# setfacl -x u:zhangsan abc.txt #删除abc.txt 文件的 zhangsan用户的acl 策略
[root@localhost develop]# getfacl abc.txt
# file: abc.txt
# owner: root
# group: root
user::rw-
group::r--
group:zhangsan:rwx
mask::rwx
other::r--
[root@localhost develop]# setfacl -b abc.txt #删除abc.txt 用户的所有acl 策略
[root@localhost develop]# getfacl abc.txt
# file: abc.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现