Linux 就该这么学 CH05 用户的身份和文件权限

1 用户权限与能力

超级用户root拥有最高的系统所有权,能够管理系统的各项功能,如添加、删除用户;启动或关闭服务进程;开启或禁用硬件设备等。
用户身份分类:

  • 系统管理员root :UID = 0;

  • 系统用户:UID = 1-999; 系统用户的最大特点是安装系统后默认就会存在的,且默认情况不能登录系统,它们是系统正常运行必不可少的,他们的存在主要是方便系统管理,满足相应的系统进程都文件属主的要求。存放路径,/sbin/nologin。

  • 普通用户UID = 1000开始,上不封顶。

    通过使用用户组号码GID可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。
    linux用户建立时会建立一个基本用户组,但是用户可以加入到其他用户组,称为扩展用户组,一个用户只有一个基本用户组,可以有多个扩展用户组。

1)useradd

uaeradd 用于创建新用户,格式为 useradd [选项] 用户名。
在这里插入图片描述
例程: 创建一个用户,但使其不能登入系统。
需要设置新用户的解释器为 nologin。

[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe
[root@linuxprobe ~]# id linuxprobe
 uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe)

2) groupadd

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

[root@linuxprobe ~]# groupadd ronny

group存放的路径为: /etc/group.

3)usermod

usermod用于修改用户的属性,格式为 usermod [选项] 用户名。
在这里插入图片描述在这里插入图片描述

[root@linuxprobe ~]# usermod -G root linuxprobe
[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[root@linuxprobe ~]# usermod -L linuxprobe

4) passwd

passwd用于修改用户密码,过期时间。认证信息等。格式为passwd [选项] [用户名]。
普通用户在修改自己密码的时候需要验证密码,不能修改其他用户密码。
root可以修改任何普通用户以及自己的密码,而不需要验证原密码。

[root@linuxprobe ~]# passwd -l linuxprobe
Locking password for user linuxprobe.
passwd: Success
[root@linuxprobe ~]# passwd -S linuxprobe
linuxprobe LK 2017-12-26 0 99999 7 -1 (Password locked.)
[root@linuxprobe ~]# passwd -u linuxprobe
Unlocking password for user linuxprobe.
passwd: Success
[root@linuxprobe ~]# passwd -S linuxprobe
linuxprobe PS 2017-12-26 0 99999 7 -1 (Password set, SHA512 crypt.)

5)userdel

userdel命令用于删除用户。格式为 userdel [选项] 用户名。
在这里插入图片描述

2 文件权限与归属

linux系统中的文件类型有下面几种:

  • -:普通文件
  • d:目录文件
  • l:链接文件
  • b:块设备文件
  • c:字符设备文件、
  • p:管道文件。
    每个文件可以被所有者,所属组和其他用户所操作,而每个用户所操作文件的权限分为:可读(r),可写(w),可执行(x)。
文件 目录
可读(r) 能够读取文件的实际内容 能够读取目录内的文件列表
可写(w) 能够编辑、增删改文件的实际内容 能够在目录内增删以及重命名文件
可执行(x) 能够运行脚本程序 能够进入该目录

注:文件夹的可执行与否可用cd判断,能进入则表示可执行。
文件权限:可读(r)、可写(w)、可执行(x),也可以分别用数字4、2、1表示。
在这里插入图片描述
ls -l可以查看文件到额详细信息以及权限信息。
在这里插入图片描述
权限的字符表示和数字表示转换实例:
rwxrw-r-- --> 421420400 --> 764
rw–w--wx --> 623
–xr-x-wx --> 153
rwx-wx–x --> 731

chmod

改变文件权限的命令,格式为 chmod [选项] [参数]。
参数如下所示:

选项 作用
-c或–changes 效果类似“-v”参数,但仅回报更改的部分;
-f或–quiet或–silent 不显示错误信息;
-R或–recursive 递归处理,将指令目录下的所有文件及子目录一并处理;
-v或–verbose 显示指令执行过程;
–reference=<参考文件或目录> 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
<权限范围>+<权限设置> 开启权限范围的文件或目录的该选项权限设置;
<权限范围>-<权限设置> 关闭权限范围的文件或目录的该选项权限设置;
<权限范围>=<权限设置> 指定权限范围的文件或目录的该选项权限设置;

权限范围的表示法如下

字母 作用
u User,即文件或目录的拥有者;
g Group,即文件或目录的所属群组;
o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
a All,即全部的用户,包含拥有者,所属群组以及其他用户;
r 读取权限,数字代号为“4”;
w 写入权限,数字代号为“2”;
x 执行或切换权限,数字代号为“1”;
- 不具任何权限,数字代号为“0”;
s 特殊功能说明:变更文件或目录的权限。

