Linux基础知识之用户和用户组以及 Linux 权限管理

已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字。这几个关键字对于前端程序猿的我来讲真的是很高大上有木有,之前尝试学 Linux 的时候看到这些名词老是下意识的跳过不敢看有木有,一提起这几个名词立刻脑海中老是升腾起无限的崇拜有木有!今天就硬着头皮捯饬捯饬这几个概念,但愿能有所收获。前端

  1.从 /etc/passwd 提及

  前面的基本命令学习中,咱们介绍了使用 passwd 命令能够修改用户密码。对于操做系统来讲,用户名和密码是存放在哪里的呢?咱们都知道一个站点的用户名和密码是存放在数据库中,数据库是用来保存记录数据的,咱们经常使用的数据库有 MySQL,Oracle,MongoDB等。其实,咱们把 MySQL 等叫作数据库是不严谨的,由于它们只是数据库的管理软件,从广义上来讲,任何能保存数据的东东均可以叫作数据库。好比文本。linux

  数据库是用来保存数据的,操做系统中的用户名和密码也理应存放在数据库中,这个数据库是啥呢?在 Linux 下,它是处于 /etc 下的一个叫 passwd 的文件。咱们不妨看一下这个文件中的内容。算法

  

  大多数人看到这种东东通常都会说:什么?你肯定这不是天书?这里面能瞅到啥?说实话,除了行号,我一个都不认识!shell

  好了,再仔细看看,找找规律。通过你的仔细观察,你可能会注意到如下几点讯息:数据库

    • 每一行文本都有数个英文格式的冒号(:) ,它们对每一行文本进行了分割    
    • 仔细数一数,每行文本的冒号数量都是相同的
    • 再仔细数一数,若是咱们把冒号先后的东东叫字段的话,每行文本中的字段数目都是相同的(包括空字段)
    • 首行的 root 和尾行的 charley,不就分别是咱们的两个帐户吗

  因而你大胆的猜想:对的!这就是咱们的用户表,这些表也包含一个个字段,这些字段用来存放用户的某些信息!事实上也正是如此,/etc/passwd 保存了用户相关的信息,包括用户名,密码,所属组等等。或许你还会有疑问:明明咱们只有两个用户,一个管理员帐户 root,一个是普通用户 charley,那其余的东西是什么呢?为何他们也出如今这个表里面?别急,先从分组形式讲起。apache

  2.一些常见的分组形式

  下面,咱们就对用户,用户组以及上面的一些疑问进行展开讨论。首先介绍一些对用户或者用户组分组的方式,站在不一样的角度,能够进行不一样的区分。安全

    • 经过用户类型分组,咱们能够把用户分为:
      • 管理员
      • 普通用户
    • 经过用户组类型分组,咱们能够把用户组分为:
      • 管理员组
      • 普通用户组
    • 从用户的角度,咱们能够把用户组分为:
      • 基本组(默认组)
      • 额外组(附加组)
    • 对于普通用户,咱们还能够分为:
      • 系统用户
      • 普通用户
    • 所以,对于普通用户组,咱们也能够分为:
      • 系统用户组
      • 普通用户组

  上面的分组方式是否是看的你眼花缭乱呢?不要紧,其实对用户或者用户组分组,自己就是多解的,只是因为站的角度不一样,产生了不一样的结果而已。换个角度,咱们还能够再来 N 种分组形式,以上只是常规的分法。因为这些分组的形式能够体如今咱们建立用户或者用户分组命令选项中,在学习了建立用户和建立用户组的命令以后,天然能够轻松的理解这些概念。学习

  3.理解用户

  咱们知道 /etc/passwd 至关于操做系统保存用户信息的数据库,那么如此能够得出表中每行数据都是表明了一个特定的用户,可是除了系统的 root 用户和咱们建立的一个普通用户 charley 以外,还有不少其余的东西,这些东西是什么呢?它们也是用户吗?是的,这些咱们不认识的东东,也是用户,只不过不是有咱们建立,而是由操做系统建立的,因此叫作系统用户。加密

  某人若是想使用操做系统的某些功能,那么他必须是这个系统上的一个用户(客人用户也是用户)。用户登陆操做系统以后,操做系统能够由用户的特征码进行权限的分配,以便使用操做系统的功能。spa

  咱们使用计算机,使用操做系统,是为了让他们帮咱们完成某些任务,具体下来,是经过调用操做系统上的软件来完成,让软件帮咱们作事。操做系统在启动的时候,有一些必要的应用、服务等须要启动,而遵循前面讲到的简单逻辑,启动软件的必须得是操做系统上的用户。按照这个逻辑,Linux 系统为咱们建立了一些系统用户,经过它们来在操做系统启动时执行相应的文件。可见系统用户是不须要登陆的,也叫非登陆用户,请先记住这一点。

  上面讲到了用户特征码,操做系统时经过用户特征码来识别用户的。对于淫类,咱们识别用户是经过用户名,由于用户名(字符串)好记。而计算机以为数字更好记一些,因而在建立用户时系统会为其分配一个惟一的特征码,用以识别该用户,这个特征码也叫UID。一样的,用户组也有特征码,叫作GID。

  Linux 系统中,UID以以下的方式划分:

    • 0 表示管理员(root)
    • 1 - 500 表示系统用户
    • 501 - 65535 表示普通用户
    • 不一样的 Linux 发行版,这些数字可能不同

  4. /etc/passwd 中的字段分析

  /etc/passwd 中的字段分别表示以下信息(字段名字是我本身取的):

    • ACCOUNT:用户名
    • PASSWORD:密码占位符
    • UID:用户ID
    • GID:用户组ID
    • COMMAND:注释信息
    • HOME DIR:用户家目录
    • SHELL:用户的默认 shell

  密码占位符,其值是 x,显然这不是真正的密码。真正的密码保存在哪里呢?在 /etc/shadow 文件中,此文件中保存的也不是明文密码,而是通过加密处理以后的密码。咱们来看一下 /etc/shadow 中的内容(root only):

  

  可见,/etc/shadow 中保存的也是数据表,这个表也和用户相关。还记得次日说到的 man 命令吗?man 手册的第五个章节是特殊文件,咱们来 man 一波试试:

 

  对于 /etc/shadow 中每一个字段的含义,手册中都给出了说明,咱们能够去参考(这里只给出了一部分截图)。同理,对于 /etc/passwd,咱们也能够经过 man 5 passwd 查看每个字段表示的含义。

  好了,回到 PASSWORD 字段,咱们看一下 root 用户和 charley 的此项字段值,能够看到此值中有一些规律可循:

    • $1$XXXXXXXX$XXXXXXXXXX.....

  咱们能够经过此字段来获取以下信息:

    • 前两个美圆符号中的数字1表示加密方式是 md5
    • 第二个和第三个美圆符号之间的字串是通过加密后的密码盐值
    • 第三个美圆符号以后的字串是密码明文精加密的后的特征码

  既然谈到了加密和盐值,咱们来复习一下关于加密的基础知识。咱们一般用到的加密方式有一下几种:

    • 对称加密:使用同一套密码进行加密和解密

    • 公钥加密:每一个密码以私钥(secret key)和公钥(public key)成对出现,公钥进行的加密使用与其配对的私钥解密,反之亦然,相对于对称加密,速度很慢,通常不用于加密,而是秘钥交换
    • 单向加密(散列加密):只能加密不能解密。也就是说只能由明文取得密文,而不能由密文取得明文。通过单向加密获得的是一份惟一的特征码,每一个数据的特征码是独一无二的,所以也叫做指纹加密。若是两次算法取得的特征码同样,那么就是同��份数据。单向加密能够用来作数据校验,若是数据被动了手脚,那么数据的特征码就不同。经常使用的散列加密方式有:

      • MD5:定长128位输出特征码
      • SHA1:定长160位输出特征码
      • 还有其余方式,主要体如今特征码输出长度的不一样
    • 单向加密的特色:
      • 不可逆
      • 雪崩效应:数据的微小改变,会引发特征码的巨大变化
      • 定长输出:无论加密的内容长度多少,输出的特征码长度都是同样
    • 加盐:若是两个用户使用了一样的密码,那么通过 MD5 散列加密后的特征码就是一致的,若是一个用户偶然发现另外一个用户的特征码和他本身是同样的,那么就能够推断另外一个用户的密码。这是不太安全的。为了安全起见,咱们须要用到散列加密特色中的雪崩效应,往密码中额外加点杂质(内容),这样加密后的特征码就千差万别了。这个过程就是所谓的加盐。

  5.useradd 命令:添加用户

  说了那么多,终于来点真格的了,Linux 中使用 useradd 命令添加一个用户。这个命令很简单,简单到只使用 useradd USERNAME 就能够添加一个用户。

  咱们新建一个用户 MIKE,而后查看 /etc/passwd 中的对应内容:

  

  在 /etc/passwd 的最后一行,咱们看到了刚刚添加的用户,而且系统自动设置了用户的一些属性,好比UID,GID,HOME DIR等。咱们也能够手动指定新增用户的信息:

    • useradd -u UID:指定 UID,这个 UID 必须是大于等于500,并无其余用户占用的 UID
    • useradd -g GID/GROUPNAME:指定默认组,能够是 GID 或者 GROUPNAME,一样也必须真实存在
    • useradd -G GROUPS:指定额外组
    • useradd -c COMMENT:指定用户的注释信息
    • useradd -d PATH:指定用户的家目录
    • useradd -s SHELL:指定用户的默认 shell,最好是在 /etc/shells 中存在的路径
    • useradd -s /sbin/nologin:该用户不能登陆,还记得咱们上面说到的系统用户不能登陆吧?咱们能够看到系统用户的 shell 字段也是 /sbin/nologin
    • echo $SHELL :查看当前用户的 shell 类型
    • useradd -M USERNAME:建立用户但不建立家目录
    • useradd -mk USERNAME:建立用户的同时建立家目录,并复制 /etc/skel 中的内容到家目录中。关于 /etc/skel 目录会在下一篇 Linux 权限管理中再次讲解。
    • 若是用户没有家目录,那么不能切换到该用户

  6.userdel 命令:删除用户

    • userdel USERNAME:删除用户
    • userdel -r USERNAME:删除用户的同时删除用户家目录

  7.id 命令:显示帐号属性信息

    • id -g USERNAME:显示默认组ID
    • id -G USERNAME:显示附加组ID
    • id -u USERNAME:显示UID
    • id -n -g/-G/-U:显示默认组/附加组/用户的名称

  8.finger 命令:检索用户信息,比使用 id 命令更加友好

  9.usermod 命令:修改用户信息

    • 基本用法和 useradd 类似,这里列出须要注意的点
    • usermod -G GROUPS USERNAME:改变用户的附加组,会彻底替换原有的附加组
    • usermod -G -a GROUPS USERNAME:在原有附加组的基础上追加附加组
    • usermod -d PATH USERNAME:修改家目录。修改后原先家目录中的文件不能访问了,由于在当前的家目录中并不存在这些文件。
    • usermod -l NEWNAME USERNAME:改变用户名
    • usermod -e USERNAME:指定该用户的过时时间
    • usermod -L USERNAME:锁定用户
    • usermod -U USERNAME:解锁用户

  10.快捷命令

    • chsh SHELL USERNAME:改变默认 shell
    • chfn USERNAME:修改注释信息,用来增长用户的详细信息,如公司,地址等。能够由 finger 查看相应的改变。

  11.passwd

    • passwd --stdio:标准输入读取密码passwd -l:锁定用户帐号(root only)
      • echo "newpassword" | passwd --stdio MIKE
    • passwd -u:解锁用户帐号(root only)
    • passwd -d:删除用户密码。用户密码删除后不能登陆。

  12.pwch(password check):检查密码文件的完整性,可获取一些警告信息

  13.groupadd 命令:添加组

    • groupadd -g GID GROUPNAME:指定GID
    • groupadd -r GROUPNAME:添加一个系统用户组(-r 也适用于 useradd)
      • groupadd -r apache

  13.groupmod 命令:修改组

    • groupmod -g NEWGID GROUPNAME:修改GID
    • groupmod -n NEWGROUPNAME GROUPNAME:修改组名

  14.groupdel 命令:删除组

    • groupdel GROUPNAME

  15.gpasswd 命令:给组加密码

    • gpasswd GROUPNAME

  16.newgrp :临时指定基本组,下文介绍。

  17.给组添加密码的做用

  为何须要给组添加密码呢?不妨先说一下用户的基本组,好像到如今咱们尚未讲基本组的状况吧,嘿嘿。基本组很简单,Linux 规定每一个用户都须要在某一个组中,所以在建立用户的时候,咱们能够指定用户的基本组(默认组):useradd -g GROUPNAME USERNAME。若是咱们不手动指定用户的基本组,系统会默认建立一个和当前用户名一致的组,而后将这个组设置为用户的基本组。基本组的 GID 默认和用户 UID 一致(若是不被占用的话)。

  为啥用户必需要有一个组呢?由于 Linux 规定,一个文件的须要具有三种权限:文件所属主的权限,文件所属主所在组的权限,以及其余用户的权限。所以文件的所属主要是没有基本组的话,那是否是很是尴尬呢。这个问题先说到这里。

  回头看一下 gpasswd 的做用,通常状况下咱们是不须要为组设置密码的。如今提一个需求:在执行某项操做的时候,要使用到其余组的权限,就须要临时切换到其余组,又不想改变现有组,那么就须要使用 newgrp 命令,newgrp 命令就是用来临时切换用户基本组,注意此操做只对当前登陆有效。在使用 newgrp 的时候,可能须要咱们输入组密码。为何是可能呢?由于在将额外组临时设置为用户的基本组时,是不须要密码的。只有将此前和用户绝不相关的组临时设置为基本组才会须要密码。如需还原基本组:exit 或者 logout。

  18.总结

  本文主要介绍了 Linux 的用户管理和用户组管理,并介绍了 /etc/passwd 和 /etc/shadow 这两个和用户有关的文件。和用户组有关的文件位于 /etc/group 和 /etc/gshadow 中。此外介绍了常见的加密形式:对称加密,公钥加密和散列加密。关于用户和用户组就介绍到这里,在此基础上咱们将在下篇文章中介绍 Linux 的权限管理,和本文属于同一个系列。

相关文章
相关标签/搜索