主机安全入门【1】- Linux用户和组

简介: 深入浅出介绍linux的用户,群组的概念

user,goup和other概念

linux是一个多用户共享系统,同时可能有多个用户在使用操作系统。用户(user),群组(group)和其他人(other)概念是为了将系统的资源进行隔离,比如文件、设备、目录等,由于在linux中一切皆文件,所以也可以说为了将文件进行隔离。

  • user是一个独立的资源拥有单元,用户可以自定义自己文件的权限。
  • group是多个用户组成的一个群体,可以对某个文件进行统一授权,当然也可以对每个用户逐一进行授权,但是当用户量不断增加时用group授权是一个更高效的方式。
  • other即group内用户以外的用户。也可以针对other来设置权限。
    用户和组之间是多对多的关系,一个用户可以添加到多个组中,其中只有一个初始组,其他都是附加组。一个组包含多个用户。
    root用户是一个特殊的user,即管理员,它拥有所有文件的访问和操作权限。

/etc/passwd和/etc/shadow文件

默认情况下,linux系统的用户信息都记录在/etc/passwd文件中,与之匹配的还要/etc/shadow文件用来存用户密码的hash值。

/etc/passwd一般是所有用户可读,root可写,/etc/shadow文件一般是root用户可读写,root组用户可读,其他用户无权限。这样设置权限的目的是为了对所有用户暴露用户列表,但是隐藏用户密码hash,防止其他用户读取到root密码hash之后用暴力破解(暴破)的方式获取root密码。

debian1@debian1:~$ ls -l /etc/passwd
-rw-r--r-- 1 root root 2247  5月  4 22:32 /etc/passwd
debian1@debian1:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1262  5月  4 22:32 /etc/shadow

/etc/passwd

以下是我的debian虚拟机上的/etc/passwd文件的部分内容

debian1@debian1:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash     # root用户
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...... #省略部分内容
Debian-gdm:x:116:124:Gnome Display Manager:/var/lib/gdm3:/bin/false
debian1:x:1000:1000:debian1,,,:/home/debian1:/bin/bash
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
sshd:x:117:65534::/run/sshd:/usr/sbin/nologin
mysql:x:118:125:MySQL Server,,,:/nonexistent:/bin/false

文件中每一行表示一个用户,以":"分割为7个字段,每个字段从前往后分别表示:(以root用户为例)

root:x:0:0:root:/root:/bin/bash
  • 用户名:root
  • 密码的hash:x表示密码的hash存储在/etc/shadow文件中
  • UID:0为root用户ID
  • GID:0为root组ID
  • 描述:root
  • home目录:root用户的home目录为/root
  • bash路径:root用户的bash使用的是/bin/bash

UID具有一定的规划,0为root用户ID,1~999(centos7以前是1~499)为伪用户ID,供系统使用,>=1000为普通用户ID。
系统是以UID而不是用户名来识别用户的,所以root不一定是管理员,UID为0的才是,可以将一个普通用户的UID改为0,这样它就成为了管理员。

/etc/shadow

以下是我的debian虚拟机上的/etc/shadow文件的部分内容,可以看到,普通用户没有权限查看改文件内容,需要提权才行

debian1@debian1:~$ cat /etc/shadow
cat: /etc/shadow: 权限不够
debian1@debian1:~$ sudo cat /etc/shadow
[sudo] debian1 的密码:
root:{
   mathJaxContainer[0]}j9T{
   mathJaxContainer[1]}gMhkN6auOSJlGx330vc2Yr0AoBhUcKoMor5glF81nh1:19348:0:99999:7:::
daemon:*:19348:0:99999:7:::
......  # 省略部分内容
debian1:{
   mathJaxContainer[2]}j9T{
   mathJaxContainer[3]}BVJ8oXeFst4i6jfNF7mAiXxhzJYa6FFDjEY.BmwRuk3:19348:0:99999:7:::
systemd-coredump:!*:19348::::::
sshd:*:19481:0:99999:7:::
mysql:!:19481:0:99999:7:::

每一行表示一个用户密码信息,以":"分割为9个字段,它们的含义分别如下(摘自:c语言中文网):

  • 用户名:同 /etc/passwd 文件的用户名有相同的含义。
  • 加密密码:这里保存的是真正加密的密码。

    目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。
    所有伪用户的密码都是"!!"或"※",代表没有密码,是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!",代表这个用户没有密码,不能登录。

  • 最后一次修改时间:此字段表示最后一次修改密码的时间

    可是,为什么 root 用户显示的是 15775 呢?
    这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 15775 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 15775 天修改的 root 用户密码。
    那么,到底 15775 代表的是哪一天呢?可以使用如下命令进行换算:

    [root@localhost ~]# date -d "1970-01-01 15775 days"
    2013年03月11日 星期一 00:00:00 CST
    

    可以看到,通过以上命令,即可将其换算为我们习惯的系统日期。

  • 最小修改时间间隔:该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
  • 密码有效期:经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。

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

  • 密码需要变更前的警告天数:表示当账户密码有效期快到时,系统发出警告信息提前的天数。

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

  • 密码过期后的宽限天数:也称为“口令失效日”,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。0表示立即失效,-1表示用用不失效。
  • 账号失效时间:同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!该字段通常被使用在具有收费服务的系统中。
  • 保留:这个字段目前没有使用,等待新功能的加入。