例程

[root@RHEL Desktop]# ls -l  test.txt test2.txt
-rw-r--r--. 1 root root    28 Aug 26 23:51 test.txt
-rw-r--r--. 1 root root    31 Aug 26 20:38 test2.txt
[root@RHEL Desktop]# chmod 777 test.txt 
[root@RHEL Desktop]# ls -l test.txt
-rwxrwxrwx. 1 root root 28 Aug 26 23:51 test.txt
[root@RHEL Desktop]# chmod u+x test2.txt 
[root@RHEL Desktop]# ls -l test2.txt
-rwxr--r--. 1 root root 31 Aug 26 20:38 test2.txt
[root@RHEL Desktop]# chmod u=-,g=rw,o=x test2.txt 
[root@RHEL Desktop]# ls -l test2.txt
----rw---x. 1 root root 31 Aug 26 20:38 test2.txt
[root@RHEL Desktop]# chmod -c 777 test2.txt 
mode of ‘test2.txt’ changed from 0061 (---rw---x) to 0777 (rwxrwxrwx)    ##显示结果对比
[root@RHEL Desktop]# chmod -v 667 test2.txt 
mode of ‘test2.txt’ retained as 0667 (rw-rw-rwx)
[root@RHEL Desktop]# ls -l test.txt test2.txt
-rw-r-xr--. 1 root root 28 Aug 26 23:51 test.txt
-rw-rw-rwx. 1 root root 31 Aug 26 20:38 test2.txt
[root@RHEL Desktop]# chmod --reference test2.txt test.txt
[root@RHEL Desktop]# ls -l test.txt test2.txt
-rw-rw-rwx. 1 root root 31 Aug 26 20:38 test2.txt
-rw-rw-rwx. 1 root root 28 Aug 26 23:51 test.txt
[root@RHEL Desktop]# 

chown

chown 改变某个文件或目录的所有者和所属组。格式为 chown [选项 ][ 参数]。
选项:

选项 作用
-v或–version 显示指令执行过程;
-R或–recursive 递归处理,将指定目录下的所有文件及子目录一并处理;
–reference=<参考文件或目录> 把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;

该命令只能是root或文件的所有者来操作。
例如:

chown  root:root filename  ##将filename的所有者和所属组都改为root.

3 文件的特殊权限

特殊权限是对rwx权限的安全性和灵活性进行补充。

1)SUID

SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有所有者的权限(仅对拥有普执行权限的二进制文件有效)。如果赋予了SUID的权限,则所有者中的可执行权限位如果原来是x则会变为s,如果原来是-,则会变为S。
关于SUID说明

  • SUID 仅对二进制文件有效,不能作用在脚本上,且设置在目录上无意义 。
  • 执行者对该程序需要具有x可执行权限。
  • 权限仅在程序执行的过程中有效,执行suid权限的程序时,此用户将继承此程序的所有者权限。
  • 执行者将具有程序的所有者权限,其进程的属主为原程序文件的属主。
  • 数字设置权限的值为4。
    设置方法:
#添加特殊权限
chmod u+s filename    
chmod 4xxx filename  
#删除特殊权限
chmod u-s filename   
chmod 0xxx filename

例程 1.cat命令属于root,普通用户有执行权。shadow是密码加密文件,属于root,普通用户无操作权。设置cat的SUID使普通用户可以查看shadow。执行cat命令过程中,普通用户以root身份去执行,执行结束则suid权限失效。

[root@RHEL Desktop]# ls -l /bin/cat  /etc/shadow
-rwxr-xr-x. 1 root root 54048 Jan 24  2014 /bin/cat
----------. 1 root root  1263 Sep 10 21:58 /etc/shadow
[root@RHEL Desktop]# su felix
[felix@RHEL Desktop]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[felix@RHEL Desktop]$ exit
exit
[root@RHEL Desktop]# cat /etc/shadow
root:$6$3uqRxoYH$VS68GF365IrM5uHAaJV3IPcI2iO0VICzLU8qXDcDiQ9XLe2LT3KXrk2DjcQvIwDqgCt6u7O2dvaowRkgShp1U0:18150:0:99999:7:::
···
···
[root@RHEL Desktop]# chmod u+s /bin/cat   #设置SUID
[root@RHEL Desktop]# ls -l /bin/cat  /etc/shadow
-rwsr-xr-x. 1 root root 54048 Jan 24  2014 /bin/cat  #查询SUID
----------. 1 root root  1263 Sep 10 21:58 /etc/shadow
[root@RHEL Desktop]# su felix
[felix@RHEL Desktop]$ cat /etc/shadow
root:$6$3uqRxoYH$VS68GF365IrM5uHAaJV3IPcI2iO0VICzLU8qXDcDiQ9XLe2LT3KXrk2Djc
···
···
[felix@RHEL Desktop]$ 

