用户与权限

用户与权限

Scroll Down
请注意,本文发布日期:  110  天前,最后编辑日期:  75  天前,内容可能已经不具有时效性,请酌情参考。

一、用户&权限

linux中有着严格的用户区分权限控制。用户并不是能够对所有的文件或目录进行读写操作。这就涉及到身份认证授权,身份认证即用户可以登录到系统;授权则是用户能够访问哪些资源,不能访问哪些资源。root是linux中具有超级权限的用户,对整个系统都有管治权,可以访问所有资源

二、用户

1、用户

在linux中用户身份被分成root系统用户普通用户三类。linux采用具有唯一性的UID来判断用户的权限和身份。有了身份和权限就能够区分某个用户能访问哪些资源,不能访问哪些资源。root UID为0,root只是一个代称;这就好比一个国家的领袖,总统就是UID,特朗普就是root,总统换届,root可以是拜登,但是总统的职位永远在那,实质上有权利的就是总统。

设置UID和文件权限的目的就是为了避免因为一个服务程序出现漏洞而导致整个系统被黑客控制,控制被破坏的范围。默认系统中的不同服务,由不同的系统用户运行,系统用户具有不同的权限,一般权限不是很大。

linux下的账号被保存在/etc/passwd和/etc/shadow中:
  • /etc/passwd:账号数据库信息,文件权限低
  • /etc/shadow:存放密码及相关信息,文件权限高

1) useradd

默认创建用户后,该用户主目录会存在/home下,默认shell解释器为/bin/bash,同时创建一个同名基本用户组。

useradd [参数] 用户名
-d	指定用户主目录;后跟用户主目录路径
-e	用户到期时间;YYYY-MM-DD
-u	指定该用户的UID
-G	指定一个或多个扩展用户组
-s	指定用户的默认shell解释器
-m	同时创建主目录
-N	不创建同名组账号
shell解释器被设置为/sbin/nologin表示该用户无法登录系统

2) usermod

如果创建用户时填错用户的信息,那么可以通过usermod去修改。

usermod [参数] 用户名
-c	填写用户的备注信息;
-d -m	重新指定用户主目录并且自动把旧的数据转移过来;
-e	用户到期时间;YYYY-MM-DD
-g	变更所属用户组;
-G	变更扩展用户组;
-L	锁定用户,禁止其登录系统;
-U	解锁用户,允许登录系统;
-s	变更默认shell解释器
-u	修改用户的UID

3) passwd

可以通过passwd修改用户密码、过期时间、认证信息等。

passwd [参数] 用户名
-l	锁定用户,禁止其登录;
-u	解除锁定,允许用户登录;
--stdin	允许通过标准输入修改用户密码;如echo “newpasswd” | passwd –stdin 用户名
-d	使该用户可用空密码登录;
-e	强制用户在下次登录时修改密码;
-S	显示用户的密码是否被锁定,以及密码所采用的加密算法名称;
普通用户只能修改自身密码,root可以直接更改其他用户密码

4) userdel

当确认某位员工离职,就需要删除该用户。

userdel [参数] 用户名
-f  强制删除用户
-r  同时删除用户主目录;一般不加该参数,只删除用户,不删除用户主目录

2、用户组

为了使得在工作时更加高效和便捷,linux可以将多个用户放入到一个用户组中,方便给该组的用户进行统一的权限管理和分配任务。类似用户,用户组采用唯一性的GID(group identification)来判断用户组的权限和身份。

需要注意的是,创建用户的时候,会自动创建同名的基本用户组,该用户会隶属于基本用户组。所谓的将多个用户添加至一个用户组是将其添加入扩展用户组

用户可以属于多个扩展用户组

1) groupadd

将多个用户加入到一个扩展用户组中。

groupadd 用户组名

2) id

查看用户的UID、GID以及所属组。

id 用户名

三、权限

在linux中文件被分为:

  • -:普通文件
  • d:目录文件
  • l:链接文件
  • b:块设备文件
  • c:字符设备文件
  • p:管道文件

每个文件(无论什么类型)都具有权限,权限被分为:一般权限特殊权限隐藏权限。权限所对应到的是用户/用户组,即用户/用户组具备哪些权限。

1、一般权限

每个权限都有属组、属主。权限的实际表示方法则是有两种:字符权限、数字权限。每个文件都为属主属组其他人设置了读写执行(即rwx)权限。字符权限数字权限是一一对应的。

