Linux 下的用户、组和权限

地球胖头鱼 2020-12-23
系统与内网安全 发布于 2020-12-23 15:35:54 阅读 261 评论 0

前言

在linux中一切都是文件(文件夹和硬件设备是特殊的文件),如果有可能尽量使用文本文件。文本文件是人和机器能理解的文件,也成为人和机器进行交流的最好途径。由于所有的配置文件都是文本,所以你只需要一个最简单的编辑器就可以修改。由于修改文本文件如此简单,所以Linux系统本身肯定要加以规范。这就引出了用户(组)和权限这2个概念。而这2个概念的引入,完美的保证了Linux的安全性,同时没有添加复杂性。由于一切皆为文件。所以Linux引入了3个文件来管理用户(组), /etc/passwd存放用户信息,/etc/shadow存放用户密码信息,/etc/group存放组信息,然后在文件系统中的每个文件的文件头里面添加了用户和文件之间的关系信息。

用户、组、文件间有三种关系

  • 用户和文件的关系只有2种, 拥有和不拥有。
  • 组和文件的关系只有2种, 拥有和不拥有。
  • 用户和组的关系只有2种, 属于和不属于。

将这三种关系叠加,用户和文件的最终关系可以归纳为3类

  • 用户拥有该文件
  • 用户属于某个组,某个组拥有该文件(即用户通过属于某组来拥有该文件)
  • 用户不拥有该文件

用户和组信息的查看

在Linux下,用户分为三类:超级用户(root)、普通用户、程序用户

  • 超级用户:UID=0
  • 程序用户:Rhel5/6,UID=1-499; Rhel7,UID=1-999
  • 普通用户:Rhel5/6,UID=500-65535; Rhel7,UID=1000-60000

有三个命令可以查看用户的相关信信息

cat  /etc/passwd         #查看用户信息
cat  /etc/shadow         #查看用户的密码信息
cat  /etc/group          #查看用户的组信息

查看用户信息

cat /etc/passwd   #/etc/passwd默认权限为644,其最小权限为444

Linux下的用户、组和权限

用户信息的显示有7个字段

  • 字段1:用户名 –> root
  • 字段2:密码占位符 –> x (这里都是用x代替)
  • 字段3:uid,用户id –> 0
  • 字段4:gid ,组id –> 0
  • 字段5:用户描述信息 –> root
  • 字段6:家目录 –> /root
  • 字段7:登录 shell (用户登陆shell ,当为/bin/bash表示可以登陆,/sbin/nologin表示不被授权登陆)

注:一般来说,只有 root 用户的 uid 是为0的。如果黑客把一个普通用户的 uid 修改为0的话,那么他只要以普通用户的用户名和密码登录,系统就会自动切换到root用户。所以,系统加固的时候一定要过滤出有哪些用户的UID为0

#! /bin/bash
# Author:谢公子
# Date:2018-10-12
# Function:根据用户名查询该用户的所有信息
read -p "请输入要查询的用户名:" A
echo "------------------------------"
n=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}' | wc -l`
if [ $n -eq 0 ];then
echo "该用户不存在"
echo "------------------------------"
else
  echo "该用户的用户名:$A"
  echo "该用户的UID:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $3}'`"
  echo "该用户的组为:`id $A | awk {'print $3'}`"
  echo "该用户的GID为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $4}'`"
  echo "该用户的家目录为:`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $6}'`"
  Login=`cat /etc/passwd | awk -F: '$1~/^'$A'$/{print}'|awk -F: '{print $7}'`
  if [ $Login == "/bin/bash" ];then
  echo "该用户有登录系统的权限!!"
  echo "------------------------------"
  elif [ $Login == "/sbin/nologin" ];then
  echo "该用户没有登录系统的权限!!"
  echo "------------------------------"
  fi
fi

查看密码信息

cat  /etc/shadow     #shadow默认权限为600,最小权限为400

密码信息的显示有9个

  • 字段1:用户名
  • 字段2:通过sha-512加密(二次加密,在经过第一次加密后,第二次加入随机数再次加密)的密码
  • 字段3:最后一次修改密码距离1970年1月1日的天数间隔
  • 字段4:密码最短有效期
  • 字段5:密码最长有效期
  • 字段6:密码过期前几天进行警告
  • 字段7:账户过期后,被锁定的天数
  • 字段8:账号失效时间距离1970年1月1日的天数间隔
  • 字段9:未分配功能

字段2是用户的密码位,如果是*表示该用户禁用,!!表示用户密码未初始化,如果为空,表示空密码的

