Linux 之旅 11:Linux 账号管理与 ACL 权限设置

Linux 之旅 11:Linux 账号管理与 ACL 权限设置

image-20210821200728975

Linux 的账号与用户组

使用者识别码:UID与GID

关于Linux的账号管理,有两个数字最为重要:

  • UID:(User ID),即账号的唯一识别码
  • GID:(Group ID),即用户组的唯一识别码

LInux通过这两个数字识别系统中的用户以及群组。

要查看当前账号的UID与GID,可以:

[icexmoon@xyz ~]$ id
uid=1000(icexmoon) gid=1000(icexmoon)=1000(icexmoon),10(wheel) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

查看指定行号的UID与GID:

[icexmoon@xyz ~]$ id root
uid=0(root) gid=0(root)=0(root)

事实上用户的UID和GID等信息都保存在几个账号和群组相关的配置文件中,其中最重要的是/etc/passwd

[icexmoon@xyz ~]$ cat /etc/passwd | grep icexmoon
icexmoon:x:1000:1000:icexmoon:/home/icexmoon:/bin/bash

其中第三个字段是用户的UID,第四个字段是用户的主要群组(初始化群组)的GID。

使用者账号

在用户登录Linux的时候,用户验证的大概流程如下:

  1. 检查登录的用户名是否存在于/etc/passwd文件中,如果有,则读取其对应的UID和GID,以及登录用的shell和账号的家目录等。
  2. 通过/etc/shadow文件比对用户输入的密码是否正确。
  3. 如果没问题就调用对应的登录用shell进行登录。
/etc/passwd

现在看/etc/passwd的详细结构:

[icexmoon@xyz ~]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

该文件由:分隔,每一个字段的含义为:

  • 用户名
  • 密码:早期的Linux使用此字段保存密码,目前已废弃,转移到了/etc/shadow中,所以当前该字段中会用x字符填充。
  • UID:0表示root用户,1~999为系统账号,1000~60000为可以设置的一般性用户账号。
  • GID:用户所属的主用户组(初始化用户组)
  • 用户信息说明:关于用户的描述性信息
  • 家目录
  • Shell:通过登录验证后会使用这里指定的Shell进行登录,部分系统账号会被设置为/sbin/nologin,所以无法登录。
/etc/shadow

用户的密码保存在/etc/shadow中:

[root@xyz ~]# head -n 5 /etc/shadow
root:$6$h5eXZCiKw8ucXyB2$PxxRgKneIDs2TWIpg916ugAfGCfqNf/HJHiXjy0PTPtUmY.pR/e2cUMpjRBqbx5Y0AHNJtjxAf3aOUTek3DpO.::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::

同样以:分隔,字段对应的内容为:

  1. 用户名
  2. 密码:这里存放的是经过加密后的密码,老式的Linux会使用md5,新的Linux会使用SHA或者其它的加密算法。只要稍微修改这里的数据就会导致用户无法正常登录,所以如果需要临时禁止某个用户登录,但是保留其包括登录密码在内的用户信息,就可以在这个字段开始添加一个!字符,如果要恢复登录就取消,很方便。
  3. 最近一次修改密码的日期:格式为以天为单位的时间戳
  4. 可变更密码的间隔天数:刚修改完密码后,需要间隔指定天数才能再次修改密码,通过设置这个字段可以杜绝频繁修改密码的行为,默认为0,表示可以随时修改密码。
  5. 密码过期天数:距离上一次修改密码后超过该天数后会在用户登录时要求用户修改密码。默认为99999,可以看作是永不过期。
  6. 密码过期前多少天进行警告:会在临近过期时,用户登录后会收到密码将要到期的提醒。
  7. 密码过期后的宽限天数:在宽限天数内可以修改密码并登录,如果超过宽限天数,密码将失效,无法修改和登录系统。
  8. 账号失效日期:格式为天为单位的时间戳,到该时间后账户会无条件失效,此字段用于特殊用途,比如将账号作为收费项目提供。
  9. 保留字段

