Linux基础学习笔记-账号管理

前言

以下是关于Linux用户和用户组的内容。

Linux账号管理与ACL权限设置

linux账号与用户组

用户标识符:UID和GID

用户ID(User ID)为UID UID与账号的对应就在/etc/passwd中

用户组ID(Group ID)为GID GID与组的对应在/etc/group中

用户账号

拿到shell的过程

Linux上的用户登录主机获取shell是如何进行的?首先必须要利用tty1~tty6的终端提供的登录接口,输入用户名和密码才能登录,通过网络登录则需要ssh功能,系统后台的处理过程:

  1. 查找/etc/passwd里面是否有账号,没有就退出,有的话就将该用户的UID和GID(etc/group)读出来,家目录和shell也读出

  2. 接下来就是核对密码表。在/etc/shadow里查找出同一个UID,然后核对刚刚输入的密码是否一致

  3. 一切顺利就进入shell

/etc/passwd结构

每一行代表一个账户,里面有许多本来系统运行所必须的账号,简称系统账户,例如bin,adm,nobody…每一行用分号分开,每一部分代表的内容都不一样

1
root:x:0:0:root:/root:/bin/bash
  1. 账户名称

  2. 密码

    早期的unix将密码放在这个字段,由于安全性,现在放在shadow里,所以用x代替

  3. UID

    0:系统管理员

    1~999:系统账号

    ​ 1~200:linux自己建立的系统账号

    ​ 201~999:用户创建的系统账户

    1000~60000:一般用户账号

  4. GID

    与/etc/group有关,所属组的id

  5. 用户信息说明

  6. 家目录

  7. 用户默认获取的shell

/etc/shadow结构

程序的运行与权限有关,权限与GID和UID有关,所以程序需要读取/etc/passwd来了解不同用户的权限,所以passwd的权限必须要设置成-rw-r--r--,这时如果密码还是放在passwd里面,就会造成密文的泄露,所以需要将密码的密文单独移动到shadow里面,shadow的权限默认为-rw-------

1
2
3
root:$6$KaRerEYG$TjxFjDPsKL6m7jYzTwXsekXjt4i2a56zhxslPozbfXRKKv7CcUh2A43F.C8QfrN/riCzJIoOrjyvsLXNEuD1V/:18049:0:99999:7:::

gard3nia:$6$AscHmt6SqDOyCv1p$VKdcxkNdVFDQiCgWpqhKlmSTBt8IEHz.VH5zKQn8ExZSNoqr/rsOj5q39g7d5GQgg98/n7DB53oNxntx/fJTq0::0:99999:7:::
  1. 账户

  2. 密码密文

  3. 最近修改密码的日期:距离1970/01/01的日期

  4. 密码不可被修改的天数

    在最近一次修改密码以后经过多久不能修改密码

  5. 密码需要重新修改的天数

    强制用户修改密码

  6. 密码需要修改期限前的警告天数

    密码有效期快要到的时候,系统会发出警告给用户

  7. 密码过期以后的宽限天数

    如果密码过期,在宽限天数以内可以被强制修改密码然后登陆

  8. 账号失效的日期,无论密码是否失效,都会账户失效,依旧是距离1970/01/01的天数

  9. 保留功能

关于用户组

/etc/group结构

1
2
3
4
5
root:x:0:  
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
  1. 组名

  2. 用户组密码

    给组的管理员使用,目前很少使用

  3. GID

  4. 此用户组支持的账号名称

    一个账号可以加入多个用户组,如果某个账号想要加入此用户组,将该用户填入这个字段即可

三个文件中相关参数的联系:

MM0eJ0.png

有效用户组和初始用户组

在学用户组和用户的时候,用户可以加入任意多个用户组,这么多用户组有什么区别呢???

初始用户组

