Linux学习 day06之文件权限管理

文件权限管理

  • 一 文件权限管理之基本权限
    • 基本权限介绍
    • 设置权限
    • 权限对文件/目录的意义
      • 文件:`ls -l 文件名`
      • 目录:`ls -dl 文件名`
    • 例1:要想在目录下创建\删除内容:对目录的x权限+对目录的w权限
    • 例2:要浏览目录下内容:对目录的x权限+对目录的r权限
    • 例3:要执行目录下程序:对目录的x权限+对文件的x权限,如果文件是解释型语言的脚本程序,还需要对文件有r权限
  • 二 文件权限管理之特殊权限
    • 外援详解
    • `SUID`
    • `SGID`
      • 权限设定方法
      • 文件权限位表示:
      • `SGID`相关说明:
    • `SBIT`
  • 三 文件权限管理之`chattr`
    • 简介
    • `chattr`命令语法
    • `chattr`使用实例
    • `lsattr`命令语法
    • `lsattr`使用实例
  • 四 权限管理之su、sudo
    • su切换用户与sudo提权
      • 介绍
      • `su`切换用户
        • 储备知识
        • `bash shell`配置文件介绍(文件主要保存用户的工作环境)
        • 配置文件的应用顺序
        • 执行登录与非登录`shell`
      • `sudo`提权
      • 配置(两种编辑方式)
        • `visudo`(会提示语法错误,推荐使用)
        • `vim /etc/sudoers`
        • `Sudo` 常用参数
      • `sudo`实例

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

一 文件权限管理之基本权限

基本权限介绍

  1. 基本权限类型
    r:可读=》4

    w:可写=》2

    x:可执行=》1


  1. 权限的归属
    属主:u

    属组:g

    其他人:o

    例如
    输入:ls -l a.txt
    返回:-rw-r--r-- 1 root root 1146 Jul 16 18:42 a.txt

    分别代表:
    权限硬链接个数属主属组文件所占用的空间(以字节为单位)文件(目录)最近访问(修改)时间文件名

  2. 文件类型:
    -:文本文档
    d:目录
    b:设备block
    c:字符设备
    s:套接字文件
    l:软链接


设置权限

  1. 修改属主、属组
    chown cm.hr file1 # 改属主、属组
    chown cm file1 # 只改属主
    chown .hr file1 # 只改属组
    chown -R /test # 递归修改
  2. 修改ugo对应的权限
    1. 加减法
      chmod u+x,g-w,o+r a.txt
    2. 赋值
      chmod a=rwx a.txt
      chmod a=- a.txt
      chmod ug=rw,o=r file1
    3. 数字
      chmod 644 file1
      chmod -R 777 xxx/
  • 注意:把某一个非属主用户添加到文件的属组里,他就拥有了该组的权限,而不再是其他人

权限对文件/目录的意义

文件:ls -l 文件名

r:可以cat读取文件内容

w:可以修改文件

x:可以执行文件代码,如果该文件的代码是编译好的结果,那么只有x权限即可执行,但如果该文件的代码是一个解释型的脚本程序,则需要配合r权限才可执行

目录:ls -dl 文件名

r: 可以ls浏览文件下的内容

w:可以在目录下创建新文件or目录

x

  • 可以执行目录下的程序,除了对目录有执行权限外,还要对程序文件有执行权限才行。
  • 可以正常切换到目录下
  • 涉及到多层目录如/a/b/c,需要对每一级都有x权限才可以正常走到下一级

一:对文件夹的操作(不操作文件内容),需要当前用户具备的权限

  1. 对沿途所有文件夹有rx权限
  2. 对目标文件夹有rw权限
    r-》可以浏览
    w-》可以创建、删除、移动子文件和子目录
    实验:复制当前终端,登录普通用户,root用户修改权限后查看普通用户的权限变化。

二:对文件的操作(操作文件内容),需要当前用户具备的权限

  1. 对沿途所有文件夹有x权限
  2. 对目标文件有rw权限
    r-》可以读取文件内容
    w-》可以修改文件内容

!!!注意!!!

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

  1. 当前用户对沿途所有文件夹都有x权限
  2. 并且当前用户对目标文件夹有w权限
  3. 但是当前用户对目标文件没有w权限

