跳到主要内容

用户账号和群组

《鸟哥的linux私房菜》

用户账号

UID : /etc/passwd

密码表: /etc/shadow

GID : /etc/group image.png

登入主机时,读取/etc/passwd是否存在该账号(读出UID和shell目录) ->读取/etc/group(读出GID) -> 读取/etc/shadow(核对密码表)

/etc/passwd 文件结构

image.png

7个字段:账号名称:密码:UID:GID:用户信息说明栏:家目录:shell

/sbin/nologin

/sbin/nologin这个特殊shell 可以替代成让账号无法取得shell环境,在/etc/nologin.txt中可以编辑提示信息

UID

0(系统管理员):把账号的 UID 改为 0就可以让其他的账号名称也具有 root 的权限

1~999(系统账号):这些系统账号通常是不可登入的,特殊shell:/sbin/nologin

1000~60000(可登入账号)

/etc/shadow 文件结构

[root@leo ~]# head /etc/shadow
root:$6$x55f4XU/jgzBISL8$/8W0A3rv0Kr0...::0:99999:7:::
bin:*:17632:0:99999:7:::
daemon:*:17632:0:99999:7:::

9个字段:

1.账号名称

2.密码:经过编码的(加密)

3.最近更动密码的日期

4.密码不可被更动的天数

5~7 强制用户修改密码

  • 5.密码需要重新变更的天数

  • 6.密码需要变更期限前的警告天数

  • 7.密码过期后的账号宽限时间(密码失效日):登入系统时,系统会强制要求重新设定密码才能登入

8.账号失效日期:账号过期后,不管密码是否过期,都无法再使用

9.保留

群组

/etc/group 文件结构

image.png

4个字段:

组名:

群组密码:给群组管理员使用。真正密码在/etc/gshadow

GID:

此群组支持的账号名称:某个账号想要加入此群组时,将该账号填入这个字段即可。逗号隔开[root❌0:dmtsai,username]

初始群组

初始群组, 使用者一登入就会主动取得,不需要在 /etc/group 的第四个字段写入该账号。

有效群组

  1. groups命令显示的第一个群组就是有效群组 。
  2. 通常有效群组的作用是在新建文件 。
  3. 切换有效群组:newgrp grpname ('grpname'必须是当前用户支持的群组)

/etc/gshadow

image.png

4个字段:

  1. 组名
  2. 密码栏,同样的,开头为 ! 表示无合法密码,所以无群组管理员
  3. 群组管理员的账号 (相关信息在 gpasswd 中介绍)
  4. 有加入该群组支持的所属账号 (与 /etc/group 内容相同!)

用户怎么加入群组?

way1:系统管理员利用usesrmod帮你加入

way2:群组管理员以gpasswd帮你加入

账号管理

useradd 建立新用户

useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM]\
> [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名

选项与参数:
-u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
-g :后面接的那个组名就是我们上面提到的 initial group 啦~
该群组的 GID 会被放置到 /etc/passwd 的第四个字段内。
-G :后面接的组名则是这个账号还可以加入的群组。
这个选项与参数会修改 /etc/group 内的相关资料喔!
-M : 强制!不要建立用户家目录! (系统账号默认值)
-m : 强制!要建立用户家目录! (一般账号默认值)
-c : 这个就是 /etc/passwd 的第五栏的说明内容啦~可以随便我们设定的啦~
-d :指定某个目录成为家目录,而不要使用默认值。 务必使用绝对路径!
-r :建立一个系统的账号, 这个账号的 UID 会有限制 (参考 /etc/login.defs)
-s :后面接一个 shell ,若没有指定则预设是 /bin/bash 的啦~
-e :后面接一个日期,格式为『YYYY-MM-DD』此项目可写入 shadow 第八字段,
亦即账号失效日的设定项目啰;
-f :后面接 shadow 的第七字段项目,指定密码是否会失效。 0 为立刻失效,
-1 为永远不失效(密码只会过期而强制于登入时重新设定而已。 )

[root@study ~]# useradd vbird1
[root@study ~]# ll -d /home/vbird1
drwx------. 3 vbird1 vbird1 74 Jul 20 21:50 /home/vbird1
# 默认会建立用户家目录,且权限为 700 !这是重点!
[root@study ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
www.linuxidc.com/etc/passwd:vbird1:x:1003:1004::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:16636:0:99999:7:::
/etc/group:vbird1:x:1004:

加上 -r 这个选项以后,系统就会主动将账号与账号同名群组的 UID/GID 都指定小于 1000 以下(即系统账号);

系统账号默认都不会主动建立家目录的 。

useradd参考档(预设信息)位于/etc/default/useradd,useradd -D可查看

image.png

useradd命令会处理一下几个项目:

  • 在 /etc/passwd 里面建立一行与账号相关的数据,包括建立 UID/GID/家目录等;
  • 在 /etc/shadow 里面将此账号的密码相关参数填入,但是尚未有密码;
  • 在 /etc/group 里面加入一个与账号名称一模一样的组名;
  • 在 /home 底下建立一个与账号同名的目录作为用户家目录,且权限为 700

passwd 设置/更改密码

[root@study ~]# passwd [--stdin] [账号名称] <==所有人均可使用来改自己的密码
[root@study ~]# passwd [-l] [-u] [--stdin] [-S] \
> [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 <==root 功能
选项与参数:
--stdin :可以透过来自前一个管线的数据,作为密码输入, 对 shell script 有帮助!
-l :是 Lock 的意思, 会将 /etc/shadow 第二栏最前面加上 ! 使密码失效;
-u :与 -l 相对,是 Unlock 的意思!
-S :列出密码相关参数,亦即 shadow 文件内的大部分信息。
-n :后面接天数, shadow 的第 4 字段,多久不可修改密码天数
-x :后面接天数, shadow 的第 5 字段,多久内必须要更动密码
-w :后面接天数, shadow 的第 6 字段,密码过期前的警告天数
-i :后面接『日期』, shadow 的第 7 字段,密码失效日期

echo "abc543CC" | passwd --stdin vbird2 这可以直接更新密码而不用再次输入; 缺点是这个密码会保留在 /root/.bash_history 中。通常仅用在 shell script 的大量建立使用者账号

chage 密码参数

[root@study ~]# chage [-ldEImMW] 账号名
选项与参数:
-l :列出该账号的详细密码参数;
-d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
-E :后面接日期,修改 shadow 第八字段(账号失效日),格式 YYYY-MM-DD
-I :后面接天数,修改 shadow 第七字段(密码失效日期)
-m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
-M :后面接天数,修改 shadow 第五字段(密码多久需要进行变更)
-W :后面接天数,修改 shadow 第六字段(密码过期前警告日期)

usermod 修改账号相关数据

[root@study ~]# usermod [-cdegGlsuLU] username
选项与参数:
-c :后面接账号的说明,即 /etc/passwd 第五栏的说明栏,可以加入一些账号的说明。
-d :后面接账号的家目录,即修改 /etc/passwd 的第六栏;
-e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据啦!
-f :后面接天数, 为 shadow 的第七字段。
-g :后面接初始群组,修改 /etc/passwd 的第四个字段,亦即是 GID 的字段!
-G :后面接次要群组,修改这个使用者能够支持的群组,修改的是 /etc/group 啰~
-a :与 -G 合用,可『增加次要群组的支持』而非『设定』喔!
-l :后面接账号名称。亦即是修改账号名称, /etc/passwd 的第一栏!
-s :后面接 Shell 的实际文件,例如 /bin/bash 或 /bin/csh 等等。
-u :后面接 UID 数字啦!即 /etc/passwd 第三栏的资料;
-L : 暂时将用户的密码冻结, 让他无法登入。其实仅改 /etc/shadow 的密码栏。
-U : 将 /etc/shadow 密码栏的 ! 拿掉,解冻啦!

userdel 删除用户相关信息

用户账号/密码相关参数: /etc/passwd, /etc/shadow 用者群组相关参数: /etc/group, /etc/gshadow 用户个人文件数据: /home/username, /var/spool/mail/username ...

[root@study ~]# userdel [-r] username
选项与参数:
-r : 连同用户的家目录也一起删除

id 查看账号

id [username]

finger 查看用户相关信息

这个指令有点危险!

[root@study ~]# finger [-s] username
选项与参数:
-s : 仅列出用户的账号、全名、 终端机代号与登入时间等等;
-m :列出与后面接的账号相同者,而不是利用部分比对 (包括全名部分)

chfn - change finger

[root@study ~]# chfn [-foph] [账号名]
选项与参数:
-f :后面接完整的大名;
-o :您办公室的房间号码;
-p : 办公室的电话号码;
-h :家里的电话号码!

chsh - change shell

[vbird1@study ~]$ chsh [-ls]
选项与参数:
-l :列出目前系统上面可用的 shell ,其实就是 /etc/shells 的内容!
-s : 设定修改自己的 Shell 啰

群组管理

groupadd

[root@study ~]# groupadd [-g gid] [-r] 组名
选项与参数:
-g :后面接某个特定的 GID ,用来直接给予某个 GID ~
-r :建立系统群组啦!与 /etc/login.defs 内的 GID_MIN 有关。

不指定GID时,由 1000 以上最大 GID+1 来决定

groupmod group相关参数的修改

[root@study ~]# groupmod [-g gid] [-n group_name] 群组名
选项与参数:
-g :修改既有的 GID 数字;
-n :修改既有的组名

不要随意改动GID!易造成系统资源错乱

groupdel 删除群组

groupdel [groupname]

如果有用户使用该群组作为 initial group ,则该群组不能被删除。

gpasswd:群组管理员功能

系统管理员(root):

[root@study ~]# gpasswd groupname
[root@study ~]# gpasswd [-A user1,...] [-M user3,...] groupname
[root@study ~]# gpasswd [-rR] groupname
www.linuxidc.com选项与参数:
: 没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow)
-A : 将 groupname 的主控权交由后面的使用者管理(该群组的管理员)
-M : 将某些账号加入这个群组当中!
-r : 将 groupname 的密码移除
-R : 让 groupname 的密码栏失效

群组管理员:

[someone@study ~]$ gpasswd [-ad] user groupname
选项与参数:
-a : 将某位使用者加入到 groupname 这个群组当中!
-d : 将某位使用者移除出 groupname 这个群组当中。

使用者身份切换su、sudo

su

[root@study ~]# su [-lm] [-c 指令] [username]
选项与参数:
- : 单纯使用 - 如『su - 』代表使用 login-shell 的变量文件读取方式来登入系统;
若使用者名称没有加上去, 则代表切换为 root 的身份。
-l :与 - 类似,但后面需要加欲切换的使用者账号!也是 login-shell 的方式。
-m : -m 与 -p 是一样的,表示『使用目前的环境设定,而不读取新使用者的配置文件』
-c : 仅进行一次指令,所以 -c 后面可以加上指令喔!

若要完整的切换到新使用者的环境,必须要使用『su - username 』或『su -l username 』,才会连同PATH/USER/MAIL 等变量都转成新用户的环境;

如果仅想要执行一次 root 的指令,可以利用『su - -c "指令串" 』的方式来处理;

使用 root 切换成为任何使用者时,并不需要输入新用户的密码;

sudo

[root@study ~]# sudo [-b] [-u 新使用者账号]
选项与参数:
-b : 将后续的指令放到背景中让系统自行执行,而不与目前的 shell 产生影响
-u :后面可以接欲切换的使用者,若无此项则代表切换身份为 root 。

使某个用户可以使用root的任何指令

修改/etc/sudoers

方法1:使单一用户可进行 root 所有指令

image.png

方法2:利用 wheel 群组以及免密码的功能处理 visudo

image.png

方法3:有限制的指令操作

image.png

其他做法...

用户的特殊shell与PAM模块

/sbin/nologin

前面多次说到,以/sbin/nologin 为shell的用户会呗拒绝登录主机。这与PAM验证机制有关。

PAM

例1:执行passwd时呼叫PAM验证的流程

image.png

  1. 用户开始执行 /usr/bin/passwd 这支程序,并输入密码;
  2. passwd 呼叫 PAM 模块进行验证;
  3. PAM 模块会到 /etc/pam.d/ 找寻与程序 (passwd) 同名的配置文件;
  4. 依据 /etc/pam.d/passwd 内的设定,引用相关的 PAM 模块逐步进行验证分析;
  5. 将验证结果 (成功、失败以及其他讯息) 回传给 passwd 这支程序;
  6. passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证! )

例2:login 的 PAM 验证机制流程

image.png

image.png

1.验证阶段 (auth):

首先,(a)会先经过 pam_securetty.so 判断,如果使用者是 root时,则会参考 /etc/securetty 的设置;

接下来(b)经过 pam_env.so 设置额外的环境变量;

再(c)通过 pam_unix.so 检验密码,若通过则回报 login 程序;

若不通过则(d)继续往下以 pam_succeed_if.so 判断 UID 是否大于 1000 ,若小于 1000则回报失败,

否则再往下 (e)以 pam_deny.so 拒绝连线。

2.授权阶段 (account):

(a)先以 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则不许一般使用者登陆;

(b)接下来以 pam_unix.so 及 pam_localuser.so 进行帐号管理,再以

(c) pam_succeed_if.so 判断 UID 是否小于 1000 ,若小于 1000 则不记录登录信息。

(d)最后以 pam_permit.so 允许该帐号登陆。

3.密码阶段 (password):

(a)先以 pam_pwquality.so 设置密码仅能尝试错误 3 次;

(b)接下来以 pam_unix.so 通过 sha512, shadow 等功能进行密码检验,若通过则回报login 程序,若不通过则

(c)以 pam_deny.so 拒绝登陆。

4.会话阶段 (session):

(a)先以 pam_selinux.so 暂时关闭 SELinux;

(b)使用pam_limits.so 设置好使用者能够操作的系统资源;

(c)登陆成功后开始记录相关信息在登录文件中;

(d)以 pam_loginuid.so 规范不同的 UID 权限;

(e)打开pam_selinux.so 的功能。

第二字段:验证的控制旗标

image.png

例题 为什么 root 无法以 telnet 直接登入系统,但是却能够使用 ssh 直接登入? 答: 一般来说, telnet 会引用 login 的 PAM 模块,而 login 的验证阶段会有 /etc/securetty 的限制! 由于远程联机 属于 pts/n (n 为数字) 的动态终端机接口装置名称,并没有写入到 /etc/securetty , 因此 root 无法以 telnet 登 入远程主机。至于 ssh 使用的是 /etc/pam.d/sshd 这个模块, 你可以查阅一下该模块,由于该模块的验证阶段并 没有加入 pam_securetty ,因此就没有 /etc/securetty 的限制!故可以从远程直接联机到服务器端。