在/etc/passwd的第四栏有一个GID,那个GID就是初始用户组的ID,用户登录系统立刻就会有这个用户组的相关权限。因为是初始用户组,所以用户一登录就会主动获取,不需要在/etc/group的第四个字段写入该账号。

非初始用户组

但是如果是非初始用户组的其他用户组,必须要在/etc/group这个文件中的找到该组,在其第四栏添加上该用户的用户名。

有效用户组

如果用户建立一个新的文件或者目录,新文件的用户组到底是哪一个???

  • groups:有效与支持用户组的观察

    1
    2
    [gard3nia@localhost ~]$ groups
    gard3nia wheel docker

    从结果里面可以看出gard3nia属于三个用户组gard3nia wheel docker,第一个输出的用户组就为有效用户组,也就是说有效用户组为gard3nia

    1
    2
    [gard3nia@localhost ~]$ ls -l 1.txt
    -rw-rw-r--. 1 gard3nia gard3nia 0 Nov 9 10:45 1.txt

    新建文件后发现用户组确实为gard3nia

  • newgrp:有效用户组的切换

    使用这个命令有个前提就是:你想要切换的用户组必须要是你已经有支持的用户组。也就是说上面的gard3nia用户组可以切换为wheel和docker用户组

    1
    2
    3
    [gard3nia@localhost ~]$ newgrp docker
    [gard3nia@localhost ~]$ groups
    docker wheel gard3nia

    额外讨论newgrp:

    这个命令可以切换当前用户的有效用户组,而且是另外以一个shell来提供这个功能

    MQPZrR.png

    所以上述的gard3nia相当于目前是以另一个shell登录的,而且新的shell给gard3nia有效的GID为docker,用户的用户组权限将会被重新计算,退出直接exit即可回到原来的环境。

    /etc/gshadow

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [gard3nia@localhost ~]$ sudo head -n 4 /etc/gshadow
    [sudo] password for gard3nia:
    root:::
    bin:::
    daemon:::
    sys:::
    ...
    gard3nia:!!::gard3nia
    nginx:!::
    cgred:!::
    dockerroot:!::
    docker:!::gard3nia
    apache:!::
    slocate:!::

    几乎和group文件相同,需要注意的是第二栏目,如果为空或者为!时,表示该用户组不具有用户组管理员。每个字段表示的内容:

    1. 组名
    2. 密码栏:开头为!的表示无合法密码,所以没有用户组管理员
    3. 用户组管理员的账号
    4. 有加入该用户组支持的所属账号

    这个gshadow的最大功能就是建立用户组管理员,root平时太忙的时候,改用户组管理员就可以将需要服务的用户的账号加入到自己管理的用户组里面进行管理,由于sudo的出现,现在这个功能已经很少使用。

账号管理

新增与删除用户

usreadd

useradd的参数特别多,这里列出几个常用的…

1
2
3
4
5
6
-u UID
-g 初始用户组
-G 次要用户组
-d 家目录绝对路径
-s 登录获取的shell类型
-r 创建系统账户

一般账号

系统已经帮我们设置了好多默认的值了,所以可以简单地使用useradd+用户名来建立用户,系统会默认帮你处理下面几个选项:

  1. 在/etc/passwd里面建立一条与用户相关的数据,包括建立UID,GID,家目录等等
  2. 在/etc/shadow里面将此账号的密码相关参数写入,但是还没有密码
  3. 在/etc/group里面加入一个与账户名称一样的组名
  4. 在/home下面建立家目录,权限为700

这时还没有设置密码,所以还需要使用passwd+用户名的方法设置密码。

系统账号

系统账号的UID一般都是在1000号以下,加上-r参数就可以直接建立一个系统账户。系统账号主要是用来执行系统所需服务的权限设置,所以系统账号默认都不会主动建立家目录

useradd的参考文件