此时当前用可以vim编辑文件内容,并且可以wq!强制保存退出完成文件修改,其实是将源文件删掉了,可以
通过查看前后操作的文件inode号来确定
stat 文件名可以查看文件iNode信息
实验:root用户创建相应目录和文件,并修改权限信息,普通用户强制修改文件内容,查看iNode变化。


例1:要想在目录下创建\删除内容:对目录的x权限+对目录的w权限

  1. 设置权限
mkdir -p a/b/c
chmod -R o=x a # 其他人o对当前目录及其子目录都有x权限
chmod o+w a/b/c # 其他人o对/a/b/c目录有w权限
  1. 查看权限
ls -dl a
#返回:drwxr-x--x 3 root root 4096 Aug 11 16:24 a

ls -dl a/b
#返回:drwxr-x--x 3 root root 4096 Aug 11 16:24 a/b

ls -dl a/b/c
#返回:drwxr-x-wx 2 root root 4096 Aug 11 16:25 a/b/c
  1. 验证
su - cm
#返回:Last login: Tue Aug 11 16:17:28 CST 2020 on pts/2

touch a/b/c/1.txt
exit
#返回:logout

ls a/b/c/
#返回:1.txt

例2:要浏览目录下内容:对目录的x权限+对目录的r权限

mkdir -p a/b/c
chmod -R o=x a
chmod o+r a/b/c
touch a/b/c/{1..3}.txt
su - cm
#返回:Last login: Tue Aug 11 16:27:33 CST 2020 on pts/2

ls a/b/c
#返回:1.txt 2.txt 3.txt

例3:要执行目录下程序:对目录的x权限+对文件的x权限,如果文件是解释型语言的脚本程序,还需要对文件有r权限

mkdir -p a/b/c
chmod -R o=x a/b/c
cp /bin/echo a/b/c
chmod o=x a/b/c/echo
su - cm
#返回:Last login: Tue Aug 11 16:30:17 CST 2020 on pts/2

./a/b/c/echo "hello cm"
#返回hello cm


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

外援详解

详解:https://www.cnblogs.com/linhaifeng/articles/13357542.html
suid 4
sgid 2
sticky 1


SUID

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

ll /etc/shadow
#返回:---------- 1 root root 1109 Aug 11 16:11 /etc/shadow`

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

ll `which passwd`
#返回:-rwsr-xr-x 1 root root 27856 Aug 9 2019 /bin/passwd

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

  • SUID 权限仅对二进制可执行文件有效
  • 如果执行者对于该二进制可执行文件具有 x 的权限,执行者将具有该文件的所有者的权限
  • 本权限仅在执行该二进制可执行文件的过程中有效

权限设定方法:

  1. 字母表示法:
    chmod u+s FILE...
    chmod u-s FILE...
    
  2. 数字表示法:
    chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无意义)
    在普通三位数字权限位之前,用4代表添加的SUID
    chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)

示例:

ll `which cat`
#返回:-rwxr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat

chmod 4755 `which cat` # 或者 chmod u+s `which cat`
ll `which cat`
#返回:-rwsr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat

su - cm
cat /etc/shadow # 可以看到内容

工作原理:
环境前提:

  1. linux中有一个二进制程序cat,属主属组均为root
  2. linux中有一个系统文件/etc/shadow,属主属组均为root
  3. 我们创建一个普通用户叫user1
  4. user1具有对cat的执行权限
  5. user1 不具有对/etc/shadow的任何权限
  • 默认情况下:
    user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1
    cat进程访问/etc/shadow,由于进程属主属组是user1:user1,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.❌

  • cat设置SUID之后
    user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1
    cat进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许✔


例:
准备环境:

mkdir /test
chmod 777 /test/
echo 1111 > /test/a.txt
chmod 000 /test/a.txt
chown user1.group1 /test/a.txt
chown cm.devops /usr/bin/cat
chmod u+s /usr/bin/cat

实验:

[root@cm ~]# ll /test/a.txt # 目标文件的属主:user1,属组:group1 ----------. 1 user1 group1 4 10月 29 18:31 /test/a.txt

[root@cm ~]# ll /usr/bin/cat # 命令文件的属主:cm -rwxr-xr-x. 1 cm devops 54160 10月 31 2018 /usr/bin/cat

