Day 05 权限管理-文件权限

Day 05 权限管理-文件权限

一、文件管理的基本权限

把一个用户加入了一个组,该用户就拥有了该组的权限,当一个用户要操作某个文件时,系统会依次检 索该用户是否是该文件的1拥有者,其次是2组成员,最后是3其他人,如果扫描到是拥有者,则具备拥有者 的权限,不必往后扫描,以此类推

1 基本权限介绍

基本权限类型
  • r:可读(read)-----------4
  • w:可写(read)-----------2
  • x:可执行(execute)-----------1
权限的归属
  • u:属主(user)
  • g:数组(group)
  • o:其他人(execute)

这里o代表的是属组之外的所有人

like

touch 1.txt
ll 
-------------------------------------------
total 0
-rw-r--r-- 1 root root 0 Nov 25 15:27 1.txt
 -rw-   r-  -r--    1      root root 0 Nov 25 15:27 1.txt
u(rw) g(r) o(r)  硬链接个数  属主  属组 大小    时间     文件名

2 权限设置

修改属主,属组—chown(Change Owner)

利用 chown命令 可以将文件的拥有者加以改变。一般来说,这个命令只能由系统管理者(root)使用,一般用户没有权限来改变别人的文件的拥有者,也没有权限可以将自己的文件的拥有者改设为别人。只有系统管理者(root)才有这样的权限。

useradd mouse
useradd cow
useradd tiger
useradd rabbit  # 创建四个用户
mkdir testfile  # 创建一个测试文件夹
groupadd zodiac  # 创建组 生肖
ll  # 查看用户 home下
------------------------------------
drwx------ 2 cow    cow    4096 Nov 25 15:34 cow
drwx------ 2 mouse  mouse  4096 Nov 25 15:34 mouse
drwx------ 2 rabbit rabbit 4096 Nov 25 15:35 rabbit
drwx------ 2 tiger  tiger  4096 Nov 25 15:34 tiger
drwxr-xr-x 2 root   root   4096 Nov 25 15:35 testfile
目录(d---dirtectory)拥有所有权限(rwx)

# 权限修改
chown mouse.zodiac testfile/  # 修改为mouse属主,zodiac属组
-----------------------------------
drwxr-xr-x 2 mouse  zodiac 4096 Nov 25 15:35 testfile
#表示testfile是个目录(d),mouse拥有读写执行的权限(rwx),和mouse所在同一个zodiac组里的用户拥有只读和执行权限(r-x),剩下其他用户拥有执行(r-x)权限!

chown tiger testfile/  # 修改tiger属主
-----------------------------------
drwxr-xr-x 2 tiger  zodiac 4096 Nov 25 15:35 testfile

chown .tiger testfile/  # 修改tiger属组
-----------------------------------
drwxr-xr-x 2 tiger  tiger  4096 Nov 25 15:35 testfile


touch testfile/{a..c}.txt  # 在目录下创建三个txt文件,由于是root创建,所以属主属组都是root
ll testfile/
-----------------------------------
-rw-r--r-- 1 root root 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 c.txt

chown .rabbit testfile/  # 修改属组
-----------------------------------
drwxr-xr-x 2 tiger  rabbit 4096 Nov 25 16:00 testfile

ll testfile/  # 查看testfile目录下的 文件-----属组属主并没有变化
-----------------------------------
-rw-r--r-- 1 root root 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 c.txt
递归修改
chown -R .rabbit testfile/  # 递归修改属组
----------------------------------
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

目录及以下所有权限的修改 **R®**选项通常是指递归,不加只修改目标文件的属主,属组信息

修改u,g,o对应的权限

chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)

chmod a=rwx testfile/a.txt  # 修改所有(a)权限为(rwx)
----------------------------------
-rwxrwxrwx 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

chmod a=- testfile/a.txt   # 取消(-)所有用户(a)权限
----------------------------------
---------- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

chmod a=rwx testfile/a.txt
chmod ug=rw,o=r testfile/a.txt  # 修改所有者属组(ug)为读写(rw)权限,其他人(o)只读(r)权限
ll testfile/
----------------------------------
-rw-rw-r-- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

# 数字代表权限位的 u-4 g-2 o-1
chmod 761 testfile/a.txt   # 修改所有者所有权限(7 r+w+x),属组(6 r+w),其他(1 x)
----------------------------------
-rwxrw---x 1 root rabbit 0 Nov 25 16:00 testfile/a.txt

注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人

3 权限对文件or目录的意义

文件:ls -l 文件名

  • r:可以cat读取文件内容
  • w:可以修改文件
  • x:可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该 文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行一般是以绿色显示

目录:ls -dl 文件名

  • r: 可以ls浏览文件下的内容
  • w:可以在目录下创建新文件or目录
  • x:
    • 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
    • 可以正常切换到目录下
    • 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
3.1 对文件夹的操作(不操作文件内容),需要当前用户具备的权限
3.1.1 对沿途所有文件夹有x权限
3.1.2 对目标文件夹有r或w权限
  • r----->可以浏览
  • w----->可以创建、删除、移动子文件和子目录
3.2 对文件的操作(操作文件内容),需要当前用户具备的权限
3.2.1 对沿途所有文件夹有x权限
3.2.2 对目标文件夹有r或w权限
  • r----->可以读取文件内容
  • w----->可以修改文件内容

注意

储备知识:vim修改的原理是将源文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文 件名 例子:

  1. 当前用户对沿途所有文件夹都有x权限
  2. 并且当前用户对目标文件夹有w权限
  3. 但是当前用户对目标文件没有w权限 此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以 通过查看前后操作的文件inode号来确定
无法修改 提示read only ,不过要注意属主问题 属主>user的加wq!强制执行是可以的,但是由于swp机制,源文件已经删除,inode已经改变(代表不是源文件 stat 文件 查看),强制写入的文件是新创建的文件

二、文件权限管理之特殊权限

1 SUID(Set User ID)

普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限

ll /etc/shadow
-----------------------------------------
---------- 1 root root 714 Nov 25 15:35 /etc/shadow

但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,如何实现 的???

ll `which passwd`  # 注意这里是反斜杠
-----------------------------------------
-rwsr-xr-x 1 root root 27856 Aug  9  2019 /usr/bin/passwd

可以看到一个s权限,s权限的特殊之处

  • SUID 权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
    • 比如passwd文件具有s权限,执行者属于(g 或者 o)拥有读®和执行(x)权限,那么他也会拥有所有者(u)的读写(rw)权限
  • 本权限仅在执行该二进制可执行文件的过程中有效

可以改不过是swp规则

image-20201125171756167

了解
  1. 在没有设置suid的情况下,我们登录了一个用户,来执行操作目标文件的命令 会依次比对当前登录用户是否是目标文件的属主、属组、其他人来确定是否拥有操作权限
  2. 在设置了suid的情况下,我们登录了一个用户,来执行操作目标文件的命令 当前用户会转换成命令文件的属主身份,然后拿着该身份去对应目标文件,如果该身份不是目标文件的主人, 那么就直接被归为其他人一栏,不会检索组

sgid也是一样

2 SGID(Set Group ID)

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

cd /tmp/ && mkdir dtest  # 建立测试目录
----------------------------------------------
drwxr-xr-x 2 root root 4096 Nov 25 22:43 dtest

chmod g+s dtest/ && ll -d dtest/  # 给测试目录赋予SetGID权限,检查SetGID是否生效
----------------------------------------------
drwxr-sr-x 2 root root 4096 Nov 25 22:43 dtest/

