Linux学习之用户身份与文件权限

时间:2022-06-04 02:34:54

Linux学习之用户身份与文件权限

1 用户身份及能力

Linux系统的管理员之所以是root,并不是因为其名叫root,而是该用户身份号码数值(UID)为0.

  管理员UID为0:系统的管理员用户

  系统用户UID为1-999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整个服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。

  普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。

在Linux系统中创建每个用户时,将自动创建一个同名的基本用户组,且该用户组只有用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称为扩展用户组。一个用户只有一个基本用户组,但可以有多个扩展用户组。

  1.1 useradd命令

  用于创建新的用户,格式为“useradd [选项] 用户名”

  常用参数及作用

  -d  指定用户的家目录(默认为/home/username)

  -e  账户的到期时间,格式为“2018-10-01”

  -u  指定该用户的默认UID

  -g  指定一个初始的用户基本组(必须已存在)

  -G  指定一个或多个扩展用户组

  -N  不创建与用户同名的基本用户组

  -s  指定该用户的默认shell解释器

   % useradd -d /home/linux -u -s /sbin/nologin linuxprobe #一旦用户的解释器被设置为nologin,则代表该用户不能登录到系统中。

  1.2 groupadd命令

  用于创建用户组,格式为“groupadd [选项] 群组名”


Linux中没有直接根据组名查询GID的命令

可用如下方法

% grep eric /etc/group #群组文件放置在/etc/group中


  1.3 usermod 命令

  用于修改创建用户组,格式为“usermod [选项] 用户名”

  常用参数及作用:

  -c  填写用户账户的备注信息

  -d -m  参数-m与-d连用,可重新指定用户的家目录并自动把旧的数据转移过去

  -e  账户的到期时间,格式为“2018-10-01”

  -g  变更所属用户组

  -G  变更扩展用户组

  -L  锁定用户禁止其登录系统

  -U  解锁用户,允许其登录系统

  -s  变更默认终端

  -u  修改用户的UID

  1.4 passwd命令

  用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”

普通用户只能使用此命令修改自己的密码,而root则有权限修改其他所有人的密码

  常用参数及作用:

  -l  锁定用户,禁止其登录

  -u  解除锁定,允许用户登录

  --stdin  允许通过标准输入修改用户密码,如'echo "NewPassWord" | passwd --stdin Username'

  -d  使该用户可用空密码登录系统

  -e  强制用户在下次登录时修改密码

  -S  显示用户的密码是否被锁定,以及密码所采用的加密算法名称

  1.5 userdel 命令

  用于删除用户,格式为“userdel [选项] 用户名”

  常用参数及作用:

  -f  强制删除用户

  -r  同时删除用户及用户家目录

  2 文件权限及归属

  Linux文件类型:

  -   普通文件

  d  目录文件

  l   链接文件

  b  块设备文件

  c  字符设备文件

  p  管道文件

对于目录文件来说,“可读”表示能够读取目录内的文件列表,“可写”表示能够在目录内新增、删除、重命名文件,“可执行”则表示能够进入该目录。

  r—4   w—2    x—1

  权限:rwxrw-r--  764  #必须对应权限项,无权限位置用-

Linux学习之用户身份与文件权限

1          2                3      4          5            6                 7                                8

1:文件类型

2:文件访问权限

3:文件数

4:文件拥有者

5:文件所属组

6:文件大小

7:文件修改时间

8:文件名


输出第N列信息

例:上文中依据组名查询GID,只输出GID

原输出为: eric:x::

% grep eric /etc/group | awk -F: '{print $3}' #-F参数是用来分割原字符串,后加分割标识符,后面{print $3}必须加大括号

输出为10000


 3 文件的特殊权限

  3.1 SUID

  SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。

Linux学习之用户身份与文件权限

  设置SUID:(u+s)

% chmod u+s filename

设置SUID后,执行位x替换为s,若无执行权限,则该位为S

  3.2 SGID

  主要实现两种功能:一是让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);二是在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置,如部门的共享目录)。SGID的第一种功能是参考SUID设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。

  设置SGID:(g+s)

% chmod -Rf g+s filename    # -R  递归处理    -f  不显示错误信息

  3.3 chmod命令

  用于设置文件或目录的权限,格式为“chmod [参数] 权限”

  3.4 chown命令

  用于设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组 文件或目录名称”

% chown root:bin test

  3.5 SBIT(粘滞位或保护位)

  SBIT特殊权限可以确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,设置了SBIT,该目录中的文件就只能被其所有者执行删除操作了。设置了SBIT后,执行位x替换为t,若无执行权限则为T。

  设置SBIT(o+t)

   % chmod -R o+t /root

