Linux是一款支持多用户多进程的操作系统,为了实现对系统中资源的有效管理及分配,使用了登陆账户与对应账户权限的方式来限制每一个登陆Linux系统的使用者。

        使用者在登陆Linux系统时,会先对使用者进行身份认证(authentication),通过系统账号和密码来实现。用户登陆成功时,则会按照之前设定好的账户权限为使用者授权,规定了其可以访问、使用系统中的哪些资源(authorization)。同时,为了防止已登陆的使用者恶意在系统上操作,影响其他用户的利益,还需要对所有登陆用户进行使用行为的监控(audition)。

        Linux对系统中的所有用户都可以分别设定不同的权限,但当系统上的用户过多时,一个一个的操作显然是一件非常麻烦的事。我们可以将多个用户加入一个用户组中,统一对用户组设定权限来为组中的每一个用户授权。

        但是以上说的都是一些逻辑的、便于人类理解的信息,但是计算机本身是无法理解用户名的,用户名对它来讲只是一段字符串。如何让计算机区分不同名字的用户?这时要引用uid的概念,每个用户通常情况下会对应一个独一无二的uid,方便计算机对这个用户进行识别;同理计算机也要使用gid来分辨不同的组。

====================================================================== 用户 

       用户可以分为大致两类

        管理员

        普通用户;而普通用户中又可以分为两类

                系统用户

                登陆用户

         用户的uid在计算机中用16位(bit)的二进制来表示,其中管理员的uid位0,系统用户的uid在红帽6,centOS6上位1~499,登陆用户为500-60000;而在红帽7,centOS7上分别为1~999,1000-60000.

        系统是如何把用户名称与uid关联起来的呢?是通过名称解析库文件/etc/passwd进行解析

 

用户组分类方式比较复杂,通常有三种分组的方式

        第一种:使用和用户近似的方式分组,即

        管理员组

        普通用户组

                系统用户组

                登陆用户组

        

        第二种:

        用户的基本组:任何一个用户都至少有、且只能有一个基本组。如果管理员不指定,通常在创建用户时系统会顺带创建一个和用户名字一样的基本组。

        用户的附加组:用户除了基本组之外,还可以同时属于多个附加组

 

        第三种:

        用户的私有组:组名同用户名,并且只包含了一个用户

        用户的公共组:组内包含了多个用户

 

    组的标示gid也是用16位二进制数来表示,标识范围和用户uid相同,请参考上面uid的标识范围。组的名称解析库文件则是/etc/group.

=============================================================

        早先用户的密码信息也是一并明文存储在/etc/passwd这个文件中的,但是这样的设计很不安全,所以,现在passwd中原来存放密码的位置只留了一个占位符“x”,而密码实际位置在/etc/shadow下,组的密码文件为/etc/gshadow。并且,这些密码都是单向加密后存放的,问题来了,什么是单向加密?(下面的内容略跑题,可跳至下一节继续浏览)

        常用的加密方式通常有三种:

        对称加密:加密与解密使用同一个密钥

        非对称加密:加密和解密使用的是一对儿密钥,公钥(public key)与私钥(private key)

        单向加密:使用某种算法将密码换算成一种数据特征码,只能加密,无法解密。

                数据特征码有以下两个特点:

                        定长输出:无论原文件有多少个字符,输出的特征码长度都一致

                        雪崩效应:只要源文件做出细微的改变,特征码将会天翻地覆的改变,防止有人用                              特征码变化推敲源文件内容。

                常用的单向机密方式有MD5 (message digest) 算法,可以输出128位的特征码,当然,特征码位数越多,源文件就越安全,所以centOS6以上版本已经默认使用sha(secure hash algorithm)算法,可以支持到512位。

=============================================================

        下面来看一下/etc/passwd这个文件的内容 用:一共分隔了7列

https://s5.51cto.com/wyfs02/M02/77/B4/wKiom1ZsMqnDdMAUAAAr0LQhKBM369.png

                第一列是当前系统上所有用户的用户名

                第二列是密码占位符

                第三列是用户uid

                第四列是用户基本组的gid

                第五列是用户的一些备注、注释信息

                第六列是用户的家目录路径

                第七列是用户登陆账户时默认使用的shell

                Linux会给每个新用户创建一个同名家目录,默认在/home下

        

        接下来是/etc/shadow

