用户身份与文件权限

1.用户身份与能力

设计Linux的初衷就是为了满足多用户同时工作的需要,因此Linux需要有很好的安全性。在Linux中,root是最高权限,可以进行任何操作,但是能力越大、责任也越大,一旦使用root操作失误,就可能毁掉整个系统。

学习过程建议使用root权限来学习,这样就可以避免因权限不足导致的命令无法执行,虽然有可能因操作失误导致系统崩溃,但由于实验环境是在VMware虚拟机上搭建的,可以将安装好的系统设置为一次快照,这样即使系统崩溃了也可以在几秒内快速还原一台新的系统。设置快照很有必要,否则出现问题无法解决再重新安装时将会花费较多的时间。

在Linux中,UID(User IDentification)就相当于我们的身份证号一样具有唯一性,在RHEL7系统中,用户身份有如下一些:

  • 管理员 UID为0:系统的管理员用户(root)。
  • 系统用户 UID为 1~999:Linux为了避免因某个服务程序出现漏洞而被黑客提权至整个服务器,默认服务器会有独立的系统用户负责运行,进而有效控制被破坏的范围。
  • 普通用户 UID从1000开始:由管理员创建的用于日常工作的用户。

可以把多个用户加到同一个组中,方便为组中的用户统一规划权限或指定任务,这样的组叫用户组,有对应的用户组号码(GID,Group IDentification)。例如一个公司有多个部门,每个部门都有很多员工,如果希望某个部门的员工只能访问自己部门的资源,而不能访问其他部门的资源,那么就可以通过设置部门权限而非一个一个设置个人权限来达到目的。

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

1.1 useradd命令

useradd用于创建新用户,格式:useradd [选项] 用户名

使用该命令创建的用户默认的用户家目录会被存放在 /home , 默认的Shell解释器为 /bin/bash,默认创建一个与其同名的基本用户组。该命令的参数及作用:

  • -d:指定用户的家目录(默认为 /home/username)
  • -e:账户的到期时间,格式为 YYYY-MM-DD
  • -u:指定该用户的默认UID
  • -g:指定一个初始的用户基本组(必须已存在)
  • -G:指定一个或多个扩展用户组
  • -N:不创建与用户同名的基本用户组
  • -s:指定该用户的默认Shell解释器

下面创建了一个指定家目录路径、用户UID以及Shell解释器的普通用户user8888。

/sbin/nologin 是与bash完全不同的解释器,一旦用户的解释器被设置为 nologin,就代表该用户不能登录到系统中。

1.2 groupadd命令

用于创建用户组的命令,格式为:groupadd [选项] 群组名

1.3 usermod命令

用于修改用户属性的命令,格式为:usermod [选项] 用户名

用户的信息保存在 /etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已创建的用户信息,如用户UID、基本/扩展用户组、默认终端等。usermod命令的参数及作用如下:

先查看账户linuxprobe的默认信息:

然后把用户linuxprobe加入到root用户组中,这样扩展用户组会出现root用户组的字样,而基本用户组不会受到影响。

下面是使用-u参数修改用户的UID,同理,还可以通过-g、-G修改用户的基本组ID和扩展组ID

1.4 passwd命令

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

普通用户只能修改自己的密码,root权限用户可以修改所有人的密码并且不需要验证旧密码。passwd命令参数及作用:

分别设置root和linuxprobe的密码

1.5 userdel命令

用于删除用户,格式为:userdel [选项] 用户名,该命令参数及作用:

删除用户linuxprobe1

2.文件权限与归属

Linux中一切都是文件,但文件的类型不尽相同。Linux系统采用不同的字符加以区分,常见字符如下:

在Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文件来> 说,权限比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。
对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。
文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1来表示,文件所有者,所属组及其他用户权限之间无关联.
文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可> 读、可写(4+2)。
现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r--,数字法> 表示即为764。764不能再相加得17,因为文件所有者,所属组及其他用户权限之间无关联。练习:计算数字表示法764、642、153、731所对应的字符表示法,把rwxrw-r--、rw--w-> -wx、rw-r--r--转换成数字表示法。

