Linux 用户管理

Linux 用户管理,第1张

Linux 用户管理 用户管理
su          切换用户
useradd     新建用户
userdel     删除用户
passwd      修改用户密码
usermod     修改用户属性
chage       修改用户属性

root 用户可以访问系统配置文件。

普通用户无法访问其他用户的家目录。

切换用户
su 用户名       # 账号切换到用户名身份,但shell环境仍为当前环境
su - 用户名     # 账号切换到用户名身份,shell环境也变更为该用户身份

su kevin
su - kevin

su              # 账号切换为root身份,shell环境还是变更前的用户身份
su -            # 账号切换为root身份,shell环境也切换为root身份

su命令和su -命令最大的本质区别就是:前者只是切换了 root 身份,但 Shell 环境仍然是普通用户的 Shell;而后者连用户和 Shell 环境一起切换成 root 身份了。

“-” 这里说的切换环境,不单单是指登录后切换到该用户的家目录;还指(更重要的)环境变量也会切换当该用户的环境变量。这才是真正的“环境切换”。

新建用户
useradd 用户名

useradd kevin # 新建的用户为 kevin 同时 用户组也为 kevin,家目录也为 /home/kevin

useradd -g 指定用户组 用户名
useradd -g testgroup kevin
# 新建用户 kevin 并同时将其初始组设置为 testgroup(将不会生成一个叫 kevin 的用户组)

新建用户,系统实际进行了如下 *** 作:

在/home/目录下新建了与用户名同名的家目录,并在家目录下安放了与用户相关的几个隐藏配置文件。如:

.bash_logout.bash_profile.bashrc

用户会被记录到 /etc/passwd 文件中

文件功能更详细请参考:http://c.biancheng.net/view/839.html

/etc/passwd 文件,是系统用户配置文件,存储了系统中所有用户的基本信息,并且所有用户都可以对此文件执行读 *** 作

kevin:x:1000:1000:centos7:/home/kevin:/bin/bash只要有包含 kevin 的这一行,就说明系统里有 kevin 这个用户 用户名密码UID(用户ID)GID(组ID)描述性信息主目录默认Shellkevinx10001000centos7/home/kevin/bin/bash

用户名、UID:用户名仅是为了方便用户记忆,Linux 系统是通过 UID 来识别用户身份,分配用户权限的。

密码: “x” 表示此用户设有密码,但不是真正的密码,真正的密码加密后保存在 /etc/shadow 文件中。

虽然 “x” 并不表示真正的密码,但也不能删除,如果删除了 “x”,那么系统会认为这个用户没有密码,从而导致只输入用户名而不用输入密码就可以登陆(只能在使用无密码登录,远程是不可以的),除非特殊情况(如破解用户密码),这当然是不可行的。【经测试,即将x删除后,可以在当前电脑其他用户切换为这个用户时不再使用密码(图形界面重启也能免密进入该用户),但远程ssh是需要这个用户本身有密码才行的,没了密码压根不允许登录】 UID 范围用户身份0超级用户。UID 为 0 就代表这个账号是管理员账号。在 Linux 中,如何把普通用户升级成管理员呢?只需把其他用户的 UID 修改为 0 就可以了,这一点和 Windows 是不同的。不过不建议建立多个管理员账号。1~499系统用户(伪用户)。也就是说,此范围的 UID 保留给系统使用。其中,1~99 用于系统自行创建的账号;100~499 分配给有系统账号需求的用户。

其实,除了 0 之外,其他的 UID 并无不同,这里只是默认 500 以下的数字给系统作为保留账户,只是一个公认的习惯而已。500~65535普通用户。通常这些 UID 已经足够用户使用了。但不够用也没关系,2.6.x 内核之后的 Linux 系统已经可以支持 232 个 UID 了。

描述性信息:这个字段并没有什么重要的用途,只是用来解释这个用户的意义而已。

/etc/passwd 记录的用户中的绝大多数是系统或服务正常运行所必需的用户,这种用户通常称为系统用户或伪用户。系统用户无法用来登录系统,但也不能删除,因为一旦删除,依赖这些用户运行的服务或程序就不能正常执行,会导致系统问题。

默认的shell:可以把这个字段理解为用户登录之后所拥有的权限。如果这里使用的是 bash(/bin/bash) 命令解释器,就代表这个用户拥有权限范围内的所有权限(即其所在用户组的权限,它都可以正常使用,之所以这么说,是因为可能其权限还会被进一步缩减,即便在这个组也是用不了这个组的所有权限)。

/sbin/nologin:用户禁止登录/usr/bin/passwd:用户可以登录,但登录后只能修改自己的密码。注意:这里不能随便写入和登录没有关系的命令(如 ls),系统不会识别这些命令,同时也就意味着这个用户不能登录。