chmod 777 dtest/  # 给测试目录赋予777权限,让普通用户可以写
----------------------------------------------
drwxrwsrwx 2 root root 4096 Nov 25 22:43 dtest


su - mouse  # 切换成普通用户mouse,并进入该目录
----------------------------------------------
[mouse@hecs-x-medium-2-linux-20201118090009 ~]$ 

cd /tmp/dtest/  # 普通用户创建测试文件,检查文件的信息
touch mouse_test
ll
----------------------------------------------
-rw-rw-r-- 1 mouse root 0 Nov 25 22:58 mouse_test

补充

&&运算符: 相当于 and

command1 && command2

&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。

||运算符: 类似于 or

command1 || command2

||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

2.2sgid授权方法: 2000权限字符s(S),取决于属组位置上的x
# chmod 2755  directory 
# chmod  g+s  directory
2.3 sgid作用
  • 针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
  • 当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
  • 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。
2.4 特殊权限

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

[root@bgx tmp]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 Apr 13 05:32 /tmp/

2.sticky授权方法,1000 权限字符t(T),其他用户位的x位上设置。

# chmod 1755  /tmp
# chmod o+t /tmp

3.sticky作用

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

5.权限属性chattr

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

#选项: + 增加权限 -减少权限 =等于某个权限
# a:让文件或目录仅可追加内容
# i:不得任意更动文件或目录