https://s5.51cto.com/wyfs02/M02/77/B3/wKioL1ZsMq3TyqCZAAAjXNCV69Y869.png

                第一列是用户名

                第二列是加密的特征码字段

                第三列是用户上一次修改密码到今天的天数,默认从1970.1.1开始计算

                第四列是用户密码最短使用天数:如果天数不够,用户自己改不了密码

                第五列是用户密码最长使用天数:用户密码最多只能用这么多天。

                第六列是用户密码的警告天数:密码在过期的提前几天开始警告用户

                第七列是用户密码非活动天数:密码过期之后还能最多使用几天,到了之后会被禁用

                第八列是用户账户过期天数:如果设置为30,则30天后账号会自动禁用

                

                这其中比较复杂的是第二列,分三个字段,以$分割:

                        第一个字段是密码加密使用的算法,1代表md5,而6则是sha512,顺便介绍一下Linux中自带的算法命令:

                        md5sum   1

                        sha1sum   2

                        sha224sum   3

                        sha256sum    4

                        sha384sum    5

                        sha512sum    6

                        可以使用 echo “123456” | sha512sum    这样的命令来自行计算校验码。

        

                        第二个字段是salt,也就是杂质的意思。如果系统中某两个用户密码恰好一样,则他们的校验码也会一模一样,这样不安全,所以内核在生成校验码之前,会在密码前随机加上不同的salt,以生成不同的校验码。

 

                        第三个字段是密码加完salt字段后计算出来的校验码本身

                    

                然后请看/etc/group

      https://s5.51cto.com/wyfs02/M00/77/B4/wKiom1ZsMqqSaKY-AAAY6HOCvts960.png

                第一列是组名

                第二列是密码占位符

                第三列是gid

                第四列是将这个组作为附加组的用户

        

                接下来是/etc/gshadow

       https://s2.51cto.com/wyfs02/M00/77/B3/wKioL1ZsMq2gy0k9AAAVxQOIgbg393.png

     第一列是组名

                第二列是组密码

                第三列是组管理者账户

                第四列是将这个组作为附加组的用户

 

=============================================================

权限

       Linux下,所有的文件都有自己的属主和属组,基本上谁创建了这个文件,谁就是这个文件的属主,而他所在的基本组则成了这个文件的属组。

        一个文件的基本权限是这样的"rwxr-xr--",其中前三位是这个文件属主(user)的权限,其中r为只读,w为可写,x为可执行。中间三位是组(group)的权限,最后三位为(other)的权限。

        对于目录而言

                r读权限意味着可以使用ls查看该目录下的文件,但不能使用ls -l

                w写权限意味着用户可以随意在目录下创建删除文件

                x执行权限意味着用户可以用cd命令进入该目录

 

        如果用户hadoop使用ls命令访问了/etc/fstab,如何判断用户是属主,还是属组,还是other呢?

               linux系统下,所有进程是用发起者的身份运行,当用户使用ls命令时,会调用/bin/ls这个程序,接着启动一个“ls进程”,这个进程使用的是 hadoop的身份去访问该文件,这时文件会把用户先检查这个用户是不是自己的属主,如果不是,看看用户所在的组是不是自己的属组,如果还不是,则用other权限匹配。(所以linux下会创建很多普通账户来启用那些系统服务,这些服务也都是进程,这些普通账户即为系统账户,因为它们并不需要登陆系统)

=============================================================

用户、组还有权限管理的相关命令:

        useradd    创建用户

                    -u    创建用户时指定uid

                    -g    创建用户时指定基本组 

                    -G    指定用户的附加组,可是多个,用逗号隔开

                    -c    指定用户的备注信息

                    -d    指定用户的家目录路径,默认以/etc/skel目录做为模板复制,如果目标路径已存在,则不会复制该模板

                    -s    指定用户的登陆系统的默认shall

                    -r    创建系统用户

                    -M    不为用户添加家目录

                    -D    显示创建用户的一些配置信息并修改,结果将保存于/etc/default/useradd文件中,也可以直接编辑这个文件来修改

 

        usermod    修改用户属性

                    -c    修改备注信息

                    -u    修改uid

                    -g    修改基本组

                    -G    修改附加组,注意这里会覆盖原来的附加组

                    -aG    追加修改用户附加组,不会覆盖原来的组

                    -d    修改用户的家目录路径,原来家目录的文件不会被移动

                    -md    修改用户家目录的路径,并复制原来家目录的文件到新家

                    -l    修改用户名

                    -L    锁定用户密码;