Liunx学习总结(三)--用户和用户组管理

用户和组的基本概念

用户和组是操作系统中一种身份认证资源。

每个用户都有用户名、用户的唯一编号 uid(user id)、所属组及其默认的 shell,可能还有密码、家目录、附属组、注释信息等。

每个组也有自己的名称、组唯一编号 gid(group id)。一般来说,gid 和 uid 是可以不相同的,但基本上约定俗成绝大多数都会让它们保持一致。

组分为主组 (primary group) 和辅助组 (secondary group) 两种,用户一定会属于某个主组,也可以同时加入多个辅助组。

用户组分类

* 系统管理员

具有使用系统所有权限的用户, 其 UID 为 0,默认名称为 root。因为 uid 默认具有唯一性,所以超级管理员默认只能有一个 (如何添加额外的超级管理员,见下文)。

* 普通用户

即一般用户,其使用系统的权限受限, 默认只能执行 /bin、/usr/bin、/usr/local/bin 和自己目录下的命令。尽管普通用户权限受到限制,但是它对自己目录下的文件是有所有权限的。其 UID 为 500-60000 之间。

* 系统用户

保障系统运行的用户,一般不提供密码登录系统, 其 UID 为 1-499 之间。

相关配置文件

1) /etc/passwd

/etc/passwd 文件存放系统用户配置,记录用户的基本属性,对所有用户来说都是可读的。每一行记录对应一个用户,属性以冒号间隔,格式如下:

用户名: 口令: 用户标识号: 组标识号: 注释性描述: 主目录: 默认 shell 

实例:

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

注:

  • 第二列默认都为 x 。在以前老版本的系统上,第二列是存放用户密码的,但是密码和用户信息放在一起不便于管理 (密钥要保证其特殊属性),所以后来将密码单独放在另一个文件 /etc/shadow 中,这里就都写成 x 了。
  • 用户的默认 shell 表示的是用户登录 (如果允许登录) 时的环境或执行的命令。例如 shell 为 /bin/bash 时,表示登录时就执行 /bin/bash 命令进入 bash 环境;shell 为 /sbin/nologin 表示该用户不能登录,之所以不能登录不是因为指定了这个特殊的程序,而是由 /sbin/nologin 这个程序的功能实现的,假如修改 Linux 的源代码,将 /sbin/nologin 这个程序变成可登录,那么 shell 为 /sbin/nologin 时也是可以登录的。

2) /etc/shadow

/etc/shadow 文件存放用户密码信息。该文件具有特殊属性,除了超级管理员,任何人都不能直接读取和修改该文件,而用户自身之所以能修改密码,则是因为该文件的 suid 属性,使得修改密码时临时提升为 root 权限。

文件类似于 passwd,也是每一行记录代表一个用户,格式如下:

实例:

root:$1$isNMgfFT$Xs7zD53r4EWLSPpxw5lhz0:17742:0:99999:7:::
bin:*:17110:0:99999:7:::
    1. 用户名
    1. 加密后的密码
  • 3)上次更改密码时间距 1970 年 1 月 1 日的天数。
  • 4)密码更改后,不可以更改的天数。
  • 5)密码更改后,必须再次更改的天数(即密码的有效期)。
  • 6)密码过期之前提前多少天提醒用户(在正确登录时)。
  • 7)密码过期之后多少天帐户过期(在正确登录时)。
  • 8)帐户过期时间(自 1970-1-1 到该天经过了多少天来表示)。
  • 9)保留字段。

注:第二列还有其他含义:

  • 该列留空,即 "::",表示该用户没有密码。
  • 该列为 "!",即 ":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如 ssh key 的方式,su 的方式。
  • 该列为 "",即"::",也表示该用户被锁,和"!" 效果是一样的。
  • 该列以 "!" 或 "!!" 开头,则也表示该用户被锁。
  • 该列为 "!!",即 ":!!:",表示该用户从来没设置过密码。
  • 如果格式为 "\(id\)salt\(hashed",则表示该用户密码正常。其中 \)id$ 的 id 表示密码的加密算法,\(1\)表示使用 MD5 算法,\(2a\)表示使用 Blowfish 算法,"\(2y\)"是另一算法长度的 Blowfish,"\(5\)"表示 SHA-256 算法,而"\(6\)" 表示 SHA-512 算法,可见上面的结果中都是使用 sha-512 算法的。\(5\)\(6\)这两种算法的破解难度远高于 MD5。\(salt\)是加密时使用的 salt,$hashed 才是真正的密码部分。

3) /etc/group

