Linux12--权限管理之:文件高级权限ACL、文件特殊属性、su与sudo

一 ACL权限

### 1 ACL   Access Control List
ACL权限是UGO权限的扩展,可以针对单一用户、单一文件或目录来进行r、w、x的权限控制
可将 用户 对文件权限进行进一步的细化,对于需要特殊权限的使用状况有一定帮助

  # 通过ACL设置权限后,最好统一使用ACL设置,别交叉使用chmod


### 2 ACL命令
# 2.1 查看
getfacl /opt/a.txt

  # file: opt/a.txt
  # owner: root
  # group: root
  user::rw-
  group::r--
  other::---


# 2.2 删除
setfacl -x g:group1 /opt/a.txt  # 删除组group1的权限
setfacl -b /opt/a.txt   # 删除所有acl权限


# 2.3 修改
# 修改属主的权限
setfacl -m u::权限 a.txt

# 修改属组的权限
setfacl -m g::权限 a.txt

# 修改其他人的权限
setfacl -m o::权限 a.txt

# 修改具体某一个用户的权限
setfacl -m u:用户名:权限 a.txt

# 修改具体某一个组的权限
setfacl -m g:组名:权限 a.txt  # 组必须存在

# 目录设置,都一样


### 3 案例
# eg: 其他人对文件没有任何权限,然后单独设置其他人里的egon01对文件有r权限、egon02对文件有w权限
setfacl -b b.txt  # 可以先清理掉所有的acl权限,保证实验环境干净

setfacl -m o::- b.txt
setfacl -m u:egon01:r b.txt
setfacl -m u:egon02:w b.txt

# 结果
egon01 对 b.txt的权限为 r
egon02 对 b.txt的权限为 w
剩余的其他人中:
egon03 对 b.txt的权限为 -

1 高级用法之mask

# 1 mask值
除了属主和other不受影响,其他都会受到mask的影响,mask决定了他们的最高权限
  # 这里属主和other,指的是 用getfacl 查看出来的 owner和other


# 2 设置mask命令   m:权限      默认为 rw-
setfacl -m m:rw /opt/a.txt

 
# 3 详解
mask值就像一个筛子,文件属主和other之外的所有权限都需要被它筛一遍
若mask值为rw-,则代表该筛子只放行rw权限
本质原理是权限A需要与mask值B进行按位 与 运算,得到的结果才是effective有效权限


# ps:一般不更改mask权限,只要赋予mask最大权限(也就是rwx),则给用户或群组设定的ACL权限本身就是有效的

2 高级用法之default

# 1 default: 继承
将某个用户 针对目录的权限,继承到以后 新建目录 或者文件里
  注: 是作用到子目录 或目录下的文件,对当前目录没有相应权限


# 2 设置default命令   d: 正常的权限
setfacl -m d:u:egon:rwx /home


# 3 案例  egon能够对/test以及以后在/test下新建的文件有读、写、执行权限
mkdir /test

setfacl -m u:egon:rwx /test     # 设置egon 对目录的权限
setfacl -m d:u:egon:rwx /test   # 将egon的权限 继承给目录下面
getfacl /test

# 检验
mkdir /test/aaa
getfacl /test/aaa/

touch /test/b.txt
getfacl /test/b.txt 

二 文件特殊属性

### 1 特殊权限
a : 允许追加内容
i : 禁止任何修改,有些病毒程序会对文件加上该权限
A : 不更改文件访问时间


### 2 权限命令
# 查看特殊权限
lsattr 文件路径

# 增加特殊权限
chattr +a 文件路径

# 删除特殊权限
chattr -a 文件路径