[root@cm ~]# su - lili -c "cat /test/a.txt" # lili切换为cm用户执行,cm用户没有对上a.txt的属主,所以直接被当成其他人,没有任何权限
cat: /test/a.txt: 权限不够

[root@cm ~]# chmod o+r /test/a.txt
[root@cm ~]# su - lili -c "cat /test/a.txt"
111

[root@cm ~]# chmod o-r,g+r /test/a.txt
[root@cm ~]# ll /test/a.txt
----r-----. 1 user1 group1 4 10月 29 18:31 /test/a.txt

[root@cm ~]# usermod -a -G group1 cm
[root@cm ~]# ll /usr/bin/cat # 确保suid还在
-rwsr-xr-x. 1 egon devops 54160 10月 31 2018 /usr/bin/cat

[root@cm ~]# id cm
uid=1005(cm) gid=1005(cm)=1005(cm),1003(group1)

[root@cm ~]# su - lili -c "cat /test/a.txt" # lili--->cm,cm用户没有对上a.txt的属主,所以直接被当成其他人,虽然此时cm属于文件a.txt的属组group1的成员,但是对suid来说那没用
cat: /test/a.txt: 权限不够

[root@cm ~]# su - cm -c "cat /test/a.txt" # 如果当前用户与suid的用户重叠,那么就无所谓用户转换,同样会按照:属主、属组、其他人的次序依次对照
1111

SGID

权限设定方法

  1. 字母表示法:
    chmod g+s DIR/FILE
    chmod g-s DIR/FILE
  2. 数字表示法:
    chmod 2755 DIR/FILE 添加SGID到目录或文件
    在普通数字权限位前,用2代表添加SGID
    chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)
    chmod 755 DIR/FILE 同上

文件权限位表示:

[root@localhost learn]# ll file1.txt
-rwxr-sr-x. 1 cm hr 0 Nov 24 08:22 file1.txt

SGID相关说明:

  1. 作用在二进制程序上时:
    执行SGID权限的程序时,此用户将继承此程序的所属组权限

  2. 作用于目录上时:
    此文件夹下所有用户新建文件都自动继承此目录的用户组。

    SGID 作用于普通文件时,和 SUID 类似,在执行该文件时,用户将获得该文件所属组的权限。
    SGID 作用于目录时,意义就非常重大了:
    当一个用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件
    如果该目录同时用 SGID 修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

    [root@localhost ~]# mkdir /test
    [root@localhost ~]# chmod g+s /test/ # 等同于chmod 2755 /test/
    [root@localhost ~]# ll -dl /test/
    drwxr-sr-x 2 root root 6 8月 11 17:06 /test/
    
    [root@localhost ~]# chown .cm /test/ # 后期任何人在该目录下创建的文件or目录的属组都是cm
    

SBIT

其实 SBITSUIDSGID 的关系并不大。

SBIT 是 the restricted deletion flag or sticky bit 的简称,有时也称为Sticky。粘滞位

权限设定方法:

  1. 字母表示法:
    chmod o+t DIR...
    chmod o-t DIR...
    chmod +t DIR...
  2. 数字表示法:
    chmod 1755 DIR
    在普通数字权限位前,用1代表添加Sticky

文件权限表示:
输入:ll -d tmp
返回:drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp

  • 文件other位的x权限,用t代替.表示被设置了Sticky
    如果other位没有x权限,会显示为大写T,表示有故障(权限无效)

相关说明:

对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;
只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限。


实验:

[root@localhost learn]# mkdir -p dir1/test{1..4}
[root@localhost learn]# useradd user01
[root@localhost learn]# useradd user02
[root@localhost learn]# chown -R user01:user01 dir1/test1
[root@localhost learn]# chown -R user01:user01 dir1/test2
[root@localhost learn]# chown -R user02:user02 dir1/test3
[root@localhost learn]# chown -R user02:user02 dir1/test4
[root@localhost learn]# ll dir1/
total 0
drwxr-xr-x. 2 user01 user01 6 Nov 24 11:13 test1
drwxr-xr-x. 2 user01 user01 6 Nov 24 11:13 test2
drwxr-xr-x. 2 user02 user02 6 Nov 24 11:13 test3
drwxr-xr-x. 2 user02 user02 6 Nov 24 11:13 test4