特殊权限更多内容:https://www.jianshu.com/p/b390688a7af8

  4 文件的隐藏属性

  4.1 chattr命令

  用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。添加隐藏功能,需“+参数”,移除隐藏功能,则为“-参数”。

  常用参数及作用:

  i  无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。

  a  仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)

  S  文件内容在变更后立即同步到硬盘(sync)感觉类似于flush

    s  彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)

  A  不再修改这个文件或目录的最后访问时间(atime)

  b  不再修改文件或目录的存取时间

  D  检查压缩文件中的错误

  d  使用dump命令备份时忽略本文件/目录

  c  默认将文件或目录进行压缩

  u  当删除文件后依然保留其在硬盘中的数据,方便日后恢复

  t  让文件系统支持尾部合并(tail-merging)

  X  可以直接访问压缩文件中的内容

  4.2 lsattr命令

  用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”,Linux系统中隐藏权限必须用lsattr查看。

  5 文件访问控制列表(ACL)

  一般权限、特殊权限、隐藏权限共性:针对某一类用户

  文件访问控制列表:针对某一个用户

  若对某个目录设置了ACL,该目录内文件会继承其ACL;若对文件设置了ACL,则文件不再继承其所在目录的ACL。

  5.1 setfacl命令

  用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的rwx权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行rwx权限的控制。

  常用参数及作用:

  -R  对目录进行递归设置ACL

  -m  对普通文件设置ACL

  -b  删除某个文件/目录的ACL  

   % setfacl -Rm u:linuxprobe:rwx /root   #u为user的简写,也可写user、g(group)、mask、other

ACL要素:

ACL_USER_OBJ:相当于Linux里file_owner的permission
ACL_USER:定义了额外的用户可以对此文件拥有的permission
ACL_GROUP_OBJ:相当于Linux里group的permission
ACL_GROUP:定义了额外的组可以对此文件拥有的permission
ACL_MASK:定义了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大权限
ACL_OTHER:相当于Linux里other的permission

  5.2 getfacl命令

  用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”,可加--omit-header省略掉前三行。

[root@localhost ~]# getfacl ./test.txt
# file: test.txt
# owner: root
# group: admin
user::rw-  #1
user:john:rw-  #2
group::rw-  #3
group:dev:r--  #4
mask::rw- other::r--  #5

1:文件拥有者权限,ACL_USER_OBJ

2:用户john权限,ACL_USER

3:文件所属组权限,ACL_GROUP_OBJ

4:用户组dev权限,ACL_GROUP

5:MASK权限(ACL中最大权限,其他用户/用户组权限均不得大于此,否则按此权限执行)

设置ACL后 ls查看文件权限的最后一位由“.”变成了“+”

Linux学习之用户身份与文件权限

见到设置了ACL的文件/目录,不能单单依靠ls查看所有者、所属组及其他人的权限,如设置ACL时定义了MASK,则MASK权限替代GROUP权限显示,需使用getfacl命令查看。

  6 su命令与sudo服务

  6.1 su命令

  用于切换用户身份,格式为“su - 用户名”,-表示完全切换到新用户,即把环境变量信息也变更为新用户。

  6.2 sudo命令

  用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务(指定提权),格式为“sudo [参数] 命令名称”。

  主要参数及作用:

  -h  列出帮助信息

  -l  列出当前用户可执行的命令

  -u用户名或UID值  以指定的用户身份执行命令

  -k  清空密码的有效时间,下次执行sudo时需要再次进行密码验证

  -b  在后台执行指定的命令

  -p  更改询问密码的提示语

  6.3 visudo命令

  类似于vim,用于配置用户权限,此命令执行时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。只有root管理员才可以用visudo命令编辑sudo服务的配置文件。

  填写规则:

  谁可以使用 允许使用的主机=(以谁的身份) 可执行命令列表(命令必须为绝对路径,用whereis查看)

  例 在99行加入:linuxprobe ALL=(ALL) ALL  #linuxprobe可执行root权限的所有命令

    在99行加入:linuxprobe    ALL=(root) /usr/bin/cat  #linuxprobe可查看/root(root管理员家目录)中的文件信息

   % sudo cat /etc/shadow

  linuxprobe ALL=NOPASSWD:  /usr/sbin/poweroff  #“NOPASSWD:”参数使得用户执行sudo命令时不需密码验证,不要忘了:否则报错