用户和组的基本概念
用户和组是操作系统中一种身份认证资源。
每个用户都有用户名、用户的唯一编号 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:::
- 用户名
- 加密后的密码
- 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:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for marklogzhu:
root:$1$L0j6SBPg$39oiYVrzXev1FXOWqQAqm/:17758:0:99999:7:::
bin:*:17110:0:99999:7:::
发现可以查看数据了!
注:!! 表示重复上一条命令