[root@localhost learn]# chmod 1777 dir1/
[root@localhost learn]# ll -d dir1
drwxrwxrwt. 6 root root 58 Nov 24 11:13 dir1

测试:

[root@localhost learn]# su - user01
[user01@localhost ~]$ cd /usr/local/learn/
[user01@localhost dir1]$ ll
total 0
drwxr-xr-x. 2 user01 user01 6 Nov 24 11:13 test1
drwxr-xr-x. 2 user01 user01 6 Nov 24 11:13 test2
drwxr-xr-x. 2 user02 user02 6 Nov 24 11:13 test3
drwxr-xr-x. 2 user02 user02 6 Nov 24 11:13 test4

[user01@localhost dir1]$ mv test3 user01
mv: cannot move ‘test3’ to ‘user01’: Operation not permitted

[user01@localhost dir1]$ touch test3/1.txt
touch: cannot touch ‘test3/1.txt’: Permission denied

SBIT 目前只对目录有效,用来阻止非文件的所有者删除文件。比较常见的例子就是 /tmp 目录:

权限信息中最后一位t表明该目录被设置了 SBIT 权限。SBIT对目录的作用是:当用户在该目录下创建新文件或目录时,仅有自己和root才有权力删除,主要作用于一个共享的文件夹。


三 文件权限管理之chattr

简介

你是否遇到过文件或目录具有可读写权限,但是使用root用户删除、修改时提示"Operation not permitted"的情况。可能是由于chattr设置了文件的隐藏保护权限导致。通过chattr命令修改文件或目录属性能够提高系统的安全性。与chmod命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr命令改变的。本文主要介绍chattrlsatt命令的语法和基本介绍。

说明:这两个命令在工作中用的比较少,经常用到的场景就是解决"Operation not permitted"问题。
至于它们语法,掌握最基本的就可以了。就是会查属性、会修改属性就可以了。

chattr命令语法

chattr [+-=] [ASacdistu] File/Directory
参数说明:

+-=:分别为 [+ 增加] [- 减少] [= 设定] 指定属性

A :当设定了 A这个属性时,文件或目录的存取时间atime (access) 将不可被修改。

S :这个功能有点类似sync的功能!就是会将数据同步写入磁盘当中!可以有效的避免数据流失!

a :文件将只能增加数据,而不能删除,只有root才能设定这个属性。

c :这个属性设定之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩出来,但是在储存的时候,将会先进行压缩之后再储存。

d :当dump(备份)程序被执行的时候,设定d属性将可使该档案(或目录)具有dump功效!

i:指定文件不能被删除、改名、也无法写入或新增数据!对于系统安全性有相当大的帮助!

j :当使用ext3这个档案系统格式时,设定 j属性将会使档案在写入时先记录在journal中! 但是当filesystem设定参数为 data=journalled 时,由于已经设定了日志了,所以这个属性无效!

s :当文件设定了 s 参数时,他将会被完全的移除出这个硬盘空间。

u :与 s相反的,当使用 u 来设定文件时,则数据内容其实还存在磁盘中,可以使用来undeletion.


chattr使用实例

  1. 设置指定文件的隐藏属性,使其无法删除、修改。
    chattr +i /home/config/config.conf #添加i隐藏属性后,就无法更动config.conf这个文件了
  2. 取消文件的删除、修改保护权限
    chattr -i /home/config/config.conf #解除i这个隐藏属性

lsattr命令语法

lsattr [-aR] File/Directory

  • 参数说明
    -a :将隐藏文件的属性也列出来;
    -R :连同子目录的数据也一并列出来!

lsattr使用实例

lsattr file.txt 查看指定文件隐藏属性



四 权限管理之su、sudo

su切换用户与sudo提权

介绍

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

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

  1. su切换用户身份
    特点:使用普通用户登录,然后使用su命令切换到root账户下
    优点:简单粗暴

    缺点:
    1. 需要知道root密码
    2. 权限控制不精细:每次都是获取所有root权限
  2. sudo提取部分管理员权限
    • 特点:
      1. 使用普通用户登录,然后sudo命令提取root用户的部分管理权限,注意只是某部分,而不是全部。
      2. 不需要切换到root账户下
    • 优点:相对复杂
    • 缺点:
      1. 不需要知道root密码,输入的是用户自己的密码
      2. 权限控制更为精细:可以控制普通用户只获取部分root权限