例程2 :用touch来证明执行有suid权限命令过程中以命令所有者的身份。
思路:touch 的所有者属于root,普通用户有执行权,给该命令加上suid权限,然后普通用户建立一个文件,如果该文件所有者属于root,则说明执行过程以root身份去执行的。

[root@RHEL Desktop]# ls -l /bin/touch
-rwxr-xr-x. 1 root root 62432 Jan 24  2014 /bin/touch
[root@RHEL Desktop]# touch test
[root@RHEL Desktop]# ls -l test
-rw-r--r--. 1 root root 0 Sep 11 01:58 test
[root@RHEL Desktop]# su felix
[felix@RHEL Desktop]$ touch test2
touch: cannot touch ‘test2’: Permission denied
[felix@RHEL Desktop]$ exit
exit
[root@RHEL Desktop]# chmod u+s /bin/touch
[root@RHEL Desktop]# ls -l /bin/touch
-rwsr-xr-x. 1 root root 62432 Jan 24  2014 /bin/touch
[root@RHEL Desktop]# su felix
[felix@RHEL Desktop]$ touch test2
[felix@RHEL Desktop]$ ll test2
-rw-rw-r--. 1 root felix 0 Sep 11 02:00 test2   #建立的文件属于root.
[felix@RHEL Desktop]$ 

SUID有个bug,就是如果对vim进行suid权限设置,那么系统中所有的文件都可以被修改 ,如果修改了root有关的文件,那么普通用户也可以和root一样操作了。

2) SGID

SGID 是让目录中新的文件或目录的所有组归属该目录的所有组。

  • 让所有者临时拥有所有组的权限。
  • 简单的说设置SGID的目的就是让多个用户(同属一个组)共享,同一个组的用户都可以处理。
  • 同suid一样,当原来所属组上是x时,则设置SGID之后是s,若是-,则设置SGID之后是S。
  • SGID对二进制文件和目录有效。
  • 执行者对该程序、目录需要具有x可执行权限。
  • 用户在此目录下的有效组群将会变成目录的组群。
  • 若用户在此目录下有w权限,则使用者所建立的新文件的组群与该目录的组群相同。
  • 数字设置权限的值为2。
    设定方法:
#添加SGID
chmod g+s filename/dir
chmod 2xxx filename/dir
#删除SGID
chmod g-s filename/dir
chmod 0xxx filename /dir

例程:设置一个共享文件夹test,让test扩展组内的用户都可以操作。

#1,新建一个用户组test,然后把root和felix都加入该组
[root@RHEL /]# groupadd test
[root@RHEL /]# usermod -G test root
[root@RHEL /]# id root
uid=0(root) gid=0(root) groups=0(root),1002(test)
[root@RHEL /]# usermod -G test felix
[root@RHEL /]# id felix
uid=1000(felix) gid=1000(felix) groups=1000(felix),1002(test)

#2,用root在根目录下新建一个文件夹test,然后将该文件的所属组改为test,并增加所属组的写权限.
[root@RHEL /]# mkdir test
[root@RHEL /]# ll -ald test
drwxr-xr-x. 2 root root 6 Sep 11 21:15 test
[root@RHEL /]# chown root:test test
[root@RHEL /]# chmod g+w test
[root@RHEL /]# ls -ald test
drwxrwxr-x. 2 root test 22 Sep 11 21:18 test

# 3 修改test的SGID权限,用root和felix 分别在test目录下新建一个文件
[root@RHEL /]# chmod g+s test
[root@RHEL /]# ls -ald test
drwxrwsr-x. 2 root test 36 Sep 11 22:00 test
[root@RHEL /]# cd test
[root@RHEL test]# touch test1.sh
[root@RHEL test]# su felix
[felix@RHEL test]$ touch test2.sh
[felix@RHEL test]$ ll
total 0
-rw-r--r--. 1 root  test 0 Sep 11 22:03 test1.sh
-rw-rw-r--. 1 felix test 0 Sep 11 22:03 test2.sh
#上面显示test1.sh 和test2.sh的所属组都是test.

3) SBIT(set sticky bit,也称粘滞位)。

SBIT 的作用:

  • 对于一个多人可写的目录,如果设置了sticky,则每个普通用户(除了root和目录所有者)仅能删除和改名自己的文件或目录;
  • 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略。
  • 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限 。
  • 任何人都可以在此目录拥有写权限,但是不能删除、修改、移动别人拥有的文件。
  • 数字设置权限的值为1。
    SBIT 设置方法:
#设置SBIT
chmod o+t dir
chmod o-t dir

chmod 1xxxx dir
chmod 0xxxx dir  #test