### 3 案例
touch /opt/{1..3}.txt
chmod 000 /opt/*

lsattr /opt/
---------------- /opt/1.txt
---------------- /opt/2.txt
---------------- /opt/3.txt

chattr +a /opt/1.txt  # 允许追加内容
chattr +i /opt/2.txt  # 禁止任何修改,有些病毒程序会对文件加上该权限
chattr +A /opt/3.txt  # 不更改文件访问时间
 
lsattr /opt/
-----a---------- /opt/1.txt
----i----------- /opt/2.txt
-------A-------- /opt/3.txt

# 验证
echo 111 >> /opt/1.txt 

cat /opt/1.txt 
111

rm -rf /opt/1.txt 
rm: 无法删除"/opt/1.txt": 不允许的操作

三 su与sudo

1.不使用root用户登录,2.又能保证普通用户完成日常工作

让普通用户具备管理员权限

1 su切换用户

# su切换用户身份:
从一个用户切换登录到另一个用户

# 特点:
使用普通用户登录,然后使用su命令切换到root账户下

# 优点:简单粗暴

# 缺点:
1.需要知道root密码
2.权限控制不精细:每次都是获取root的所有权限

1.1 bash种类及配置文件

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

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


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

个人配置文件: 
  ~/.bash_profile 
  ~/.bashrc
  
profile类文件 # 设定环境变量, 登陆前运行的脚本和命令
bashrc类文件  # 设定本地变量, 定义命令别名
# 如果全局配置和个人配置产生冲突,以个人配置为准


# 3 配置文件加载顺序
登录式shell  配置文件执行顺序是:  su - 用户
/etc/profile -> /etc/profile.d/*.sh -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc

非登录式shell                   su 用户
~/.bashrc -> /etc/bashrc -> /etc/profile.d/*.sh


# 4 常用
1.若所有用户,且 登录与非登录shell 都执行的配置 通常写入: /etc/bashrc 

2.重新加载配置文件  source 配置文件   # 当前环境下,配置文件立即生效

1.2 执行su

# 执行登录shell:身份与环境都切换
su - 用户 # 相当于重新开机登录用户,所有配置文件都重新加载

# 执行非登录shell:只切换用户身份
su 用户   # 相当于系统运行时,换一个用户,配置文件只加载bashrc文件和/etc/profile.d/*.sh,且当前目录不会切换


# 补充:
1.从root往普通用户下切换无需输入密码,反之则需要

2.切换身份执行命令:su - 用户 -c “命令”

2 sudo提权

# 特点:
1.使用普通用户登录,然后sudo命令提取root用户的部分管理权限
  注意只是某部分,而不是全部
    
2.不切换用户,不需要切换到root账户下
    
# 优点:  *** 推荐使用
1.不需要知道root密码,输入的是用户自己的密码
2.权限控制更为精细:可以控制普通用户只获取root的部分权限
  
# 缺点:相对复杂
执行命令前,需加上 sudo 命令

2.1 配置sudo

### 方式一: visudo  推荐使用
直接使用 visudo 命令,进行配置修改,好处是会提示语法错误

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


### 方式二: vim /etc/sudoers   风险高、无提示  可修改完后,用visudo -c 检测

# 1 sudo 语法
user    MACHINE=COMMANDS      
 
# 示例解释:root    ALL=(ALL)       ALL        
  root  : 指定哪个用户
  ALL   : 指定用户可以在哪台服务器 机器上执行指令  # 跟xshell远程连接的客户端无关
          通常设置为ALL,代表所有机器都可以执行   # ***
          可设置为localhost,代表在本机上执行指令
          可设置为本机以外的其他IP地址或主机名
          
  (All) : 表示允许用户以哪个用户的权限做事情  # 转成的用户身份  通常就是(all) 或 (root)
  ALL   : 所有命令   # 命令的绝对路径
  
  # 最终解释:root用户可以在所有主机上以任意用户身份执行所有命令


# 2 配置案例:
tom     ALL=(ALL)  ALL            # tom用户在任何机器上,可以 以任何用户身份 执行 任何命令
                                    等同于root用户
                                   
lili    ALL=(ALL)  NOPASSWD: ALL  # 针对所有的命令都免密  或  NOPASSWD:/bin/cp  针对某个命令免密

egon    ALL=(root)  /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 
                   # vim可以编辑所有文件,除了/test/a.txt 
                   
### 针对多个用户 批量配置的两种方案

# 方案一:通过Linux系统 用户组来设置
%php ALL=(root)  /bin/cp

groupadd php

useradd php01
useradd php02

gpasswd -a php01 php
gpasswd -a php02 php

# 方案二:通过sudoes 用户别名来设置
User_Alias PHP=php01,php02

PHP ALL=(root)  /bin/cp              

2.2 执行sudo

# 1 sudo 执行流程
1.普通用户执行sudo命令, 会检查/var/db/sudo是否存在时间戳缓存
2.如果存在则不需要输入密码, 否则需要输入用户与密码
3.输入密码会检测是否该用户是否拥有该权限
4.如果有则执行,否则报错退出


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

-k : 删除/var/db/sudo/下面对应的时间戳的信息,下次执行sudo需要输入当前用户的密码
     # 第一次输入用户密码后,不需要密码  系统默认也是5分钟失效
     # 配置 免密是另一种情况  NOPASSWD: ALL  远程sudo(有条件限制的)

2.3 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.编辑配置文件
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


# 配置注意事项
1.命令的路径要全路径
2.别名需要大写
3.超过一行,用 "\" 换行  
4.排除的命令一定在最后面写

5.kaifaManager 因为有ALL命令(包含 /usr/bin/su ),所以可直接成都su - 切换root
  但是 sudo su -切换不了(被禁了)
posted @ 2023-07-11 14:42  Edmond辉仔  阅读(329)  评论(0)    收藏  举报