#1.创建文件并设置属性
[root@lqz ~]# touch file_a file_i
[root@lqz ~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

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

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

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

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

6.进程掩码umask

1.umask是什么?

当我们登录系统之后创建一个文件总是有一个默认权限的,比如: 目录755、文件644、那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限。

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

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

3.umask涉及哪些配置文件

umask涉及到的相关文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profile
shell (vim,touch) –umask–> 会影响创建的新文件或目录权限
vsftpd服务如果修改–umask–> 会影响ftp服务中新创建文件或创建目录权限
useradd如果修改umask–> 会影响用户HOME家目录权限

4.umask演示示例

#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 

#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1

#3.默认目录权限计算方法
7 7 7  -  0 2 2 = 7 5 5
 
#umask所有位全为偶数时
# umask 044
# mkdir d044   目录权限为733
# touch f044   文件权限为622

#umask部分位为奇数时
# umask 023
# mkdir d023   目录权限为754
# touch f023   文件权限为644

#umask值的所有位为奇数时
# umask 035
# mkdir d035   目录权限为742
# touch f035   文件权限为642

示例1: 在 shell 进程中创建文件

#查看当前用户的umask权限
[root@lqz ~]# umask
0022
[root@lqz ~]# touch file0022
[root@lqz ~]# mkdir dir0022
[root@lqz ~]# ll -d file0022  dir0022/
drwxr-xr-x 2 root root 6 Jan 24 09:02 dir0022/
-rw-r--r-- 1 root root 0 Jan 24 09:02 file0022

示例2: 修改 shell umask 值(临时生效)

[root@lqz ~]# umask 000
[root@lqz ~]# mkdir dir000
[root@lqz ~]# touch file000
[root@lqz ~]# ll -d dir000 file000
drwxrwxrwx 2 root root 6 Jan 24 09:04 dir000
-rw-rw-rw- 1 root root 0 Jan 24 09:04 file000

示例3: 通过 umask 决定新建用户 HOME 目录的权限

[root@lqz ~]# vim /etc/login.defs
UMASK 077
[root@lqz ~]# useradd dba
[root@lqz ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

[root@tianyun ~]# vim /etc/login.defs
UMASK 000
[root@lqz ~]# useradd sa
[root@lqz ~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/

三 权限管理之su、sudo

su切换用户与sudo提权

4.1 介绍

因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止 root用户直接登录的,而运维组的小伙伴通常使用的都是普通用户,但是运维组内的小伙伴们在进行日 常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下 的命令。

那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢,有两种 方案

1、su切换用户身份

特点:使用普通用户登录,然后使用su命令切换到root账户下
优点:简单粗暴
缺点:
1、需要知道root密码
2、权限控制不精细:每次都是获取所有root权限

123456

2、sudo提取部分管理员权限

特点:
1、使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
2、不需要切换到root账户下

优点:相对复杂
缺点:
1、不需要知道root密码,输入的是用户自己的密码
2、权限控制更为精细:可以控制普通用户只获取部分root权限

123456789

4.2 su切换用户

4.2.1 储备知识
linux中shell可以分两类
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种

非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
123

插一句:shell的使用方式有两种

交互式,等待用户输入执行的命令(终端操作,需要不断提示)

非交互式,执行shell脚本, 脚本执行结束后shell自动退出

1234
bash shell配置文件介绍(文件主要保存用户的工作环境)
全局配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

个人配置文件:
~/.bash_profile
~/.bashrc

profile类文件, 设定环境变量, 登陆前运行的脚本和命令。

bashrc类文件, 设定本地变量, 定义命令别名

PS: 如果全局配置和个人配置产生冲突,以个人配置为准。

123456789101112131415
配置文件的应用顺序
如果执行的是登录式shell,那么配置文件执行顺序是:

/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc

如果执行的是非登录式shell,那么配置文件执行顺序是:

~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行。
12345678
执行登录与非登录shell
# 执行登录shell:身份与环境都切换
su - 用户
# 执行非登录shell:只切换用户身份
su 用户
# 补充:
# 1、从root往普通用户下切换无需输入密码,反之则需要
# 2、切换身份执行命令:su - 用户 -c “命令”
1234567

4.3 sudo提权

在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全 风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某 一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。

通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权 限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。

4.4 配置

两种编辑方式

1、visudo(会提示语法错误,推荐使用)

[root@egon ~]# visudo -c # 检查配置是否正确
/etc/sudoers:解析正确
[root@egon ~]#
123

2、vim /etc/sudoers

# sudo 语法
user MACHINE=COMMANDS

# 示如
# root ALL=(ALL) ALL
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令,通常设置为ALL,如果设置为localhost代表在本机上执行
指令。
也可以设置为本机以外的其他IP地址或主机名,此时该/etc/sudoers虽然是在本机上配置的,但用户
登录到本机
后仍然是无法执行命令的,如果把/etc/sudoers这个配置文件赋值到指定ip或主机名的那台机器上,
就好用了
配置文件中讲到:
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems)./etc/sudoers文件可以在多个系统之间共享,如果我们设置成ALL的话就省事了,该文件复制到人任
意一台机器
上的完成的权限配置都一样

3、(All):表示允许用户以哪个用户的权限做事情

4、ALL:所有命令
最终解释:root用户可以在所有主机上以任意用户身份执行所有命令
tom ALL=(ALL) ALL # tom用户在任何机器上,可以以任何用户身份执行任何命令等同于
root用户
lili ALL=(ALL) NOPASSWD: ALL # 免密
egon ALL=(ALL) /bin/cp,/bin/touch # 只允许egon用户以root用户的身份执行
cp,touch命令
egon01 ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt # !代表取反
egon02 ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim
/test/a.txt # 可以编辑所有文件,除了/test/a.txt
# 可以测试
[root@egon ~]# su - egon02
上一次登录:二 12月 20 11:21:01 CST 2022pts/0 上
[egon02@egon ~]$
[egon02@egon ~]$ sudo vim /test/b.txt
[egon02@egon ~]$ sudo vim /test/a.txt
对不起,用户 egon02 无权以 root 的身份在 egon 上执行 /bin/vim /test/a.txt。
[egon02@egon ~]$
12345678910111213141516171819202122232425262728293031323334353637383940

测试

[root@egon ~]# su - egon
上一次登录:四 9月 10 20:27:09 CST 2020pts/0 上
[egon@egon ~]$ ll -d /etc/
drwxr-xr-x. 146 root root 8192 9月 10 20:27 /etc/
[egon@egon ~]$ touch /etc/a.txt # =================> 没有权限
touch: 无法创建"/etc/a.txt": 权限不够
[egon@egon ~]$ sudo touch /etc/a.txt # =================> 使用sudo提权
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] egon 的密码:
[egon@egon ~]$ ll /etc/a.txt
-rw-r--r-- 1 root root 0 9月 10 20:28 /etc/a.txt
ps: sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出

123456789101112131415161718192021

Sudo 常用参数

sudo常用参数:
-l : 登录用户下面,执行sudo -l 显示当前用户有哪些权限
-k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
--> 系统默认也是5分钟失效
--> 配置免密是另一种情况 NOPASSWD: ALL远程sudo(有条件限制的)

123456

其他配置详见配置文件

4.5 sudo实例

企业生产环境用户权限集中管理方案实例

根据角色的不同,给不同的用户分配不同的角色

# 1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个
批量创建用户
for user in chuji{01..03} net01 senior01 manager01
> do
> useradd $user
> echo "111111"|passwd --stdin $user
> done;

# 2.创建5个开发人员,属于phpers组
groupadd -g 999 phpers
for n in `seq 5`
do
useradd -g phpers php0$n
done

# 3.创建开发经理,中级phper
for user in kaifaManager seniorPhper
> do
> useradd $user
> echo "111111"|passwd --stdin $user
> done

# 4.编辑配置文件
[root@localhost ~]# vim /etc/sudoers
########################Cmnd_Alias By FTL ###################################
Cmnd_Alias CY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname,
/sbin/ifconfig, /bin/netstat, /sbin/route
Cmnd_Alias GY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname,
/sbin/ifconfig, /bin/netstat, /sbin/route, /sbin/iptables, /etc/init.d/network,
/bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /bin/rpm,
/usr/bin/updatedb, /usr/bin/yum, /sbin/fdisk, /sbin/sfdisk, /sbin/parted,
/sbin/partprobe, /bin/mount, /bin/umount
Cmnd_Alias CK_CMD_1=/usr/bin/tail, /bin/grep, /var/log/messages*
Cmnd_Alias GK_CMD_1=/sbin/service, /sbin/chkconfig, /bin/tail, /var/log/*,
/bin/grep, /bin/cat, /bin/ls, /bin/sh
Cmnd_Alias GW_CMD_1= /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
/usr/bin/net, /sbin/iptables, /sbin/iwconfig, /sbin/mii-tool, /bin/cat,
/var/log/*
########################User Aliases By FTL ###################################
User_Alias CHUJI_YUNWEI_ADMINS=chuji01,chuji02,chuji03
User_Alias CHUJI_KAIFA_ADMINS=php01,php02,php03,php04,php05
User_Alias GAOJI_WANG_ADMINS=net01
########################Runas_Alias By FTL ###################################
Runas_Alias OP = root -->未来切换到某个角色执行任务
########################Config By FTL ###################################
senior01 ALL=(OP) GY_CMD_1
manager01 ALL=(ALL) NOPASSWD:ALL
kaifaManager ALL=(ALL) ALL, /usr/bin/passwd [A-Za-z], !/usr/bin/passwd
root, !/usr/sbin/visudo,\
!/usr/bin/vi *sudoer*, !/usr/bin/sudo su -,
!/bin/su
seniorPhper ALL=(OP) GK_CMD_1
CHUJI_YUNWEI_ADMINS ALL=(OP) CY_CMD_1
CHUJI_KAIFA_ADMINS ALL=(OP) CK_CMD_1
GAOJI_WANG_ADMINS ALL=(OP) GW_CMD_1

命令的路径要全路径
别名需要大写
超过一行,用"\"换行
排除的命令一定在最后面写
kaifaManager 因为有ALL,所以可以直接su - 切换root,但是 sudo su -切换不了

# Day 03 权限管理-文件权限

一、文件管理的基本权限

把一个用户加入了一个组,该用户就拥有了该组的权限,当一个用户要操作某个文件时,系统会依次检 索该用户是否是该文件的1拥有者,其次是2组成员,最后是3其他人,如果扫描到是拥有者,则具备拥有者 的权限,不必往后扫描,以此类推

1 基本权限介绍

基本权限类型
  • r:可读(read)-----------4
  • w:可写(read)-----------2
  • x:可执行(execute)-----------1
权限的归属
  • u:属主(user)
  • g:数组(group)
  • o:其他人(execute)

这里o代表的是属组之外的所有人

like

touch 1.txt
ll 
-------------------------------------------
total 0
-rw-r--r-- 1 root root 0 Nov 25 15:27 1.txt
 -rw-   r-  -r--    1      root root 0 Nov 25 15:27 1.txt
u(rw) g(r) o(r)  硬链接个数  属主  属组 大小    时间     文件名

2 权限设置

修改属主,属组—chown(Change Owner)

利用 chown命令 可以将文件的拥有者加以改变。一般来说,这个命令只能由系统管理者(root)使用,一般用户没有权限来改变别人的文件的拥有者,也没有权限可以将自己的文件的拥有者改设为别人。只有系统管理者(root)才有这样的权限。

useradd mouse
useradd cow
useradd tiger
useradd rabbit  # 创建四个用户
mkdir testfile  # 创建一个测试文件夹
groupadd zodiac  # 创建组 生肖
ll  # 查看用户 home下
------------------------------------
drwx------ 2 cow    cow    4096 Nov 25 15:34 cow
drwx------ 2 mouse  mouse  4096 Nov 25 15:34 mouse
drwx------ 2 rabbit rabbit 4096 Nov 25 15:35 rabbit
drwx------ 2 tiger  tiger  4096 Nov 25 15:34 tiger
drwxr-xr-x 2 root   root   4096 Nov 25 15:35 testfile
目录(d---dirtectory)拥有所有权限(rwx)

# 权限修改
chown mouse.zodiac testfile/  # 修改为mouse属主,zodiac属组
-----------------------------------
drwxr-xr-x 2 mouse  zodiac 4096 Nov 25 15:35 testfile
#表示testfile是个目录(d),mouse拥有读写执行的权限(rwx),和mouse所在同一个zodiac组里的用户拥有只读和执行权限(r-x),剩下其他用户拥有执行(r-x)权限!

chown tiger testfile/  # 修改tiger属主
-----------------------------------
drwxr-xr-x 2 tiger  zodiac 4096 Nov 25 15:35 testfile

chown .tiger testfile/  # 修改tiger属组
-----------------------------------
drwxr-xr-x 2 tiger  tiger  4096 Nov 25 15:35 testfile


touch testfile/{a..c}.txt  # 在目录下创建三个txt文件,由于是root创建,所以属主属组都是root
ll testfile/
-----------------------------------
-rw-r--r-- 1 root root 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 c.txt

chown .rabbit testfile/  # 修改属组
-----------------------------------
drwxr-xr-x 2 tiger  rabbit 4096 Nov 25 16:00 testfile

ll testfile/  # 查看testfile目录下的 文件-----属组属主并没有变化
-----------------------------------
-rw-r--r-- 1 root root 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 c.txt
递归修改
chown -R .rabbit testfile/  # 递归修改属组
----------------------------------
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

目录及以下所有权限的修改 **R®**选项通常是指递归,不加只修改目标文件的属主,属组信息

修改u,g,o对应的权限

chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)

chmod a=rwx testfile/a.txt  # 修改所有(a)权限为(rwx)
----------------------------------
-rwxrwxrwx 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

chmod a=- testfile/a.txt   # 取消(-)所有用户(a)权限
----------------------------------
---------- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

chmod a=rwx testfile/a.txt
chmod ug=rw,o=r testfile/a.txt  # 修改所有者属组(ug)为读写(rw)权限,其他人(o)只读(r)权限
ll testfile/
----------------------------------
-rw-rw-r-- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

# 数字代表权限位的 u-4 g-2 o-1
chmod 761 testfile/a.txt   # 修改所有者所有权限(7 r+w+x),属组(6 r+w),其他(1 x)
----------------------------------
-rwxrw---x 1 root rabbit 0 Nov 25 16:00 testfile/a.txt

注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人

3 权限对文件or目录的意义

文件:ls -l 文件名

  • r:可以cat读取文件内容
  • w:可以修改文件
  • x:可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该 文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行一般是以绿色显示

目录:ls -dl 文件名

  • r: 可以ls浏览文件下的内容
  • w:可以在目录下创建新文件or目录
  • x:
    • 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
    • 可以正常切换到目录下
    • 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
3.1 对文件夹的操作(不操作文件内容),需要当前用户具备的权限
3.1.1 对沿途所有文件夹有x权限
3.1.2 对目标文件夹有r或w权限
  • r----->可以浏览
  • w----->可以创建、删除、移动子文件和子目录
3.2 对文件的操作(操作文件内容),需要当前用户具备的权限
3.2.1 对沿途所有文件夹有x权限
3.2.2 对目标文件夹有r或w权限
  • r----->可以读取文件内容
  • w----->可以修改文件内容

注意

储备知识:vim修改的原理是将源文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文 件名 例子:

  1. 当前用户对沿途所有文件夹都有x权限
  2. 并且当前用户对目标文件夹有w权限
  3. 但是当前用户对目标文件没有w权限 此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以 通过查看前后操作的文件inode号来确定
无法修改 提示read only ,不过要注意属主问题 属主>user的加wq!强制执行是可以的,但是由于swp机制,源文件已经删除,inode已经改变(代表不是源文件 stat 文件 查看),强制写入的文件是新创建的文件

二、文件权限管理之特殊权限

1 SUID(Set User ID)

普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限

ll /etc/shadow
-----------------------------------------
---------- 1 root root 714 Nov 25 15:35 /etc/shadow

但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,如何实现 的???

ll `which passwd`  # 注意这里是反斜杠
-----------------------------------------
-rwsr-xr-x 1 root root 27856 Aug  9  2019 /usr/bin/passwd

可以看到一个s权限,s权限的特殊之处

  • SUID 权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
    • 比如passwd文件具有s权限,执行者属于(g 或者 o)拥有读®和执行(x)权限,那么他也会拥有所有者(u)的读写(rw)权限
  • 本权限仅在执行该二进制可执行文件的过程中有效

可以改不过是swp规则

image-20201125171756167

了解
  1. 在没有设置suid的情况下,我们登录了一个用户,来执行操作目标文件的命令 会依次比对当前登录用户是否是目标文件的属主、属组、其他人来确定是否拥有操作权限
  2. 在设置了suid的情况下,我们登录了一个用户,来执行操作目标文件的命令 当前用户会转换成命令文件的属主身份,然后拿着该身份去对应目标文件,如果该身份不是目标文件的主人, 那么就直接被归为其他人一栏,不会检索组

sgid也是一样

2 SGID(Set Group ID)

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

cd /tmp/ && mkdir dtest  # 建立测试目录
----------------------------------------------
drwxr-xr-x 2 root root 4096 Nov 25 22:43 dtest

chmod g+s dtest/ && ll -d dtest/  # 给测试目录赋予SetGID权限,检查SetGID是否生效
----------------------------------------------
drwxr-sr-x 2 root root 4096 Nov 25 22:43 dtest/

chmod 777 dtest/  # 给测试目录赋予777权限,让普通用户可以写
----------------------------------------------
drwxrwsrwx 2 root root 4096 Nov 25 22:43 dtest


su - mouse  # 切换成普通用户mouse,并进入该目录
----------------------------------------------
[mouse@hecs-x-medium-2-linux-20201118090009 ~]$ 

cd /tmp/dtest/  # 普通用户创建测试文件,检查文件的信息
touch mouse_test
ll
----------------------------------------------
-rw-rw-r-- 1 mouse root 0 Nov 25 22:58 mouse_test

补充

&&运算符: 相当于 and

command1 && command2

&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。

||运算符: 类似于 or

command1 || command2

||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

2.2sgid授权方法: 2000权限字符s(S),取决于属组位置上的x
# chmod 2755  directory 
# chmod  g+s  directory
2.3 sgid作用
  • 针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
  • 当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
  • 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。
2.4 特殊权限

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

[root@bgx tmp]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 Apr 13 05:32 /tmp/

2.sticky授权方法,1000 权限字符t(T),其他用户位的x位上设置。

# chmod 1755  /tmp
# chmod o+t /tmp

3.sticky作用

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

5.权限属性chattr

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

#选项: + 增加权限 -减少权限 =等于某个权限
# a:让文件或目录仅可追加内容
# i:不得任意更动文件或目录

#1.创建文件并设置属性
[root@lqz ~]# touch file_a file_i
[root@lqz ~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

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

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

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

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

6.进程掩码umask

1.umask是什么?

当我们登录系统之后创建一个文件总是有一个默认权限的,比如: 目录755、文件644、那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限。

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

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

3.umask涉及哪些配置文件

umask涉及到的相关文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profile
shell (vim,touch) –umask–> 会影响创建的新文件或目录权限
vsftpd服务如果修改–umask–> 会影响ftp服务中新创建文件或创建目录权限
useradd如果修改umask–> 会影响用户HOME家目录权限

4.umask演示示例

#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 

#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1

#3.默认目录权限计算方法
7 7 7  -  0 2 2 = 7 5 5
 
#umask所有位全为偶数时
# umask 044
# mkdir d044   目录权限为733
# touch f044   文件权限为622

#umask部分位为奇数时
# umask 023
# mkdir d023   目录权限为754
# touch f023   文件权限为644

#umask值的所有位为奇数时
# umask 035
# mkdir d035   目录权限为742
# touch f035   文件权限为642

示例1: 在 shell 进程中创建文件

#查看当前用户的umask权限
[root@lqz ~]# umask
0022
[root@lqz ~]# touch file0022
[root@lqz ~]# mkdir dir0022
[root@lqz ~]# ll -d file0022  dir0022/
drwxr-xr-x 2 root root 6 Jan 24 09:02 dir0022/
-rw-r--r-- 1 root root 0 Jan 24 09:02 file0022

示例2: 修改 shell umask 值(临时生效)

[root@lqz ~]# umask 000
[root@lqz ~]# mkdir dir000
[root@lqz ~]# touch file000
[root@lqz ~]# ll -d dir000 file000
drwxrwxrwx 2 root root 6 Jan 24 09:04 dir000
-rw-rw-rw- 1 root root 0 Jan 24 09:04 file000

示例3: 通过 umask 决定新建用户 HOME 目录的权限

[root@lqz ~]# vim /etc/login.defs
UMASK 077
[root@lqz ~]# useradd dba
[root@lqz ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

[root@tianyun ~]# vim /etc/login.defs
UMASK 000
[root@lqz ~]# useradd sa
[root@lqz ~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/

三 权限管理之su、sudo

su切换用户与sudo提权

4.1 介绍

因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止 root用户直接登录的,而运维组的小伙伴通常使用的都是普通用户,但是运维组内的小伙伴们在进行日 常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下 的命令。

那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢,有两种 方案

1、su切换用户身份

特点:使用普通用户登录,然后使用su命令切换到root账户下
优点:简单粗暴
缺点:
1、需要知道root密码
2、权限控制不精细:每次都是获取所有root权限

123456

2、sudo提取部分管理员权限

特点:
1、使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
2、不需要切换到root账户下

优点:相对复杂
缺点:
1、不需要知道root密码,输入的是用户自己的密码
2、权限控制更为精细:可以控制普通用户只获取部分root权限

123456789

4.2 su切换用户

4.2.1 储备知识
linux中shell可以分两类
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种

非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
123

插一句:shell的使用方式有两种

交互式,等待用户输入执行的命令(终端操作,需要不断提示)

非交互式,执行shell脚本, 脚本执行结束后shell自动退出

1234
bash shell配置文件介绍(文件主要保存用户的工作环境)
全局配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

个人配置文件:
~/.bash_profile
~/.bashrc

profile类文件, 设定环境变量, 登陆前运行的脚本和命令。

bashrc类文件, 设定本地变量, 定义命令别名

PS: 如果全局配置和个人配置产生冲突,以个人配置为准。

123456789101112131415
配置文件的应用顺序
如果执行的是登录式shell,那么配置文件执行顺序是:

/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc

如果执行的是非登录式shell,那么配置文件执行顺序是:

~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行。
12345678
执行登录与非登录shell
# 执行登录shell:身份与环境都切换
su - 用户
# 执行非登录shell:只切换用户身份
su 用户
# 补充:
# 1、从root往普通用户下切换无需输入密码,反之则需要
# 2、切换身份执行命令:su - 用户 -c “命令”
1234567

4.3 sudo提权

在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全 风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某 一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。

通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权 限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。

4.4 配置

两种编辑方式

1、visudo(会提示语法错误,推荐使用)

[root@egon ~]# visudo -c # 检查配置是否正确
/etc/sudoers:解析正确
[root@egon ~]#
123

2、vim /etc/sudoers

# sudo 语法
user MACHINE=COMMANDS

# 示如
# root ALL=(ALL) ALL
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令,通常设置为ALL,如果设置为localhost代表在本机上执行
指令。
也可以设置为本机以外的其他IP地址或主机名,此时该/etc/sudoers虽然是在本机上配置的,但用户
登录到本机
后仍然是无法执行命令的,如果把/etc/sudoers这个配置文件赋值到指定ip或主机名的那台机器上,
就好用了
配置文件中讲到:
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems)./etc/sudoers文件可以在多个系统之间共享,如果我们设置成ALL的话就省事了,该文件复制到人任
意一台机器
上的完成的权限配置都一样

3、(All):表示允许用户以哪个用户的权限做事情

4、ALL:所有命令
最终解释:root用户可以在所有主机上以任意用户身份执行所有命令
tom ALL=(ALL) ALL # tom用户在任何机器上,可以以任何用户身份执行任何命令等同于
root用户
lili ALL=(ALL) NOPASSWD: ALL # 免密
egon ALL=(ALL) /bin/cp,/bin/touch # 只允许egon用户以root用户的身份执行
cp,touch命令
egon01 ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt # !代表取反
egon02 ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim
/test/a.txt # 可以编辑所有文件,除了/test/a.txt
# 可以测试
[root@egon ~]# su - egon02
上一次登录:二 12月 20 11:21:01 CST 2022pts/0 上
[egon02@egon ~]$
[egon02@egon ~]$ sudo vim /test/b.txt
[egon02@egon ~]$ sudo vim /test/a.txt
对不起,用户 egon02 无权以 root 的身份在 egon 上执行 /bin/vim /test/a.txt。
[egon02@egon ~]$
12345678910111213141516171819202122232425262728293031323334353637383940

测试

[root@egon ~]# su - egon
上一次登录:四 9月 10 20:27:09 CST 2020pts/0 上
[egon@egon ~]$ ll -d /etc/
drwxr-xr-x. 146 root root 8192 9月 10 20:27 /etc/
[egon@egon ~]$ touch /etc/a.txt # =================> 没有权限
touch: 无法创建"/etc/a.txt": 权限不够
[egon@egon ~]$ sudo touch /etc/a.txt # =================> 使用sudo提权
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] egon 的密码:
[egon@egon ~]$ ll /etc/a.txt
-rw-r--r-- 1 root root 0 9月 10 20:28 /etc/a.txt
ps: sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出

123456789101112131415161718192021

Sudo 常用参数

sudo常用参数:
-l : 登录用户下面,执行sudo -l 显示当前用户有哪些权限
-k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
--> 系统默认也是5分钟失效
--> 配置免密是另一种情况 NOPASSWD: ALL远程sudo(有条件限制的)

123456

其他配置详见配置文件

4.5 sudo实例

企业生产环境用户权限集中管理方案实例

根据角色的不同,给不同的用户分配不同的角色

# 1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个
批量创建用户
for user in chuji{01..03} net01 senior01 manager01
> do
> useradd $user
> echo "111111"|passwd --stdin $user
> done;

# 2.创建5个开发人员,属于phpers组
groupadd -g 999 phpers
for n in `seq 5`
do
useradd -g phpers php0$n
done

# 3.创建开发经理,中级phper
for user in kaifaManager seniorPhper
> do
> useradd $user
> echo "111111"|passwd --stdin $user
> done

# 4.编辑配置文件
[root@localhost ~]# vim /etc/sudoers
########################Cmnd_Alias By FTL ###################################
Cmnd_Alias CY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname,
/sbin/ifconfig, /bin/netstat, /sbin/route
Cmnd_Alias GY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname,
/sbin/ifconfig, /bin/netstat, /sbin/route, /sbin/iptables, /etc/init.d/network,
/bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /bin/rpm,
/usr/bin/updatedb, /usr/bin/yum, /sbin/fdisk, /sbin/sfdisk, /sbin/parted,
/sbin/partprobe, /bin/mount, /bin/umount
Cmnd_Alias CK_CMD_1=/usr/bin/tail, /bin/grep, /var/log/messages*
Cmnd_Alias GK_CMD_1=/sbin/service, /sbin/chkconfig, /bin/tail, /var/log/*,
/bin/grep, /bin/cat, /bin/ls, /bin/sh
Cmnd_Alias GW_CMD_1= /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
/usr/bin/net, /sbin/iptables, /sbin/iwconfig, /sbin/mii-tool, /bin/cat,
/var/log/*
########################User Aliases By FTL ###################################
User_Alias CHUJI_YUNWEI_ADMINS=chuji01,chuji02,chuji03
User_Alias CHUJI_KAIFA_ADMINS=php01,php02,php03,php04,php05
User_Alias GAOJI_WANG_ADMINS=net01
########################Runas_Alias By FTL ###################################
Runas_Alias OP = root -->未来切换到某个角色执行任务
########################Config By FTL ###################################
senior01 ALL=(OP) GY_CMD_1
manager01 ALL=(ALL) NOPASSWD:ALL
kaifaManager ALL=(ALL) ALL, /usr/bin/passwd [A-Za-z], !/usr/bin/passwd
root, !/usr/sbin/visudo,\
!/usr/bin/vi *sudoer*, !/usr/bin/sudo su -,
!/bin/su
seniorPhper ALL=(OP) GK_CMD_1
CHUJI_YUNWEI_ADMINS ALL=(OP) CY_CMD_1
CHUJI_KAIFA_ADMINS ALL=(OP) CK_CMD_1
GAOJI_WANG_ADMINS ALL=(OP) GW_CMD_1

命令的路径要全路径
别名需要大写
超过一行,用"\"换行
排除的命令一定在最后面写
kaifaManager 因为有ALL,所以可以直接su - 切换root,但是 sudo su -切换不了

# Day 03 权限管理-文件权限

一、文件管理的基本权限

把一个用户加入了一个组,该用户就拥有了该组的权限,当一个用户要操作某个文件时,系统会依次检 索该用户是否是该文件的1拥有者,其次是2组成员,最后是3其他人,如果扫描到是拥有者,则具备拥有者 的权限,不必往后扫描,以此类推

1 基本权限介绍

基本权限类型
  • r:可读(read)-----------4
  • w:可写(read)-----------2
  • x:可执行(execute)-----------1
权限的归属
  • u:属主(user)
  • g:数组(group)
  • o:其他人(execute)

这里o代表的是属组之外的所有人

like

touch 1.txt
ll 
-------------------------------------------
total 0
-rw-r--r-- 1 root root 0 Nov 25 15:27 1.txt
 -rw-   r-  -r--    1      root root 0 Nov 25 15:27 1.txt
u(rw) g(r) o(r)  硬链接个数  属主  属组 大小    时间     文件名

2 权限设置

修改属主,属组—chown(Change Owner)

利用 chown命令 可以将文件的拥有者加以改变。一般来说,这个命令只能由系统管理者(root)使用,一般用户没有权限来改变别人的文件的拥有者,也没有权限可以将自己的文件的拥有者改设为别人。只有系统管理者(root)才有这样的权限。

useradd mouse
useradd cow
useradd tiger
useradd rabbit  # 创建四个用户
mkdir testfile  # 创建一个测试文件夹
groupadd zodiac  # 创建组 生肖
ll  # 查看用户 home下
------------------------------------
drwx------ 2 cow    cow    4096 Nov 25 15:34 cow
drwx------ 2 mouse  mouse  4096 Nov 25 15:34 mouse
drwx------ 2 rabbit rabbit 4096 Nov 25 15:35 rabbit
drwx------ 2 tiger  tiger  4096 Nov 25 15:34 tiger
drwxr-xr-x 2 root   root   4096 Nov 25 15:35 testfile
目录(d---dirtectory)拥有所有权限(rwx)

# 权限修改
chown mouse.zodiac testfile/  # 修改为mouse属主,zodiac属组
-----------------------------------
drwxr-xr-x 2 mouse  zodiac 4096 Nov 25 15:35 testfile
#表示testfile是个目录(d),mouse拥有读写执行的权限(rwx),和mouse所在同一个zodiac组里的用户拥有只读和执行权限(r-x),剩下其他用户拥有执行(r-x)权限!

chown tiger testfile/  # 修改tiger属主
-----------------------------------
drwxr-xr-x 2 tiger  zodiac 4096 Nov 25 15:35 testfile

chown .tiger testfile/  # 修改tiger属组
-----------------------------------
drwxr-xr-x 2 tiger  tiger  4096 Nov 25 15:35 testfile


touch testfile/{a..c}.txt  # 在目录下创建三个txt文件,由于是root创建,所以属主属组都是root
ll testfile/
-----------------------------------
-rw-r--r-- 1 root root 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 c.txt

chown .rabbit testfile/  # 修改属组
-----------------------------------
drwxr-xr-x 2 tiger  rabbit 4096 Nov 25 16:00 testfile

ll testfile/  # 查看testfile目录下的 文件-----属组属主并没有变化
-----------------------------------
-rw-r--r-- 1 root root 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root root 0 Nov 25 16:00 c.txt
递归修改
chown -R .rabbit testfile/  # 递归修改属组
----------------------------------
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

目录及以下所有权限的修改 **R®**选项通常是指递归,不加只修改目标文件的属主,属组信息

修改u,g,o对应的权限

chmod(英文全拼:change mode)命令是控制用户对文件的权限的命令

Linux/Unix 的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)

chmod a=rwx testfile/a.txt  # 修改所有(a)权限为(rwx)
----------------------------------
-rwxrwxrwx 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

chmod a=- testfile/a.txt   # 取消(-)所有用户(a)权限
----------------------------------
---------- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

chmod a=rwx testfile/a.txt
chmod ug=rw,o=r testfile/a.txt  # 修改所有者属组(ug)为读写(rw)权限,其他人(o)只读(r)权限
ll testfile/
----------------------------------
-rw-rw-r-- 1 root rabbit 0 Nov 25 16:00 a.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 b.txt
-rw-r--r-- 1 root rabbit 0 Nov 25 16:00 c.txt

# 数字代表权限位的 u-4 g-2 o-1
chmod 761 testfile/a.txt   # 修改所有者所有权限(7 r+w+x),属组(6 r+w),其他(1 x)
----------------------------------
-rwxrw---x 1 root rabbit 0 Nov 25 16:00 testfile/a.txt

注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人

3 权限对文件or目录的意义

文件:ls -l 文件名

  • r:可以cat读取文件内容
  • w:可以修改文件
  • x:可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该 文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行一般是以绿色显示

目录:ls -dl 文件名

  • r: 可以ls浏览文件下的内容
  • w:可以在目录下创建新文件or目录
  • x:
    • 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
    • 可以正常切换到目录下
    • 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级
3.1 对文件夹的操作(不操作文件内容),需要当前用户具备的权限
3.1.1 对沿途所有文件夹有x权限
3.1.2 对目标文件夹有r或w权限
  • r----->可以浏览
  • w----->可以创建、删除、移动子文件和子目录
3.2 对文件的操作(操作文件内容),需要当前用户具备的权限
3.2.1 对沿途所有文件夹有x权限
3.2.2 对目标文件夹有r或w权限
  • r----->可以读取文件内容
  • w----->可以修改文件内容

注意

储备知识:vim修改的原理是将源文件删掉,然后再将内容的内容覆盖写入了新文件,新文件名重命名为原文 件名 例子:

  1. 当前用户对沿途所有文件夹都有x权限
  2. 并且当前用户对目标文件夹有w权限
  3. 但是当前用户对目标文件没有w权限 此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以 通过查看前后操作的文件inode号来确定
无法修改 提示read only ,不过要注意属主问题 属主>user的加wq!强制执行是可以的,但是由于swp机制,源文件已经删除,inode已经改变(代表不是源文件 stat 文件 查看),强制写入的文件是新创建的文件

二、文件权限管理之特殊权限

1 SUID(Set User ID)

普通用户不是root也不属于root组,于是它对/etc/shadow文件没有任何权限

ll /etc/shadow
-----------------------------------------
---------- 1 root root 714 Nov 25 15:35 /etc/shadow

但是普通用户却可以用passwd命令修改密码,而修改密码都是在修改/etc/shadow文件,如何实现 的???

ll `which passwd`  # 注意这里是反斜杠
-----------------------------------------
-rwsr-xr-x 1 root root 27856 Aug  9  2019 /usr/bin/passwd

可以看到一个s权限,s权限的特殊之处

  • SUID 权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
    • 比如passwd文件具有s权限,执行者属于(g 或者 o)拥有读®和执行(x)权限,那么他也会拥有所有者(u)的读写(rw)权限
  • 本权限仅在执行该二进制可执行文件的过程中有效

可以改不过是swp规则

image-20201125171756167

了解
  1. 在没有设置suid的情况下,我们登录了一个用户,来执行操作目标文件的命令 会依次比对当前登录用户是否是目标文件的属主、属组、其他人来确定是否拥有操作权限
  2. 在设置了suid的情况下,我们登录了一个用户,来执行操作目标文件的命令 当前用户会转换成命令文件的属主身份,然后拿着该身份去对应目标文件,如果该身份不是目标文件的主人, 那么就直接被归为其他人一栏,不会检索组

sgid也是一样

2 SGID(Set Group ID)

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

cd /tmp/ && mkdir dtest  # 建立测试目录
----------------------------------------------
drwxr-xr-x 2 root root 4096 Nov 25 22:43 dtest

chmod g+s dtest/ && ll -d dtest/  # 给测试目录赋予SetGID权限,检查SetGID是否生效
----------------------------------------------
drwxr-sr-x 2 root root 4096 Nov 25 22:43 dtest/

chmod 777 dtest/  # 给测试目录赋予777权限,让普通用户可以写
----------------------------------------------
drwxrwsrwx 2 root root 4096 Nov 25 22:43 dtest


su - mouse  # 切换成普通用户mouse,并进入该目录
----------------------------------------------
[mouse@hecs-x-medium-2-linux-20201118090009 ~]$ 

cd /tmp/dtest/  # 普通用户创建测试文件,检查文件的信息
touch mouse_test
ll
----------------------------------------------
-rw-rw-r-- 1 mouse root 0 Nov 25 22:58 mouse_test

补充

&&运算符: 相当于 and

command1 && command2

&&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功&&那么执行这个命令”。

||运算符: 类似于 or

command1 || command2

||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。

2.2sgid授权方法: 2000权限字符s(S),取决于属组位置上的x
# chmod 2755  directory 
# chmod  g+s  directory
2.3 sgid作用
  • 针对用户组权限位修改,用户创建的目录或文件所属组和该目录的所属组一致。
  • 当某个目录设置了sgid后,在该目录中新建的文件不在是创建该文件的默认所属组
  • 使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。
2.4 特殊权限

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

[root@bgx tmp]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 Apr 13 05:32 /tmp/

2.sticky授权方法,1000 权限字符t(T),其他用户位的x位上设置。

# chmod 1755  /tmp
# chmod o+t /tmp

3.sticky作用

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

5.权限属性chattr

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

#选项: + 增加权限 -减少权限 =等于某个权限
# a:让文件或目录仅可追加内容
# i:不得任意更动文件或目录

#1.创建文件并设置属性
[root@lqz ~]# touch file_a file_i
[root@lqz ~]# lsattr file_a file_i
---------------- file_a
---------------- file_i

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

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

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

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

6.进程掩码umask

1.umask是什么?

当我们登录系统之后创建一个文件总是有一个默认权限的,比如: 目录755、文件644、那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认权限。

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

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

3.umask涉及哪些配置文件

umask涉及到的相关文件/etc/bashrc /etc/profile ~/.bashrc ~/.bash_profile
shell (vim,touch) –umask–> 会影响创建的新文件或目录权限
vsftpd服务如果修改–umask–> 会影响ftp服务中新创建文件或创建目录权限
useradd如果修改umask–> 会影响用户HOME家目录权限

4.umask演示示例

#1.假设umask值为:022(所有位为偶数)
#文件的起始权限值
6 6 6  -  0 2 2  = 6 4 4 

#2.假设umask值为:045(其他用户组位为奇数)
#计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
6 6 6  -   0 4 5 = 6 2 1

#3.默认目录权限计算方法
7 7 7  -  0 2 2 = 7 5 5
 
#umask所有位全为偶数时
# umask 044
# mkdir d044   目录权限为733
# touch f044   文件权限为622

#umask部分位为奇数时
# umask 023
# mkdir d023   目录权限为754
# touch f023   文件权限为644

#umask值的所有位为奇数时
# umask 035
# mkdir d035   目录权限为742
# touch f035   文件权限为642

示例1: 在 shell 进程中创建文件

#查看当前用户的umask权限
[root@lqz ~]# umask
0022
[root@lqz ~]# touch file0022
[root@lqz ~]# mkdir dir0022
[root@lqz ~]# ll -d file0022  dir0022/
drwxr-xr-x 2 root root 6 Jan 24 09:02 dir0022/
-rw-r--r-- 1 root root 0 Jan 24 09:02 file0022

示例2: 修改 shell umask 值(临时生效)

[root@lqz ~]# umask 000
[root@lqz ~]# mkdir dir000
[root@lqz ~]# touch file000
[root@lqz ~]# ll -d dir000 file000
drwxrwxrwx 2 root root 6 Jan 24 09:04 dir000
-rw-rw-rw- 1 root root 0 Jan 24 09:04 file000

示例3: 通过 umask 决定新建用户 HOME 目录的权限

[root@lqz ~]# vim /etc/login.defs
UMASK 077
[root@lqz ~]# useradd dba
[root@lqz ~]# ll -d /home/dba/
drwx------. 4 dba dba 4096 3 月 11 19:50 /home/dba/

[root@tianyun ~]# vim /etc/login.defs
UMASK 000
[root@lqz ~]# useradd sa
[root@lqz ~]# ll -d /home/sa/
drwxrwxrwx. 4 sa sa 4096 3 月 11 19:53 /home/sa/

三 权限管理之su、sudo

su切换用户与sudo提权

4.1 介绍

因为root用户的权限太大,破坏力太强,安全风险极高,所以通常情况下公司的服务器对外都是禁止 root用户直接登录的,而运维组的小伙伴通常使用的都是普通用户,但是运维组内的小伙伴们在进行日 常运维管理的过程中,经常需要获得某些root才有的管理权限才能完成任务,例如需要执行/sbin目录下 的命令。

那么如何才能在不使用root用户直接登录操作系统的同时又能保证普通用户完成日常工作呢,有两种 方案

1、su切换用户身份

特点:使用普通用户登录,然后使用su命令切换到root账户下
优点:简单粗暴
缺点:
1、需要知道root密码
2、权限控制不精细:每次都是获取所有root权限

123456

2、sudo提取部分管理员权限

特点:
1、使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
2、不需要切换到root账户下

优点:相对复杂
缺点:
1、不需要知道root密码,输入的是用户自己的密码
2、权限控制更为精细:可以控制普通用户只获取部分root权限

123456789

4.2 su切换用户

4.2.1 储备知识
linux中shell可以分两类
登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种

非登陆shell,不需要输入用户和密码就能进入Shell,比如运行bash会开启一个新的会话窗口
123

插一句:shell的使用方式有两种

交互式,等待用户输入执行的命令(终端操作,需要不断提示)

非交互式,执行shell脚本, 脚本执行结束后shell自动退出

1234
bash shell配置文件介绍(文件主要保存用户的工作环境)
全局配置文件:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

个人配置文件:
~/.bash_profile
~/.bashrc

profile类文件, 设定环境变量, 登陆前运行的脚本和命令。

bashrc类文件, 设定本地变量, 定义命令别名

PS: 如果全局配置和个人配置产生冲突,以个人配置为准。

123456789101112131415
配置文件的应用顺序
如果执行的是登录式shell,那么配置文件执行顺序是:

/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc

如果执行的是非登录式shell,那么配置文件执行顺序是:

~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行。
12345678
执行登录与非登录shell
# 执行登录shell:身份与环境都切换
su - 用户
# 执行非登录shell:只切换用户身份
su 用户
# 补充:
# 1、从root往普通用户下切换无需输入密码,反之则需要
# 2、切换身份执行命令:su - 用户 -c “命令”
1234567

4.3 sudo提权

在日常的运维工作中,我们不应该把root的密码公开给所有人,因为,一方面,真那样做的话,安全 风险就太高了,删库到跑路发生的概率估计会加大,另外一方面,小伙伴们大多数情况下只需要提取某 一些权限来使用即可也并不是需要所全部的管理员权限,所以说sudo比su更为靠谱一些。

通过配置sudo,我们可以实现让普通用户输入自己的密码的情况下而获取我们为其配置的特定权 限,这样,既保证了普通用户拥有他想要的特定权限,又不至于泄露管理root的密码。

4.4 配置

两种编辑方式

1、visudo(会提示语法错误,推荐使用)

[root@egon ~]# visudo -c # 检查配置是否正确
/etc/sudoers:解析正确
[root@egon ~]#
123

2、vim /etc/sudoers

# sudo 语法
user MACHINE=COMMANDS

# 示如
# root ALL=(ALL) ALL
1、root:用户
2、ALL:代表用户可以在哪台机器上执行指令,通常设置为ALL,如果设置为localhost代表在本机上执行
指令。
也可以设置为本机以外的其他IP地址或主机名,此时该/etc/sudoers虽然是在本机上配置的,但用户
登录到本机
后仍然是无法执行命令的,如果把/etc/sudoers这个配置文件赋值到指定ip或主机名的那台机器上,
就好用了
配置文件中讲到:
## Next comes the main part: which users can run what software on
## which machines (the sudoers file can be shared between multiple
## systems)./etc/sudoers文件可以在多个系统之间共享,如果我们设置成ALL的话就省事了,该文件复制到人任
意一台机器
上的完成的权限配置都一样

3、(All):表示允许用户以哪个用户的权限做事情

4、ALL:所有命令
最终解释:root用户可以在所有主机上以任意用户身份执行所有命令
tom ALL=(ALL) ALL # tom用户在任何机器上,可以以任何用户身份执行任何命令等同于
root用户
lili ALL=(ALL) NOPASSWD: ALL # 免密
egon ALL=(ALL) /bin/cp,/bin/touch # 只允许egon用户以root用户的身份执行
cp,touch命令
egon01 ALL=(ALL) ALL,!/usr/bin/vim /test/a.txt # !代表取反
egon02 ALL=(ALL) /usr/bin/passwd [a-zA-Z]*,/usr/bin/vim *,!/usr/bin/vim
/test/a.txt # 可以编辑所有文件,除了/test/a.txt
# 可以测试
[root@egon ~]# su - egon02
上一次登录:二 12月 20 11:21:01 CST 2022pts/0 上
[egon02@egon ~]$
[egon02@egon ~]$ sudo vim /test/b.txt
[egon02@egon ~]$ sudo vim /test/a.txt
对不起,用户 egon02 无权以 root 的身份在 egon 上执行 /bin/vim /test/a.txt。
[egon02@egon ~]$
12345678910111213141516171819202122232425262728293031323334353637383940

测试

[root@egon ~]# su - egon
上一次登录:四 9月 10 20:27:09 CST 2020pts/0 上
[egon@egon ~]$ ll -d /etc/
drwxr-xr-x. 146 root root 8192 9月 10 20:27 /etc/
[egon@egon ~]$ touch /etc/a.txt # =================> 没有权限
touch: 无法创建"/etc/a.txt": 权限不够
[egon@egon ~]$ sudo touch /etc/a.txt # =================> 使用sudo提权
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] egon 的密码:
[egon@egon ~]$ ll /etc/a.txt
-rw-r--r-- 1 root root 0 9月 10 20:28 /etc/a.txt
ps: sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出

123456789101112131415161718192021

Sudo 常用参数

sudo常用参数:
-l : 登录用户下面,执行sudo -l 显示当前用户有哪些权限
-k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
--> 系统默认也是5分钟失效
--> 配置免密是另一种情况 NOPASSWD: ALL远程sudo(有条件限制的)

123456

其他配置详见配置文件

4.5 sudo实例

企业生产环境用户权限集中管理方案实例

根据角色的不同,给不同的用户分配不同的角色

# 1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个
批量创建用户
for user in chuji{01..03} net01 senior01 manager01
> do
> useradd $user
> echo "111111"|passwd --stdin $user
> done;

# 2.创建5个开发人员,属于phpers组
groupadd -g 999 phpers
for n in `seq 5`
do
useradd -g phpers php0$n
done

# 3.创建开发经理,中级phper
for user in kaifaManager seniorPhper
> do
> useradd $user
> echo "111111"|passwd --stdin $user
> done

# 4.编辑配置文件
[root@localhost ~]# vim /etc/sudoers
########################Cmnd_Alias By FTL ###################################
Cmnd_Alias CY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname,
/sbin/ifconfig, /bin/netstat, /sbin/route
Cmnd_Alias GY_CMD_1=/usr/bin/free, /usr/bin/iostat,/usr/bin/top, /bin/hostname,
/sbin/ifconfig, /bin/netstat, /sbin/route, /sbin/iptables, /etc/init.d/network,
/bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall, /bin/rpm,
/usr/bin/updatedb, /usr/bin/yum, /sbin/fdisk, /sbin/sfdisk, /sbin/parted,
/sbin/partprobe, /bin/mount, /bin/umount
Cmnd_Alias CK_CMD_1=/usr/bin/tail, /bin/grep, /var/log/messages*
Cmnd_Alias GK_CMD_1=/sbin/service, /sbin/chkconfig, /bin/tail, /var/log/*,
/bin/grep, /bin/cat, /bin/ls, /bin/sh
Cmnd_Alias GW_CMD_1= /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient,
/usr/bin/net, /sbin/iptables, /sbin/iwconfig, /sbin/mii-tool, /bin/cat,
/var/log/*
########################User Aliases By FTL ###################################
User_Alias CHUJI_YUNWEI_ADMINS=chuji01,chuji02,chuji03
User_Alias CHUJI_KAIFA_ADMINS=php01,php02,php03,php04,php05
User_Alias GAOJI_WANG_ADMINS=net01
########################Runas_Alias By FTL ###################################
Runas_Alias OP = root -->未来切换到某个角色执行任务
########################Config By FTL ###################################
senior01 ALL=(OP) GY_CMD_1
manager01 ALL=(ALL) NOPASSWD:ALL
kaifaManager ALL=(ALL) ALL, /usr/bin/passwd [A-Za-z], !/usr/bin/passwd
root, !/usr/sbin/visudo,\
!/usr/bin/vi *sudoer*, !/usr/bin/sudo su -,
!/bin/su
seniorPhper ALL=(OP) GK_CMD_1
CHUJI_YUNWEI_ADMINS ALL=(OP) CY_CMD_1
CHUJI_KAIFA_ADMINS ALL=(OP) CK_CMD_1
GAOJI_WANG_ADMINS ALL=(OP) GW_CMD_1

命令的路径要全路径
别名需要大写
超过一行,用"\"换行
排除的命令一定在最后面写
kaifaManager 因为有ALL,所以可以直接su - 切换root,但是 sudo su -切换不了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值