/etc/group 文件是用户组群的主要配置文件,内容包括用户组群的名称、GID 等信息,并且能显示出用户是归属于哪一个或者哪几个组群。每一行表示一个组群账户的信息,每一行有 4 段,每段之间用“:”分隔开:

groupname :passwd : GID : userlist
  • groupname: 组名
  • passwd: 密码位, 统一表示为“x”
  • GID:
    * CentOS6 为系统组预留 1-499;可以通过 /etc/login.defs 文件查看 GID 的最大和最小值
    * CentOS7 为系统组预留 1-999;可以通过 /etc/login.defs 文件查看 GID 的最大和最小值
  • 以当前组为附加组的用户列表(分隔符为逗号):
    * 当成员先把该组当作辅助组,再转成主要组时,用户列表不改变。
    * 当成员离开该组时,用户列表被删除。

4) /etc/gshadow

/etc/gshadow 是 /etc/group 的加密文件,用户组群的管理密码就存放在这个文件中。 /etc/gshadow 文件中每一行记录一个用户组群信息,每一行有 4 段,每段之间用“:”分隔开。文件格式如下:

  • groupname: 组名
  • 密码位
  • 组管理员列表:
    * 只能由 root 任命或撤销,可以同时有多名,以, 为间隔;
    * 权利:可以修改组密码,可以将用户从该组(辅助组)当中添加或删除。
  • 以当前组作为附加组的成员列表(以逗号为分隔符):
    * 当成员先把该组当作附加组,再转成主要组时,成员列表不改变;
    * 当成员离开该组时,成员列表被删除。

