用户、密码的作用:认证,授权,审计

  • authentication:认证

  • authorization:授权

  • accouting/audition:审计

 

认证方式:

  • 用户+密码,需要对用户身份进行区分,不同用户分配不同的资源

  • 只有密码,应用于不需要区分用户身份的场景

 

1、用户

linux系统是一个多用户的系统,同一个账号可以多次同时登陆

运行命令,命令会拿着当前用户的身份去访问相应的资源

 

1.1、用户类型

  • 超级管理员,root

  • 普通用户,除root用户外的用户

 

普通用户又分2类:

  • 系统用户,服务和内核态进程对应的用户,可以通过ps -ef 查看,比如:ps -ef |grep httpd,可以看到httpd有一个系统用户,叫apache

  • 登录用户,交互式登陆

 

1.2、UID

系统通过UID去区分用户,不是用户名,每一个用户都有一个唯一的标识

  • 0,超级管理员,可以用id root查看

  • 1-999,系统账号,保留给服务使用的,一般不可登陆。在rhel7之前是1-499

  • 1-200,由系统自动分配

  • 201-999,如果使用者有系统账号的需求时,可使用的范围

  • 1000-60000,一般用于useradd命令添加的用户,可登陆用户,rhel7之前是500-60000

 

定义文件:/etc/login.defs

 

1.3、用户信息存在哪儿

cat /etc/passwd 

保存的用户信息,每个用户一行,以冒号分隔成7列:

  • 用户名

  • 都是x,这是之前的密码保存位置,不安全,所以后来把密码分开存放

  • 用户的UID

  • GID,组ID,这个用户的主要组ID,一个用户只能属于一个主组,但可以属于多个附加组

  • 这个用户的描述信息,可以用usermod -c “adfasdf” tt 为用户tt添加描述信息

  • 用户的家目录,创建时,会复制/etc/skel/目录下所有的文件到用户的家目录

  • 该用户的shell类型,默认shell,是在/etc/default/useradd中定义的SHELL变量

 

1.4、密码存在哪儿

cat /etc/shadow 

以冒号分隔成9列:

  • 用户名

  • 加密后的密码,如果此处是两个叹号(!!),第1个叹号,表示用户被锁定;第2个叹号,表示这个用户没有设置密码。linux默认是禁止空密码登陆的。

  • 上次更改密码的日期,这个时间是从1970年1月1日算起

  • 最短密码期限,从最近一次更改密码的日期算起,再过多少天之后才能再次更改密码,0表示无最短期限,随时可以改

  • 最长密码期限,必须在这个期限内更改密码,否则过了这个期限,密码将过期

  • 密码警告期限,密码过期前多少天开始提醒用户更改密码,0表示不提醒

  • 密码过期之后的宽限天数,也就是说,密码已经过期之后,在这个期限内,登陆的时候,必须改密码,才能登陆。

  • 账号到期时间,也是从1970年1月1日算起

  • 保留

 

关于密码加密:

  • 单向加密,提取数据的指纹,内容一样,指纹也一样,rhel5用md5加密,rhel6,7使用sha加密

  • 为了保证相同的密码,加密结果不一样,默认会在密码后面加上杂质,再进行加密

  • 加密后的密码,用$作为分隔符,$6,表示使用sha512sum加密,第二个$后面,就是加的杂质,第三个$后面,就是加密后的指纹。

 

#md5加密,固定长度128bit,已经出现破解

md5sum redhat

 

#sha加密,1版本,默认160bit,暂无破解

sha1sum redhat

 

#锁定这个用户密码,会在hash值之前多两个!,这时除了root用户,在其它用户下去用这个用户去登陆,就不允许登陆,因为PAM模块规定了,当root用户切换到其它用户时,不需要验证密码,而普通用户需要

passwd -l tt

 

#解锁

passwd -u tt 

 

1.5、PAM

    Linux系统中的身份认证方式是多种多样的。一般来说,可以分为服务程序身份认证和专门系统身份认证。其中,服务程序身份认证包括:login服务程序、ftp服务程序,telnet服务程序、ssh服务程序等;专门系统身份认证包括:传统UNIX认证、NIS认证、NIS+认证、Kerberos认证等。

    PAM最大的特点是实现了服务程序和认证机制的分离,它采用模块化设计和插件功能,使得我们可以轻易地在应用程序中插入新的鉴别模块或替换原先的组件,而不必对应用程序做任何修改,从而使软件的定制、维持和升级更加轻松--因为鉴别机制与应用程序之间相对独立。

 

PAM验证登陆过程:

  • login程序接收到用户输入的账号密码,要对它们进行认证

  • login程序将此信息交给PAM去作认证

  • PAM认证通过,告诉login程序,这人可以登陆

  • login程序允许登陆

 

1.6、命令行更改密码过期时间

#更改user1的密码策略

#1天之内不能修改密码,10天之后密码到期,密码到期前7天提醒,宽限17天

#如果要改默认值,可以到/etc/login.defs里修改

chage -m 1 -M 10 -W 7 -I 17 user1

 

 

cat /etc/shadow

tt:!!:16942:1:10:7:17::

 