别作死去把 root 或系统用户删除,Kevin实际测试过:另外建一个普通用户,把其uid改为0,该用户登录后实际上是使用root来登录的,于是尝试把root那行注释了,想着是否会直接用该用户代替root,结果重启后进不了系统,虚拟机被迫重新安装了centos7。
如果是基于安全原因禁用root,而用另外的账号名(比如说:kevin)来取代root的权限,更合适的方式是将 kevin 的 UID 改为 0,然后把 root 用户的 shell 改为 /sbin/nologin,这样 root 用户就会被禁用掉,但用 kevin 来登录的话,仍然会显示为 root。

用户还会记录到 /etc/shadow 文件中

更多详情参考:http://c.biancheng.net/view/840.html

/etc/shadow 文件,用于存储 Linux 系统中用户的密码信息,又称为“影子文件”。

由于/etc/passwd 文件允许所有用户读取,易导致密码泄露,因此 linux 系统将用户的密码信息从 /etc/passwd 文件中分离出来,并单独放到了 /etc/shadow 中。/etc/shadow 文件只有 root 用户拥有读权限,其他用户没有任何权限,这样就保证了用户密码的安全性。

kevin:$1$$WS/hPpd37txc0rKsvCMvl.:19006:0:99999:7::: 同样会有由 kevin 开头的一行信息。 用户名加密密码最后一次修改时间最小修改时间间隔密码有效期密码需要变更前的警告天数密码过期后的宽限天数账号失效时间保留字段kevin$$WS/hPpd37txc0rKsvCMvl.190060999997

用户名:同 /etc/passwd 文件的用户名有相同的含义。

加密密码:这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。

注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 “!”、"*" 或 “x” 使密码暂时失效。(经过 Kevin 实验,失效之后是登录不了系统,而非没有密码)

所有伪用户的密码都是 “!!” 或 “*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。

经过测试,即便两个用户的密码相同,在/etc/shadow 中的加密密码字符串都会显示为不同。

最后一次修改时间:Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 19006 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 19006 天修改的 root 用户密码。(可使用date -d "1970-01-01 19006 days"命令来查看该日期具体是哪一天)

kevin@localhost ~]$ date -d "1970-01-01 19006 days"
Fri Jan 14 00:00:00 PST 2022

最小修改时间间隔:该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。(此字段是为了针对某些人频繁更改账户密码而设计的。)

密码有效期:经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。

该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。

密码需要变更前的警告天数:与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。

该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。

密码过期后的宽限天数:也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。

比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。

账号失效时间:同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用

该字段通常被使用在具有收费服务的系统中。

保留字段:该字段目前还没有具体用途。

为用户分配一个用户id,系统通过用户id来区分用户。

如果把普通用户的 UID 设置为 0(root的 UID 就是0),那么系统就会把这个用户当作 root 用户来看待。

创建用户组(如果创建用户时没有指定组,则创建与用户同名的组)

分组目的是对用户可用资源进行限制。

注意:创建用户后,如果不给这个用户设置密码,那么其他普通用户是无法切换到这个用户上的,因为会询问密码,但不输入密码就回车又会说验证失败。同样,重启用图形界面去登录这个新用户也是需要密码,并且空密码回车会报验证失败,反正就是登录不了。【但root用户是可以不用密码就能切换到其他用户的,所有此时只有root用户能切换到该用户】

验证用户是否存在
id 用户名

id kevin
uid=1000(kevin) gid=1000(kevin) groups=1000(kevin)
指定密码/修改密码

新创建的用户需要指定密码才能登录

# root修改其他用户密码
passwd 用户名

passwd kevin

# 修改自己用户密码
passwd

忘记密码

参考: http://c.biancheng.net/view/840.html

普通用户:可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root 的身份使用 passwd 命令即可)。

root用户:则需要重新启动进入单用户模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码;也可以通过挂载根目录,修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root 无法密码即可登陆,建议登陆后使用 passwd 命令配置 root 密码。

删除用户
userdel 用户名

userdel kevin

userdel -r kevin    # -r 会删除 /home/ 目录下与用户名同名的家目录 

# 通常会使用 -r 选项,因为如果不使用 -r 选项,该用户的家目录会被保留下来。并且除了root没人可以访问这个家目录。但有个很严重的问题,就是如果之后新建的用户沿用了这个被删除用户(又保留了家目录)的uid,那么这个新用户无论是否会另外新建一个家目录,都将同时继承这个之前用户的家目录,可以访问里面的数据。(新用户与被删用户的名字是否相同并不是取决因素,uid相同才是取决因素)

