Linux学习Day7:用户身份与文件权限、su命令与sudo服务

  Linux是一个多用户、多任务的操作系统,具有很好的稳定性与安全性,在幕后保障Linux系统安全的则是一系列复杂的配置工作。在Linux系统中,root用户作为系统管理员拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备等。但是俗话说“能力越大,责任越大”,因此,在使用root管理员身份管理系统时一定要秉持谨慎的态度,特别是在生产环境下,一旦执行了错误的命令可能会直接毁掉整个系统。

一、用户身份与能力


  Linux系统的管理员之所以是root,并不是因为他的名字叫root,而是因为该用户的身份证号码UID(User IDentification)的数值为0。在Linux系统中,UID就相当于我们的身份证号码一样具有唯一性,因此可以通过用户的UID来判断用户身份。注意:UID是不能冲突的。在RHEL7系统中,用户身份有下面这些:

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

  可以通过id命令查看用户UID,如下所示:

[root@linuxprobe ~]# id root     //管理员用户
uid=0(root) gid=0(root) groups=0(root)
[root@linuxprobe ~]# id sshd    //系统用户
uid=74(sshd) gid=74(sshd) groups=74(sshd)
[root@linuxprobe ~]# id wangwu    //普通用户
uid=1003(wangwu) gid=1003(wangwu) groups=1003(wangwu)

  为了方便管理属于同一组的用户,Linux系统还引入了用户组的概念。通过使用用户组号码GID(Group IDentification),我们可以把多个用户加入到同一组中,从而方便为组中的所有用户统一分配权限或指定任务。

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

  1、useradd命令

  用于创建新的用户,格式为"useradd  [参数]  用户名"。

  默认情况下,使用该命令创建用户时,用户的家目录存放在/home目录下,Shell解释器为/bin/bash,且默认创建一个与该用户同名的基本用户组。这些默认设置也可以根据下表中的参数进行修改。

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

  实验:创建一个普通用户linuxer,并指定家目录的路径、用户的UID以及Shell解释器。 

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

  注意:一旦用户的解释器被设置成/sbin/nologin,则表示该用户无法登录到系统中。

   2、groupadd命令

  用于创建用户组,格式为“groupadd  [参数]  群组名”。

  为了更加高效的指派系统中各个用户的权限,常常会把几个用户加入到同一个用户组里,这样便可以针对一类用户统一分配权限。

  实验:创建一个名为tony的用户组。

[root@linuxprobe ~]# groupadd tony

  3、usermod命令

  用于修改用户的属性,格式为“usermod  [参数]  用户名”。

  其实,在Linux系统中创建用户也就是修改配置文件的过程。用户信息保存在/etc/passwd文件中,可以直接编辑文本来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息。usermod命令的参数以及作用如表所示:

参数 作用
-C 填写用户账户的备注信息
-d  -m 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户,禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的UID

   实验1:将用户linuxprobe加入到root用户组中。

[root@linuxprobe ~]# usermod -G root linuxprobe
[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)   //扩展组列表出现root用户组

  实验2:修改linuxprobe用户的UID号码值。

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

  4、passwd命令

  用于修改用户密码、过期时间、认证信息等,格式为“passwd  [参数]  用户名”。其中,root管理员可以直接修改其他所有用户的密码,且不需要校验旧密码。passwd命令的参数以及作用如下表所示:

参数 作用
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户的密码,如echo "new password" | passwd --stdin username
-d 使该用户可以免密登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称

  实验1:修改用户自己的密码,以及使用root管理员修改其他用户的密码。

[root@linuxprobe ~]# passwd
Changing password for user root.
New password:          //此处输入密码
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:     //再次输入密码
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]# passwd zhangsan    //修改zhangsan用户密码
Changing password for user zhangsan.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.

  实验2:锁定用户,以及解锁用户。

[root@linuxprobe ~]# passwd -l zhangsan   //锁定zhangsan用户
Locking password for user zhangsan.
passwd: Success
[root@linuxprobe ~]# passwd -S zhangsan   //查看zhangsan用户是否被锁定
zhangsan LK 2020-03-02 0 99999 7 -1 (Password locked.)
[root@linuxprobe ~]# 
[root@linuxprobe ~]# passwd -u zhangsan   //解锁用户
Unlocking password for user zhangsan.
passwd: Success
[root@linuxprobe ~]# passwd -S zhangsan
zhangsan PS 2020-03-02 0 99999 7 -1 (Password set, SHA512 crypt.)

  5、userdel命令

  用于删除用户,格式为“userdel  [参数]  用户名”。在执行用户删除命令时,该用户的家目录默认会留下来,此时可以使用-r参数将其家目录删除。userdel命令相关参数及其作用如下表所示:

