用户和文件权限管理
1,用户
管理员用户:
Root用户,也称根用户、超级用户、超级管理员
可对根目录执行读写和执行操作
具有系统中的最高、所有权限
普通用户:
权限有限的用户
Root用户拥有系统的所有权限,等同于操作系统的权限,足以把整个系统的大部分文件删掉,导致系统完全毁坏,不能再次使用。所以,用root进行不当的操作是相当危险的,轻微的可以死机,严重的甚至不能开机。但是有时候也有一些需要root权限的应用,譬如广告阻挡。除非确实需要,一般情况下都不推荐使用root。最好单独建立一个普通的用户,作为日常之用。
Linux系统是一个多用户、多任务的操作系统,每个用户之间都是互相隔离的,每个用户是通过User Id (UID)来唯一标识的,相当于人类社会的身份证号码。
Linux中可以将一个或多个用户加入用户组中,组就是包含0个或多个用户的集合,用户组是通过Group
ID(GID) 来唯一标识的。
用户(组)分类:
用户类型 | 用户名 | 用户ID (uid) | 作用 |
---|---|---|---|
超级管理员**(组)** | root(可自定义) | 0 | 超级管理员 |
系统用户**(组)** | 自定义 | 1-499(CentOS6及以前), 1-999(CentOS7及以后) |
给后台程序使用,像nginx,mysql等 |
登录用户**(组)** | 自定义 | 500+(CentOS6及以前), 1000+(CentOS7及以后) |
给用户进行交互式登录 |
命令提示符#、$
# 管理员
$ 普通用户
范例:显示系统中现有用户的相关信息
[root@Rocky8 ~]# lslogins
UID USER PROC PWD-LOCK PWD-DENY LAST-LOGIN GECOS
0 root 153 0 0 09:57 root
1 bin 0 0 0 bin
2 daemon 0 0 0 daemon
3 adm 0 0 0 adm
4 lp 0 0 0 lp
5 sync 0 0 0 sync
6 shutdown 0 0 0 Feb02/01:08 shutdown
7 halt 0 0 0 halt
8 mail 0 0 0 mail
11 operator 0 0 0 operator
12 games 0 0 0 games
14 ftp 0 0 0 FTP User
59 tss 0 1 0 Account used for TPM access
72 tcpdump 0 1 0
74 sshd 0 1 0 Privilege-separated SSH
81 dbus 1 1 0 System message bus
89 postfix 0 1 0
193 systemd-resolve 0 1 0 systemd Resolver
991 setroubleshoot 0 1 0
992 unbound 0 1 0 Unbound DNS resolver
993 chrony 0 1 0
994 cockpit-wsinstance 0 1 0 User for cockpit-ws instances
995 cockpit-ws 0 1 0 User for cockpit web service
996 sssd 0 1 0 User for sssd
997 libstoragemgmt 1 1 0 daemon account for libstoragemgmt
998 polkitd 1 1 0 User for polkitd
999 systemd-coredump 0 1 0 systemd Core Dumper
1000 jett 0 0 0
65534 nobody 0 0 0 Kernel Overflow User
范例:
[root@Rocky8 ~]# who #查看当前登录用户信息
root pts/0 2023-02-02 09:57 (10.0.0.1)
[root@Rocky8 ~]# whoami #打印当前登录用户,相当于执行”id -un”指令
root
[root@Rocky8 ~]# id #显示当前用户与用户组信息
uid=0(root) gid=0(root) groups=0(root)
[root@Rocky8 ~]# w #显示目前登入系统的用户信息
10:48:38 up 54 min, 1 user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 09:57 1.00s 0.04s 0.00s w
Linux用户和组的关系
用户和用户组的对应关系是:一对一、多对一、一对多或多对多
1.一对一:一个用户可以存在一个组中,是组中的唯一成员;
2.一对多:一个用户可以存在多个用户组中,此用户具有这多个组的共同权限;
3.多对一:多个用户可以存在一个组中,这些用户具有和组相同的权限;
4.多对多:多个用户可以存在多个组中,也就是以上 3 种关系的扩展。
一个用户至少有一个组,也可以有多个组;
一个组至少有0个用户,也可以有多个用户;
用户的主要组(primary group):又称私有组,一个用户必须属于且只有一个主组,创建用户时,默认会创建与其同名的组作为主组;
用户的附加组(supplementary group):又称辅助组,一个用户可以属于0个或多个附加组;
1.1 用户管理
1.1.1 用户管理主要配置文件
/etc/passwd:用户及其属性信息
/etc/shadow:用户密码及其相关属性
[root@Rocky8 ~]# man 5 passwd 查看帮助文档
[root@Rocky8 ~]# man 5 shadow 查看帮助文档
#/etc/passwd文件的每一行代表一个用户的信息,用冒号分隔的每一个字段分别代表不同的含义。
第一个字段:用户名
第二个字段:密码,这里的 x 仅仅是一个标识,真正的密码加密保存在 /etc/shadow 中
第三个字段:UID
第四个字段:GID
第五个字段:用户描述信息,可不填
第六个字段:用户家目录位置
第七个字段:默认shell,用 chsh 命令修改
[root@Rocky8 ~]# cat /etc/passwd |head -3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
#/etc/shadow文件同样是一行一个用户的信息,每个字段有不同含义
第一个字段:用户名
第二个字段:密码。有密码的用户在这里都是一串加密过的字符。这里我填了两个叹号,表示没有密码。
第三个字段:从1970/01/01到最近一次密码修改经过的时间,以天为单位。
第四个字段:密码过多久可以被修改,0表示随时可改。
第五个字段:密码的有效期
第六个字段:密码要过期前多少天提醒用户,7就是提前一周提醒。
第七个字段:密码过期后多少天之内还能登录,但是要登录必须改密码。
第八个字段:密码的最长使用期限
第九个字段:系统保留字段
所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的,新建用户还没设密码时为!!,禁用账号,可以直接在密码字段前加 !
[root@Rocky8 ~]# cat /etc/shadow |head -3
root:$6$cPKVQe4MwVWb9vCN$Rrx2WSze5G86tEOzWOCcY6TeptTN0aHNceSqIpWj.h4sF/df3CdYM8xBHjERxt19pvSUtJWyDPckgbzxdMyPe1::0:99999:7:::
bin:*:18700:0:99999:7:::
daemon:*:18700:0:99999:7:::
1.1.2 用户管理命令
useradd命令 – 创建并设置用户信息
newusers命令 – 更新和批量创建新用户
userdel命令 – 删除用户账户
passwd命令 – 设置和修改用户的密码值
chpasswd命令 – 批量更新用户密码
chage命令 – 修改帐号和密码的有效期限
usermod命令 – 修改用户账号信息
su命令 – 切换用户身份
who命令 – 查看当前登录用户信息
groups - 打印用户所在的组
getent命令 – 查看系统数据库中的记录信息
1.1.2.1 用户创建useradd、newusers
useradd命令来自于英文词组“User add”的全拼,其功能是用于创建并设置用户信息。
#语法:
useradd [options] LOGIN
useradd -D
useradd -D [options]
#常见选项
-u|--uid UID #指定UID
-g|--gid GID #指定用户组,-g groupname|--gid GID
-c|--comment COMMENT #新账户的 GECOS 字段
-d|--home-dir HOME_DIR #指定家目录,可以是不存在的,指定家目录,并不代表创建
家目录
-s|--shell SHELL #指定 shell,可用shell在/etc/shells 中可以查看,指定用户使用/sbin/nologin,无论是本地还是远程都不能登录系统,也无法实现系统管理,使用/sbin/nologin的shell的用户无法切换,ubnutn中使用/bin/false的shell的用户同样无法切换
-r|--system #创建系统用户,CentOS 6之前 ID<500,CentOS7 以后
ID<1000,不会创建登录用户相关信息
-m|--create-home #创建家目录,一般用于登录用户
-M|--no-create-home #不创建家目录,一般用于不用登录的用户
-p|--password PASSWORD #设置密码,这里的密码是以明文的形式存在
于/etc/shadow 文件中
-o|--non-unique #允许使用重复的 UID 创建用户
-G|--groups GROUP1[,GROUP2,...] #为用户指明附加组,组须事先存在
-N|--no-user-group #不创建同名的组,使用users组做主组
-D|--defaults #显示或更改默认的 useradd 配置,默认配置文件是
/etc/default/useradd
-e|--expiredate EXPIRE_DATE #指定账户的过期日期 YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过
期立即禁用,-1表示不使用此功能
-k|--skel SKEL_DIR #指定家目录模板,创建家目录,会生成一些默认文件,如果指定,就从该目录复制
文件,默认是/etc/skel/,要配合-m
-K|--key KEY=VALUE #不使用 /etc/login.defs 中的默认值,自己指定,比如
-K UID_MIN=100
-l|--no-log-init #不将用户添加到最近登录和登录失败记录,前面讲到的3a认证审计,就在此处
lastlog|lastb|cat /var/log/secure
范例:默认创建指定的用户
[root@Rocky8 ~]# useradd user1 #默认创建用户user1
[root@Rocky8 ~]# lslogins |grep user1 #查看用户user1信息
1001 user1 0 1 0
[root@Rocky8 ~]# getent passwd user1 #查看本地的用户文件(/etc/passwd)中包含的指定用户user1信息
user1:x:1001:1001::/home/user1:/bin/bash
[root@Rocky8 ~]# getent shadow user1 #查看本地的用户密码文件(/etc/shadow)中包含的指定用户user1信息
user1:!!:19390:0:99999:7:::
[root@Rocky8 ~]# getent group user1 #查看本地的用户组文件(/etc/group)中包含的指定用户user1信息
user1:x:1001:
[root@Rocky8 ~]# getent gshadow user1 #查看本地的用户组密码文件(/etc/gshadow)中包含的指定用户user1信息
user1:!::
[root@Rocky8 ~]# ls -a /home/user1/ #用户user1默认家目录,来源于家目录模块文件/etc/skel。
. .. .bash_logout .bash_profile .bashrc
[root@Rocky8 ~]# ll /var/spool/mail/user1
-rw-rw---- 1 user1 mail 0 Feb 2 11:42 /var/spool/mail/user1
[root@Rocky8 ~]# ls -a /etc/skel #家目录模板,修改此目录内容后,新创建的用户家目录中的内容会发生改变
. .. .bash_logout .bash_profile .bashrc
[root@Rocky8 ~]# useradd -D #显示或更改默认的 useradd 配置,默认配置文件是/etc/default/useradd
GROUP=100 #useradd不指定组,且/etc/login.defs中的USERGROUPS_ENAB为no或useradd -N时,group 为100
HOME=/home #此项表示将新建用户的主目录放在/home目录下
INACTIVE=-1 #此项表示是否启用帐号过期禁用,-1表示不启用,对应/etc/shadow文件第7列
EXPIRE= #此项表示帐号过期日期,不设置表示不启用,对应/etc/shadow文件第8列
SHELL=/bin/bash #此项指定了新建用户的默认shell类型
SKEL=/etc/skel #此项用来指定用户主目录默认文件的来源,也就是说新建用户主目录下的文件都是从这个目录下复制而来的
CREATE_MAIL_SPOOL=yes
[root@Rocky8 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
/etc/default/useradd文件定义了新建用户的一些默认属性,比如用户的主目录、使用的shell等等,通过更改此文件,可以改变创建新用户的默认属性值
#/etc/login.defs文件用来定义创建一个用户时的默认设置,比如指定用户的UID和GID的范围,用户的过期时间、是否需要创建用户主目录等等。
[root@Rocky8 ~]# cat /etc/login.defs
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#
# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail #当创建用户时,同时在目录/var/spool/mail中创建一个用户mail文件
#MAIL_FILE .mail
# Default initial "umask" value used by login(1) on non-PAM enabled systems.
# Default "umask" value for pam_umask(8) on PAM enabled systems.
# UMASK is also used by useradd(8) and newusers(8) to set the mode for new
# home directories if HOME_MODE is not set.
# 022 is the default value, but 027, or even 077, could be considered
# for increased privacy. There is no One True Answer here: each sysadmin
# must make up their mind.
UMASK 022
# HOME_MODE is used by useradd(8) and newusers(8) to set the mode for new
# home directories.
# If HOME_MODE is not set, the value of UMASK is used to create the mode.
HOME_MODE 0700
# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999 #指定密码保持有效的最大天数
PASS_MIN_DAYS 0 #表示自从上次密码修改以来多少天后用户才被允许修改口令
PASS_MIN_LEN 5 #指定密码的最小长度
PASS_WARN_AGE 7 #表示在口令到期前多少天系统开始通知用户口令即将到期
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 1000 #添加用户时,用户的UID 从1000开始
UID_MAX 60000 #指定最大UID为60000
# System accounts
SYS_UID_MIN 201
SYS_UID_MAX 999
#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN 1000 #添加组时,组的GID从1000开始
GID_MAX 60000 #指定最大GID为60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local
#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes #此项是指是否创建用户主目录,yes为创建,no为不创建。
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes #会用和用户名相同的名字创建用户组
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 #用sha512加密算法
#综上:新建用户的相关文件
/etc/default/useradd
/etc/skel/*
/etc/login.defs
范例:使用newusers命令批量创建用户
#使用命令之前需要创建包含新用户的文件,假如是/root/newuserfile,文件内容如下:
[root@Rocky8 ~]# vim /root/newuserfile
[root@Rocky8 ~]# cat /root/newuserfile
linuxcool0:x:520:520::/home/zhangsan0:/bin/bash
linuxcool1:x:521:521::/home/zhangsan1:/bin/bash
linuxcool2:x:521:521::/home/zhangsan2:/bin/bash
#使用此文件批量创建用户
[root@Rocky8 ~]# newusers /root/newuserfile
[root@Rocky8 ~]# id linuxcool0
uid=520(linuxcool0) gid=520(linuxcool0) groups=520(linuxcool0)
[root@Rocky8 ~]# id linuxcool1
uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)
[root@Rocky8 ~]# id linuxcool2
uid=521(linuxcool2) gid=521(linuxcool1) groups=521(linuxcool1)
范例:
#创建指定的用户信息,但不创建家目录,亦不让登录系统
[root@Rocky8 ~]# useradd -M -s /sbin/nologin user2
[root@Rocky8 ~]# id user2
uid=1002(user2) gid=1002(user2) groups=1002(user2)
#创建指定的用户信息,并自定义UID值
[root@Rocky8 ~]# useradd -u 6688 user3
[root@Rocky8 ~]# id user3
uid=6688(user3) gid=6688(user3) groups=6688(user3)
#创建用户前先建组,可以确保组ID是己知的
[root@Rocky8 ~]# groupadd -g 336 -r mysql
[root@Rocky8 ~]# getent group mysql
mysql:x:336:
[root@Rocky8 ~]# getent gshadow mysql
mysql:!::
#创建指定的用户信息,并追加指定组为该账户的扩展组
[root@Rocky8 ~]# useradd -G mysql user4
[root@Rocky8 ~]# id user4
uid=6689(user4) gid=6689(user4) groups=6689(user4),336(mysql)
#创建指定的用户信息,并指定过期时间
[root@Rocky8 ~]# useradd -e "2025/05/05" user5
[root@Rocky8 ~]# id user5
uid=6690(user5) gid=6690(user5) groups=6690(user5)
[root@Rocky8 ~]# getent passwd user5
user5:x:6690:6690::/home/user5:/bin/bash
[root@Rocky8 ~]# getent shadow user5
user5:!!:19390:0:99999:7::20213:
#创建多项定义的用户
[root@Rocky8 ~]# useradd -u 336 -g mysql -s /sbin/nologin -d /data/mysql -M -r mysql
[root@Rocky8 ~]# getent shadow mysql
mysql:!!:19390::::::
[root@Rocky8 ~]# getent passwd mysql
mysql:x:336:336::/data/mysql:/sbin/nologin
[root@Rocky8 ~]# getent group mysql
mysql:x:336:user4
[root@Rocky8 ~]# getent gshadow mysql
mysql:!::user4
1.1.2.2 用户属性修改usermod
usermod命令来自于英文词组“user modify”的缩写,其功能是用于修改用户帐户的属性。
语法:
usermod [options] LOGIN
#常见选项
-c|--comment COMMENT #修改注释
-d|--home HOME_DIR #修改家目录
-e|--expiredate EXPIRE_DATE #修改过期的日期,YYYY-MM-DD 格式
-f|--inactive INACTIVE #密码过期之后,账户被彻底禁用之前的天数,0 表示密码过期立即禁用,-1表示不使用此功能
-g|--gid GROUP #修改组
-G|--groups GROUPS #groupName|GID... 新附加组,原来的附加组将会被覆盖;若保留原有,则要同时使用-a选项
-a|--append GROUP #将用户追加至上边 -G 中提到的附加组中,并不从其它组中删除此用户
-l|--lo