用户身份与文件权限

一.用户身份与能力

概述

  • 设计Linux系统的初衷之一就是为了满足多个用户同时工作的需求,因此Linux系统必须具备很好的安全性。
  • Linux的管理员是root用户,其实这种说法不是很准确,root用户之所以为系统的管理员,是因为它的UID(User Identification)为0,而不是它叫做root。
  • Linux系统中有三种类型的用户:
    • 管理员用户:UID为0的用户
    • 系统用户:UID为1-999,Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
    • 普通用户:UID为1000-?,由管理员创建的用于日常工作的用户。
  • Linux中还有用户组的概念(GID,Group IDentification),用于更加方便地管理某一类用户的权限等。在创建每个用户时,将自动创建一个与其同名的基本用户组,这个基本用户组只有本用户一个人,如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。

管理用户的三种方式

1.可视化方式

  • 直接在可视化页面添加用户和管理用户即可。

2.命令方式

  • useradd命令:用于创建新的用户,格式为“useradd [选项] 用户名”。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。这些默认设置可以根据表5-1中的useradd命令参数自行修改。

    注意:当shell解释器设置为/sbin/nologin,则该用户不能登陆到系统中

  • groupadd命令:用于创建用户组,格式为“groupadd [选项] 群组名”。具体参数作用使用man命令查询。

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

  • passwd命令:用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项][用户名]”。普通用户只能使用passwd命令修改自身的系统密码,而root管理员则有权限修改其他所有人的密码。更酷的是,root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便。既然root管理员可以修改其他用户的密码,就表示完全拥有该用户的管理权限。

  • userdel命令:用于删除用户,格式为“userdel [选项] 用户名”。

3.修改配置文件方式

  • 用户的信息在/etc/passwd文件中,可以直接使用文本编辑器来添加和修改其中的用户及其参数。

    图中的信息按照":"隔开:

    • 第一列为用户名
    • 第二列该用户是否设置了密码(密码的配置文件在/etc/shadow中)
    • 第三列是UID
    • 第四列是GID
    • 第五列是用户的描述
    • 第五列是用户的家目录
    • 第六列是用户使用了哪种解释器
  • 用户组的信息在/etc/group文件中。

    分割方式同passwd文件,只是第二列的用户组密码基本没啥用处。

二.文件权限与归属

  • 文件类型
    第一位表示文件类型,linux中的类型有以下几种:

  • 访问权限
    访问权限共有9个位置,应用3+3+3的角度看这9个位置,前三位表示文件所有者的权限,中间三位表示文件所属组的权限,后三位表示其他用户的权限。在Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。一般文件来说,比较容易理解:“可读”表示能够读取文件的实际内容;“可写”表示能够编辑、新增、修改、删除文件的实际内容;“可执行”则表示能够运行一个脚本程序。另外,对目录文件来说,“可读”表示能够读取目录内的文件列表;“可写”表示能够在目录内新增、删除、重命名文件;而“可执行”则表示能够进入该目录。文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1来表示,文件所有者,所属组及其他用户权限之间无关联。

    文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可读、可写(4+2)。我们来看这样一个例子。现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r--,数字法表示即为764。

所以,回到最初的例子,这张图包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r--),除此以外的其他人也只有可读权限(r--),文件的磁盘占用大小是34298字节,最近一次的修改时间为4月2日的凌晨23分,文件的名称为install.log。

三.文件的特殊权限

1.SUID

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

2.SGID

SGID主要实现两种功能:

  • 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);类似SUID的功能,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,二十获取到文件所属组的权限。
  • 个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置):如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是SGID的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

3.SBIT

SBIT也叫做“粘滞位”,功能是可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。

4.修改权限和所属者的命令

  • chmod,用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法表示为760。对应的命令为"chmod 760 文件名"。
  • chown,用来设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组 文件或目录名称”。
  • 用这两个命令对目录进行操作时,需要加上参数-Rf,R表示递归操作,即对目录内所有的文件进行整理操作;f表示强制。
  • 添加特殊权限时:(以chmod为例)
    • SUID(代表4):"chmod 4741 test"表示将test文件的权限改为rws rw- r--,也可以将命令写成"chmod u+s test"
    • SGID(代表2):"chmod 2771 test"表示将test文件的权限改为rwx rws r--,也可以将命令写成"chmod g+s test"
    • SBIT(代表1):"chmod 1477 test"表示将test文件的权限改为r-- rws rwt,也可以将命令"chmod o+t test"

四.文件的隐藏属性

Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。

1.chattr命令

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

例子:

2.lsattr命令

lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls之类的命令则看不出端倪。一旦使用lsattr命令后,文件上被赋予的隐藏权限马上就会原形毕露。此时可以按照显示的隐藏权限的类型(字母),使用chattr命令将其去掉:

五.文件访问控制列表

一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。

为了更直观地看到ACL对文件权限控制的强大效果,我们先切换到普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果如下所示:

  • setfacl命令
    用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。下面来设置用户在/root目录上的权限:

    另外,常用的ls命令是看不到ACL表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了ACL了。

  • getfacl命令
    用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。

注意:FACL权限 > 隐藏权限 > 特殊权限 > 普通权限