如上图所示,-rw------- 代表文件类型和访问权限,第一个 - 代表文件类型为普通文件,rw------- 即上文所示的文件权限的字符表示,两个 root 分别表示所有者和所属组,1713 代表占用的磁盘大小(字节),后面的时间为最近一次的修改时间,最后一个表示文件名anaconda-ks.cfg

3.文件的特殊权限

在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的需求,因此便有了SUID、SGID与SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功
能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。

3.1 SUID

SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。

查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。另外,如果原本的权限是rw-,即原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。

3.2 SGID

SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:

除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:

这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而可以顺利地读取设备文件了。

chmod命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760。

除了设置文件或目录的权限外,还可以设置文件或目录的所有者和所属组,使用的命令为chown,其格式为“chown [参数] 所有者:所属组 文件或目录名称”。

chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。

3.3 SBIT

SBIT用于确保用户只能删除自己的文件,不能删除他人的文件,也就是说,当某个目录设置了SBIT粘滞位权限后,该目录中的文件就只能被其所有者删除。

RHEL7中的 /tmp 作为一个共享目录的文件,默认设置了SBIT特殊权限位。

与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。

4.文件的隐藏属性

4.1 chattr命令

用于设置文件的隐藏权限,格式:chattr [参数] 文件。如果想把某个隐藏功能添加到文件上,需在命令后追加“+参数”,如果想移除某个隐藏功能,则追加“-参数”。

chattr命令的参数及作用


创建一个文件然后直接删除,操作成功

创建文件设置隐藏权限然后删除,无法删除

4.2 lsattr命令

用于显示文件的隐藏权限,格式:lsattr [参数] 文件。

5.文件访问控制列表

一般权限、特殊权限、隐藏权限都是针对某一类用户设置的,如果希望对某个指定用户进行单独的权限管理,就需要用到文件的访问控制列表(ACL)了。基于普通文件或目录设置

ACL就是针对指定用户或用户组设置文件或目录的操作权限。

5.1 setfacl命令

用于管理文件的ACL规则,格式:setfacl [参数] 文件名。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或

用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。

下面为设置用户在/root 目录上的权限,设置后,即可使用普通用户查看/root 下的文件。

可以看到,前面表示文件类型和权限的内容 dr-xrwx--- 的后面由原本的点(.)变成了加号(+),即表示文件设置了ACL。

5.2 getfacl命令

用于显示文件上设置的ACL,格式为:getfacl 文件名称。

6.su命令与sudo服务

su命令解决用户切换身份的需求,使得当前用户在不退出登陆的情况下,切换到其他用户。

su与用户名之间的 - ,表示完全切换到新的用户,即把环境变量信息也变为新用户的相应信息。

从root切换到普通用户是不需要密码验证的,但是普通用户切换到root是需要验证密码的。

sudo命令用于给普通用户提供额外的权限来完成本来root管理员才能完成的任务,格式:sudo [参数] 命令名称。sudo中参数及作用:

sudo命令的功能:

  • 限制用户执行指定的命令
  • 记录用户执行的每一条命令
  • 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数
  • 验证密码的后五分钟内(默认值)无需再让用户再次验证密码

可以使用sudo命令提供的visudo命令来配置用户权限(须root权限)。这条命令禁止多用户同时修改,还会对文件内参数进行语法检查,发现错误时进行报错。

使用visudo命令配置sudo命令的配置文件的操作方法与Vim编辑器一样。


修改内容,增加一行:linuxprobe ALL=(ALL) ALL 【格式:谁可以使用 允许使用的主机=(以谁的身份) 可执行的命令列表】

然后便可以使用linuxprobe用户来操作root权限才能操作的内容,比如查看 /root 目录下的文件:

但是,实际生产环境中不允许普通用户拥有root管理员的一切权限,可以指定路径使该用户只拥有部分权限。先使用whereis cat命令找到命令所对应的保存路径,然后修改上面增加的那一行,把最后的ALL改为找到的路径:

然后就可以通过sudo命令顺利查看文件内容了:

当然,每次执行sudo都要输入一次密码,为了省去这个步骤,还可以添加NOPASSWD参数:

这样,再使用sudo命令时就不需要密码验证了。

原文地址:https://www.cnblogs.com/achangblog/p/8425229.html