# 一旦由于上面的因素,导致比如有一个遗留的家目录叫“test”,后面新建的用户“test”又没有沿用之前test用户的uid,导致没有继承这个家目录的话,userdel -r  就会出问题,因为既删不掉test用户目前使用的家目录(因为目录与用户不同名),又删不掉那个叫“test”的家目录(因为test用户没有这个目录的权限)。

# 另外,当这种删除用户又不删除家目录的奇怪 *** 作多了之后,难免会出现新建一个用户,对多个家目录的情况,这个时候,对这几个家目录中的任意一个家目录 *** 作,都同时对其他家目录进行 *** 作。比如test有两个家目录test与abc,则userdel -r test 会删除的是test家目录,保留abc,但abc内容也会被清空,就好像是一个家目录分了几个入口的感觉。显然这样是很混乱的。
修改用户账户信息
usermod 用户名称

# 仅修改家目录(原家目录会重命名并移动到新的目录下成为新的家目录)
usermod -d 新家目录 -m 用户名
usermod -d /home/abc kevin # 这里漏了-m 实测 *** 作无效
usermod -d /home/abc -m kevin
usermod -d /haha -m kevin # 也是成功的,新的家目录可以是在任意设定的位置,而不一定需要在home目录下。
# 这里改变的只是家目录,并不改变用户名,也不改变用户组

# 仅修改用户名
usermod -l 新用户名 旧用户名
usermod -l mark kevin   # 用户名从kevin改为mark
# 用户组不变,用户家目录不变


# 修改用户名及其家目录
usermod -l 新用户名 -d /home/新用户名 -m 以前的用户名
# -l 是小写字母L,上面的命令执行完之后会立即把就用户名改为新用户名,旧家目录改为新家目录(不另外建新目录,而是直接将旧家目录名称变更)
# 这里改变了用户名和家目录,单用户组是没有变更的。

# 修改用户组
usermod -g 新用户组 用户名
usermod -g testgroup kevin

# 为用户添加附加组(不影响初始组)
usermod -a -G 新添加的附加组(多个附加组用逗号隔开) 用户名
usermod -a -G testgroup1,testgroup2 kevin
# 此时,kevin同时属于testgroup1、testgroup2、kevin组。

# 为用户替换附加组(不影响初始组)
usermod -G 附加组(多个附加组用逗号隔开)
usermod -G testgroup3 kevin
# 原本kevin属于testgroup1,testgroup2,kevin 3个组,现在,kevin属于 testgroup3,kevin两个组。【即,若原本所在的附加组不在此组列表中,用户将被移出该附加组】。




# 锁定用户(已经登录无影响,未登录无法登录)
usermod -L kevin
# 解锁用户
usermod -U kevin

修改用户密码过期时间

设置用户密码修改的间隔时间、密码过期时间、用户账号过期时间。

chage [选项] 用户名

-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:列出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。

# 注意:有两种让账号在指定日期失效的方式:
# 1. -E 设置账户有效期
# 2. 不设置账户有效期,但设置密码有效期,并 -i  设置停滞时间,如果密码过期后限期内不修改,也会对账号禁用。

chage -M 99999 用户名   # 基本等于设置这个用户的密码永久有效了。

用户组管理
groupadd    新建用户组
groupmod    修改用户组
groupdel    删除用户组
新建用户组
groupadd 新用户组名
查看当前系统中的用户组信息

/etc/group

更多详情参考:http://c.biancheng.net/view/841.html

如:kevin:x:1000:

组名组密码组id(group id)组中的用户kevinx1000

实际的组密码保存在 /etc/gshadow中,/etc/passwd中只有group id ,可以在这里找到对应的组名。

组名

组名不能重复

组密码

和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。

用户组密码主要是用来指定组管理员的,由于系统中的账号可能会非常多,root 用户可能没有时间进行用户的组调整,这时可以给用户组指定组管理员,如果有用户需要加入或退出某用户组,可以由该组的组管理员替代 root 进行管理。但是这项功能目前很少使用,我们也很少设置组密码。如果需要赋予某用户调整某个用户组的权限,则可以使用 sudo 命令代替。

组id

就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。

这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。

组中的用户

此字段列出每个群组包含的所有用户。需要注意的是,如果该用户组是这个用户的初始组,则该用户不会写入这个字段,可以这么理解,该字段显示的用户都是这个用户组的附加用户。

每个用户都可以加入多个附加组,但是只能属于一个初始组。所以我们在实际工作中,如果需要把用户加入其他组,则需要以附加组的形式添加。例如,我们想让 kevin 也加入 root 这个群组,那么只需要在第一行的最后一个字段加入 kevin,即 root : x : 0 : kevin 就可以了。