注:借助chage指令,可以修改用户的密码策略,也可通过编辑 /etc/shadow (不建议)
比如:chage -l bob,查看用户bob的密码策略

    #!/bin/bash

    # Author:谢公子

    # Date: 2018-10-12

    # Function: 实现对用户密码策略的设定,如密码最长有效期等

    read -p  "设置密码最多可多少天不修改:" A

    read -p  "设置密码修改之间最小的天数:" B

    read -p  "设置密码最短的长度:" C

    read -p  "设置密码失效前多少天通知用户:" D

    sed -i '/^PASS_MAX_DAYS/c\PASS_MAX_DAYS   '$A'' /etc/login.defs

    sed -i '/^PASS_MIN_DAYS/c\PASS_MIN_DAYS   '$B'' /etc/login.defs

    sed -i '/^PASS_MIN_LEN/c\PASS_MIN_LEN     '$C'' /etc/login.defs

    sed -i '/^PASS_WARN_AGE/c\PASS_WARN_AGE   '$D'' /etc/login.defs

    echo "已设置好密码策略......"

查看组信息

cat /etc/group

组信息的显示有四个字段

  • 字段1:组名称 –> root
  • 字段2:组密码占位符 –> x
  • 字段3:gid –> 0
  • 字段4:组成员

注:一个用户只能有一个主要组,最多可以有31个附加组。主要组是用户创建文件时默认的所有组,附加组主要用于权限管理。不论用户属于哪个组,用户都能拥有该组的权限

特殊组wheel

在Linux中有一个特殊组wheel,wheel组就类似于一个管理员的组。在linux中,即使我们有系统管理员root的权限,也不推荐用root用户登录。一般情况下用普通用户登录就可以了,在需要root权限执行一些操作时,再su登录成为root用户。但是,任何人只要知道了root用户的密码,就都可以通过su命令来登录为root用户–这无疑为系统带来了安全隐患。所以,将普通用户加入到wheel组中,被加入的这个普通用户就成了管理员组内的用户了,然后可以修改配置文件使得只有wheel组内的用户可以切换到root用户。

用户和组信息的管理

用户管理

新建用户系统会做三件事

  • 新建用户时,系统会将 /etc/skel 中的目录及文件拷贝到新建用户的家目录中
  • 在 /var/spool/mail 中,新建用户名的邮箱
  • 在 /etc下的 passwd 、shadow 、group文件中,增加用户信息

添加用户时指定参数:

  • 添加用户时,使用 -g 指定新建用户的组,使用 -u 指定用户uid
  • -G 参数可以指定新建用户的附加组
  • 使用 -s /sbin/nologin 指定创建的用户没有登录系统的权限
  • 还可以使用 -M 参数,指定创建的用户不在home目录下创建家目录
  • 还可以使用 -d 参数 ,指定其家目录

以下这条命令直接生成一个具有root权限的用户:venus,密码为:123qwe 。前提是这条命令的执行需要root权限。

useradd -p `openssl passwd -1 -salt 'user' 123qwe` -u 0 -o -g root  -G root -s /bin/bash -d /home/user venus

注:用户创建时,默认的属性(比如UID,GID,是否创建家目录,创建邮箱等)都是通过/etc/login.defs文件控制的,修改此文件的属性,会影响以后创建的所有用户。也可以创建用户时指定参数修改,这样只对当前创建用户有效

删除用户 :

userdel  -r  james  #删除用户一定记得加 -r 参数 !!
  • 不加 -r 参数,只删除 passwd、shadow 和 group 文件中的用户信息,/home 目录下的文件不删除,/var/spool/mail/ 下的文件不删除
  • 加 -r 参数,删除 passwd、shadow 和 group 文件中的用户信息,同时删除用户的家目录和邮箱

修改账户密码 :

passwd  james   #给james用户设置密码

当前用户为 root 时:

  • 不需要知道当前的密码
  • 设置新密码时,不需要遵循密码要求

当前用户为普通用户时:

  • 需要知道当前密码
  • 设置新密码时,必须遵循密码要求(1.不能少于8个字符,2.满足复杂度要求)

修改账户属性:

usermod   参数   james
  • -s 修改用户的登陆shell usermod -s /sbin/nologin james
  • -L 账户锁定 (可以通过 passwd -S 账户名 查看账户的状态)
  • -U 解锁账户
  • -g 修改账户所在组 例: 将bob所在组改成james:usermod -g james bob
  • -G 给账户添加附加组 例:给bob添加一个附加组john:usermod -G john bob从附加组john中删除用户bob:gpasswd -d bob john
  • -a 默认情况下,当用户已经存在附加组时,再添加附加组则会把之前的附加组给替换了,加 -a 参数,则不替换原来的附加组,意味着该用户可以有多个附加组。
[root@Redhat ]# id james
uid=1000(james) gid=2002(james)=2002(james)

[root@Redhat ]# usermod -g aaa james ; id james;  //修改用户的主组为aaa
uid=1000(james) gid=2000(aaa)=2000(aaa)