参数 作用
-f 强制删除用户
-r 同时删除用户及用户的家目录

   实验:删除lisi用户,以及家目录。

[root@linuxprobe ~]# id lisi
uid=1002(lisi) gid=1002(lisi) groups=1002(lisi)
[root@linuxprobe ~]# userdel -r lisi
[root@linuxprobe ~]# 
[root@linuxprobe ~]# id lisi
id: lisi: no such user

 二、文件权限与归属


  尽管在Linux系统中一切都是文件,但是每个文件的类型不尽相同,因此Linux系统使用不同的字符来加以区分,常见的字符如下所示:

字符 表示的文件类型
- 普通文件
d 目录文件
l 链接文件
b 块设备文件
c 字符设备文件
p 管道文件

[root@linuxprobe ~]# ls -l total 21228 drwxr-xr-x. 3 root root 14 Feb 18 15:26 a //目录文件 -rw-r--r--. 1 root root 147 Feb 26 21:02 chkhost.sh //普通文件 -rw-r--r--. 1 root root 195 Feb 28 22:16 chkhosts.sh -rw-r--r--. 1 root root 220 Feb 29 10:10 chkkeys.sh -rw-r--r--. 1 root root 215 Feb 26 22:33 chkscore.sh -rw-r--r--. 1 root root 393 Feb 26 22:56 CreateUser.sh drwxr-xr-x. 2 root root 6 Feb 15 19:41 Desktop //目录文件

  在Linux系统中,每个文件都有所属的所有者和所有组,并规定了文件的所有者、所有组以及其他人对文件拥有的可读(r)、可写(w)、可执行(x)的权限。可以通过ls命令查看文件的属性信息。

  但是对于普通文件和目录文件设置权限时,可读(r)、可写(w)、可执行(x)有不同的含意,如下所示:

  权限 含意
普通文件 r权限 表示能够读取文件的实际内容
w权限 表示能够编辑、新增、修改、删除文件的实际内容
x权限 表示能够运行一个脚本程序
目录文件 r权限 表示能够读取目录内的文件列表
w权限 表示能够在目录内新增、删除、重命名文件
x权限 表示能够进入该目录

  文件的读、写、执行权限可以简写成rwx,也可以用数字4、2、1来表示,如下表所示:

权限分配 文件所有者 文件所属组 其他用户
权限项 执行 执行 执行
字符表示 r w x r w x r w x
数字表示 4 2 1 4 2 1 4 2 1

  为了简化权限的表示,可以采用权限的数字法

  1.   若权限为7则代表:可读、可写、可执行(4+2+1)
  2.   若权限为6则代表:可读、可写(4+2)
  3.   若权限5则表示:可读、可执行(4+1)

  实验:设置一个文件的权限,其所有者拥有可读、可写、可执行的权限,其所属组拥有可读、可写的权限,其他人只有可读的权限。那么该文件的权限就是rwxrw-r--,数字法表示就是764。

[root@linuxprobe ~]# ls -l practice.txt 
-rw-r--r--. 1 root root 22 Feb 22 18:05 practice.txt
[root@linuxprobe ~]# chmod +764 practice.txt    //设置文件权限
[root@linuxprobe ~]# ls -l practice.txt 
-rwxrw-r--. 1 root root 22 Feb 22 18:05 practice.txt

 三、文件的特殊权限


  在复杂多变的生产环境中,单纯设置文件的rwx权限无法满足我们对安全和灵活性的要求,于是就有了SUID、SGID与SBIT的特殊权限位

  1、SUID

  SUID是一种对二进制程序(一般是指Linux系统命令,命令本质就是一个应用程序)进行设置的特殊权限,可以让二进制程序的执行者(也可以理解为执行命令的用户)临时拥有属主的权限,该权限仅针对拥有执行权限的二进制程序有效(即仅对命令有效)。例如,在passwd命令加上SUID特殊权限,就可以让普通用户临时拥有程序所有者的身份。

   查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x变成s就意味着该文件被赋予了SUID权限。如果原本是rw-权限,那么被赋予特殊权限后就变成rwS