/etc/gshadow

更多详情参考:http://c.biancheng.net/view/842.html

如:kevin:!::

组名组密码组管理员组中的附加用户kevin!

/etc/passwd 文件存储用户基本信息,同时考虑到账户的安全性,将用户的密码信息存放另一个文件 /etc/shadow 中。 /etc/gshadow 文件也是如此,组用户信息存储在 /etc/group 文件中,而将组用户的密码信息存储在 /etc/gshadow 文件中。

组名

同 /etc/group 文件中的组名相对应。

组密码

对于大多数用户来说,通常不设置组密码,因此该字段常为空,但有时为 “!”,指的是该群组没有组密码,也不设有群组管理员。

组管理员

从系统管理员的角度来说,该文件最大的功能就是创建群组管理员。那么,什么是群组管理员呢?

考虑到 Linux 系统中账号太多,而超级管理员 root 可能比较忙碌,因此当有用户想要加入某群组时,root 或许不能及时作出回应。这种情况下,如果有群组管理员,那么他就能将用户加入自己管理的群组中,也就免去麻烦 root 了。

不过,由于目前有 sudo 之类的工具,因此群组管理员的这个功能已经很少使用了。

组中的附加用户

该字段显示这个用户组中有哪些附加用户,和 /etc/group 文件中附加组显示内容相同。

修改用户组
groupmod 用户组名

# 修改组名
groupmod -n 新组名 旧组名
groupmod -n newgroup oldgroup # 将 oldgroup 重命名为 newgroup

# 修改组id
groupmod -g 新组id 用户组名
groupmod -g 1004 testgroup


用户切换
su      # 切换用户
sudo    # 以自己的身份执行其他用户身份的指令

之所以有这两种命令的区分,是因为su的话,比如说su默认切换为 root,就得暴露 root 的密码给这个普通用户,但事实上我只是想把 root 的部分命令临时给予这个普通用户执行而已,并不希望这个用户有机会为所欲为拥有所有命令的权限。

sudo 则能实现这种场景,不把 root 的密码暴露,不把 root 的所有权限给出去,而是让普通用户能临时用自己的身份来执行原本只有 root 身份才能执行的若干命令。

su          # 切换为root
su 用户名   # 切换为该用户
su -        # 切换为root,并将当前目录切换到/root,将login shell 切换为root的login shell(环境变量变为root的环境变量)
su - 用户名 # 切换为该用户,并将当前目录切换到该用户的家目录,将login shell 切换为该用户的login shell(环境变量变为该用户的环境变量)
设置需要使用sudo的用户(组)
visudo
# 或 vim /etc/sudoers

两者其实都是在编辑 /etc/sudoers 这个文件。
进入该文件后,可以看到很多以井号(#)开头的描述,以井号开头的就是被注释掉的样例说明,不会起作用。修改时,只需要在文件最下方开始添加设置即可。

修改完后保存退出即可,并不需要额外去重启终端,或者退出那个已经登录的用户重新登录,而是马上就能实现命令的授权或限制的。

# 命令格式:3个字段
用户(组)      主机=可执行命令     指定普通用户适用sudo时是否需要密码

# 用户(组):
# 前面加百分号(%)是用户组,没有百分号,则是指用户

# 主机:
# 本地登录(字符界面登录:localhost),有说法是讲本地的图形界面登录算远程,但实际测试,图形界面使用terminal还是可以通过localhost来设置的。
# 远程登录(远程的ssh登录)
# ALL代表 “本地+远程” 的所有主机都适用

# 可执行命令:
# ALL 为所有命令
# 多条命令用逗号隔开

# -----------------------------------------------------

# 样例:
%testgroup  localhost=/sbin/shutdown, /sbin/mount NOPASSWD:ALL 
# 不建议nopasswd 因为不安全。
即应该写成:
%testgroup localhost=/sbin/shutdown
就可以了
# 注意,这里的shutdown支持了所有选项,如果想进一步限制,比如我只想让这个普通用户组使用shutdown -c,而不希望其使用其他选项,可以像下面这样写。
%testgroup localhost=/sbin/shutdown -c
# 另外,如果是想实现同一个命令的多个选项,比如说shutdown的-c与-h,经过实验,并不能直接像下面这样写:
%testgroup 172.29.6.111=/sbin/shutdown -ch
或
%testgroup ALL=/sbin/shutdown -c -h
而是需要写两条独立的命令
%testgroup ALL=/sbin/shutdown -c, /sbin/shutdown -h

# 另外还支持对选项进行限制,比如说该用户只能控制10分钟后关机,不能20分钟,也不能是now,那么就这么写:
%testgroup ALL=/sbin/shutdown -h 10

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5714731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存