1
2
3
4
5
6
7
8
[gard3nia@localhost ~]$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
  • GROUP=100,新建账号的初始用户组使用GID为100

    • 私有用户组机制

      系统会建立一个与账号一样的用户组给用户作为初始用户组,这种用户组设置机制会比较有保密性,因为每个用户都会有自己的用户组,而且家目录权限还是700;

    • 公共用户组机制

      以上面的GROUP=100设置值作为新建用户的初始用户组,每个用户都属于users这个用户组,默认家目录的权限是755,大家共享家目录内的数据。

  • HOME=/home,用户家目录的基准目录

  • INACTIVE=-1,密码过期以后是否会失效的设置值,如果是-1代表密码永远不会失效;0代表密码过期立刻失效;如果是30,则代表过期后30天后才失效。

  • SHELL=/bin/bash,获取的shell

  • EXPIRE=,shadow的第八个字段,即账号失效的日期

  • SKEL=/etc/skel,用户家目录参考基准目录

  • CREATE_MAIL_SPOOL=yes,建立用户的mailbox…

passwd

用useradd创建账号以后,在默认的状况下,该账号是锁定的,必须要用passwd来设置密码;

passwd的参数很多,可用–help自行查看,root用户修改密码不需要输入历史密码…

1
2
3
4
5
passwd+用户名:帮助特定用户修改密码
passwd:自己修改自己的密码
passwd -S可以列出密码相关参数,看出加密是使用了sha512;
passwd -l可以在shadow的密码位置前面加上!使得密码失效,起到lock的作用
passwd -u解锁
1
2
3
[gard3nia@localhost ~]$ sudo passwd -S gard3nia
[sudo] password for gard3nia:
gard3nia PS 1969-12-30 0 99999 7 -1 (Password set, SHA512 crypt.)

chage

运用passwd -S查询到的信息很少,更详细的密码参数显示功能需要使用chage:

1
2
3
4
5
6
7
8
[gard3nia@localhost ~]$ chage -l gard3nia
Last password change : never
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

更多的参数可以修改密码的一些参数,自行–help

usermod

在useradd的时候设置错了参数,可以使用usermod来进行补救,基本上参数有很多是和useradd是一致的:

1
2
3
4
5
6
7
8
9
10
11
-d 修改家目录
-e 接日期,修改shadow第八栏
-f 接天数,修改shadow第七栏
-g 接初始用户组,修改passwd的GID
-G 接次要用户组,修改group
-a 与-G合用,增加次要用户组
-l 接账户名称,即修改账户名称
-s 修改默认shell
-u 修改UID
-L LOCK
-U UNLOCK

userdel

删除用户的相关数据,数据有:

1
2
3
用户账号,密码相关数据:/etc/passwd  /etc/shadow
用户组相关参数:/etc/group /etc/gshadow
用户个人文件数据:/home/name /var/spool/mail/name

参数也非常简单,加上-r连同使用者家目录一起删除:

1
userdel -r username

这样做一般不会将用户的数据抹除干净,最好在执行userdel之前,进行find / -user name进行删除…

用户功能

useradd,userdel,usermod都是系统管理员才可以使用的命令,如果是一般身份,也有权限来修改除了密码以外的一些参数。

id

可以查询某人或者自己的相关UID/GID信息

1
2
[gard3nia@localhost ~]$ id
uid=1000(gard3nia) gid=1000(gard3nia) groups=1000(gard3nia),10(wheel),1001(docker) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

finger

指纹…可以查看很多用户相关的信息。大部分都是/etc/passwd里面的数据,危险命令,已经不默认安装…

没安装成功,暂且搁置…

chfn

像是change finger…没什么卵用…

chsh

change shell

1
2
3
chsh [-ls]
-l 列出所有可用shell
-s 修改自己的shell

新增与删除用户组

基本上这部分的操作是与/etc/group和/etc/gshadow有关

groupadd

1
2
-g 后面接上GID表示设置某个GID
-r 建立系统用户组

groupmod

1
2
-g 修改既有的GID数字
-n 修改既有的用户组名称