比如ls查看某文件显示信息“-rwxr-xr-x”,从中读取到的信息是该文件是普通文件、属主拥有rwx权限,属组拥有r-x权限,其他人拥有r-x权限;对应的数字权限就是755。

一般权限对于普通文件和目录文件有着不同的效果:

普通文件
  • r:读取文件内容、复制
  • w:编辑、新增、修改、删除文件的内容
  • x:作为应用程序执行文件
目录文件
  • r:读取目录内容
  • w:在目录中创建、删除、重命名文件/目录;上传和下载文件权限
  • x:进入该目录、读取文件属性和权限
当创建/传送一个文件后,这个文件就会自动归属执行该操作的用户(即属主)

1) chmod

chmod可以修改文件的属性。

chmod 属主/属组/其他人  +-  {r|w|x|s}  文件名称
+- 表示增加/减少权限
示例:
  • 赋予脚本可执行权限:sudo chmod u+x a.sh
  • 不指定添加对象,即为当前用户所在组添加:sudo chmod +x a.sh
  • 一次性添加多个权限:sudo chmod g+w,o-r a.sh
  • 文件数字权限:sudo chmod 777 a.sh
  • 目录数字权限:sudo chmod -R 755 /home

2) chown

修改文件/目录的属主和属组。

chown [参数] 属主:属组  文件名称
-R   针对目录操作
示例:
  • 将属主为ubuntu的a.txt文件修改为epiol:sudo chown epiol a.txt
  • 一次性修改a.txt的属主和属组:sudo chown epiol:epiol a.txt
  • 修改目录的属主:sudo chown epiol -R /a

2、特殊权限

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

禁止滥设特殊权限位!

1) SUID

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

比如所有用户可以使用passwd修改自己的密码,也可以直接修改文件来修改密码。一般密码存在/etc/shadow文件中,但是该文件权限000,意味着除了root外,所有用户都无法查看和修改该文件,如果给passwd加上SUID,那么普通用户临时获得程序所有者的身份,把变更密码信息写入到/etc/shadow文件中以达到修改密码的目的。

如果某个文件是被加了SUID特殊权限位的二进制程序所执行,那么该文件的属主权限从rw-变成rwS

2) SGID

例如如果计算机老师收作业时,要求学生上传到共享目录中,那么在该目录上设置SGID特殊权限位,这样,学生在该目录中创建任何文件都是属于该目录的属组,而不是自己的基本用户组。

chmod -Rf g+s file

3) SBIT

该特使权限是”保护位”,针对目录操作。老师要求作业上传到服务器的特定共享目录中,但是某些人可以删除其他同学的作业,这时设置该共享目录为SBIT特殊权限位,可确保用户只能删除自己的文件,而不能删除其他用户的文件。

  • 系统中的/tmp作为一个共享文件的目录,默认被设置了SBIT特殊权限位
  • 目录设置了SBIT后,如果o是rwx则变为rwt,如果o是rw-则变为rwT
  • 文件能否删除并不取决于自身的权限,还要看目录是否有写入权限,假如文件权限777,其所处的目录被设置了SBIT,那么是无法删除的
chmod -R o+t 目录

3、隐藏权限

所谓的隐藏权限,即默认情况下不能直接被用户发现。有时候明明拥有root权限,仍然删除不了某些文件,或者只能增加内容,不能修改和删除内容的情况。这一定程度上阻止了黑客篡改日志文件的情况。关于文件的隐藏权限涉及到了两个命令:chattr和lsattr

chattr用于设置文件的隐藏权限、lsattr用于显示文件隐藏权限

1) chattr

设置文件的隐藏权限

chattr [参数] 文件名
-i	无法对文件进行修改,若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除
-a	仅允许追加内容,无法删除后者覆盖内容
-S	文件内容在变更后立即同步到硬盘
-s	彻底从硬盘中删除,不可恢复
-A	不再修改该文件/目录的最后访问时间(即atime)
-b	不再修改该文件/目录的存取时间
-D	检查压缩文件中的错误
-d	使用dump命令备份时忽略本文件/目录
-c	默认将文件/目录进行压缩
-u	当删除该文件后依然保留其在硬盘上的数据,方便日后恢复
-t	让文件系统支持尾部合并
-X	可以直接访问压缩文件中的内容
示例:
  • 为a.txt文件添加i文件属性权限,让其无法被删除:sudo chattr +i a.txt
  • 为a.txt文件减少i文件属性权限,让其被删除:sudo chattr -i a.txt
  • 保护a目录:sudo chattr -R +i a
  • 接触保护a目录:sudo chattr -R -i a