如果一般用户忘记了密码,很好解决,只要用root或者其它管理员账号修改即可,如果root账号的密码忘了,且没有其它的管理员账号可以使用,就比较麻烦了,要么通过单人维护模式之类的方式启动系统,此时会获得root权限,进行密码重置,要么可以用启动U盘之类的启动系统,用挂载文件系统的方式挂载/etc/shadow所在分区,然后清空其中的root密码字段,然后重启系统后就会提示设置root的密码。

如果要查看Linux对密码加密使用的是何种算法,可以:

[root@xyz ~]# authconfig --test | grep hashing
 password hashing algorithm is sha512

关于用户组

/etc/group

用户组相关的信息保存在/etc/group中:

[root@xyz ~]# head -n 5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

这些字段的含义为:

  1. 用户组名称
  2. 用户组密码:此字段已废弃,相关信息移动到了/etc/gshadow
  3. GID
  4. 包含在此用户组中的用户名:例如root:x:0:user1,user2就表明user1user2两个用户包含在root用户组中,一个用户可以加入多个用户组,此外,如果某个用户的主用户组是当前的用户组,则不需要写入这里。
初始化用户组

用户的主用户组,或者说初始化用户组(initial group)是创建用户时所关联的用户组,是不需要将用户名写入/etc/group中的相关字段的:

[root@xyz ~]# grep icexmoon /etc/passwd /etc/shadow /etc/group
/etc/passwd:icexmoon:x:1000:1000:icexmoon:/home/icexmoon:/bin/bash
/etc/shadow:icexmoon:$6$vGNuDgQdXLIv4U19$mnkT6XkbUOAAO9jxxBfzXbRfS6ZA9LpR0fDwRJmfQ2cZ7PyMF18aGosW00KXjlcsv9GbzDpzSqgvqQr5E51aW/::0:99999:7:::
/etc/group:wheel:x:10:icexmoon
/etc/group:icexmoon:x:1000:icexmoon

不过事实上这里是有的:/etc/group:icexmoon:x:1000:icexmoon,是CentOS版本的问题?

有效用户组

使用groups命令可以查看用户所有关联的用户组:

[icexmoon@xyz ~]$ groups
icexmoon wheel

其中第一个为用户的有效用户组(effective group),如果创建新文件,所用的用户组信息就会是这个有效用户组:

[icexmoon@xyz tmp]$ touch test_group
[icexmoon@xyz tmp]$ ll test_group
-rw-rw-r--. 1 icexmoon icexmoon 0 819 21:43 test_group

使用newgrp命令可以切换有效用户组:

[icexmoon@xyz tmp]$ newgrp wheel
[icexmoon@xyz tmp]$ groups
wheel icexmoon
[icexmoon@xyz tmp]$ touch test_grou2
[icexmoon@xyz tmp]$ ll test_grou*
-rw-r--r--. 1 icexmoon wheel    0 819 21:45 test_grou2
-rw-rw-r--. 1 icexmoon icexmoon 0 819 21:43 test_group
[icexmoon@xyz tmp]$ exit
exit

newgrp会打开一个子shell,并改变有效用户组,此时新建文件会使用新的有效用户组。需要注意的是因为是新的子shell,所以在执行完相关操作后需要使用exit退出,并返回之前所在的shell中。

/etc/gshadow

/etc/gshadow主要的用途是保存用户组的密码:

[root@xyz ~]# head -n 5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::

这些字段的含义是:

  1. 用户组名称
  2. 用户组密码:如果为用户组设置管理员,则会设置这个字段
  3. 用户组管理员账号
  4. 加入用户组的用户(与/etc/group相同)

所谓的用户组管理员,就是可以帮助root管理对应的用户组,进行增加和删除用户,如果Linux主机上的用户很多,且频繁需要管理用户组,就可能需要设置用户组管理员来帮助管理,不过现在已经很少需要这么做了。

账号管理

添加和移除用户

useradd

