用户、组和权限管理
首先用户是什么?组又是什么?为什么对我们系统来讲会有用户的概念?我们又说过现
代的操作系统都是多任务多用户系统叫 Multi-task,Multi-Users
所以在PC兼容机出现之前很多使用的都是主机。那个时候可以使用众多终端来链接到这
个主机上来。这样一来就又很多人一起使用同一个计算机。在同一个系统上创建文件,
管理文件使用文件。但是我么应该知道资源是有限的,我如果发现磁盘空间不够用了,
偷偷的把别人的空间拿来用。所以为了避免这种情况出现。我们必须有一种机制来保
护每个人的文件不受到损害。因此我们需要让每个使用计算机的人。它的权益不会受到
损害。我们必须建立资源隔离的机制。为了能够实现隔离我们需要标识每一个使用者,
因此每一个使用者就是一个用户
每个使用者就是一个用户,但是用户并非唯一的标识机制。手机在开机时没用用户的概
念但是它可以让我们去认证,怎么认证输入一个密码但是没有用户名我们现在很多手机
都可以指纹识别了。因此我们通过生物识别技术依旧可以识别使用者。
站在计算机的视角考虑用户到底是什么?
其实我们大家都应该知道,用户一般是用用户名进行标识的,事实上我们生物识别技术
指纹信息也可以代表一个用户。所以所谓用户其实就是计算机中识别一个个体的专用标
识而已。它可以是我们理解的用户名甚至和其对应的密码。这种机制对计算机来讲最终
要转换成什么?比如指纹识别通过了无非就是计算机内部与这个指纹附加一个唯一的识
别码。所以对于计算机来讲最终无论你是用户账号也罢,还是指纹信息也罢,其实最后
对计算机来讲无非就是为每一个使用者提供一个唯一使用标识而已,而这个唯一使用标
识我们可以称为这个使用者的ID。
在早期时候,在现代的识别技术流行开来之前那更多的还是字符串而已,但是各位应该
知道字符串是任何人都可以获得的,我们识别用户的时候使用两个组件来进行识别。一
个是用户标识、另一个是用户密码。为什么需要密码呢?
假如我们的计算机能识别10个使用者,其中TOM是一个管理员那因此在某一时刻有一个
使用者来了,他就说它就是TOM,我们计算机怎么识别它就是TOM呢?
无非就是要通过某种方案来判定这个使用者的确是他所声称的那个人,这种机制叫做认
证。所以密码其实是一种认证手段,包括生物识别技术也是一种认证手段。所以用户名
对应了一个具体使用者但用户名是公开的,但是每个用户想使用计算机的资源时必须通
过操作系统的认证通过才能有权限获取。原因在于资源是有限的。
换一个视角来描述,计算机的资源是很有限的,但使用者是有很多的,为了能实现使用
者彼此之间在资源上相互隔离并且我们能让主机认定这个使用者的确是它自己。所以我
们必须在操作系统上完成两种机制。
叫做认证机制Authentication.那认证通常就是通过某种识别技术将其与当前系统上
某个用户标识关联起来的过程。
所以认证通过不意味着结束了,还有一个授权机制Authorization所谓授权就是身份
识
别通过但系统的资源使用级别可能有很多种。对一个文件来讲有的人可以把它删除或者
创建,但别的人只能读取这个文件。这个机制就称为授权机制。
授权之后我们还需要审计和监督来看结果是否符合条例,称为Audition。
这些称为3A:认证、授权、审计
所以对我们操作系统来讲的确是这样运行的,首先我们装完操作系统以后,我们首先要
输入用户名和密码才能登录进去,登录进去后它能自动的根据用户名识别这个用户的授
权。对我们Linux而言他的授权机制是非常薄弱的,他的层次很简单无非就是有管理员
和普通用户两类。管理员能够管理整个全局权限,而普通用户对系统级的资源只有读取
权限和使用权限。对自己的资源有全部的管理权限。所以我们说它只有两级分配机制,
这也是它管理功能非常薄弱的一种表现。
除了这个以外,我们的系统还会对每一个文件附加属主、属组。属主它通常意味着用户
是资源的所有者或拥有者。一般来讲拥有者具有完全支配它的权力,接着还有属组,组
有是什么呢?接着还有其他的的等等。
我们通过向文件标识它的属主属组和二者之外的其他权限,从而完成从用户到资源二者
之间权限的映射。 每一个用户对于我们系统上的资源的使用尤其是登
录认证以后的使用的过程他会记录到日志文件当中。而日志就是以后用来审计的凭据。
当然了对于我们Linux系统而言它没有对每一个用户每一步的操作都做审计,如果我们
要想做的话我们可以借用其他机制来实现。比如我们在Linux系统中装一个全局审计的
系统,任何用户登录系统以后你访问那个文件做了什么操作每一个操作都能记录下来。
将来我可以通过这个文件来审计你的行为。
比如说SE这个,尤其在违反法则使用时我们可以进行审计,甚至可以把整个系统记录下
来想管理员发出警告。
组:
接下来我们说说组是什么?我们这里的组是用户组,用户组到底指的是什么呢?说白了用户组就是用户的容器,它能够将多个用户合并为形成一个逻辑概念。形成一个逻辑组件,单一的逻辑组件。那这个逻辑组件有什么用?比如我们将来想授权多个用户对某一个文件的访问权限时,如果我们基于用户级别来实现这是麻烦的,因为一个文件的输入只能有一个。我现在想让多个用户对同一个文件具有相同的权限应该怎么做
注意不是所有用户只是某一部分用户,所以我们就用了一个容器把多个用户归类进来并让一个文件拥有属组。所以我们在文件上授权属组的权限,从而把几个用户加到这个组里面来,所以使的多个用户对这一个文件就有了相同的访问权限了。这种管理机制使得我们的授权以及收回权限的工作或者撤销权限的工作是比较容易的。这就是用户组存在的意义。
所以我们说它是一个用户的容器是为了便于实现权限分配的,其实在有些系统当中组
也被称为角色,虽然二者并不能完全等同起来,但有些时候组是可以被称为角色的。
它能够实现让一个用户加到一个组里以后。
对Linux而言用户只有两类,管理员和普通用户,但是对我们Linux来讲尤其是Centos
普通用户又分为两类:一类叫系统用户,一类叫登录用户。而且计算机容易识别的有是
数字所以每一个用户都有它的用户标识我们把它称为UserID,简称UID.用一个数字来进
行标识的,早些时候Centos用的是一个16位的二进制来标识的。16位二进制它的有效
范围是0-65535.后来大型主机不够用的话我们给扩充位为32位的。但一般而言都是16
位二进制。
而0-65535当中,我们刚才说过管理员它是需要标识的,那普通用户也需要标识的。所
以一般来讲管理员的标识是0。永远为0.普通用户是1-65535.但一般来讲不会用这么多
可能只用到了6万,这是对Centos7系统来讲。至少说它默认情况下用到了6万。
系统用户的范围是1-499对于Centos5、6而言。Centos7是1-999.这样一来我们的登
录用户就发生变化了。500-60000(Centos6),1000-60000(Centos7).这是我们的
用户标识
计算机在其内部当你登陆完以后每名而不是数字,计算机怎么识别这个名字对不对呢?
计算机有怎么知道这个名字对应的ID一个用户都会自动被转换为数字标识进行使用。
我们一定要记得。
请问一个用户的名字到底是这个字符串,还是它的ID号?哪一个应该是它的本名呢?
我们可不可以理解为计算机更容易识别数字,所以ID号是本名.反而我们看到的用户名
不是它的真名。但是还要考虑一点我们每次登录输入的都是用户号又是谁呢?
这里有涉及到一个名称解析的过程,什么叫名称解析呢?其实名称解析简单来讲就是名
称转换的过程,比如你给它的是一个用户名Username我们需要把它转换成什么?UID。
把一个格式的名字转换成另外一个格式的名字我们就叫做名称解析。但是名称解析怎么
解析呀?
所以名称解析只能根据名称解析库进行,所谓的名称解析它指的就是如果你给的是名字
我就找那么一个库,库里面有名字和ID的对应,根据这个库去查询这个对应的名字。
所以对我们的系统来讲它应该有那么一个库来保存了用户名和ID号的关系,甚至包含
用户的其他信息比如像我们的家目录,还有用户的全名。我们此前讲的用who查询的是
登录名并不是用户的全名。这个只是用来登录信息识别使用的而已。
所以这里我们就需要一个复杂的数据库来保存这些信息,对Linux而言则用到的是
/etc/passwd 这其实就是那个用到的用户解析库。这里面保存的是什么呢?
很显然我们解析库文件能放在文本文件中,我们能不能放在一个复杂格式的存储中,
比如像关系数据库mysql,oacsql等等,josn格式的数据库,比如就是一个文档数据
库等等。
当然更多用来实现做用户名保存的叫LDAP我们叫轻量级目录访问协议等等。
它除了名称解析之外,还额外保存了一个用户附加的其他信息。
再说组,对于我们人来讲我们更容易识别的是字符串,组也是有组名和组ID组成的。
组类别有管理员组和普通用户组,普通用户组里面一样的有系统组和登录组,这样区
别对组来讲并不理想。
组也需要组标识:GroupID,GID,管理员组是0.
组类别2,这里的组类别1和组类别2我们还是站在所谓它的公用上划分的,大家想一下
一个用户是否可以属于多个组?如果可以的话到底那个组是它的主组,我们是不是应该
有一个标识。
因此我们的组类别站在用户的角度来划分一样可以这样区分。第一我们的组类别中有用
户的主组,第二也有用户的附加组。所以站在一个用户的角度来划分组有两类叫用户的
基本组和用户的附加组。
另外我们根据一个组只包含一个用户还是多个用户还可以划分为第三种。组类别3,如果
一个组,这个组的组名和用户名相同并且只包含它同名的一个用户,这种组我们称为用
户的私有组
其实我们除了用户名、用户ID等相关信息之外在用户登录时还需要对用户的身份进行识
别和认证。那认证时需要怎么做?如果你是指纹认证的话就意味着这个用户事先必须在
本地存储有指纹信息,下次在登录时我们把指纹和存储的做对比就可以了。同样的用户
在登录时为了识别它的密码是否正确应该怎么做?一样的我们事先在系统上要存储这个
用户的密码,然后去比对在登录时用户输入的密码,你输入和我存储的是否一样。一样
则认证通过,不一样则认证失败。
现在有出现了一个问题我把密码放到哪里去?认证信息通过比对事先存储的,与登录时
提供的信息是否一致。密码的信息我们需要保存在哪里呢?也需要一个库,没一个用户
可能都有一个密码或者说很多用户都可能需要密码,因此我们需要把用户密码信息给存
储下来。而密码早些时候和/etc/passwd存储在一起的。这个文件每个人都可以读取,
如果某个人不小心看见了别人的密码怎么办?而这个文件又需要让每个人看见,所以
我们密码存放在passwd文件中不能时明文存放的。密码是什么就保存为什么这个是最
拙劣的做法。
那我们应该怎么办?把密码转换为加密格式,然后下次用户登录时,把原来加密的给
解密出来,和用户的输入进行对比。这个方式恐怕是不合适的,因为既然能解密,
别人看到以后就能尝试进行暴力破解。通过穷举的方式来推测。所以我们最好要找一个
不能被破解,或者解密的方式来做。
那我们可以使用单向加密方式来实现,密码存在/etc/passwd/文件中是不安全的,所
以密码存在在了/etc/shadow文件中,这是所谓的密码库,这是一个数据库文件,其实
不光用户有密码,组是也有密码,因此组的密码文件是/etc/gshadow。只不过这里要
特别强调一下这样几个问题:
第一密码应该如何存储?大家都应该知道你的密码被别人拿走了,你机器的安全性、
和保密性都不复存在了是不是?所以这一环对我们的系统安全来讲是至关重要的一环,
而对Linux来讲放在的/shadow和/gshadow中密码是字符串。
我们怎么实现让别人无法破解密码呢?其实破解有两种方案。第一种做法就是你有加密
算法,我就可以研发出算法的漏洞,最终通过这个漏洞绕过你的加密机制,从而可以计
算出原来的密码是什么?这种就叫做解密,或者叫破解解密机制。还有一种我们破解不
了怎么办?就一个一个的试这个叫做穷举。
而穷举当中看你怎么试了,为什么这样讲呢?假如说我们的密码,假如只使用一位密码
我们如果不允许使用汉字的的话,那就有128个字符如果在除去特殊字符之后就可能只
要100个左右。那就意味着我们试100次怎么都可以试出来,所以密码只有一位的时候
是相当不安全的。2个就是100的2次方次。密码的长度越长暴力破解的成本越高。
为什么说量子计算机是现在争夺的制高点呢?因为现代的计算机假如你1秒钟能算1千
万次而量子计算机能算1千万亿次。我们的密码不能使用常见密码,尤其是生日之类的,
太容易被穷举了。任何能被人想到的常见组合都可以被穷举。为了保证这些算法复杂度,
我们现在还有一种字典工具,字典工具就不是简单的穷举工具,
把常用的组合都放在这里
然后我们就一个一个比对。用常用组合去尝试,而不是用随意的组合去对比。而这种字
典都保存了市面上常见的密码组合。这种方式比直接穷举要快的多。
我们应该使用随机字符串,没有任何规律而言的字母组合,但是随机密码串我们能记
住吗?这是不容易记忆的。怎么办?我们要遵循最起码的密码准则,密码长度8位以上
其次使用各种字符,至少要使用大写字母,小写字母、数字标点符号4位中的至少三位。
接着如果有别人盯上了你,非要破解你的密码甚至不惜使用超级计算机,对于这种事
我们就不得不防了是吧。你的密码8位复杂度,我们的普通PC机要几十年才能破解,
用超级计算机可能使用几十天破解,或者几个月。那怎么办,我们就养成习惯几个月
更换一次密码。这就是我们的密码使用策略。
我们的密码保存在/etc/shadow和/etc/gshadow下,别人如果看到了,拿到了就可以
用我们此前说的穷举或者字典工具进行破解如果算法本身有漏洞就破解的更快了。压根
不用穷举,直接逆向破解就可以了。所以为了避免出现这种问题,第一这个密码我们
不能明文存放这个是第一个常识。第二是加密的,第三这个加密机制最好是不可逆的。
说白了就是我能加密但是不能解密的。
所以我们来说说加密算法目前来讲我们常见的加密算法有三种。第一叫做对称加密:
加密和解密使用同一个密码。
什么是加密?加密的过程可以想象为,现在我有一个加密算法机,
我们向这里输入数据
他能输出另外一种表现形式的数据。而这个机制就是把你的字符串
转换为另外一种字符
串的机制。加密前的叫做明文,加密后的叫做密文。明文piain text,
密文cipher text 问题是这个加密机,加密算法本身任何人都是可能得到的。但是
这个算法机制是基于数学上的复杂度,会导致你即便看到算法,也不能做逆向操作。
所以加密算法都是数学家做的。每个国家加密算法都是军备资源。我们现在能使用的
都是民用的算法。对我们来讲民用的角度已经足够的安全了。
另外一个这种算法大家都能得到,因此A加密的明文,和B加密的明文二者之间怎么
区别呢?
同一个算法大家都要用,你加密的数据和我加密的数据一样,但是结果不一样。
在非对称加密中密钥是成对的,当然这一对当中一个叫公钥一个叫私钥。非对称加密的
密钥长度要比对称加密的密钥长度要长很多。像对称加密的密钥长度早些时候只有56位
但2002年都已经被破解了,后来人们就开始增长密钥的长度到128位,
甚至到后来192位256位、384位等等这叫做密钥长度。当然你给定这个密钥长度和密
码是两回事。接着对于非对称加密来讲它的密码长度更是达到了惊人的级别起始512位
随后现在的民用级别可以达到2048位。甚至于可以达到4096位。各位要知道密钥越长
加密时所需要的计算量越大。所以也就越慢。非对称加密要比对称加密慢的多。
单向加密,只能加密不能解密,或者说他叫提取数据特征码,单向加密有这几个特征,
定长输出:意思就是说,你问原来的数据是多大。和原来的数据量没多大关系。第二个
有雪崩效应,初始条件的微小改变,将会引起结构的巨大变化。越复杂的科技和系统,
将来出故障和严重问题的可能性越大。所以大家有没有留意过现在很多设计都是反科
学的。
为了避免多个用户密码相同,在计算之时加salt进去,我们称为添加的随机数,对于
两个用户来说即使它们的密码相同,但是它们的salt不同,所以使他加密出来的结果
也不同。
介绍下信息库:
/etc/passwd:用户的信息库
那这个信息库里面放的是什么呢?刚才我们已经看到说它里面包含了用户的ID号
和用户的名字。第一每一行都是完整的用户信息。第一字段是用户名,
第二字段是用户的密码x,但是我们说过密码不再此处存放。
现在放成X的意思是什么?
我们要使用影子口令的,说白了就是/etc/shadow文件来保存密码的。
X是占位符。第三字段是UID,第四字段是什么呢?
用户、组和权限管理
Multi-tasks,Multi-Users
每个使用者:
用户标识、密码
Authentication
Authorization
Audition
组: 用户组,用户容器
用户类别:
管理员
普通用户
系统用户
登录用户
用户标识: UserID,UID
16bits二进制数字:0-65535
管理员:0
普通用户:1-65535
系统用户:1-499(Centos6),1-999(centos7)
登录用户:500-60000(Centos6)1000-60000(centos7)
名称解析:名称转换
UsernameUID
根据名称解析库进行:/etc/passwd
组:
组类别1:
管理员组
普通用户组
系统组
登录组
组标识:GroupID,GID
普通用户组:1-65535
系统用户:1-499(Centos6),1-999(centos7)
登录用户:500-60000(Centos6)1000-60000(centos7)
名称解析:groupnamegid
解析库:/etc/group
组类别2:
用户的基本组
用户的附加组
组类别3:
私有组:组命同用户名,且只包含一个用户
公共组:组内包含了多个用户
认证信息:
通过对比事先存储的,与登陆时提供的信息是否一致
password:
/etc/shadow
/etc/gshadow
密码的使用策略:
1.使用随机密码
2.最短长度不要低于8位
3.应该使用大写字母、小写字母、数字和标点符号四类字符中至少三类
4.定期更换
加密算法:
对称加密:加密和解密使用同一个密码
非对称加密:加密和解密使用的一对儿密钥
密钥对儿:
公钥:public key
私钥:private key
单向加密:只能加密,不能解密,提取数据特征码
定长输出
雪崩效应
算法:
md5:message digest,定长输出128bits
sha: secure hash algorithm 定长输出160bits
sha224
sha256
sha384
sha512
在计算之时加salt,添加的随机数
mageedu12345678:加密字串
mageedu12345678:生成加密字串
/etc/passwd: 用户的信息库
name:password:UID:GID:GECOS:directory:shell
name:用户名
password:可以是加密的密码,也可以是占位符
UID:
GID:用户所属主组的ID号
FECOS:用户的注释信息
directory:用户的家目录
shell:用户的默认shell,登录时默认的shell程序
/etc/shadow: 用户密码
shadow是一个文件,它包含了系统账户的密码信息和用户账户的使用期限信息,
次文件每行包含9个字段
用户名:
加密了的密码: 而且这个加密了的密码串使用$符号做分隔符,有三段组成第一个$
和第二个$符之间的这个数字用来表示使用的加密算法,1表示md5,依次向后推所以6
就表示sha512。第二个$符号和第三个$符号之间是随机数。从第三个$符号到下一个
冒号之间才代表的是加密后的密码
$6
UvucO/
wxfGqSoW41iwU2Ds09aM4GYQ19nn1tSTY4ZB4FEuu1rxkvyiDyxPYa9FS0QTH5DtPnYRo8.eKEcPPvg/::0:99999:7:::
最后一次密码的更改日期:它是一个相对时间计时法,表示从1970年1月1日开始到上
一 次改密码的时间为止中间所经过的天数。0有特殊的意思,表示用户应该下次登录
系统时更改密码。空字段表示密码年龄功能被禁用了。
密码最小年龄:什么叫最小年龄,叫密码最小使用期限。意思是用户更改密码完了以后
你不能随便改来改去的,改完以后要至少使用多次时间才能被允许再次修改。
密码的最大使用期限:比如告诉你密码的最大使用期限50天,是什么意思呢?从上次修
改密码之后经过50天以后必须进行修改。我们是提前改还是过了这个日期改?
都是提前修改。
密码警告时间段:密码过期之前,提前警告用户的天数。
密码禁用期:
账户的过期日期:我们事先预设一个账号的有效期限。
用户名:加密的密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告期段:
过期期限:保留字段
/etc/group:组的信息文件
一共有四个字段组成
group_name:password:GID:user_list
user_list:该组的用户成员,以此组为附加组的用户的用户列表
完成优于完善
学习要动手实践
mage@magedu.com
相关命令:useradd,userdel,usermod,passwd,groupadd,groupdel,
groupmod,gpasswd,chage,chsh,chsh,id,su
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com