[root@Redhat ]# usermod -G xie james ;id james;   //给用户添加附加组 xie 
uid=1000(james) gid=2000(aaa)=2000(aaa),1000(xie)

[root@Redhat ]# usermod -G xiao james ;id james;  //给用户添加附加组xiao,并且如果原来有附加组的话替换原来的附加组
uid=1000(james) gid=2000(aaa)=2000(aaa),2001(xiao)

[root@Redhat ]# usermod -aG xie james;id james;  //给用户添加附加组 xie ,并且不替换原来的附加组
uid=1000(james) gid=2000(aaa)=2000(aaa),1000(xie),2001(xiao)

锁定和解锁用户 :

  • 锁定用户:usermod -L xie 或 passwd -l xie
  • 解锁用户:usermod -U xie 或 passwd -u xie
  • 查看用户状态:passwd -S xie

注:虽然 usermod 和 passwd 这两个命令都可以锁定和解锁用户,但是还是有区别的。区别之一就是passwd命令操作完后会有提示。还有一个区别就是 passwd 的权限比 usermod 大,使用 usermod 锁定的用户可以用 passwd 来解锁,但是使用 passwd 锁定的用户不能用 usermod 来解锁

添加组 :groupadd xie

  • -g, –gid 为新组使用 GID,例 groupadd -g 2000 xie 创建新组xie,并且gid设置为2000
  • -K, –key 不使用 /etc/login.defs 中的默认值
  • -o, –non-unique 允许创建有重复 GID 的组
  • -p, –password 为新组使用此加密过的密码
  • -r, –system 创建一个系统账户

删除组: groupdel xie

  • -r , –remove 删除主目录和邮件池

修改组的属性:groupmod xie

  • -g, –gid GID 将组 ID 改为 GID
  • -n, –new-name 改名为 NEW_GROUP
  • -o, –non-unique 允许使用重复的 GID
    groupmod  -g  2000 bob       //将bob组的GID修改为2000
    groupmod  -n  aaa   bob      //将bob组的名字改为aaa
    groups    bob                //查看bob所属的所有组

修改组中的用户:groupmems

groupmems   -a  john  -g  xie     将用户john加到xie组中
groupmems   -d  john  -g  xie     将用户john从xie组中移除 或 gpasswd -d  john  xie

文件权限

文件权限的查看

使用 ls -lh 可以查看文件的具体信息,其中包括不同的用户对该文件的权限

    drwxr-xr-x.  3 root root     97 824 23:04 abrt

    -rw-r--r--.  1 root root     16 824 23:08 adjtime

我们拿 abrt 这个目录和 adjtime这个文件来解释。
前11个字符确定不同用户能对文件干什么
第一个字符代表文件-、目录d,链接l 设备C 块设备b
其余字符每3个一组rwx,读r、写w、执行x

  • 第一组rwx:文件所有者的权限是读、写和执行
  • 第二组rw-:与文件所在组同一组的用户的权限是读、写但不能执行
  • 第三组r–: 不与文件所有者同组的其他用户的权限是读不能写和执行

最后的.代表没有ACL扩展权限+代表有ACL扩展权限。

针对文件

  • r 表示可以读取文件
  • w 表示可以对文件内容做修改
  • x 表示文件可执行

针对目录:

  • r 表示可以列出目录内容(可以使用ls),前提是得有 x 权限,因为如果你都不能进入这个目录,你怎么列出该目录的内容
  • w 表示可以在目录中增删改查,前提是得有 x 权限,因为如果你都不能进入这个目录,你怎么增删改查
  • x 表示可以进入目录,但不一定能读取目录内的内容。要想读取目录的内容,需要有 r 权限,要想修改,需要有 w 权限!

注:目录的权限比较特殊,可以看到,x 权限是目录最基本的权限,因为如果你都不能进入该目录,那读取内容和增删改查就更无从所起了。还有一个就是当你对目录拥有 rwx 权限的时候。倘若目录中有一个文件,该文件对你的权限是没有 w 权限的,但是因为你先匹配到该目录的权限,可以对目录中的文件修改,所以你可以强制修改该文件,保存退出!

后面的各个字段的含义:

  • 3 代表文件的链接数是3;
  • root 代表该文件的所属用户;
  • root 代表该文件所属的组。一般文件所属的组就是文件所属主所在的组,也有特殊情况,可以自己随意修改!!
  • 97 代表文件的大小;
  • 8月 24 23:04代表文件最后的修改日期;
  • abrt 表示的是文件名
例子:         这里有几个用户,其UIDGID分别如下
root 用户:   uid=0(root)     gid=0(root)     groups=0(root)
xie  用户:   uid=1000(xie)   gid=1001(john)  groups=1001(john)
john 用户:   uid=1001(john)  gid=1001(john)  groups=1001(john)
james用户:   uid=1002(james) gid=1002(james) groups=1002(james)
jerry用户:   uid=1003(jerry) gid=1002(james) groups=1002(james)

