Day-12-Linux 特殊权限

一、特殊权限概述

前面我们已经学习过 r(读)、w(写)、 x(执行)这三种普通权限,但是我们在査询系统文件权限时会发现出现了一些其他权限字母,比如:

[root@oldboy ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

在属主本来应该是 x(执行)权限的位置出现了一个小写s,这是什么权限?我们把这种权限称作 SetUID 权限,也叫作 SUID 的特殊权限。

二、.特殊权限SUID

1.问题

在 Linux 系统中,每个普通用户都可以更改自己的密码,这是合理的设置。问题是,普通用户的信息保存在 /etc/passwd 文件中,用户的密码在 /etc/shadow 文件中,也就是说,普通用户在更改自己的密码时修改了 /etc/shadow 文件中的加密密码,但是文件权限显示,普通用户对这两个文件其实都是没有写权限的,那为什么普通用户可以修改自己的权限呢:

[root@boldboy ~]# ll /etc/passwd
-rw-r--r-- 1 root root 6209 Apr 13 03:26 /etc/passwd
[root@boldboy ~]# ll /etc/shadow
---------- 1 root root 11409 Apr 13 03:26 /etc/shadow

2.解决方案

其实,普通用户可以修改自己的密码在于 passwd 命令。该命令拥有特殊权限 SetUID,也就是在属主的权限位的执行权限上是 s。可以这样来理解它:当一个具有执行权限的文件设置 SetUID 权限后,用户在执行这个文件时将以文件所有者的身份来执行。

示例图
图片.png

当普通用户使用 passwd 命令更改自己的密码时,实际上是在用 passwd 命令所有者 root 的身份在执行 passwd 命令,root 当然可以将密码写入 /etc/shadow 文件,所以普通用户也可以修改 /etc/shadow 文件,命令执行完成后,该身份也随之消失。

3.示例演示

1)举个例子,有一个普通用户 cui-01,他可以修改自己的权限,因为 passwd 命令拥有 SetUID 权限;但是她不能査看 /etc/shadow 文件的内容,因为査看文件的命令(如 cat)没有 SetUID 权限。命令如下:
1.普通用户可以自己可以修改自己的密码,从而改变/etc/shadow中的数据
[cui-01@oldboy ~]$ passwd 
Changing password for user cui-01.
Changing password for cui-01.
(current) UNIX password: 

2.但无法使用cat命令查看/etc/shadow
[cui-01@oldboy ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[root@oldboy ~]# ps aux | grep passwd     查看修改密码时的进程
root       7612  0.5  0.0 170712  1992 pts/1    S+   14:40   0:00 passwd
root       7615  0.0  0.0 112708   976 pts/0    S+   14:41   0:00 grep --color=auto passwd

3.创建一个新的用户,并将其改为属主,赋予特殊权限
[root@oldboy ~]# useradd cui
[root@oldboy ~]# chown cui /usr/bin/passwd   修改为属主
[root@oldboy ~]# ll /usr/bin/passwd 
-rwxr-xr-x. 1 cui root 27832 Jun 10  2014 /usr/bin/passwd
[root@oldboy ~]# chmod u+s /usr/bin/passwd    赋予特殊权限
[root@oldboy ~]# ll /usr/bin/passwd 
-rwsr-xr-x. 1 cui root 27832 Jun 10  2014 /usr/bin/passwd

4.再次修改密码(但是修改不成功,因为普通用户cui无权访问/etc/shadow)
[cui-01@oldboy ~]$ passwd 
Changing password for user cui-01.
Changing password for cui-01.
(current) UNIX password:
 
5.再次查看修改密码时passwd的进程,发现特殊权限调用cui(属主)去修改文件
[root@oldboy ~]# ps aux | grep passwd
cui        7655  0.0  0.0 170712  1996 pts/1    S+   16:08   0:00 passwd
root       7658  0.0  0.0 112708   976 pts/0    R+   16:08   0:00 grep --color=auto passwd
[root@oldboy ~]# ll /etc/shadow
----------. 1 root root 775 Aug  8 16:03 /etc/shadow

进程能够以何种身份去查看文件,主要取决于运行这个进程的用户 对这个文件有没有权限。

2)注:
passwd 是系统命令,可以执行,所以可以赋予 SetUID 权限。
cui-01 用户对 passwd 命令拥有 x(执行)权限。
cui-01 用户在执行 passwd 命令的过程中,会暂时切换为 root 身份,所以可以修改 /etc/shadow 文件。
命令结束,cui-01用户切换回自己的身份。
注: cat 命令没有 SetUID权限,所以使用 cui-01 用户身份去访问 /etc/shadow 文件,


4.suid授权方法:权限字符s(S),用户位置上的 执行权限(x)位上设置

  • 4000 数字设置,
  • u+s 用命令设置
    suid优点: 可以让普通用户执行无法执行的命令 方便
  • suid缺点: 如果rm 为suid, 无论谁执行该命令,都能删除系统的任何 资源
[root@boldboy ~]# chmod 4755 passwd
[root@boldboy ~]# chmod  u+s  passwd

——suid 的作用

  • 让普通用户对可执行的二进制文件,临时拥有二进制文件的所属主权限。
  • 如果设置的二进制文件没有执行权限,那么suid的权限显示就是大S。
  • 特殊权限suid仅对二进制可执行程序有效,其他文件或目录则无效。

5.特殊权限SGID

将目录设置为 sgid 后,如果在该目录下创建文件,都将与该目录的所属组保持一致,演示如下