su切换用户

储备知识

  • linux中shell可以分两类

    登陆shell,需要输入用户名和密码才能进入Shell,日常接触的最多的一种

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

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

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

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


bash shell配置文件介绍(文件主要保存用户的工作环境)

  • 全局配置文件:
    /etc/profile
    /etc/profile.d/*.sh
    /etc/bashrc

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

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

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


配置文件的应用顺序

如果执行的是登录式shell,那么配置文件执行顺序是:
/etc/profile->/etc/profile.d/*.sh->~/.bash_profile->~/.bashrc->/etc/bashrc

如果执行的是非登录式shell,那么配置文件执行顺序是:
~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh

  • PS: 验证使用echo在每行添加一个输出即可,注意,要把输出放在文件的第一行。

执行登录与非登录shell

执行登录shell:身份与环境都切换
su - 用户

执行非登录shell:只切换用户身份
su 用户

补充:

  1. 从root往普通用户下切换无需输入密码,反之则需要
  2. 切换身份执行命令:su - 用户 -c “命令”

sudo提权

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

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


配置(两种编辑方式)

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

visudo -c # 检查配置是否正确
返回:/etc/sudoers:解析正确


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 onwhich machines (the sudoers file can be shared between multiplesystems).

    即/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 ~]$ sudo vim /test/b.txt
    [egon02@egon ~]$ sudo vim /test/a.txt
    对不起,用户 egon02 无权以 root 的身份在 egon 上执行 /bin/vim /test/a.txt。
    

测试

[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. 如果有则执行,否则报错退出

Sudo 常用参数

sudo常用参数:

-l : 登录用户下面,执行sudo -l 显示当前用户有哪些权限

-k :删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码

  • –> 系统默认也是5分钟失效
  • –> 配置免密是另一种情况 NOPASSWD: ALL远程sudo(有条件限制的)

其他配置详见配置文件


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 -切换不了

热门文章

编程学习 ·

IBM分布式深度学习平台FfDL了解

IBM的分布式深度学习平台FfDL(Fabric for Deep Learning) 是用于分布式深度学习模型训练,基于微服务的平台。用户通过提交深度学习作业到已部署FfDL的服务器集群或者云上来进行训练。方便了拥有服务器集群的大型公司或机构进行深度学习硬件资源的调度管理。FfDL会自动调度用户…
编程学习 ·

RFID标签与我们的生活息息相关

在我们的生活中,很多领域都在使用RFID标签,下面,小编就来给大家介绍一下。1、ETC智能收费把RFID标签安装在车子汽车挡风玻璃上,在高速收费站ETC行车道上的频射无线天线中间的专用型短程通信,利用软件连接网络技术性与金融机构开展后台管理清算解决,进而做到车子根据路桥区…
编程学习 ·

如何重命名data.frame中的单个列?

本文翻译自:How to rename a single column in a data.frame? I know if I have a data frame with more than 1 column, I can use 我知道如果我有一个多于一列的数据框,我可以使用 colnames(x) <- c("col1","col2")to rename the columns. 重命名…
编程学习 ·

springboot aop 切到service层,不生效

今天发现一个问题,使用aop切到service层方法上,idea会有切成功的标志,编译也不报错,但就是不生效。研究了下发现,是因为我切的方法被同一个service中的其他方法调用,这样的话就不生效了,暂不清楚原因,解决方法时切到调用它的方法上,这只是切点不生效的一种情况,希望能…
编程学习 ·

redis基础知识汇总

redis基础知识汇总一、redis 基础知识1. 什么是Redis?2. redis的优缺点?3. redis比memcached的优势在哪里?以及两者的区别?4. redis的持久化策略?5. Redis过期键的删除策略6. 数据淘汰策略7. redis的事务?8、redis 事件?9、redis 集群redis哨兵数据分片主从配置二、Redi…
编程学习 ·

mybati中动态标签「if」没有生效的原因

一、问题: <if test="carrier != null and carrier != and carrier !=0">AND CARRIER = #{carrier} </if>我们在接口设置传入的字段类型为String,要在carrier字段不为null,空字符串,和”0“的时候增加以上条件,但是以上当carrier等于"0"时…
编程学习 ·

数据结构之查找(期末复习)

【知识框架】一、查找的基本概念 1、查找表 查找表是由同一类的数据元素(或记录)构成的集合。集合中的数据元素之间存在着完全松散的关系,因此查找表是一种非常灵便的数据结构。 2、关键字 关键字是数据结构(或记录)中某个数据项的值,用它可以标识一个数据元素(或记录)…
编程学习 ·

jQuery 的实现原理

(function(window, undefined) {})(window); jQuery 利用 JS 函数作用域的特性,采用立即调用表达式包裹了自身,解决命名空间和变量污染问题 window.jQuery = window.$ = jQuery; 在闭包当中将 jQuery 和 $ 绑定到 window 上,从而将 jQuery 和 $ 暴露为全局变量
编程学习 ·

整理得吐血了,二叉树、红黑树、B&B+树超齐全,快速搞定数据结构

前言没有必要过度关注本文中二叉树的增删改导致的结构改变,规则操作什么的了解一下就好,看不下去就跳过,本文过多的XX树操作图片纯粹是为了作为规则记录,该文章主要目的是增强下个人对各种常用XX树的设计及缘由的了解,也从中了解到常用的实现案例使用XX树实现的原因。数据…
编程学习 ·

屏蔽系统更新

win+r services.msc 改为禁用 恢复 -> 全改为无操作win + r gpedit.msc 找到windows 更新 中的 配置自动更新禁用掉注: 家庭版无法打开gpedit.msc 新建一个文本文档,名字随便取,编辑以下批处理内容,保存后将后缀名改为.bat ,右键使用管理员权限执行: @echo of…
编程学习 ·

Jmeter之JDBC的使用

(一)环境准备 1、下载mysql-connector-java-x.x.x.jar放到 jmeter根目录的lib目录下,重启jmeter(二)数据库配置 1、在测试计划下面,添加一个setup线程组2、在setup线程组下,添加一个配置元件JDBC Connection Configuration3、填写配置信息 Variable Name:数据库连接池的…
编程学习 ·

快手2020校园招聘秋招笔试--工程B试卷

攻击者使用无效IP地址,利用TCP连接的三次握手过程,连续发送会话请求,使受害主机处于开放会话的请求之中,直至连接超时,最终因耗尽资源而停止响应。这种攻击被称为A. DNS欺骗攻击 B. DDoS攻击 C. SYN Flooding攻击 D. 重放攻击DNS欺骗攻击:DNS(Domin Name Sever)是域名服…
编程学习 ·

linux弱密码检测

1.安装一个john软件包用来检测弱密码2.进入桌面可以看到3.使用mkdir /soft 在/下创建一个soft的文件夹;然后使用mv命令:mv john-1.8.0.tar.xz /soft/ 把john包移动到soft下面:4.在soft的文件夹下使用:tar -xf john-1.8.0.tar.xz 解压缩:5.进入到src目录下:6.make + 系统注…
编程学习 ·

随时获取数据流的中位数

题目 有一个源源不断往外吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个方法,这个方法可以随时取出之前吐出所有数的中位数 要求如果已经保存了吐出的N个数,那么任意时刻将一个新数加入的过程,其时间复杂度不超过O(logN) 取得中位数的过程,时间复杂度为O…
编程学习 ·

HTML概述

HTML发展史HTML没有1.0,因为关于它的初版存在争议,1995年HTML 2.0面世,1997年由国际官方组织W3C推出了HTML 3.2以及HTML 4.0标准,后面W3C(万维网联盟)也渐渐变成Web技术领域的权威,经过漫长的演变,2014年,HTML 5标准最终面世。HTML 2.0——1995年11月,RFC 1866发布HTML…
编程学习 ·

python从小白到入门(6)

1、集合: >>> set_a = {1,2,3,1,a,b,c} >>> set_a {1, 2, 3, c, a, b} >>> #集合 >>> #集合没用顺序,没有重复,不能索引,hash 哈希类型2、 >>> set1 = {1,2,3} >>> set2 = {a,b,c} >>> set3 = {1, a, 2} &g…