groupdel

如果有某个账号的初始用户组使用该用户组,则该用户组不可删除

删除前必须要确保/etc/passwd里面的用户没有任何人使用该用户组作为初始用户组

gpasswd

用户组管理员功能,如果系统管理员太忙碌,导致某些账号需要帮助时没有人,这时就可以建立用户组管理员

ACL的使用

暂且搁置…

用户身份切换

为了安全,要尽量使用一般身份的用户来进行linux的日常作业。等到需要设置系统环境的时候,再切换成root来进行管理,这样相对来说比较安全,避免出现低级失误如:rm -rf /

su

su是最简单的身份切换命令,可以进行任何身份的切换,参数如下:

1
2
3
4
-  单纯的su -代表使用login-shell的变量文件读取方式来登录系统
-l 与-类似,后面需要加上欲切换的使用者的账户,也是login-shell方式
-m 表示使用目前的环境设置,不读取新的使用者的配置文件
-c 仅仅执行一次命令,加命令即可

su和su -的区别:

单纯使用su会切换成root的身份,读取的变量设置方式为非登陆shell的方式,这种方式很多原本的变量不会被修改,例如$PATH和家目录的路径

1
2
3
4
5
6
[gard3nia@localhost ~]$ su
Password:
[root@localhost gard3nia]# pwd
/home/gard3nia
[root@localhost gard3nia]# echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/gard3nia/.local/bin:/home/gard3nia/bin

但是如果使用su -就会完全切换为root的环境

1
2
3
4
5
6
7
[gard3nia@localhost ~]$ su -                                          
Password:
Last login: Sat Nov 9 15:49:32 EST 2019 on pts/0
[root@localhost ~]# pwd
/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

其实单单使用su命令只是切换了root的身份,但是当前的shell环境还是刚刚的一般用户的shell环境,而su -命令使用后会将用户身份和shell环境一起切换为root,所以一般还是使用su -来进行身份的切换

虽然su很方便,但是当很多人公用环境时,大家都需要使用su来切换成root,每个人都要知道root的密码,这样很不妥,所以就需要sudo;

sudo

su需要的是root用户的密码,而sudo的使用只需要自己的密码。由于sudo可以让你以其他用户的身份执行命令(通常是root),因此并非所有人都能执行sudo,只有规范到/etc/sudoers内的用户才可以执行sudo。

1
2
3
sudo [-b] [-u 账号]
-b 将后续的命令放到系统后台执行,不与目前的shell产生影响
-u 后面加上需要切换的使用者,没有这一项代表切换root

sudo可以让你切换身份去进行某项任务,执行流程如下:

  1. 执行sudo后,系统于/etc/sudoers里面查找该用户是否有执行sudo的权限
  2. 若用户具有可执行sudo的权限后,便让用户输入自己的密码来确认
  3. 如果密码正确,就开始执行后续命令
  4. 想要切换的身份和执行者相同,也不需要输入密码

所以关于/etc/sudoers的内容是非常重要的,一般不会采用vi的方法去修改这个文件的内容,因为该文件有一定的语法规律,不符合语法是不可以运行的,一般采用的是visudo命令。

visudo

其实visudo也就是用vi将sudoers的内容调出来而已 ,去添加你想要添加的用户和用户组即可

用户特殊的shell和PAM模块

开坑…

Linux主机上的用户信息传递

查询用户

w和who

查询当前登录在系统的用户

last和lastlog

last可以列出从系统建立之后到目前为止的所有登陆者信息

lastlog可以列出每个账户最近登录的时间

用户对谈

write

write+对方用户名+对方终端界面 可以做到向对面的shell传输信息的功能

mesg

mesg n 可以设置不接受任何信息

wall

wall+信息 广播给用户信息

Author: Gard3nia
Link: https://gardenia30.top/2019/11/12/Linux基础学习笔记-账号管理/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.