前面关于文件和文件夹的普通权限,通过chmod等命令改变文件所有者,文件群组等的权限做了一个总结,但是从Linux系统层面来还存在账号管理以及ACL权限控制的问题,这篇博客简单记录以下自己的学习笔记,参考《鸟哥的Linux私房菜》一书中的第13章。
UID——使用者id。GID——群组id。Linux中每个文件都有对应的使用者id和组群id,每当用户要显示文件属性的时候,系统会根据/etc/passwd和/etc/group的内容,找到与UID和GID对应的用户名和组名,将其显示出来
## 查看指定用户的id
[root@localhost etc]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@localhost coderman]# ll
total 4
-rw-rw----. 1 thomas thomas 27 Apr 30 10:57 coderman.txt
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Desktop
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Documents
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Downloads
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Music
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Pictures
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Public
drwxrwx---. 1 root vboxsf 0 May 16 19:55 share
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Templates
d-wxrwx--x. 2 coderman coderman 22 Apr 30 16:52 test
drwxr-xr-x. 2 coderman coderman 6 Apr 29 19:39 Videos
每次ll命令中显示的用户名和组名,其实是通过UID和GID进行过转换。
每次用户登录的时候,UID和GID信息也很重要。系统先从/etc/passwd中找寻是否有我们输入的用户名,如果有则将对应的UID和GID(GID在/etc/group文件中)读取出来。除此之外,还在/etc/passwd中读取用户的shell设定与home目录。之后Linux会通过/etc/shadow,匹配对应用户的UID和密码,如果一切符合,则进入用户的shell管控界面。下面分别总结一下/etc/passwd,/etc/shadow文件的结构。
这个文件中的每一行就代表一个账号,很多系统账号也保存在这个文件。
[root@localhost etc]# 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
每一列都使用[:]进行分割,关于每一列的内容,总结成如下表格
序号 | 含义 |
---|---|
1 | 账号,即登录系统的用户名 |
2 | 密码,真正的密码是加密之后存在/etc/shadow文件中,这里就只显示一个X |
3 | UID, 0——超级管理员的UID。 1~999——系统账号的UID 1000~60000——一般使用者的UID |
4 | GID,关于组的配置信息存放在/etc/group文件中 |
5 | 用户信息说明 |
6 | 该用户的home目录 |
7 | 该用户的shell配置 |
存放系统所有用户的密码的,和/etc/passwd类似(早期的linux系统,密码也是直接存放在/etc/passwd的第二列,后来为了安全,将密码存放在/etc/passwd中)。
[root@localhost etc]# head -n 5 shadow
root:$6$32p8oIN1HwDuD85F$19Zsg97wCFi9GbFqqE2m7mxj3IJGiJpKDJH7T23N1A7oHZR0zH7r22.Qt82eQ7IvrF8n0kDRfAN/j6yye4g6Q0:19108:0:99999:7:::
bin:*:18397:0:99999:7:::
daemon:*:18397:0:99999:7:::
adm:*:18397:0:99999:7:::
lp:*:18397:0:99999:7:::
也是通过[:]进行分割,分割成9列
序号 | 含义 |
---|---|
1 | 账号名称,这个与/etc/passwd中的一致 |
2 | 密码,这个是用户真正的密码(通过加密显示) |
3 | 最近更改密码的日期(长整型的时间戳) |
4 | 密码不可被更改的天数,0表示密码可以随时被更改。 |
5 | 密码的有效期,99999表示当前密码273年后失效 |
6 | 密码失效前的提醒天数,7表示密码失效7天前系统会给出提示 |
7 | 密码过期后的宽限天数,密码失效之后有几天临时有效期。 |
8 | 账号失效日期,这个值会设定为具体的年月日 |
9 | 保留字段,暂时无用 |
/etc/group文件用于存储系统用户组信息
[root@localhost etc]# head -n 5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
以[:]符号分为4列
序号 | 含义 |
---|---|
1 | 组名 |
2 | 群组管理员的密码,X显示 |
3 | GID,组群ID |
4 | 加入该组群的账号, 例如:root:\x:0:coderman,thomas 表示用户coderman和thomas属于root的用户组 |
/etc/gshadow这个文件使用于管理组群的
[root@localhost etc]# head -n 5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
以[:]符号分为4列
序号 | 含义 |
---|---|
1 | 组名 |
2 | 密码栏,如果是**!**或空表示无群组管理员 |
3 | 群组管理员的账号 |
4 | 加入该群组的账号 |
在熟悉了UID和GID的内容之后,再来看账号管理,就变得容易些许。
在上面我们看到,一个用户至少有用户名和密码两个数据,因此新增用户的主要工作也是在系统中新增这两个数据。useradd命令用于新增用户
这个命令中,系统已经帮我们设置好了很多默认值,我们只需要简单的useradd即可。在useradd操作之后,系统默认会帮我们完成以下几个事情
1、在/etc/passwd中新加一行与账号相关的数据,包括建立 UID/GID,以及home目录等
2、在/etc/shadow中增加与此账号相关的参数,但是没有密码
3、在/etc/group中增加一个与账号名称一样的群组名称
4、在/home文件夹下创建一个同名的目录作为当前新用户的home目录,且权限为700
##增加一个叫tom的用户
[root@localhost etc]# useradd tom
##/etc/passwd文件中增加了一行与账号相关的数据,UID=1002,GID=1002
[root@localhost etc]# tail -1 passwd
tom:x:1002:1002::/home/tom:/bin/bash
## /etc/shadow中增加了与此账号相关的参数,但是没有密码(!符号表示没有密码)
[root@localhost etc]# tail -1 shadow
tom:!!:19133:0:99999:7:::
## /etc/group中增加了一个与账号名称一样的群组名称
[root@localhost etc]# tail -1 group
tom:x:1002:
## /home文件夹下创建一个同名的目录作为当前新用户的home目录,且权限为700
[root@localhost etc]# ll /home
total 4
drwx------. 3 tom tom 78 May 21 20:54 tom
关于useradd还有其他参数,这个对应/passwd文件的属性进行参考即可,这里就不总结了。
在通过useradd增加了新用户之后,/etc/shadow中没有用户相关的密码,在预设的情况下,当前新加的账号暂时是被封锁的(无法登录)。需要设定密码之后才能登录。
在之前我们新建了tom用户之后,通过passwd来设置tom的密码
#通过root用户个tom用户赋予登录密码
[root@localhost etc]# passwd tom
Changing password for user tom.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost etc]# tail -1 shadow
tom:$6$UkmKrDXX$8Y0md7TTBRCQk2kBJWHN7HLKvXiDxONyC6PHUg7edYAMxUZGhAWPZ/azdicxp/opj6/dJYxVmzz1Oa2djqBAh1:19133:0:99999:7:::
之后可以通过tom用户进行系统登录了,《鸟哥的Linux私房菜》中还列举了如何通过passwd和chage命令来实现密码安全的各种措施。这里就不总结了。
如果需要修改用户账号相关数据,可以通过usermod命令进行操作。当然,其实也可以直接去修改/etc/passwd和/etc/shadow文件中的数据,不过还是建议使用usermod指令。
实例
## 设置tom用户在2022-5-22失效
[root@localhost etc]# usermod -e "2022-5-22" tom
实例
##删除用户tom
[root@localhost etc]# userdel -r tom
##对应的home目录没有了,同样的/etc/passwd和/etc/shadow中相关的内容也没有了
[root@localhost etc]# ls /home/tom
ls: cannot access /home/tom: No such file or directory
除了上述用户账号管理的命令之外,还有普通用户可以用于查询和修改自己相关信息的命令,比如id命令,finger命令,因为安全问题finger命令已经不在新版本中默认安装了。《鸟哥linux私房菜》一书中针对这个finger命令,以及修改用户finger数据的chfn和chsh命令都有详细介绍,这里篇幅所限,不做总结。
[tom@localhost ~]$ id
uid=1002(tom) gid=1002(tom) groups=1002(tom) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[tom@localhost ~]$ finger
bash: finger: command not found...
这里遗留一个问题:普通用户也可以通过passwd指令修改自身的登录密码,我们知道用户相关的密码数据存放在/etc/passwd和/etc/shadow文件中,那也就意味着普通用户也有权限修改这两个文件。那……这两个文件的权限是什么呢?
ps:这涉及到文件的特殊权限的内容,这个后续在总结。
与用户数据相对应,组群数据的新增和修改分别是groupadd和groupmod命令。组群的相关信息存放于/etc/group和/etc/gshadow中
实例
## 增加tempgroup用户组
[root@localhost etc]# groupadd tempgroup
## 查看相关文件中tempgroup的内容
[root@localhost etc]# grep tempgroup /etc/group /etc/gshadow
/etc/group:tempgroup:x:1002:
/etc/gshadow:tempgroup:!::
实例
## 将tempgroup的GID改为201,并将其名称改为 groupone
[root@localhost etc]# groupmod -g 201 -n groupone tempgroup
[root@localhost etc]# grep groupone /etc/group /etc/gshadow
/etc/group:groupone:x:201:
/etc/gshadow:groupone:!::
通常不建议随意的更改GID,容易造成系统资源紊乱。
[groupdel 群组名]
实例:
## 删除groupone群组
[root@localhost etc]# groupdel groupone
## 相关数据已不存在
[root@localhost etc]# grep groupone /etc/group /etc/gshadow
在删除所属群组的时候,必须要确认/etc/passwd内的账号没有任何人使用这个群组。
下面这个实例稍微有点复杂
## root用户创建testgroup组群
[root@localhost etc]# groupadd testgroup
## 给这个组群建一个密码
[root@localhost etc]# gpasswd testgroup
Changing the password for group testgroup
New Password:
Re-enter new password:
## root用户创建了两个用户,tom和jack,并分别设置密码
[root@localhost tom]# useradd tom
[root@localhost tom]# useradd jack
[root@localhost jack]# passwd tom
Changing password for user tom.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost jack]# passwd jack
Changing password for user jack.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
## root用户将tom用户设置为testgroup群组的管理员
[root@localhost etc]# gpasswd -A tom testgroup
[root@localhost etc]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1002:
/etc/gshadow:testgroup:$6$LRgbM/A9eOc$SjmcHox3ysfw3wKdUI/Zha/Rk7cVj4AL8OGL6zk.cBWFwLHIkXh9YpvH3HJtclhk9jZSu6oCkeFDWxKzzJz.60:tom:
##以tom用户身份登录系统(这个时候tom还没加入到群组)
[tom@localhost ~]$ id
uid=1002(tom) gid=1003(tom) groups=1003(tom) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
## tom将自己加入到testgroup中
[tom@localhost ~]$ gpasswd -a tom testgroup
Adding user tom to group testgroup
## tom将jack加入到testgroup中
[tom@localhost ~]$ gpasswd -a jack testgroup
Adding user jack to group testgroup
## 查看testgroup中的内容
[tom@localhost ~]$ grep testgroup /etc/group
testgroup:x:1002:tom,jack
## tom还可以修改testgroup的群组密码
[tom@localhost ~]$ gpassword testgroup
bash: gpassword: command not found...
[tom@localhost ~]$ gpasswd testgroup
Changing the password for group testgroup
New Password:
Re-enter new password:
简单小结了一下Linux中账号与群组的内容,对应《鸟哥的Linux私房菜》中13章的部分内容。后面会总结一下账号管理的一个具体实例,以及文件的特殊权限和ACL访问控制。