1.7、useradd 创建用户

  • -c 添加描述信息

  • -g 指定主要组

  • -G 指定附属组

  • -d 指定家目录

  • -D 更改默认值,实际就是在改/etc/default/useradd中的变量值。

    比如:useradd -D -s /bin/tcsh,将创建用户时的默认shell,改成了tcsh。

  • -s 指定shell

  • -u 指定UID,注意,只能使用1000以上,并且不能和其它UID冲突

 

1.8、usermod 更改用户信息

  • -g 更改主要组

  • -G 更改附属组,如果之前已经指定过附属组,会把该用户从之前附属组中删除

  • -a 和-G结合使用,不删除之前的组,如果要加入多个组,用空格隔开

  • -d 更改用户的家目录,但不会将旧家目录中的文件移过去。

  • -m 和-d结合使用,更改家目录时,文件一起移过去

  • -s 更改用户的shell

  • -L 锁定用户账号

  • -U 解锁用户账号

 

#切换用户user1的shell

chsh user1

 

1.9、userdel 删除一个用户

#同时删除用户和家目录,如果不加这个选项,只删除用户,而家目录还在

userdel -r user1

 

#显示用户信息

id 

 

#显示user1的ID,主要组ID,所有组ID

id user1

 

#只显示用户ID

id -u user1

 

1.10、修改用户密码

#更改当前用户的密码

passwd

  • -d,删除用户密码

  • -l,锁定用户

  • -u,解锁用户

  • -n,指定密码最短有效期

  • -x,指定密码最长有效期

  • -w,指定提前多少天警告

  • -i,宽限期

 

#更改user1这个用户的密码,但这种方式只有root才有权限

passwd user1

 

#从标准输入接受用户密码

echo redhat |passwd --stdin sam

 

#检查密码文件的完整性

pwck

 

1.11、批量修改用户密码

#chpasswd,从标准输入读取用户名和密码,来修改用户密码

echo user1:redhat | chpasswd 

 

#将用户密码按格式写到一个文件

vi user.txt

user1:redhat

user2:redhat

 

chpasswd < user.txt

 

2、组

一个用户有两种组:

  • 主要组(基本组),一般和用户名一样,且只包含一个用户

  • 附加组(属组),一个用户可以属于多个属组

     

#组信息配置文件

vim /etc/gropu

  • 组名:组密码:GID:以当前组为附加组的用户(多个用户,用逗号分隔)

 

#组密码文件

vim /etc/gshadow

 

创建用户时,会自动创建一个和用户名一样的用户组

groupadd

  • -g 指定GID,注意,1000以上,不能冲突

 

groupmod

  • -n 更改用户组名称

 

#删除一个用户组

groupdel

 

gpasswd

  • 默认,设置组密码

  • -a 添加用户到组

  • -d 从组中删除用户

 

#查看user1这个用户的主要组ID

id -g user1

 

#查看user1这个用户的属组ID

id -G user1

 

#查看user1这个用户的主要组名称

id -g -n user1

 

#查看user1这个用户的所有属组名称

id -G -n user1

 

3、切换用户

#非登陆式切换,不会切换当前工作路径,就不会去读取用户家目录下的环境变量文件

su user1

 

#登陆式切换,会切换到用户的家目录,并且读取用户家目录下的环境变量文件

#-,其实是-l选项,表示login

su - user1

 

#不切换用户,以user1身份执行一条命令

su - user1 -c 'echo hello'

 

#临时将自己的主要组变成user2

#注意,如果user2组不是user1用户的属组,切换时,需要输入user2组的密码,所以组需要先设置密码才行

su - user1

newgrp user2

 

注意:

  • root用户切换时,不要密码

  • 非root用户切换时,要密码

 

4、sudo 

  • 分权,把root的权限分给普通用户。

  • 配置文件:/etc/sudoers,修改这个文件,不要直接使用vi和 vim去修改,因为这两个工具不会去检查语法,用visudo工具去编辑,这个工具会间接调用vim

 

4.1、为一个普通用户分权

visudo

user1 ALL=(ALL) NOPASSWD:/usr/sbin/fdisk  

  • user1,表示能使用sudo命令的用户

  • ALL(ALL),第一个ALL,表示允许从任何主机登录都可以使用sudo命令,第二个ALL,表示使用sudo后,可以使用任何身份来执行命令。

  • NOPASSWD: 表示执行后面的命令不需要输入用户密码。如果没这句,首次执行fdisk命令会提示你输入当前用户的密码,如果5分钟还没输入密码就会自动退出。如果通过验证,下次再使用这个命令就不需要输密码了。

  • /usr/sbin/fdisk,这是fdisk命令的全路径

 

4.2、普通用户怎么去执行?

sudo fdisk

 

4.3、用户的别名

  • 如果多个用户都要做同样的操作怎么办呢?

  • 作别名,相当于一个组,把多个用户加入这个别名,然后对这个别名分权。

注意:别名不能小写,必须大写

 

visudo

User_Alias AA = user1, user2

AA ALL=(ALL) NOPASSWD:/usr/sbin/fdisk

 

4.4、为一个用户组分权

visudo

%group ALL=(ALL) NOPASSWD:/usr/sbin/fdisk

  • 只要属于group这个组的用户都可以使用fdisk这个命令

 

4.5、命令的别名

visudo

Cmnd_Alias CM = /usr/sbin/fdisk, /usr/sbin/useradd

AA ALL=(ALL) NOPASSWD:CM