2) lsattr

可以查看EXT文件系统属性,如果使用root权限也没法删除该文件,说明该文件的EXT文件系统属性被修改了。

lsattr [参数] 文件名
-R     针对查看目录及其子目录的EXT文件系统属性
-d     针对查看目录的EXT文件系统属性
示例:
  • 查看上述被添加i文件属性的a.txt:lsattr a.txt

4、umask

当创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?umask设置了用户创建文件的默认权限,系统管理员必须要为你设置一个合理的 umask值,以确保创建的文件具有所希望的默认权限,防止其他非同组用户对你的文件具有写权限。在已经登录之后,可以按照个人的偏好使用umask命令来改变文件创建的默认权限。相应的改变直到退出该shell或使用另外的umask命令之前一直有效。

修改umask值是在profile这个文件中。如果是针对某一个用户设置默认的umask,那么就需要在该用户的主目录下的.profile或者.bash_profile文件中去修改;如果是针对所有用户设置默认的umask,那么就需要在/etc/profile文件中设置umask值。用户在登录时会先查找主目录下的.profile或.bash_profile,如果没有则找/etc/profile,然后引用。

修改umask时需要注意:
  • 设置文件的umask:对于文件的umask来说,系统不允许在创建一个文件时就赋予它x权限,比如创建后通过chmod来实现,所以针对文件的umask的权限最大值为6。
  • 设置目录的umask:对于目录的umask来说,系统允许在创建时就设置x权限,所以针对目录的umask的权限最大值为7
umask默认值为022,得到正确的权限需要拿777-022=755才对。但是linux中规定文件默认值不能赋予x权限,所以默认值创建的文件权限为644

5、访问控制

一般权限、特殊权限、隐藏权限都是针对某一类用户设置的。文件ACL是针对某个指定用户/用户组进行的单独的权限控制。文件的ACL提供的是在属主、属组、其他人的rwx权限之外的特殊权限控制。文件ACL权限继承规则:

  • 对目录设置ACL,目录中的文件会继承ACL
  • 对目录中的文件设置ACL,文件不会再继承所在目录的ACL

1) setfacl

setfacl可以针对单一用户/用户组/单一文件/目录来进行rwx权限的控制。

setfacl [参数] u/g/o:用户名/用户组名:rwx 文件名
-R	针对目录文件
-m	针对普通文件
-b	删除某个文件ACL
如果文件设置了文件ACL,那么ls显示的结果会多出+

2) getfacl

getfacl可以显示文件上的ACL信息

getfacl 文件名

6、用户切换

su用于切换用户,使得当前用户在不退出的情况下,切换到其他用户。sudo用于将执行权限赋予给指定用户。在日常管理中,不要使用root去操作,因为一旦出错,难以挽回,ubuntu默认禁用root账户。

1) su

-表示把环境变量信息变更为新用户的相应信息,而不是保留原始的信息。但是这容易泄露root密码,我们可以配置sudo来更加安全的完成用户需要root权限才能操作的行为。

su -用户名

2) sudo

临时(默认5分钟)赋予root权限,保证了普通用户完成相应工作的情况下,尽可能少的赋予额外的权限。

sudo [参数] 命令
-l	列出当前用户可执行的命令
-u	用户名或者UID:以执行用户身份执行命令
-k	清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b	在后台执行指定的命令
-p	更改询问密码的提示语
  • sudo服务的配置文件/etc/sudoers,提供集中的用户管理、权限与主机等参数,修改sudo配置文件
  • 默认验证密码的后5分钟内无需让用户再次验证密码
常见sudoers配置示例:
  • 用户执行poweroff命令时无需密码:epiol ALL=NOPASSWD: /usr/sbin/poweroff
  • 增加使用sudo命令的用户:epiol ALL=(ALL:ALL) ALL
  • 指定192.168.100.0/24网段用户执行cat命令:epiol 192.168.100.0/24=(root) /usr/bin/cat
  • Epiol用户敲sudo时无需密码:epiol ALL=(ALL:ALL) NOPASSWD:ALL