例程:设置test的SBIT权限,用root新建文件,用普通用户去删除;用普通用户去建新文件,用root去删除,结果普通用户无法删除,root可以删除。(不严谨,应该用两个普通用户,设SBIT之前和之后对比)。

[root@RHEL /]# chmod o+t test
[root@RHEL /]# chmod o+w test
[root@RHEL /]# ls -ald test
drwxrwsrwt. 2 root test 36 Sep 11 22:06 test
[root@RHEL test]# touch test1.sh
[root@RHEL test]# su felix
[felix@RHEL test]$ rm -rf test1.sh
rm: cannot remove ‘test1.sh’: Operation not permitted
[felix@RHEL test]$ touch test2.sh
[felix@RHEL test]$ exit
exit
[root@RHEL test]# rm -rf test2.sh
[root@RHEL test]# ls
test1.sh

如果原来有x,则设置SBIT之后变为t;如果原来是-,则设置SBIT之后为T。
总结:
在这里插入图片描述
参看 :特殊权限 SUID、SGID、Sticky
Linux文件权限与属性详解 之SUID、SGID & SBIT

4,文件的隐藏属性

linux中的文件除了有一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,不容易被用户发现。隐藏权限可以使文件不能被删除,或修改,但日志文件可以追加内容。

1) chattr

chattr 用于设置文件的隐藏权限,格式为 chattr [参数] 文件名.
在这里插入图片描述
在这里插入图片描述
其中 +参数 就是增加隐藏功能的参数属性, -参数就是取消参数属性。

[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# chattr +a linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
rm: cannot remove ‘linuxprobe’: Operation not permitted

2) lsattr

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

[root@linuxprobe ~]# lsattr linuxprobe
-----a---------- linuxprobe
[root@linuxprobe ~]# chattr -a linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe
---------------- linuxprobe

5 文件访问控制列表

如果希望对指定的用户进行单独的权限控制,则就需要用到文件的访问控制列表ACL(即FACL,file access control list). 总的来说,基于普通文件或目录设置ACL,就是针对指定的用户或用户组设置文件的目录权限。
说明:

  • 如果对目录设置了ACL则目录中的文件就会继承ACL.
  • 如果对文件进行了ACL设置,则它不再集成目录的ACL。

setfacl

setfacl命令是用于设置管理文件的ACL规则,格式为 setfacl [参数] 文件名。
文件的ACL提供的是在所有者,所属组和其他用户的读写执行权限之外的特殊权限控制,使用setfacl命令可以使用单一用户或用户组、单一文件或目录进行读写执行权限的控制。
-R 递归参数针对目录设置。
-m 针对普通文件设置。
-b 用于删除某个文件的ACL权限。

例程:

[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd /root
-bash: cd: /root: Permission denied
[linuxprobe@linuxprobe root]$ exit
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ cd /root
[linuxprobe@linuxprobe root]$ ls
anaconda-ks.cfg Downloads Pictures Public	

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

[root@linuxprobe ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root

2 )getfacl

getfacl用于查看文件设置的ACL信息,格式为 getfacl filename.
例程:

[root@linuxprobe ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---

6, su命令和sudo服务。

1) su命令

su命令用于切换用户的身份,使得用户在不退出登录的情况下直接切换到其他用户。格式为:
su - username.
其中格式中的-可要可不要,加上-的作用是完全切换到新用户,比如把环境信息也变更到新用户的信息,而不保留原始的信息。
当从root切换到普通用户时不需要密码,当从普通用户切换到root时需要验证密码。但是使用exit命令可以不输入密码。

2) sudo服务

sudo服务是把特定的命令的执行权限赋予给指定用户。sudo的配置原则是:保证普通用户完成相应的工作前提下,尽可能少的赋予额外的权限。
sudo用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为:sudo [参数] 命令名称。
在这里插入图片描述
总结sudo的功能如下:

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

可以使用visudo命令来修改sudo的配置文件,好处是:可以禁止多个用户同时修改sudoers文件,还可以进行语法检测。
设置格式:
在sudo配置文件的最后一行按下面的格式加入:
谁可以使用 允许使用的主句=(以谁的身份) 可执行命令的列表
例如:
linuxprob ALL=(ALL) ALL
sudo -l 命令可以查看到所有当前普通用户可以执行的命令。
为了限制普通用户的权限可以使用下面的格式来指定普通用户的可用命令。

···
linuxprob 	ALL=(ALL)  /usr/bin/cat 

还可以添加 NOPASSWD 参数,使得用户执行 sudo 命令时不再需要密码验证,格式如下:

···
linuxprob 	ALL=NOPASSWD 		 /usr/bin/cat 

原文地址:https://www.cnblogs.com/fhyfhy/p/11760981.html