05 用户身份与文件权限

用户身份与能力

用户身份

注意

UID 是不能冲突的,而且管理员创建的普通用户的 UID 默认是从 1000 开始的(即使前面有闲置的号码)。

用户组

注意

  • 基本用户组就像是原生家庭,是在创建账号(出生)时就自动生成的。
  • 扩展用户组则像工作单位,为了完成工作,需要加入到各个不同的群体中,这是需要手动添加的。

用户能力

id

[linuxprobe@linuxprobe ~]$ id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),10(wheel)

useradd

[linuxprobe@linuxprobe ~]$ useradd linuxcool
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
[linuxprobe@linuxprobe ~]$ su - root
Password:
[root@linuxprobe ~]# useradd linuxcool
[root@linuxprobe ~]# id linuxcool
uid=1001(linuxcool) gid=1001(linuxcool) groups=1001(linuxcool)
[root@linuxprobe ~]#
[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxdown
[root@linuxprobe ~]# id linuxdown
uid=8888(linuxdown) gid=8888(linuxdown) groups=8888(linuxdown)
[root@linuxprobe ~]# ls /home/
linux  linuxcool  linuxprobe
[root@linuxprobe ~]#

groupadd

[root@linuxprobe ~]# groupadd ronny
[root@linuxprobe ~]#

usermod

[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),10(wheel)
[root@linuxprobe ~]#
[root@linuxprobe ~]# usermod -G root linuxprobe # 将用户 linuxprobe 加入到 root 用户组中
[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[root@linuxprobe ~]#
[root@linuxprobe ~]# usermod -u 8888 linuxprobe # 修改 linuxprobe 用户的 UID 号码值
[root@linuxprobe ~]# id linuxprobe
uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[root@linuxprobe ~]#
[root@linuxprobe ~]# usermod -s /sbin/nologin linuxprobe # 把用户的解释器终端由默认的 /bin/bash 修改为 /sbin/nologin
[root@linuxprobe ~]# su - linuxprobe
This account is currently not available.

passwd

[root@linuxprobe ~]# passwd # 修改 root 用户密码
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]# passwd linuxprobe # 修改 linuxprobe 用户密码
Changing password for user linuxprobe.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]#
[root@linuxprobe ~]# passwd -l linuxprobe # 锁定 linuxprobe 用户,禁止其登录
Locking password for user linuxprobe.
passwd: Success
[root@linuxprobe ~]# passwd -S linuxprobe # 显示用户的密码是否被锁定
linuxprobe LK 2023-06-11 0 99999 7 -1 (Password locked.)
[root@linuxprobe ~]#
[root@linuxprobe ~]# passwd -u linuxprobe # 解除 linuxprobe 锁定,允许用户登录
Unlocking password for user linuxprobe.
passwd: Success
[root@linuxprobe ~]# passwd -S linuxprobe
linuxprobe PS 2023-06-11 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@linuxprobe ~]#

userdel

参数 作用
-f 强制删除用户
-r 同时删除用户及用户家目录
[root@linuxprobe ~]# userdel linuxcool  # 删除 linuxcool 用户及用户家目录
[root@linuxprobe ~]# id linuxcool
id: ‘linuxcool’: no such user
[root@linuxprobe ~]# ls /home/ # 用户已被删除,但家目录数据会继续存放在 /home 目录中
linux  linuxcool  linuxprobe
[root@linuxprobe ~]# rm -rf /home/linuxcool
[root@linuxprobe ~]# userdel -rf linuxdown # 删除 linuxdown 用户及用户家目录
[root@linuxprobe ~]# ls /home/
linuxprobe
[root@linuxprobe ~]#

文件权限与归属

读写执行权限对于文件与目录可执行命令的区别

文件 目录
可读(r) cat ls
可写(w) vim touch
可执行(x) ./script cd

文件权限的字符与数字表示

权限项 可读 可写 可执行 可读 可写 可执行 可读 可写 可执行
字符表示 r w x r w x r w x
数字表示 4 2 1 4 2 1 4 2 1
权限分配 文件所有者 文件所属组 其他用户

文件权限的数字表示法

img

文件属性信息

img

常见的文件类型

Info

  • 普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及 Shell 脚本等,都属于普通文件。几乎在每个目录下都能看到普通文件(-)和目录文件(d)的身影。
  • 块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等,在 /dev/ 目录中最为常见。应该很少有人会对鼠标、键盘进行硬件级别的管理吧。

文件的特殊权限

SUID