使用useradd就可以添加一个新用户:

[root@xyz ~]# useradd user1
[root@xyz ~]# ls -ald /home/user1
drwx------. 3 user1 user1 78 820 18:26 /home/user1
[root@xyz ~]# grep user1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:user1:x:1001:1001::/home/user1:/bin/bash
/etc/shadow:user1:!!:18859:0:99999:7:::
/etc/group:user1:x:1001:

可以看到新用户创建后,会自动创建相应的家目录(一般是/home/xxx),此外还会在前边介绍的几个关键的用户和用户组相关的配置文件中添加相应的信息。

需要注意的是,/etc/shadow中添加的新记录中的密码字段是!!,意味着该用户的密码还未设置,所以需要设置密码后才能使用,可以用root进行设置:

[root@xyz ~]# passwd user1
更改用户 user1 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 它基于字典单词
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

这里我使用的是一个常见的简单密码,所以被提示未通过字典检查,但是root依然可以通过重复两次的方式强行设置。

默认情况下useradd会给新用户指定一个UID和GID,其中GID是为新用户单独创建的一个新的用户组。如果你有特殊需要,也可以为新用户指定一个UID和一个已存在的用户组作为其主用户组:

[root@xyz ~]# useradd -u 1500 -g users user2
[root@xyz ~]# ls -ald /home/user2
drwx------. 3 user2 users 78 820 18:37 /home/user2
[root@xyz ~]# grep user2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:user2:x:1500:100::/home/user2:/bin/bash
/etc/shadow:user2:!!:18859:0:99999:7:::

上面说的是用于普通用户登录和使用Linux主机的一般账号,此外还可以添加系统账号:

[root@xyz ~]# useradd -r user3
[root@xyz ~]# ls -ald /home/user3
ls: 无法访问/home/user3: 没有那个文件或目录
[root@xyz ~]# grep user3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:user3:x:988:982::/home/user3:/bin/bash
/etc/shadow:user3:!!:18859::::::
/etc/group:user3:x:982:

使用useradd -r可以添加系统账号,可以看到分配的UID是988,小于1000,此外,因为系统账号一般用于运行程序等,并不会被用户登录和使用,所以没有创建对应的家目录。

useradd 参考文件

可以通过useradd -D查看useradd命令创建用户时的默认值:

[root@xyz ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

其实这些内容是从/etc/default/useradd这个文件读取的。

这些默认值的含义为:

  • GROUP=100

    新建用户时候分配的初始用户组是100。但是CentOS或Redhat系列发行版中,实际上并不会使用这个设置,而是会为新用户创建同名的一个新的用户组作为初始用户组,这种机制称为“私有用户组机制”,而使用这个设置并为新用户指定同一个用户组作为初始用户组的方式称为“公共用户组机制”。

  • HOME=/home

    为新用户创建的家目录的位置,一般为/home/xxx

  • INACTIVE=-1

    这个默认值对应/etc/shadow中的第7个字段“密码过期后的宽限天数”,-1表示永不失效,0表示立即失效,其它值表示具体的宽限天数。

  • EXPIRE

    对应/etc/shadow中的第8个字段,账号会在到达该天数后失效。

  • SHELL=/bin/bash

    新用户默认使用的shell程序,如果为了安全考虑,希望新用户默认都不能登录,可以将这个值改为/sbin/nologin

  • SKEL=/etc/skel

    新用户家目录的模板目录,在创建新用户的时候,会使用这里的模板目录为新用户创建家目录,比如,如果你希望新用户的家目录有一些基础的用户手册或者shell脚本,可以在/etc/skel中设置好对应的文件,这样新建的用户的家目录里也会有一份相关文件的拷贝。

  • CREATE_MAIL_SPOOL=yes

    是否为新用户创建邮箱,也就是/var/spool/mail/xxx

除了这些默认值以外,useradd还需要参考其他的配置文件,比如/etc/login.defs

[root@xyz ~]# cat /etc/login.def
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值