5) /etc/skel/*

/etc/skel/* 该目录下的所有文件都是隐藏文件,用来存放新用户配置文件的目录,当新用户被创建时,该目录下的文件会被自动地复制到新用户的家目录下。通过修改、添加、删除 /etc/skel 目录下的文件,可为新创建的用户提供统一的、标准的、初始化用户环境。若用户家目录下的配置文件发生故障时,将 /etc/skel 目录下相应的文件复制到用户家目录下即可。

6)/etc/login.defs

用来定义创建一个用户时的默认设置,比如创建邮箱、分配权限、指定用户的 UID 和 GID 的范围,用户的过期时间、是否需要创建用户主目录等等。

7)/etc/default/useradd

创建用户时的默认配置。useradd -D 修改的就是此文件。

# useradd defaults file
GROUP=100       # 在 useradd 使用 -N 或 /etc/login.defs 中 USERGROUPS_ENAB=no 时表示创建用户时不创建同用户名的主组 (primary group),
                # 此时新建的用户将默认以此组为主组,网上关于该设置的很多说明都是错的,具体可看 man useradd 的 -g 选项或 useradd -D 的 -g 选项
HOME=/home      # 把用户的家目录建在 /home 中
INACTIVE=-1     # 是否启用帐号过期设置 (是帐号过期不是密码过期),-1 表示不启用
EXPIRE=         # 帐号过期时间,不设置表示不启用
SHELL=/bin/bash # 新建用户默认的 shell 类型
SKEL=/etc/skel  # 指定骨架目录,前文的 /etc/skel 就在这里
CREATE_MAIL_SPOOL=yes  # 是否创建用户 mail 缓冲

用户管理命令

1) 新建用户账号

语法格式
useradd 选项 用户名

选项:

-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用 -m 选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell 文件 指定用户的登录 Shell。
-u 用户号 指定用户的用户号,如果同时有 -o 选项,则可以重复使用其他用户的标识号。

用户名:

指定新账号的登录名。
实例
useradd -d /usr/marklogzhu -m marklogzhu

此命令创建了一个用户 marklogzhu ,其中 -d 和 -m 选项用来为登录名 marklogzhu 产生一个主目录 /usr/marklogzhu(/usr 为默认的用户主目录所在的父目录)。

2) 修改用户账号

语法格式
usermod 选项 用户名

选项:

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。另外,有些系统可以使用选项:-l 新用户名,这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
实例
 usermod  -l  新用户名  -d  /usr/新用户名  -m  老用户名  

3) 删除用户账号

语法格式
userdel 选项 用户名

常用的选项是 -r,它的作用是把用户的主目录一起删除。

实例
userdel -r newmarklogzhu

4) 用户口令

用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。

指定和修改用户口令的 Shell 命令是 passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。命令的格式为:

passwd 选项 用户名

选项:

-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。
实例

实例 1:指定自己的口令

[root@VM_0_15_centos usr]# passwd
Changing password for user root.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

实例 2:超级管理员指定其他用户的口令

[root@VM_0_15_centos usr]# passwd marklogzhu
Changing password for user marklogzhu.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

用户组管理命令

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同 Linux 系统对用户组的规定有所不同,如 Linux 下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对 /etc/group 文件的更新。

1) 新增用户组

语法格式
groupadd 选项 用户组

选项:

-g GID 指定新用户组的组标识号(GID)。
-o 一般与 -g 选项同时使用,表示新用户组的 GID 可以与系统已有用户组的 GID 相同。
实例
 groupadd group1

新增加一个用户组 group1,新组的组标识号是在当前已有的最大组标识号的基础上加 1。

2)删除用户组

语法格式
groupdel 用户组
实例
groupdel group1

3)修改用户组

语法格式
groupmod 选项 用户组

选项:

-g GID 为用户组指定新的组标识号。
-o 与 -g 选项同时使用,用户组的新 GID 可以与系统已有用户组的 GID 相同。
-n 新用户组 将用户组的名字改为新名字
实例

将组 group2 的标识号改为 10000,组名修改为 group3。

 groupmod –g 10000 -n group3 group2

4) 切换用户组

一个用户可以同时属于多个用户组,用户可以在用户组之间切换,以便具有其他用户组的权限。

语法格式
newgrp  用户组
实例

切换当前用户到 root 组。

newgrp root

常用命令

1) 显示当前登陆用户

users

2) id

id 选项 用户名

选项:

-u:得到 uid
-n:得到用户名而不是 uid
-z:无任何空白字符输出模式,不能在默认的格式下使用。

3) 查看最近登陆用户

last 选项

选项:

-n:显示记录数

其实查看的是 /var/log/wtmp 文件。

4) 查看登陆失败用户

lastb 选项

选项:

-n:显示记录数

5) 切换用户或以指定用户运行命令

语法格式
su(选项) 要切换身份的用户

选项:

-c< 指令 > 或 --command=< 指令 >:执行完指定的指令后,即恢复原来的身份;
-f 或——fast:适用于 csh 与 tsch,使 shell 不用去读取启动文件;
-l 或——login:改变身份时,也同时变更工作目录,以及 HOME,SHELL,USER,logname。此外,也会变更 PATH 变量;
-m,-p 或 --preserve-environment:变更身份时,不要变更环境变量;
-s<shell> 或 --shell=<shell>:指定要执行的 shell;
--help:显示帮助;
--version;显示版本信息。
实例

变更帐号为 root 并在执行 ls 指令后退出,变回原使用者。

su -c ls root

6) 提权操作

有时候需要 root 权限,但是又不想将 root 账号告知,面对这种场景就可以使用提权操作, 以其他人的身份执行。

语法格式
sudo (选项) (参数)

选项:

-b:在后台执行指令;
-h:显示帮助;
-H:将 HOME 环境变量设为新身份的 HOME 环境变量;
-k:结束密码的有效期限,也就是下次再执行 sudo 时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s<shell>:执行指定的 shell;
-u< 用户 >:以指定的用户作为新的身份。若不加上此参数,则预设以 root 作为新的身份;
-v:延长密码有效期限 5 分钟;
-V :显示版本信息。

参数:

指令:需要运行的指令和对应的参数。

配置 sudo 必须通过编辑 /etc/sudoers 文件,而且只有超级用户才可以修改它,还必须使用 visudo 编辑。之所以使用 visudo 有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用 visudo 来检查一下语法。

实例

增加 marklogzhu 账号 sudo 权限

1)进入 sudoers 文件: vim /etc/sudoers
2)找到 root ALL=(ALL) ALL ,在下面新增 marklogzhu ALL=(ALL) ALL

我们知道 etc/shadow 文件是只有管理员可以查看的,我们试下没有提权时能否查看:

[marklogzhu@VM_0_15_centos /]$ cat etc/shadow
cat: etc/shadow: Permission denied

提示没有权限,我们试下提权:

[marklogzhu@VM_0_15_centos /]$ sudo !!
sudo cat etc/shadow

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

<span class="hljs-comment">#1) Respect the privacy of others.</span>
<span class="hljs-comment">#2) Think before you type.</span>
<span class="hljs-comment">#3) With great power comes great responsibility.</span>

[sudo] password for marklogzhu:
root:$1$L0j6SBPg$39oiYVrzXev1FXOWqQAqm/:17758:0:99999:7:::
bin:*:17110:0:99999:7:::

发现可以查看数据了!
注:!! 表示重复上一条命令