[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1397 Jun 11 17:39 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd # 所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限
-rwsr-xr-x. 1 root root 33544 Dec 14  2019 /bin/passwd
[root@linuxprobe ~]#
Info

加粗显示的字体用来告诫用户一定要小心这个权限,因为一旦某个命令文件被设置了 SUID 权限,就意味着凡是执行该文件的人都可以临时获取到文件所有者所对应的更高权限。因此,千万不要将 SUID 权限设置到 vim、cat、rm 等命令上面!!!

SGID

[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxr-xr-x. 2 root root 6 Jun 11 17:56 testdir
[root@linuxprobe tmp]# chmod -R 777 testdir # 设置好目录的 777 权限, 确保普通用户可以向其中写入文件
[root@linuxprobe tmp]# chmod -R g+s testdir # 设置 SGID 特殊权限位
[root@linuxprobe tmp]# ls -ald testdir
drwxrwsrwx. 2 root root 6 Jun 11 17:56 testdir
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Jun 11 17:57 test
[linuxprobe@linuxprobe testdir]$ logout
[root@linuxprobe tmp]

chmod

[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1385 Jun  4 03:15 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg # 权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为 rwxrw----,其对应的数字法表示为 760
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 root root 1385 Jun  4 03:15 anaconda-ks.cfg

chown

[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 linuxprobe linuxprobe 1385 Jun  4 03:15 anaconda-ks.cfg
[root@linuxprobe ~]#

SBIT

[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# echo "Welcome to linuxprobe.com" > test
[root@linuxprobe tmp]# chmod 777 test # 赋予 test 文件最大的 777 权限
[root@linuxprobe tmp]# ls -al test
-rwxrwxrwx. 1 linuxprobe linuxprobe 26 Jun 11 18:08 test
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ rm -f /tmp/test # 由于 SBIT 特殊权限位的缘故,依然无法删除该文件
rm: cannot remove 'test': Operation not permitted

特殊权限的设置参数

SUID、SGID、SBIT 特殊权限的设置参数:

参数 作用
u+s 设置 SUID 权限
u-s 取消 SUID 权限
g+s 设置 SGID 权限
g-s 取消 SGID 权限
o+t 设置 SBIT 权限
o-t 取消 SBIT 权限
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R linux/
chmod: missing operand after ‘linux/’
Try 'chmod --help' for more information.
[root@linuxprobe ~]# chmod -R o+t linux/ # 设置 SBIT 权限
[root@linuxprobe ~]# ls -ald linux/
drwxr-xr-t. 2 root root 6 Jun 11 18:12 linux/
[root@linuxprobe ~]#

权限数字和字符表示法的转换

img

文件的隐藏属性

chattr

[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# rm linuxprobe # 文件正常可以删除
rm: remove regular file ‘linuxprobe’? y
[root@linuxprobe ~]#
[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# chattr +a linuxprobe  # 设置 `不允许删除与覆盖`(+a 参数)权限
[root@linuxprobe ~]# rm -f linuxprobe  # 设置隐藏权限后无法删除
rm: cannot remove 'linuxprobe': Operation not permitted
[root@linuxprobe ~]#

lsattr

[root@linuxprobe ~]# ls -al linuxprobe
-rw-r--r--. 1 root root 9 Jun 11 18:42 linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe  # 查看文件的隐藏权限
-----a-------------- linuxprobe
[root@linuxprobe ~]# chattr -a linuxprobe # 使用 chattr 去掉文件的隐藏权限
[root@linuxprobe ~]# lsattr linuxprobe
-------------------- linuxprobe
[root@linuxprobe ~]# rm -f linuxprobe # 文件正常可以删除
[root@linuxprobe ~]#

文件访问控制列表

setfacl

[root@linuxprobe ~]#
[root@linuxprobe ~]# logout
[linuxprobe@linuxprobe ~]$ cd /root/  # 普通用户无法进入 /root 目录
-bash: cd: /root/: Permission denied
[linuxprobe@linuxprobe ~]$
[linuxprobe@linuxprobe ~]$ su - root
Password:
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root # 为普通用户单独设置权限
[root@linuxprobe ~]#
[root@linuxprobe ~]# logout
[linuxprobe@linuxprobe ~]$ cd /root # 普通用户可以进入 /root 目录
[linuxprobe@linuxprobe root]$ ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates
Desktop          Downloads  Music                 Public    Videos
[linuxprobe@linuxprobe root]$ logout
[linuxprobe@linuxprobe ~]$ ls -ald /root # 文件权限的最后一个点(.)变成了加号(+),这就意味着该文件已经设置了 ACL
dr-xrwx---+ 15 root root 4096 Jun 11 18:45 /root

getfacl

[root@linuxprobe ~]# getfacl /root # 显示在root管理员家目录上设置的所有ACL信息
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---

[root@linuxprobe ~]# setfacl -m g:linuxprobe:rw /etc/fstab # 允许 linuxprobe 组用户都可以读写 /etc/fstab 文件
[root@linuxprobe ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:linuxprobe:rw-
mask::rw-
other::r--

[root@linuxprobe ~]# setfacl -x g:linuxprobe /etc/fstab # 清空 linuxprobe 组用户的所有 ACL 权限
[root@linuxprobe ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

[root@linuxprobe ~]#

备份恢复 ACL 权限

[root@linuxprobe ~]# cd /
[root@linuxprobe /]# getfacl -R home > backup.acl
[root@linuxprobe /]# ls -ald backup.acl
-rw-r--r--. 1 root root 19756 Jun 11 19:04 backup.acl
[root@linuxprobe /]# setfacl --restore backup.acl # 在备份时已经指定是对 /home 目录进行操作,所以不需要写对应的目录名称,它能够自动找到要恢复的对象
[root@linuxprobe /]#
注意

getfacl 在备份目录权限时不能使用绝对路径的形式,因此我们需要先切换到最上层根目录,然后再进行操作。

su 命令与 sudo 服务

su

sudo

visudo

[root@linuxprobe ~]# visudo
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ sudo -l # 列出当前 linuxprobe 用户可执行的命令
[sudo] password for linuxprobe:
Matching Defaults entries for linuxprobe on linuxprobe:
    !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, 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 linuxprobe may run the following commands on linuxprobe:
    (ALL) ALL
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
root:$6$PhbzTyjeKXr0Z5/z$ucA79tg5.Vwy9nOxz.Kxe9gqB.dE4Zy9R87OACLr0ETgoLX7kmbfgya1vFzrf5Gc6.sZ9a.rtGZp.Vl472YGl.:19519:0:99999:7:::
bin:*:18199:0:99999:7:::
daemon:*:18199:0:99999:7:::
adm:*:18199:0:99999:7:::

总结