Linux用户和用户组
最近做到了一些用户管理相关命令,所以写个文章记录一下。
1. 用户和用户组的概念
在 Linux
系统中,用户和用户组是管理和控制系统资源访问权限的重要概念。了解用户和用户组的概念以及它们在系统中的作用,对于有效管理和保护系统资源至关重要。下面将西安介绍 Linux
用户和用户组的基本概念,而后再介绍相关的命令。
A. 用户
在 Linux
系统中,用户(User
)是用于标识和管理系统中的个体身份的概念。每个用户都有一个唯一的用户名和用户 ID(UID),用于识别自己并访问系统资源。
一般来说,一个用户会有以下的资源:
- 用户名(Username)
- 用户 ID(UID)
- 家目录(Home Directory)
- 登录和访问权限
- 用户组(User Group)
1) 用户名(Username)
用户名是用户在系统中的标识符,用于登录系统和访问资源。用户名通常由字母、数字和特殊字符组成,不区分大小写。
一般来说,用户名的设置是没有具体得要求的,不重名就行。不过建议用户名应具有描述性,易于识别和记忆。
2) 用户 ID(UID)
用户名是字符串形式的用户标识符,主要是给人看的。对于计算机来说,整数更方便操作,因此Linux系统内中是实际上是通过整数来区别不同的用户的,这个数字称为UID
。
- 每个用户都被分配一个
UID
,用于标识其身份和权限。 - UID 是一个系统唯一的数字标识符,用于在系统级别识别用户。
在 Linux 系统中,UID 就像我们的身份证号码一样具有唯一性,因此可通过用户的 UID 值来判断用户身份:
- ROOT(UID 0):的UID为0
- 系统用户(UID 1~999):Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会由独立的系统用户负责运行,进而有效控制被破坏范围。例如:
_postfix
、_timezone
、…… - 普通用户(UID > 1000):是由管理员创建的用于日常工作的用户
3) 家目录(Home Directory)
每个用户都有一个家目录,用于存储其个人文件、配置和数据。
家目录通常以用户的用户名命名,并位于 /home
目录下。例如,用户 “john” 的家目录路径为 /home/john
。
用户可以在家目录中自由创建和组织文件和子目录。用户可以在家目录中存储个人文件、配置文件、日志文件等。
4) 登录和访问权限
用户可以通过登录系统来访问其账户和系统资源。每个用户都有自己的登录名和密码,用于验证身份。用户登录后,可以根据其权限执行各种操作,如读写文件、运行程序等。
Linux 系统提供多种登录方式,包括文本界面登录(如终端或控制台)、图形界面登录(如图形登录管理器)和远程登录(如 SSH)。用户可以选择适合自己的登录方式,并根据需要进行切换。
访问权限是在 Linux 系统中控制用户对文件和目录的访问级别的机制。每个文件和目录都有一组权限设置,分为所有者权限、用户组权限和其他用户权限。权限包括读取(r)、写入(w)和执行(x)三种操作。用户可以根据需要设置文件和目录的权限,以实现对资源的安全控制。
B. 用户组
用户组的出现是为了方便管理和控制用户的权限和访问级别。上面我们介绍了用户的概念,但是如果是相同组织的用户,可能具有相同的权限。例如:
- 同一个课题组的学生,大家都可以使用Docker相关的程序启动含有Pytorch的镜像,都能访问训练数据文件
- 同一个项目组的开发者,大家都可以使用Apache程序启动一个静态网站,都能访问网页静态文件
- ……
因此在 Linux 中,用户组是一种将多个用户组织在一起的概念。用户组可以用来管理和控制用户的权限和访问级别。
1) 用户组的标识
与用户有UID类似,用户组也有标识
- 用户组在系统中使用组 ID(Group ID,GID)进行唯一标识。
- 每个用户组都有一个唯一的 GID。
2) 主要组和附加组
既然用户组是用来管理用户的,那么每个用户就会有自己所属的用户组。
具体来说,Linux的每个用户的用户组可以分成两类:
- 主要组:每个用户在 Linux 系统中都有一个主要组(Primary Group),它是在用户创建时指定的默认组。
- 附加组:用户可以属于多个附加组(Supplementary Groups),这些组提供了额外的权限和访问控制。
2. 用户配置文件:/etc/passwd
和/etc/shadow
Linux
中万物皆文件,系统的各种运行配置,包括用户信息都是以文件的形式存在的。用户管理相关的配置文件主要就是两个:
/etc/passwd
/etc/shadow
A. /etc/passwd
文件
/etc/passwd
文件中,每一行表示一个账户用户名、密码、UID等信息。
使用less
查看一下这个文件
cat /etc/passwd | less
对应输出为:
可以看到,每一行以:
作为分隔符,划分成了七个字段。
对应的每个字段的含义为:
- 第一个字段:帐号名称,用来提供给对数字不太敏感的人类使用来登陆系统的
- 第二个字段:用户密码,早期 Unix 系统的密码就是加密后放在这字段上,但是因为这个文件的特性是所有的程序都能够读取,这样一来很容易造成密码数据被窃取, 因此后来就将这个字段的密码数据给他改放到
/etc/shadow
中了。所以这里就只有一个x
,mac这里就是一个*
- 第三个字段:UID,用户名对应的UID
- 第四个字段:GID, 用户所属的用户组ID,这个稍后会介绍
- 第五个字段:注释信息,这个字段基本上并没有什么重要用途,只是用来解释这个帐号的意义而已
- 第六个字段:主文件夹(登录文件夹),这是使用者的主文件夹。以
root
为例,root
的主文件夹在/root
,所以当root
登陆之后,就会立刻跑到/root
目录里。默认的使用者主文件夹在/home/yourIDname
,如果想要登录到别的目录,那么修改这个字段就好了。 - 第七个字段:用户登录shell,用户登录后默认使用的shell。
- 一般可以设置成
bash
、zsh
这种真实可以用的shell
- 如果不想用户登录的话,可以设置成
nologin
- 一般可以设置成
B. /etc/shadow
文件
我们知道很多程序的运行都与权限有关,因此各程序当然需要读取/etc/passwd
来了解不同帐号的权限。 因此/etc/passwd
的权限需设置为-rw-r--r--
这样的情况,即文件所有者可读写,其他人可读。
虽然早期的密码也有加密过,但正如上面所介绍,加密后的密码是放置到/etc/passwd
的第二个字段上!这样一来所有人都可以读取,因此就可以通过撞库的方式尝试去找出来用户的登录密码!
因此,后来就把密码移动到/etc/shadow
这个文件,并且将/etc/shadow
的权限设置成只有root
可以读取修改,其他人不能读取,并且额外设置一个shadow
用户组。通过这样就实现了其他人不能读取,授权的人(shadow
用户组内的人)可以读取,避免了撞库破解。此外,在/etc/shadow
中还加入很多的密码限制参数。
ls -al /etc/{passwd,shadow}
类似于/etc/passwd
,/etc/shadow
也是每一行记录一个账号。行内以:
作为分隔符。
注意,这个文件需要使用
sudo
来查看
sudo cat /etc/shadow | less
每个字段的含义:
- 第一个字段:帐号名称。由于密码也需要与帐号对应,因此这个文件的第一栏就是帐号,必须要与
/etc/passwd
相同才行 - 第二个字段:加密后的密码。由于各种密码编码的技术不一样,因此不同的编码系统会造成这个字段的长度不相同
- 第三个字段:最近更动密码的日期。这个字段记录了“更动密码那一天”的日期。由于Linux中的元年是1970年,所以记录的就是从这天开始到改变密码那天中间的天数
- 第四个字段:密码不可被更动的天数。第四个字段表示的含义是用户更改密码后需要经过几天才可以再被变更。
- 如果是 0 的话,表示密码随时可以更动
- 如果设置为 20 天的话,那么当你设置了密码之后,20 天之内都无法改变这个密码
- 一般来说,这个字段基本用不到
- 第五个字段:密码需要重新变更的天数。即指定在最近一次更改密码后,会强制要求用户在多少天数后需要再次的变更密码才行。你必须要在这个天数内重新设置你的密码,否则这个帐号的密码将会“变为过期特性”
- 如果密码过期了,那么在用户下次登录的时候就会强制要求用户修改密码
- 这个字段在安全性要求较高的场景下使用的确实比较频繁
- 第六个字段:密码需要变更期限前的警告天数。即在第五个字段设置的期限快要到的时候,系统会依据这个字段的设置,发警告给这个帐号,提醒 他密码就要过期了,请尽快重新设置密码
- 第七个字段:密码过期后的帐号宽限时间。
- 账号过期和密码过期是两个概念:
- 密码过期了下次登录会要求用户修改密码,但是该帐号还是可以用来进行其他工作的,包括登陆系统取得 bash。
- 如果是账号过期那么直接没法登录
- 这个字段一般用不着
- 账号过期和密码过期是两个概念:
- 第八个字段:帐号失效日期。这个日期跟第三个字段一样,都是使用 1970 年以来的总日数设置。这个字段表示,这个帐号在此字段规定的日期之后,将无法再使用。
- 第九个字段:保留字段
注意,设置账号过期时间和密码的过期时间一般不通过修改/etc/shadow
文件实现,而是通过chage
命令实现的。
3. 用户组配置文件:/ect/group
和/ect/gshadow
类似于/etc/passwd
和/etc/shadow
,用户组对应的文件时/etc/group
和/etc/gshadow
。
A. /ect/group
/etc/group
文件就是在记录了GID
与群组名称的对应。
cat /etc/group | less
这个文件还是挺常用的,一般像docker、mysql这样的服务程序都会创建一个用户组。
这个文件每一行代表一个用户组,也是以冒号:
作为字段的分隔符号,共分为四个字段。每一字段的意义是:
- 用户组名: 和用户名一样,同样用来给人类使用的,需要与第三字段的 GID 对应
- 群组密码: 通常不需要设置,这个设置通常是给“用户组管理员”使用的,目前很少有这个机会设置用户组管理员。同样的,密码已经移到
/etc/gshadow
,因此这个字段只会 存在一个x
而已 GID
: 用户组的ID。/etc/passwd
第四个字段使用的 GID 对应的用户组名,就是由这里对应的- 用户组包含的用户: 我们知道一个用户组包含多个用户。因此那某个帐号想要加入此用户组时,将该帐号填入这个字段即可。
- 举例来说,如果我想要让
ayf
和lighthou
加入root
这个群组,那么在root
这第一行的最后面加上dmtsai
和lighthouse
,注意不要有空格
- 举例来说,如果我想要让
B. /etc/gshadow
一般用不着这个,设置用户组管理员用的。用到了再说。
5. 用户管理命令
A. useradd命令
useradd命令 用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd
文本文件中。
在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号。在Red Hat Linux中, adduser命令 则是useradd命令的符号连接,两者实际上是同一个指令。
语法
useradd(选项)(参数)
常用选项
一般常用的参数为:
-c, --comment <Comment>
:为用户添加注释,通常用于提供有关用户的描述信息。-d, --home <HomeDirectory>
:指定用户的主目录路径。-e, --expiredate <YYYY-MM-DD>
:设置用户账户的过期日期,格式为年-月-日。-g, --gid <Group>
:指定用户所属的初始群组。-G, --groups <Groups>
:指定用户所属的其他附加群组,多个群组之间用逗号分隔。-m, --create-home
:在指定的主目录路径下创建用户的主目录。-s, --shell <Shell>
:指定用户的默认登录shell。
全部选项
-b, --base-dir BASE_DIR # 如果未指定 -d HOME_DIR,则系统的默认基本目录。如果未指定此选项,useradd 将使用 /etc/default/useradd 中的 HOME 变量指定的基本目录,或默认使用 /home。
-c, --comment COMMENT # 加上备注文字。任何文本字符串。它通常是对登录名的简短描述,目前用作用户全名的字段。
-d, --home HOME_DIR # 将使用 HOME_DIR 作为用户登录目录的值来创建新用户。
-D, --defaults # 变更预设值。
-e, --expiredate EXPIRE_DATE # 用户帐户将被禁用的日期。 日期以 YYYY-MM-DD 格式指定。
-f, --inactive INACTIVE # 密码过期后到帐户被永久禁用的天数。
-g, --gid GROUP # 用户初始登录组的组名或编号。组名必须存在。组号必须引用已经存在的组。
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]] # 用户也是其成员的补充组列表。每个组用逗号隔开,中间没有空格。
-h, --help # 显示帮助信息并退出。
-k, --skel SKEL_DIR # 骨架目录,其中包含要在用户的主目录中复制的文件和目录,当主目录由 useradd 创建时。
-K, --key KEY=VALUE # 覆盖 /etc/login.defs 默认值(UID_MIN、UID_MAX、UMASK、PASS_MAX_DAYS 等)。
-l, --no-log-init # 不要将用户添加到 lastlog 和 faillog 数据库。
-m, --create-home # 如果用户的主目录不存在,则创建它。
-M # 不要创建用户的主目录,即使 /etc/login.defs (CREATE_HOME) 中的系统范围设置设置为 yes。
-N, --no-user-group # 不要创建与用户同名的组,而是将用户添加到由 -g 选项或 /etc/default/useradd 中的 GROUP 变量指定的组中。
-o, --non-unique # 允许创建具有重复(非唯一)UID 的用户帐户。 此选项仅在与 -o 选项结合使用时有效。
-p, --password PASSWORD # crypt(3) 返回的加密密码。 默认是禁用密码。
-r, --system # 创建一个系统帐户。
-s, --shell SHELL # 用户登录 shell 的名称。
-u, --uid UID # 用户 ID 的数值。
-U, --user-group # 创建一个与用户同名的组,并将用户添加到该组。
-Z, --selinux-user SEUSER # 用户登录的 SELinux 用户。 默认情况下将此字段留空,这会导致系统选择默认的 SELinux 用户。
# 更改默认值
# 当仅使用 -D 选项调用时,useradd 将显示当前默认值。 当使用 -D 和其他选项调用时,useradd 将更新指定选项的默认值。 有效的默认更改选项是
参数
- 用户名:要创建的用户名。
B. userdel命令
userdel命令 用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。
语法
userdel(选项)(参数)
选项
-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。
参数
- 用户名:要删除的用户名。
C. usermod命令
usermod命令 用于修改用户的基本信息。usermod 命令不允许你改变正在线上的使用者帐号名称。当 usermod 命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的 crontab 档。也需手动更改使用者的 at 工作档。采用 NIS server 须在server上更动相关的NIS设定。
语法
usermod(选项)(参数)
常用选项
一般常用的参数为:
-c, --comment <Comment>
:修改用户的注释信息。-d, --home <HomeDirectory>
:修改用户的登录的主目录路径。-G, --groups <Groups>
:修改用户所属的其他附加群组,多个群组之间用逗号分隔。-l, --login <NewLoginName>
:修改用户的登录名。-L, --lock
:锁定用户账户,禁止用户登录。-s, --shell <Shell>
:修改用户的默认登录shell。
全部选项
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录,只是修改/etc/passwd中用户的家目录配置信息,不会自动创建新的家目录,通常和-m一起使用;
-m<移动用户家目录>:移动用户家目录到新的位置,不能单独使用,一般与-d一起使用。
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s:修改用户登入后所使用的shell;
-u:修改用户ID;
-U:解除密码锁定。
参数
- 登录名:指定要修改信息的用户登录名。
D. chage命令
chage命令 是用来修改帐号和密码的有效期限。
语法
chage [选项] 用户名
选项
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-I:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
实例
可以编辑/etc/login.defs
来设定几个参数,以后设置口令默认就按照参数设定为准:
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
当然在/etc/default/useradd
可以找到如下2个参数进行设置:
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
通过修改配置文件,能对之后新建用户起作用,而目前系统已经存在的用户,则直接用chage来配置。
我的服务器root帐户密码策略信息如下:
chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
我可以通过如下命令修改我的密码过期时间:
chage -M 60 root
chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 : 5月 11, 2013
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :9
然后通过如下命令设置密码失效时间:
chage -I 5 root
chage -l root
最近一次密码修改时间 : 3月 12, 2013
密码过期时间 : 5月 11, 2013
密码失效时间 : 5月 16, 2013
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :60
在密码过期之前警告的天数 :9
从上述命令可以看到,在密码过期后5天,密码自动失效,这个用户将无法登陆系统了。