六.su命令和sudo服务

在学习的过程中,为了避免权限因素导致配置服务失败,可以使用root管理员来操作系统,但是在正式的生产环境中还是要对安全有一份敬畏之心,不要用root管理员去做所有事情,因为一旦执行了错误的命令,可能会直接导致系统崩溃。

  • su命令
    可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户。su命令和用户名之间可以加一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。所以在切换用户身份的时候最好添加这个减号。

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

    要使sudo命令起作用,需要对配置文件(/etc/sudoers)进行配置,只能用root管理员对其进行修改

    ## Sudoers allows particular users to run various commands as
    ## the root user, without needing the root password.
    ## 该文件允许特定用户像root用户一样使用各种各样的命令,而不需要root用户的密码
    ##
    ## Examples are provided at the bottom of the file for collections
    ## of related commands, which can then be delegated out to particular
    ## users or groups.
    ## 在文件的底部提供了很多相关命令的示例以供选择,这些示例都可以被特定用户或
    ## 用户组所使用 
    ##
    ## This file must be edited with the 'visudo' command.
    ## 该文件必须使用"visudo"命令编辑
    
    ## Host Aliases
    ## Groups of machines. You may prefer to use hostnames (perhaps using 
    ## wildcards for entire domains) or IP addresses instead.
    ## 对于一组服务器,你可能会更喜欢使用主机名(可能是全域名的通配符)
    ## 、或IP地址,这时可以配置主机别名
    # Host_Alias     FILESERVERS = fs1, fs2
    # Host_Alias     MAILSERVERS = smtp, smtp2
    
    ## User Aliases
    ## These aren't often necessary, as you can use regular groups
    ## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname 
    ## rather than USERALIAS
    ## 这并不很常用,因为你可以通过使用组来代替一组用户的别名
    # User_Alias ADMINS = jsmith, mikem
    
    ## Command Aliases
    ## These are groups of related commands...
    ## 指定一系列相互关联的命令(当然可以是一个)的别名,通过赋予该别名sudo权限,
    ## 可以通过sudo调用所有别名包含的命令,下面是一些示例
    
    ## Networking 网络操作相关命令别名
    # Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient
    , /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig
    , /sbin/mii-tool
     
    ## Installation and management of software 软件安装管理相关命令别名
    # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
    ## Services 服务相关命令别名
    # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
     
    ## Updating the locate database 本地数据库升级命令别名
    # Cmnd_Alias LOCATE = /usr/bin/updatedb
    
    ## Storage 磁盘操作相关命令别名
    # Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe
    , /bin/mount, /bin/umount
    
    ## Delegating permissions 代理权限相关命令别名
    # Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp 
    
    ## Processes 进程相关命令别名
    # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
    
    ## Drivers 驱动命令别名
    # Cmnd_Alias DRIVERS = /sbin/modprobe
    
    # Defaults specification
    #
    # Disable "ssh hostname sudo <cmd>", because it will show the password in clear. 
    #         You have to run "ssh -t hostname sudo <cmd>".
    # 一些环境变量的相关配置,具体情况可见man soduers
    
    Defaults    requiretty
    
    Defaults    env_reset
    Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
    Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
    Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
    Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
    Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
     
    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
     
    ## Next comes the main part: which users can run what software on 
    ## which machines (the sudoers file can be shared between multiple
    ## systems).
    ## 下面是规则配置:什么用户在哪台服务器上可以执行哪些命令(sudoers文件可以在多个系统上共享)
    ## Syntax(语法):
    ##
    ## 	user	MACHINE=COMMANDS 用户 登录的主机=(可以变换的身份) 可以执行的命令
    ##
    ## The COMMANDS section may have other options added to it.
    ## 命令部分可以附带一些其它的选项
    ##
    ## Allow root to run any commands anywhere 
    ## 允许root用户执行任意路径下的任意命令
    root	ALL=(ALL) 	ALL
    
    ## Allows members of the 'sys' group to run networking, software, 
    ## service management apps and more.
    ## 允许sys中户组中的用户使用NETWORKING等所有别名中配置的命令
    # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE
    , DRIVERS
    ## Allows people in group wheel to run all commands
    ## 允许wheel用户组中的用户执行所有命令
    %wheel	ALL=(ALL)	ALL 
    
    ## Same thing without a password
    ## 允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令
    # %wheel	ALL=(ALL)	NOPASSWD: ALL
    
    ## Allows members of the users group to mount and unmount the 
    ## cdrom as root
    ## 允许users用户组中的用户像root用户一样使用mount、unmount、chrom命令
    # %users  ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
    ## Allows members of the users group to shutdown this system
    ## 允许users用户组中的用户关闭localhost这台服务器
    # %users  localhost=/sbin/shutdown -h now
    
    ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
    ## 读取放置在/etc/sudoers.d/文件夹中的文件(此处的#不意味着这是一个声明)
    #includedir /etc/sudoers.d
    

    根据配置文件的信息,按照登录的主机=(可以变换的身份) 可以执行的命令填上指定的信息,得到:

  • visudo命令

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

原文地址:https://www.cnblogs.com/huangzefeng/p/10492808.html