[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1806 Mar  2 20:25 /etc/shadow      //该文件的权限为000
[root@linuxprobe ~]# ls -l /bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jan 30  2014 /bin/passwd     //被赋予了SUID权限

  补充:普通用户都可以通过passwd命令修改自己的用户名密码,修改密码的过程其实就是修改/etc/shadow配置文件的过程,但是这个配置文件的权限是000,也就是说只有root管理员才有权限查看或者修改这个文件。因此,给passwd命令加上SUID特殊权限位,让普通用户在使用passwd命令时临时获取root身份,把变更的密码信息写入shadow文件中。

[root@linuxprobe ~]# ls -l /bin/ | grep rws       //查看拥有SUID特性权限的命令
-rwsr-xr-x. 1 root root      53792 Jan 29  2014 at
-rwsr-xr-x. 1 root root      64184 Feb 12  2014 chage
-rws--x--x. 1 root root      23960 Mar 28  2014 chfn
-rws--x--x. 1 root root      23856 Mar 28  2014 chsh
-rwsr-xr-x. 1 root root      57536 Jan 28  2014 crontab
-----------------------------省略部分输出内容----------------------
[root@linuxprobe ~]# ls -l /bin/cat
-rwxr-xr-x. 1 root root 54048 Jan 25  2014 /bin/cat
[root@linuxprobe ~]# chmod u+s /bin/cat      //赋予cat命令SUID权限
[root@linuxprobe ~]# ls -l /bin/cat
-rwsr-xr-x. 1 root root 54048 Jan 25  2014 /bin/cat
[root@linuxprobe ~]# chmod u-s /bin/cat     //撤销cat命令SUID权限

  2、SGID

  SGID主要又有以下两种功能:

  •   让执行者临时拥有所属组(注意:不是所有者)的权限,仅针对可以执行的二进制程序进行设置;
  •   在某个目录中创建的文件夹自动继承该目录的用户组(只可以对目录进行设置);

   其中第一个功能是参考SUID二设计的,不同在于让执行程序的用户临时获取的是文件所属组的权限。

  前文提到过,Linux系统中每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就自动归属于执行这个操作的用户(即该用户是文件的所有者)。现在想要设置一个部门共享文件夹,该部门内的所有人员都可以自由读取目录中的内容,那么就要在该共享目录上设置SGID特殊权限。

[root@linuxprobe ~]# cd /tmp/         //切换至临时目录
[root@linuxprobe tmp]# mkdir testdir      //创建目录
[root@linuxprobe tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Mar  6 15:14 testdir/
[root@linuxprobe tmp]# chmod -Rf g+s testdir/      //赋予目录SGID特殊权限
[root@linuxprobe tmp]# ls -ald testdir/
drwxr-sr-x. 2 root root 6 Mar  6 15:14 testdir/

  接下来切换至一个普通用户,然后在testdir/目录下创建文件,并查看新创建的文件的是否继承所在目录的所属组名称。

[root@linuxprobe tmp]# chmod -Rf 777 testdir/         //确保普通用户可以在testdir目录创建文件
[root@linuxprobe tmp]# su - linuxprobe               //切换至linuxprobe用户
Last login: Fri Mar  6 15:20:36 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ 
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir/
[linuxprobe@linuxprobe testdir]$ 
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe" > testfile     //创建文件
[linuxprobe@linuxprobe testdir]$ ls -ald testfile 
-rw-rw-r--. 1 linuxprobe root 11 Mar  6 15:24 testfile    //新创建的文件自动继承目录的所属组

  这里介绍两个关于权限设置的重要命令:chmod和chown

  chmod命令用来设置文件或目录的权限,格式为"chmod  [参数]  权限  文件或目录名称"。  

[root@linuxprobe ~]# chmod 776 users.txt     //给文件设置权限
[root@linuxprobe ~]# ls -l users.txt 
-rwxrwxrw-. 1 wangwu xuliang 16 Feb 26 23:04 users.txt
[root@linuxprobe ~]# chmod -Rf 777 xuliang/      //给目录设置权限
[root@linuxprobe ~]# ls -l xuliang/
total 0
[root@linuxprobe ~]# ls -ald xuliang/       //正确查看目录权限的方法
drwxrwxrwx. 2 root root 6 Feb 26 20:41 xuliang/

   chown命令用来设置文件或目录的所有者和所属组,格式为"chown  [参数]  所有者:所属组  文件或目录名称"。

[root@linuxprobe ~]# ls -l users.txt 
-rwxrwxrw-. 1 wangwu xuliang 16 Feb 26 23:04 users.txt
[root@linuxprobe ~]# chown root:root users.txt    //设置文件的所有者和所属组
[root@linuxprobe ~]# ls -l users.txt 
-rwxrwxrw-. 1 root root 16 Feb 26 23:04 users.txt
[root@linuxprobe ~]# ls -ald xuliang/
drwxrwxrwx. 2 root root 6 Feb 26 20:41 xuliang/
[root@linuxprobe ~]# chown -Rf linuxprobe:linuxprobe xuliang/      //设置目录的所有者和所属组,需要添加-Rf参数
[root@linuxprobe ~]# ls -ald xuliang/
drwxrwxrwx. 2 linuxprobe linuxprobe 6 Feb 26 20:41 xuliang/

   3、SBIT

  SBIT特殊权限位可以确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位(也叫"保护位")权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

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

[linuxprobe@linuxprobe ~]$ ls -ald /tmp/
drwxrwxrwt. 20 root root 4096 Mar  6 16:52 /tmp/       //tmp目录默认被设置成SBIT权限
[linuxprobe@linuxprobe ~]$ cd /tmp/
[linuxprobe@linuxprobe tmp]$ ls -l test1.txt 
-rwxrwxrwx. 1 wangwu wangwu 7 Mar  6 16:27 test1.txt     //test1.txt文件属于wangwu用户
[linuxprobe@linuxprobe tmp]$ rm test1.txt 
rm: cannot remove ‘test1.txt’: Operation not permitted       //虽然文件的其他人权限设置了rwx,但是linuxprobe用户无法删除

   补充:在tmp目录下的文件,即便设置了777权限,也只能被其所有者删除。另外,对指定的目录设置SBIT特殊权限的方法如下所示:

[linuxprobe@linuxprobe ~]$ mkdir linux
[linuxprobe@linuxprobe ~]$ chmod -R o+t linux/      //设置SBIT特殊权限
[linuxprobe@linuxprobe ~]$ ls -ald linux/
drwxrwxr-t. 2 linuxprobe linuxprobe 6 Mar  6 17:10 linux/

 四、文件的隐藏属性


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

  1、chattr命令

  用于设置文件的隐藏权限,格式为"chattr  [参数]  文件"。如果想给文件添加某个隐藏功能,就使用"+参数"的形式;如果想把某个隐藏功能移出文件,就是使用"-参数"的形式。chattr命令中可供选择的隐藏权限参数非常丰富,具体如下表所示:

参数 作用
i 无法对文件进行修改(若对目录设置了该参数,则只能修改目录中的文件内容,而不能新建或删除文件)
a 仅允许补充(追加)内容,无法覆盖或删除内容(append only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘的区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
X 可以直接访问压缩文件中的内容

   实验1:新建一个文件,然后给文件添加不允许删除的隐藏权限。

[linuxprobe@linuxprobe ~]$ echo "asdasdasd" > tttttt.sh
[linuxprobe@linuxprobe ~]$ chattr +a tttttt.sh     //添加无法删除的隐藏权限
chattr: Operation not permitted while setting flags on tttttt.sh     //注意:普通用户无法对文件进行隐藏权限设置
[linuxprobe@linuxprobe ~]$ su -
Password: 
Last login: Fri Mar  6 14:44:54 BNT 2020 from 192.168.134.1 on pts/0
[root@linuxprobe ~]# echo "123445" > linuxtest.txt
[root@linuxprobe ~]# chattr +a linuxtest.txt     //添加无法删除的隐藏权限
[root@linuxprobe ~]# rm linuxtest.txt 
rm: remove regular file ‘linuxtest.txt’? y
rm: cannot remove ‘linuxtest.txt’: Operation not permitted    //提示无法删除文件,即使是root用户

   实验2:移除一个文件的隐藏权限。

[root@linuxprobe ~]# chattr -a linuxtest.txt     //移除被赋予隐藏权限
[root@linuxprobe ~]# rm linuxtest.txt 
rm: remove regular file ‘linuxtest.txt’? y     //删除成功
[root@linuxprobe ~]# 

   2、lsattr命令

  用于显示文件的隐藏权限,格式为"lsattr [参数]  文件"。在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看,平时使用的ls命令则看不出来端倪。 

[root@linuxprobe ~]# chattr +a users.txt  //添加隐藏权限
[root@linuxprobe
~]# [root@linuxprobe ~]# lsattr users.txt //查看隐藏权限
-----a---------- users.txt [root@linuxprobe ~]# chattr -a users.txt [root@linuxprobe ~]# lsattr users.txt ---------------- users.txt

 五、文件访问控制列表


  如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。我们知道,普通用户是无法进入root管理员的家目录中,其执行结果如下所示:

[root@linuxprobe ~]# su - linuxprobe
Last login: Fri Mar  6 16:51:56 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ 
[linuxprobe@linuxprobe ~]$ cd /root/
-bash: cd: /root/: Permission denied

  1、setfacl命令

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

  •   针对目录需要使用-R参数;
  •   针对普通文件需要使用-m参数;
  •   可以使用-b参数删除某个文件的ACL。

  实验:设置普通用户linuxprobe在/root目录上拥有rwx权限。

[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root/
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar  7 16:20:41 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ cd /root/                  //成功进入/root目录
[linuxprobe@linuxprobe root]$ ls
a            chkkeys.sh     Desktop    example.sh   initial-setup-ks.cfg  
chkhost.sh   chkscore.sh    Documents  findresults  ipaddrs.txt           
chkhosts.sh  CreateUser.sh  Downloads  guess.sh     mkcdrom.sh            

  实验2:查看某个文件或目录是否设置ACL规则。

[root@linuxprobe ~]# ls -ld /root/
dr-xrwx---+ 18 root root 4096 Mar  7 15:09 /root/    //文件权限最后一个点(.)变成了(+),就表示已经设置了ACL

  实验3:新建一个root.txt文件,并指定linuxprobe用户拥有rwx权限

[root@linuxprobe ~]# cd /tmp/
[root@linuxprobe tmp]# echo "root" > root.txt   
[root@linuxprobe ~]# setfacl -m u:linuxprobe:rwx /tmp/root.txt        //其中"u"指代用户
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar  7 16:40:36 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ cd /tmp/
[linuxprobe@linuxprobe tmp]$ cat root.txt
root
[linuxprobe@linuxprobe tmp]$ ls -l root.txt 
-rw-rwxr--+ 1 root root 5 Mar  7 16:42 root.txt

  实验4:指定xuliang用户组的成员拥有对root.txt的rwx权限。

[root@linuxprobe ~]# id wangwu
uid=1003(wangwu) gid=1003(wangwu) groups=1003(wangwu),8890(xuliang)     //wangwu用户已经加入xuliang用户组
[root@linuxprobe ~]# setfacl -m g:xuliang:rwx /tmp/root.txt        //其中"g"指代用户组
[root@linuxprobe ~]# su - wangwu
Last login: Sat Mar  7 16:53:06 BNT 2020 on pts/0
[wangwu@linuxprobe ~]$ echo "wangwu" &> /tmp/root.txt     //修改文件内容
[wangwu@linuxprobe ~]$ cat /tmp/root.txt      /修改成功
wangwu

  2、getfacl命令

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

  实验:显示/root目录上设置的ACL信息。

[root@linuxprobe ~]# getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx      //显示linuxprbe用户拥有rwx权限
group::r-x
mask::rwx
other::---

 六、su命令与sudo服务


   su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺利地切换到其他用户,比如从root管理员切换到linuxprobe普通用户:

[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar  7 16:43:02 BNT 2020 on pts/0

  上述su命令与用户名之间存在一个减号(-),这意味着完全切换至新的用户,即把环境变量也变更为新用户的相应信息,而不是保留原始的信息。一般建议在切换用户时添加这个减号(-)。但是使用su命令切换至root管理员用户时,需要输入root管理员的密码,这增大了被黑客窃取的可能性。

  sudo命令可以把特定命令的权限赋予给指定的用户,既保证普通用户能顺利完成工作,也可以避免root管理员密码泄露的风险。我们要做的就是合理配置sudo服务,但原则是—在保证普通用户完成相应的工作前提下,尽可能少地赋予额外的权限。

  sudo命令用于给普通用户提供root管理员的权限,格式为"sudo [参数] 命令名称",相关的参数以及作用如下所示:

参数 作用
-h 列帮助信息
-l 列出当前用户可执行的命令
-u 用户名或UID值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行sudo命令需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

  总结来说,sudo命令具有如下功能:

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

  可以使用visudo命令来配置sudo服务的配置文件,其操作方法与Vim编辑器的使用方法一致。注意:只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。在sudo服务的配置文件中,按照下面的格式在99行(大约)填上指定的信息:

  谁可以使用   允许使用的主机=(以谁的身份)  可执行命令的列表

[root@linuxprobe ~]# visudo
     95 ## The COMMANDS section may have other options added to it.
     96 ##
     97 ## Allow root to run any commands anywhere
     98 root    ALL=(ALL)       ALL
     99 linuxprobe    ALL=(ALL)     ALL
    100 ## Allows members of the 'sys' group to run networking, software,
    101 ## service management apps and more.

  作为一名普通用户,是无法看到root管理员家目录的文件信息的,但是在完成上述sudo服务配置文件的设置后,只需要在命令前面加上sudo就可以了。

[linuxprobe@linuxprobe ~]$ ls -l /root/
ls: cannot open directory /root/: Permission denied
[linuxprobe@linuxprobe ~]$ 
[linuxprobe@linuxprobe ~]$ sudo ls -l /root/

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for linuxprobe: <此处输入linuxprobe用户的密码>
total 21336
drwxrwxr-x+  3 root       root             14 Feb 18 15:26 a        //成功查看/root目录的文件信息
-rw-rwxr--+  1 root       root            147 Feb 26 21:02 chkhost.sh
-rw-rwxr--+  1 root       root            195 Feb 28 22:16 chkhosts.sh
-rw-rwxr--+  1 root       root            220 Feb 29 10:10 chkkeys.sh
------------------------省略部分输出内容---------------------------------

  但是,为了不让普通用户拥有整个系统的最高权限,ALL参数显示有些不合适。一般规定普通用户只能以root身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统无法识别。

[root@linuxprobe ~]# visudo
     97 ## Allow root to run any commands anywhere
     98 root    ALL=(ALL)       ALL
     99 linuxprobe    ALL=(ALL)     /usr/bin/cat
[root@linuxprobe ~]# su - linuxprobe
Last login: Sun Mar  8 14:06:50 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied      
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
[sudo] password for linuxprobe: <此处输入linuxprobe用户的密码>
root:$6$bGJ7rSCb$QxVvuBqxkO/QnOGixcJcijnAhkFuspF.ZlerdV2jVjNtIOt3Rn/b4V3sjuvpMV.bfgXcFLvwsmOxq3VMkISL81:18323:0:99999:7:::
bin:*:16141:0:99999:7:::                //查看成功
daemon:*:16141:0:99999:7:::
-------------------省略部分输出内容----------------------

  当然,sudo配置文件中没有指定的命令就不允许执行了。

[linuxprobe@linuxprobe ~]$ sudo more /etc/shadow
Sorry, user linuxprobe is not allowed to execute '/bin/more /etc/shadow' as root on linuxprobe.com.

  另外。每次执行sudo命令都需要输入用户密码其实比较麻烦,这时可以添加NOPASSWD参数,使得每次执行sudo命令不再需要输入密码验证。

[root@linuxprobe ~]# visudo
     97 ## Allow root to run any commands anywhere
     98 root    ALL=(ALL)       ALL
     99 linuxprobe    ALL=NOPASSWD:     /usr/bin/cat,/usr/sbin/poweroff     //添加NOPASSWD参数并新增poweroff命令

[root@linuxprobe ~]# su - linuxprobe
Last login: Sun Mar  8 14:10:01 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ 
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow     //不再需要输入密码
root:$6$bGJ7rSCb$QxVvuBqxkO/QnOGixcJcijnAhkFuspF.ZlerdV2jVjNtIOt3Rn/b4V3sjuvpMV.bfgXcFLvwsmOxq3VMkISL81:18323:0:99999:7:::
bin:*:16141:0:99999:7:::                  
daemon:*:16141:0:99999:7:::
---------------省略部分输出------------------------

  经过上述配置以后,普通用户也可以执行关机操作了。

[root@linuxprobe ~]# su - linuxprobe
Last login: Sun Mar  8 14:23:01 BNT 2020 on pts/0
[linuxprobe@linuxprobe ~]$ poweroff
User root is logged in on sshd.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.
[linuxprobe@linuxprobe ~]$ sudo poweroff

 

原文地址:https://www.cnblogs.com/xuliang-daydayup/p/12394635.html