1.建立测试目录
[root@oldboy ~]# cd /tmp/ && mkdir dtest

2.给测试目录赋予SetGID权限,检查SetGID是否生效
[root@oldboy  tmp]# chmod g+s dtest/ && ll -d dtest/
drwxr-sr-x 2 root root 6 Apr 13 05:21 dtest/

3.给测试目录赋予777权限,让普通用户可以写
[root@oldboy  tmp]# chmod 777 dtest/

4.切换成普通用户lamp,并进入该目录
[root@oldboy  tmp]# su - lamp
[cui-01@oldboy~]$ cd /tmp/dtest/

5.普通用户创建测试文件,检查文件的信息
[cui-01@oldboy dtest]$ touch lamp_test
[cui-01@oldboy dtest]$ ll
-rw-rw-r-- 1 lamp root 0 Apr 13 05:21 lamp_test

1)sgid授权方法: 权限字符s(S),取决于属“组”位置上的x

  • 2000数字授权
  • g+s 命令授权
[root@oldboy ~]# chmod 2755  directory 
[root@oldboy ~]# chmod  g+s  directory

——sgid作用

  • 针对用户 “组” 权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
  • 当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
  • 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。

6.特殊权限SBIT——粘滞位 (只对目录有效)

普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录中拥有写入权限。如果没有粘滞位,那么普通用户拥有 w 权限,就可以删除此目录下的所有文件,包括其他用户建立的文件。但是一旦被赋予了粘滞位,除了 root 可以删除所有文件,普通用户就算拥有 w 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。

示例图
图片.png
[root@oldboy tmp]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 Apr 13 05:32 /tmp/

1)sticky授权方法——字符t(T),其他用户位的x位上设置。

  • 1000 数字授权
  • 0 + t 命令授权
[root@oldboy~]# chmod 1755  /tmp
[root@oldboy~]# chmod o+t /tmp

——sticky作用

  • 让多个用户都具有写权限的目录,并让每个用户只能删自己的文件。
  • 特殊sticky目录表现在others的x位,用小t表示,如果没有执行权限是T
  • 一个目录即使它的权限为"777"如果是设置了粘滞位,除了目录的属主和"root"用户有权限删除,除此之外其他用户都不允许删除该目录。

三、权限的属性

1.权限属性chattr

chatrr 只有 root 用户可以使用,用来修改文件系统的权限属性,建立凌驾于 rwx 基础权限之上的授权。
chatrr 命令格式:[root@oldboy ~]# chattr [+-=] [选项] 文件或目录名

1)参数

a 权限,无法写入和删除文件,但可以追加数据,适合/etc/passwd这样的文件
i 权限, 无法写入,无法删除,适合不需要更改的重要文件加锁
1.创建文件并设置属性
[root@oldboy~]# touch file_a file_i
[root@oldboy~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

2.使用chattr设置属性,lsattr查看权限限制
[root@oldboy ~]# chattr +a file_a
[root@oldboy~]# chattr +i file_i
[root@oldboy~]# lsattr file_a file_i
-----a---------- file_a
----i----------- file_i

3.a权限,无法写入和删除文件,但可以追加数据,适合/etc/passwd这样的文件
[root@oldboy ~]# echo "aa" > file_a
bash: file_a: Operation not permitted
[root@oldboy ~]# rm -f file_a
rm: cannot remove ‘file_a’: Operation not permitted
[root@oldboy ~]# echo "aa" >> file_a

4.i权限, 无法写入,无法删除,适合不需要更改的重要文件加锁
[root@xuliangwei ~]# echo "i" > file_i
bash: file_i: Permission denied
[root@oldboy ~]# echo "i" >> file_i
bash: file_i: Permission denied
[root@oldboy  ~]# rm -f  file_i
rm: cannot remove ‘file_i’: Operation not permitted

5.解除限制
[root@oldboy ~]# chattr -a file100 
[root@oldboy~]# chattr -i file200

2.进程掩码umask

1)umask 默认权限的含义

当我们登录系统之后创建一个文件总是有一个默认权限的,比如: 目录755、文件644、这就是umaskumask设置了用户创建文件的默认权限。-

2).umask是如何改变创建新文件的权限

系统默认umask为022,那么当我们创建一个目录时,正常情况下目录的权限应该是777,但umask表示要减去的值,所以新目录文件的权限应该是777 - 022 =755。至于文件的权限也依次类推666 - 022 =644。

3)umask涉及哪些配置文件

相关文件/etc/bashrc 、/etc/profile 、~/.bashrc 、~/.bash_profile

4)umask 默认权限 目录: 755 文件: 664

  • umask是用来控制默认创建文件或目录的权限
  • umask设定为022,
    • 表示要减去的权限
    • 目录 777 -022 =755
    • 文件 666 -022 =644
  • umask 设定为奇数 偶数 对文件和目录有什么影响?
    • 文件: 如果umask出现了奇数, 要在奇数位+1
    • 目录: 对目录毫无影响
  • 设定umask umask number 临时 (当前bash窗口有效,会随着bash的关闭一 起结束)
  • vim /etc/profile /etc/login.defs # 如果修改则都为永久.

总结

今天我们学习了用户的特殊权限,suid 、sgid 、sbit、特殊的属性,umask 默认权限( 表示要减去的权限 目录:777 -umask 文件:666 umask)等,大多数权限属于我们了解的内容,运用的地方并不是很多。

你可能感兴趣的:(Day-12-Linux 特殊权限)