一 、基本概念
用户的引入:
茶杯喝水的案例---->喝自己的和喝别人的,用户是最底层的安全机制之一!
用户:通俗就是系统"使用者"的身份!
文件所有者:狭义的理解为文件的创造者(这个可以改变)------>应用隐私(秘密、情书等)
用户组:用户所属的团体(组)----->抱团取暖(社团、协会等)----->户口本(里面有许多成员)
组存在的意义?-->举例:去陌生人家里吃饭--->认了个干爹,就可以享福了!
答:开放权力,用户和组-->达到收放自如!
应用:团队开发时,可以资源共享,组内的成员可以互相修改对方的数据,但是其他组的成员无法修改和查看!
附加组:角色扮演(成年男性既是儿子也是父亲也是老师也是丈夫),说深一点(万花丛中过片叶不粘身)
###################################################################################
二 、户信息涉及到的系统配置文件(很重要,去理解里面的信息!)
(1)/etc/passwd ###用户信息
查看帮助信息:man 5 passwd
七个字段分析:
用户名:系统中的所以用户(包括系统用户和自定义的用户)
密码标示:x表示有密码(由于安全问题已经不用,用占位符表示),相应的信息转至"/etc/shadow"查看
用户id(uid--->u):id 为0的是超级用户,自定义用户id 从1000(含)之后增加-->/etc/login.defs配置文件中默认定义的!
用户组id(gid-->g):用户初始组id , 每个用户只能有一个初始组(一个人自成一组)!
注释(c):用户的描述信息(comment)
家目录(d):决定了用户登录之后进入的默认位置(ditrectory)
命令解释器(shell-->s):用户登录后{默认}的解释器shell,shell的种类理解为衣服的牌子(七匹狼、海澜之家等)!
#####################################################################
需求1:如何查看shell的合法种类呢?
操作:/etc/shells记录了当前用户能使用的shell的名字
思考1:系统中除了root和student用户之外还有很多其他用户?
说明:这些用户是系统用户,系统运行的后台进程用户(运行必备),不需要进行交互登陆(看用户对应的shell类型)!
问题:什么叫做交互? -->interactive(一问一答)
(2)/etc/shadow ###用户认证信息(主要是密码密文信息--用户密码策略文件)
特点:由若干个字段组成,字段之间用“:”隔开
九个字段分析:
1. 用户名:该密码对应的用户
2. 用户密码:相关说明
0. 如果是*表示系统账户,这个帐号并不会被用户用来登入;
- 如果为空,则对应用户没有密码口令,登录时不需要口令;
- 星号!代表用户帐号被锁定(usermod -L-->锁定);
- 双叹号!!表示这个密码已经被锁定(passwd -l锁定)
$6$
开头的,表明是用SHA-512加密(128位的密码串密文----->root、student);$1$
表明是用MD5加密;$2$
是用Blowfish加密;$5$
是用 SHA-256加密(默认采用-->/etc/login.def查看);
3. 更改密码的日期: 最后一次修改密码的时间,linux 下的时间戳表示
解释:表示的是从"某个时刻"起,到用户最后一次修改口令时的天数,时间起点对不同的系统可能不一样!
时间起点:以 1970 年 1 月 1 日作为第1 天
4. 最短有效期(密码不可被变动的天数):两次密码至少多长时间才可以修改!----->单位天
解释:两次密码修改的间隔时间,要过多少天才可以更改密码,默认是0,即不限制密码的有效期(随时随地修改)。
5. 密码最长有效期(密码到期的时间):密码的最长有效期,到时间会提醒更改密码,默认99999 可表示永久有效!
6. 警告时间:系统开始警告用户到用户密码正式失效(包括活跃期)之间的天数(倒计时),登录之后会有提示,单位为天!
7. 宽限时间(非活跃期):密码到期之后的宽限时间,0 表示立即失效,-1 表示永不失效, n 表示几天后失效,一般7天
理解:passwd -e user 使用户密码马上期满,使当前密码立刻过了inactive的时间,必须修改!
8. 账号失效时间:时间起点也是1970-01-01到期之后,账号彻底失效,无论密码策略是什么!
应用:这个栏位会被使用通常应该是在‘收费服务’的系统中
9. 保留字段
区别:一个帐号的期满与一个密码的期满
密码期满:用户登陆不能再使用这个密码登陆!
账户期满:该用户不被允许登陆了,该用户无法被使用了!
(3)/etc/group ###用户的所有组信息
组织结构:组名称:组密码:组id:附加组成员
组名:
组名是用户组的名称,由字母或数字构成;特点:与/etc/passwd中的登录名一致,组名不重复!
口令标示:
x表示有密码,密码在/etc/gshadow ---->存放的是用户组加密后的口令字。
组标识号(组id):
组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组,别称GID!
组内用户列表(当前组的用户):
属于这个组的所有用户列表,每个用户之间用","号分割;如果字段为空表示用户组为GID的用户名
(4)/etc/gshadow ###组认证信息
字段分析
1. 组名:保持一致
2. 组密码:SHA 512 加密后的密码串, 不常用,容易有安全漏洞(常为空)---->了解
3. 管理员(组长):组的管理员,管理员有密码之后,就可以对组内的用户进行管理(权限管理)---->有用处
4. 用户列表(小组成员): 组下包含的用户列表
(5)/home/username ###用户家目录
(6)/etc/skel/.* ###用户骨架文件
注意: /etc/skel/ 这个目录中的所有文件或目录在用户新建的过程中会被复制到用户的家目录里,这个目录中默认存在的隐藏文件是用户的默认配置文件!
补充:用户就是系统"使用者"的身份,在系统中用户存储为若干窜字符+若干个系统配置文件
########################
########2.用户管理#######
########################
0.用户自定义创建的原始过程-->了解useradd底层默认帮我们干的事情!
(1)改变/etc/passwd -->填写相应的信息
试图:切换该用户
提示错误信息:(1)不能创建该用户的家目录;
(2)不能找到该用户的初始用户组(同名);
(3)改变家目录的属性( chown 用户.用户组)
然后:切换用户 "su - westos"-->提示错误信息(-bash-4.2$)
原因:家目录中尚未有相应的环境等配置!
解决:将"/etc/skel/*"复制到当前用户的家目录中!
cp /etc/skel/* .
最后:退出当前用户,切换到root用户,去改变新创建用户的passwd!
信息:用户登陆界面有该用户
图略
1、用户建立(自定义一些信息)
语法:useradd 参数 用户名字
-u ##指定用户uid
-g ##创建用户的同时指定用户初始组信息(gid),这个组必须已经存在
-G ##指定附加组,这个组必须存在(对应的id)大G的理解,为表示区别用G表示附加的含义!
-c ##用户说明
-d ##用户家目录
-s ##用户所使用的shell,/etc/shells记录了用户能使用shell的名字
创建用户的过程:创建用户时默认会去读取/etc/login.defs的配置文件,如果自定义某些参数,以自定义为主!
补充:LInux密码过期的设置
2、用户删除
userdel -r 用户名称
说明:-r表示删除用户信息及该用户的系统配置(很重要!!!)
3、组的建立(见名知意)
groupadd -g 组名 ##建组
groupdel 组名 ##删组
做以上实验的监控命令:
watch -n 1 'tail -n 3 /etc/passwd /etc/group;echo ===;ls -l /home;echo ===;ls -l /mnt'
说明:每秒动态监控/etc/passwd 和/etc/group系统配置文件的后三行信息,并将输入的信息送往标准输出(控制台)!
4、用户id信息查看
id 参数 用户
-u ##用户uid
-g ##用户初始组id
-G ##用户所有组id(包括附加组)
-n ##显示名称而不是id数字
-a ##显示所有信息(默认--->不指定参数时)
测试:
5、用户信息更改(天赋固然重要,但后天努力更重要!)
usermod 参数 用户
-l ##更改用户名称(login_name)
-u ##更改uid
-g ##更改gid------> usermod -g gid 用户
-G ##更改附加组gid(特点:每次都会覆盖)
-aG ##添加附加组(特点:可以添加多个)
-c ##更改说明(注释)------> usermod -c '注释的内容' 指定用户
-d ##更改家目录(只是改变指向-->/etc/passwd的信息),并没有同步改变真实家目录的名字,需要加"m"
-s ##更改shell
-L ##冻结帐号(或者passwd -l)-->用户登陆(交互方式->用户名和密码登陆的方式已经不行了)
-U ##解锁
说明:以下测试仅仅对容易犯错,概念不清的做了相应的测试!
测试1:附加组
测试2:改变用户的家目录!
测试3:用户密码冻结的问题
说明:passwd -l 冻结强度要比usermod -U 冻结强度高(一个!与两个!!)
6、小结
1. 用户组密码配置文件不常用,设置组密码容易出现安全漏洞!
2. 没有设置密码的用户,不能远程登录(免密认证的可以)!
3. 锁定用户:只需在passwd 文件中密码位前添加一个!即可
4. 每个用户创建的时候,都会创建一个与其同名的用户组,并作为此用户的初始组!
5. 查看用户的初始组:passwd查看初始组id, group 中查看组名称!
##################################################################################
######################
####3.用户权力下放####
######################
说明:普通用户本身没有权限去创建一个用户
需求:在系统中超级用户(权力的掌控者)可以下放普通用户不能执行的操作(rwx)给普通用户->使之成为vip用户(较普通用户而言)
sudo:翻译-->superuser do
下放权力配置文件:/etc/sudoers
2.下放权力的方法
首先超级用户(root)必须先执行visudo------>会再进入编辑/etc/sudoers模式(语法校验);注意:不是直接 vim /etc/sudoers
例如:查看创建用户命令(二进制文件)的信息:
-rwxr-x---. 1 root root 118152 Jun 28 2016 /usr/sbin/useradd
格式:获得权限用户 主机名称=(获得到的用户身份) 命令
执行过程----> :set nu---->:99---->I编辑模式---->test desktop0.example.com=(root) /usr/sbin/useradd
解释:test用户(待执行命令用户)能在主机名为desktop0.example.com的主机上以超级用户身份执行/usr/sbin/useradd这条命令
3.执行下放权限命令
测试:切换到test用户(ctrl+d或者exit)--->sudo(表明是以超级用户的权限去读取配置文件) 命令(useradd ) 用户
#######################需求引入##########################
需求1:普通用户可以调用系统命令useradd来创建用户
设置:root用户在/etc/sudoers中设置如下:
注意:语法格式的书写
注意:阴影部分与上面部分的对比!
说明:会去读取配置文件的信息(验证),如果第一次执行sudo需要输入当前用户密码,以后不需要了!
进一步:无密码登陆(普通用户的密码)
student foundation10.ilt.example.com=(root) NOPASSWD: /usr/sbin/useradd
注意:语法的书写形式,若有多个命令则以逗号","作为分隔符!
思考:仅仅是赋予一些命令执行的权限吗?(更高级的用法)
注意:vim与visudo的结合(tee)
############################
####4.用户认证信息的控制####
############################
说明:两种方式来修改密码的相关信息
小注:个人更倾向于passwd,通过参数见微知著!
方式1:passwd -->普通用户和超级用户
passwd的参数说明===>以在/etc/shadow出现的先后顺序来说明
===>root可用
-d:delete---->删除用户的密码(root);
-e:expire---->用户一登陆就必须改变密码(安全级别最高),动态变更密码!
说明:expire(期满的含义)-->着重理解这个!
-n:min------->改变最短有效期(在这期间不能改密码)-->默认是0表示随时随地的可以改变密码
-x:max------->改变最长有效期
-w:warning--->改变警告期
-i:inactive-->改变非活跃期
-S:status---->查看密码的状态信息(LK、PS的含义)
===>普通用户也可以用
-l:锁住密码
-u:解开已上锁的帐号-->特别:对于没有设置密码的用户可以结合f选项,使密码为空!
1)root用户
后续:删除用户的过程中用户正在被进程占用的处理办法!
userdel -r user
提示信息:用户被占用的进称号
措施:kill -9 进称号
userdel -r user
2)普通用户hello
注意:密码的位数和复杂性--->内核有自己的判别方式(至少七位,且有大小写和字符组成)!
补充:其它参数的测试略过,核心是理解密码的几个参数的含义,进而来理解passwd的参数的含义
###################################分割线###################################
方式2:chage的参数说明
chage 参数 用户
-d ##用户密码组后一次修改的时间,如果设定成"0",用户登陆系统后必须修改自己的密码(级别最高)
-m ##最短有效期(单位是天)-->min
-M ##最长有效期-->Max(大写)
-W ##警告期-->Warning(大写)
-I ##用户非活跃天数-->Inactive(大写)
-E ##帐号到期日格式 -E "YYYY-MM-DD"-->End(大写)-->passw没有此项功能!
注意:chage -E 0 user -->(0表示立即生效),禁止用户登陆,ssh即使该用户免密也不行,区别于passwd -l!
图略(重在理解密码的相应参数的含义)
############################
####5.root密码忘记####
############################
操作步骤:
1.重新启动系统(虚拟机的话双击----真机则开关键)-----注意:如果是
2.在系统启动阶段按上下健(方向)停止系统系统引导
3.选择启动引导标题(下面有提示),按“E(e)”进行编辑
4.光标移动找到linux16引导条目这一行,end跳到行末尾,从这行最后删除到ro选项,并把ro改为"rw空格rd.break"选项
5.ctrl+x启动设定过后的系统引导条目(下面有提示)
6.进入系统后执行chroot /sysroot切换到真实的系统环境------>which whoami(判断当前的用户--->非必须)
7.键入paswd----->提示修改密码----->两次键入密码----passwd root修改超级用户(root)密码
8.建立文件 "touch /.autorelabel"让系统从新扫描所有文件(很重要)
9.exit两次使系统自动重新启动
补充:系统会开始去加载文件,以百分比的形式显示进度,剩下的就是测试了!