然后,我们以root身份新建一个文件夹 test ,则test默认的权限如下
drwxr-xr-x 2 root root 4096 Aug 31 19:16 test
我们修改其文件权限,文件所有者,文件所在组,修改为如下
drwxrwx--- 2 xie james 4096 Aug 31 19:19 test
最后得到的结论如下:

xie用户的身份是文件所有者,其可以在该目录下创建文件,且创建文件的信息如下  -rw-r--r-- 1 xie   john  0 Aug 31 19:45 file1
john用户的身份是other,对该文件不可以做任何操作
james用户是身份是文件所属组的成员,其在该目录下创建文件的信息如下  -rw-rw-r-- 1 james james 0 Aug 31 19:32 file2
jerry用户的身份是文件所属组的成员,其在该目录下创建文件的信息如下  -rw-r--r-- 1 jerry james 0 Aug 31 19:43 file3

文件权限的修改

修改文件的权限 chmod

chmod  755 abrt                         //赋予abrt权限rwxr-xr-x
chmod  u=rwx ,g=rx,o=rx abrt          //赋予abrt  rwxr-xr-x权限。u=用户权限,g=组权限,o=不同组其他用户权限
chmod  u-x , g+w   abrt               //给abc去除用户执行的权限,增加组写的权限
chmod  a+r          abrt               //给所有用户添加读的权限

修改文件的所有者 chown 和 所属组 chgrp

chown   bob    adjtime           // 改变 adjtime 的所有者为 bob
chgrp   root   abrt             //改变 adjtime 所属的组为 root

chgrp   -R  root  abrt           //改变abc这个目录及其目录下所有的文件的所属的组织为 root
chown   ‐R  root  abrt           //改变abc这个目录及其下面所有的文件和目录的所有者是 root

注:修改文件和文件夹所有者和所属组方法都是一样的,如果要把文件夹内的文件的所有者和所属组都修改了,要加 -R 参数。chown除了可以修改属主属性,还可以修改所属组属性。 语法:chown 属主:属组 文件

chown   john:james   adjtime     //改变 adjtime 的所有者为john,所属组为 james

ACL控制权限 setfacl 、 getfacl

setfacl :设置文件访问控制规则

  • -m , 给文件加扩展ACL规则 , setfacl -m u:bob:
  • -x , 给文件移除扩展ACL规则 , setfacl -x u:bob abrt ;
  • -b , 移除文件所有的ACL规则 ,setfacl -b u:bob abrt ;
  • -R , 递归的对所有目录内所有的文件和目录进行操作 , setfacl -R -m u:bob:
  • -d , 设置默认的ACL规则

getfacl : 获取文件访问控制规则

例子:         这里有几个用户,其UIDGID分别如下
用户a:uid=1006(a)  gid=1006(a)  groups=1006(a)
用户b:uid=1007(b)  gid=1007(b)  groups=1007(b)
用户c:uid=1007(c)  gid=1000(root)  groups=1000(root)

我们以root身份在根目录下新建一个文件file,其权限如右:-rw-r--r-- 1 root root 4 Aug 31 23:00 file
其acl信息如下:getfacl file
            # file:  file
            # owner: root
            # group: root
            user::rw-
            group::r--
            other::r--
所以用户a和用户b只对他有读的权限,现在我们要让用户a拥有rwx权限,而用户b不变化
设置用户a的ACL权限:setfacl -m u:a:rwx  file
设置完acl之后,文件file的权限就变成了:-rw-rwxr--+ 1 root root 4 Aug 31 23:01 file  
注:用户的组权限位变化,等于acl信息中的mask值,还多了一个+扩展权限位。此时虽然用户c是root组中的,但是用户c对文件file的权限还仍然是之前的r--,而不是rwx
查看file的acl信息  getfacl  file   ,显示如下
            # file:  file
            # owner: root
            # group: root
            user::rw-
            user:a:rwx     // 用户a的ACL权限
            group::r--      
            mask::rwx      // 等于用户之前的权限与acl设置的权限进行 或运算
            other::r-
可知,用户a对其有rwx权限,用户b对其仍然只有 r 的权限
若要移除acl ,则  setfacl  -x  u:a  file               
移除了之后,a的权限就又还是只有 r 的权限了

谢公子学安全

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!
请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
地球胖头鱼
未填写
  • 作者发布文章189
  • 作者收获粉丝7
  • 作者收到点赞0
  • 所有文章被收藏了1
  • 博客总访问量排行第2
  • 博客总访问量3.4 万(每日更新)
查看所有博文