/etc/group和/etc/gshadow文件

与用户信息类似,linux系统的group信息保存在/etc/group和/etc/gshadow两个文件中。

/etc/group

以下是我debian虚拟机中/etc/group文件的部分内容

debian1@debian1:~$ cat /etc/group
root:x:0:
daemon:x:1:
...... #省略部分内容
scanner:x:120:saned,debian1
Debian-gdm:x:124:
debian1:x:1000:
systemd-coredump:x:999:
mysql:x:125:

每一行表示一个group,用":"分割为4个字段,它们分别表示:

  • 组名:root
  • 组密码:x表示密码存储在/etc/gshadow文件中。

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

  • 组ID:root组的ID为0

  • 组中的用户:表示以此group为附加组的用户名列表,用逗号分割。

由于目前我们很少为组设置密码,所以/etc/gshadow很少使用,这里不记录了。

user和group操作

命令详细用法可以参考:C语言中文网

使用useradd添加用户

添加用户时若没有指定组,会自动添加同名的组,并将改组作为该用户的初始组。

root@debian1:~# useradd lx
root@debian1:~# cat /etc/passwd | grep lx
lx:x:1001:1001::/home/lx:/bin/sh

在执行useradd命令时提示"bash:useradd:command not found",通过su root切换到root用户也不行,但是通过su -切换之后却能执行,sudo也能正常执行,一番查询后发现,useradd命令在/usr/sbin下,然而根据/etc/profile的定义,在普通用户启动shell时,不会将/usr/sbin加入到PATH中,只有当root启动shell是才会加入,而su root只会提权,不会重新加载root的profile,需要手动加载source /etc/profilesudosudo -isu -都会自动重新加载profile所以能找到命令。
image.png

通过passwd命令修改用户密码

前面在介绍/etc/passwd文件时提到过,如果用户没有设置密码,是不能登录的。

root@debian1:~# passwd lx
新的 密码:
重新输入新的 密码:
passwd:已成功更新密码

使用userdel删除用户

home目录需要手动删除,也可以通过-r选项自动删除。

root@debian1:~# userdel lx
root@debian1:~# cat /etc/passwd | grep lx
root@debian1:~# rm -rf /home/lx

使用groupadd添加组

root@debian1:~# groupadd test
root@debian1:~# cat /etc/group | grep test
test:x:1001:

使用usermod -G添加用户的附加组

也可以用-g选项来修改用户的初始组。可以通过查看/etc/group文件来查看群组下的用户

root@debian1:~# usermod -G test lx
root@debian1:~# cat /etc/group | grep test
test:x:1003:lx

通过groupdel命令删除组

root@debian1:~# groupdel test

gpasswd命令添加或删除用户

root@debian1:~# gpasswd -a lx test
正在将用户“lx”加入到“test”组中
root@debian1:~# gpasswd -d lx test
正在将用户“lx”从“test”组中删除

通过groups命令查看当前用户所属的组

root@debian1:~# su lx
$ groups
lx test

通过id命令查看用户id

root@debian1:~# id
用户id=0(root) 组id=0(root)=0(root)

su切换当前用户

普通用户切换到其他用户需要知道对方密码,root切换到普通用户无需密码。

  • su -l user: 切换到user并同时切换用户环境(包括PATH,MAIL等)
  • su user:只切换用户,不切换用户环境
  • su -:与su -l root一致
  • su -l root -c "ls":仅切换用户执行一次命令再自动切换回来,-c后加要执行的命令。

whoami查看当前用户


root@debian1:~# whoami
root
相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
18天前
|
Linux Shell
Linux系统文件默认权限
Linux系统文件默认权限
34 2
|
2月前
|
存储 Ubuntu Linux
在Linux中,如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配置文件?
在Linux中,如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配置文件?
|
1月前
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
201 73
|
12天前
|
Linux 网络安全
Linux虚拟机与主机和Xshell的连接问题解决
Linux虚拟机与主机和Xshell的连接问题解决
31 1
|
24天前
|
运维 监控 安全
Linux_权限理解(详细PLUS)
【10月更文挑战第3天】本文介绍了Linux系统中的权限管理基础,包括文件系统对象与权限关联、权限的继承性、字符与数字表示法的解读,以及用户、组与权限的动态交互。详细解析了`chmod`命令的高级用法和权限修改的风险,探讨了SUID、SGID和Sticky Bit等特殊权限的作用机制,并提出了基于角色的权限分配和定期权限审计的最佳实践。
45 11
|
17天前
|
机器学习/深度学习 Linux 编译器
Linux入门3——vim的简单使用
Linux入门3——vim的简单使用
43 1
|
17天前
|
运维 网络协议 安全
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
27 1
|
17天前
|
Linux Shell Windows
Linux入门1——初识Linux指令
Linux入门1——初识Linux指令
23 0
Linux入门1——初识Linux指令
|
9天前
|
安全 搜索推荐 Ubuntu
|
13天前
|
存储 数据可视化 Linux
Linux 基础入门
Linux 基础入门