linux权限管理

文件基本权限

-rw-r--r--
-:文件类型(-文件 d目录 l软链接文件)
rw-: u所有者权限
r--: g所属组权限
r--: o其他人权限

基本权限的修改

chmod [选项] 模式 文件名
选项:
-R: 递归
模式:
[ugoa][+-=][rwx]
mode=421

chmod u+x 文件名
chmod g+w,o+w 文件名
chmod u=rwx,g=r 文件名
chmod a=rwx 文件名
# r --- 4
# w --- 2
# x --- 1
chmod 755 文件名

权限的作用
r: 读取文件内容(cat more head tail
w: 编辑、新增、修改文件内容(vi echo),但是不包含删除文件(需要对其所在目录有w权限才可删除,文件为目录的内容)
x: 可执行

权限对目录的作用
r: 可以查询目录下文件名 (ls)
w: 具有修改目录结构的权限。如新建文件和目录,删除此目录下文件夹和文件,重命名此目录下文件夹和文件,剪切 (touch rm mv cp
x: 可以进入目录 (cd)

对文件来讲: 最高权限是执行x
对目录来讲: 最高权限是写w

其他权限命令
chown 用户名 文件名 改变文件所有者
chgrp 用户组 用户名 改变用户所属组(如果没有组名,则创建与用户名同名的用户组)

让用户对文件及目录拥有一定的权限
要求:
拥有一个test目录
让user1拥有所有的权限(7)
让user2有查看的权限(5)
其他所有人不许查看这个目录(0)

# root登录
mkdir test
useradd user1
passwd user1
groupadd user
gpasswd -a user1 user
useradd user2
gpasswd -a user2 user
chown user1:user test
chmod 750 test

分配文件基本权限的核心原则
在最小权限情况下能够实现要求即可!

文件默认权限

window中是通过继承得来的默认权限

linux中通过umask来查看默认权限

# 查看默认权限
umask
# 0022
# 第一位0:文件特殊权限
# 022:文件默认权限

文件的默认权限
文件默认不能建立为执行文件(安全),必须手工赋予执行权限
所以文件默认权限最大为666
默认权限需要换算成字母再相减
建立文件之后的默认权限,为666减去umask值
示例1
-rw-rw-rw(文件默认最大权限666) 减去 ----w--w-(umask值022) 等于 -rw-r--r--
示例2
-rw-rw-rw(文件默认最大权限666) 减去 ----wx-wx(umask值033) 等于 -rw-r--r--

目录的默认权限
目录默认权限最大为777
默认权限需要换算成字母再相减
建立文件之后的默认权限,为777减去umask值
示例
rwxrwxrwx(目录默认最大权限777) 减去 ----w--w-(umask值022) 等于 rwxr-xr-x

修改umask值
umask=022 临时修改
vi /etc/profile 永久修改

ACL权限

drwxr-xr-x. 无ACL权限(使用setfacl赋予)
drwxr-xr-x+ 有ACL权限(使用getfacl查看)

ACL 权限简介与开启

ACL权限(Access Control List):用于解决用户身份不够用的情况。如用户权限rwx,用户组权限rwx,其他人没有权限;但需要给特殊的user1只读的权限

# 查看分区ACL权限是否开启
dumpe2fs -h /dev/sda1 # dumpe2fs命令是查询指定分区详细文件系统信息的命令
# -h 仅显示超级块中信息,而不显示磁盘块组的详细信息

# 临时开启分区ACL权限
mount -o remount,acl / # 重新挂载根分区,并挂载加入acl权限

# 永久开启分区ACL权限
vi /etc/fstab
# UUID=c4976561-a3be-476d-8c77-f031a241e70d /                       ext4    defaults,acl        1 1
mount -o remount / # 重新挂载文件系统或重启系统,使用修改生效

查看与设定ACL权限

# 查看ACL权限
getfacl 文件名

# 设定ACL权限
setfacl 选项 文件名
# -m 设定ACL权限
# -x 删除指定的ACL权限
# -b 删除所有的ACL权限
# -d 设定默认ACL权限
# -k 删除默认ACL权限
# -R 递归设定ACL权限
# root登录
useradd teacher1
groupadd student
mkdir /home/test
chown teacher1:student /home/test
chmod 770 /home/test
useradd user1
setfacl -m u:user1:rx /home/test # 给用户user1赋予r-x权限,使用 "u:用户名:权限" 的格式
groupadd tgroup2
setfacl -m g:tgroup2:rwx /home/test # 为组分配ACL权限,使用 "g:组名:权限" 的格式 

最大有效权限与删除ACL权限

最大有效权限mask
mask是用来指定最大有效权限的。如果给用户赋予了ACL权限,是需要和mask的权限“相与”才能得到用户的真正权限

# 修改最大有效权限
setfacl -m m:rx 文件名 # 设定mask权限为r-x。使用 "m:权限" 的格式

删除ACL权限

setfacl -x u:用户名 文件名   # 删除指定用户的ACL权限
setfacl -x g:组名 文件名     # 删除指定用户组的ACL权限
setfacl -b 文件名  # 删除该文件所有ACL权限

ACL默认权限与递归权限

# 递归赋予ACL权限
setfacl -m u:user1:rx -R /home/test

权限溢出:当对目录进行递归赋予ACL权限时,若这个目录有ACL执行x权限,则目录中的文件也会赋予x权限

默认ACL权限
set -m d:u:用户名:rx /home/test 以后在/home/test创建的文件,将有继承/home/test的ACL权限

sudo权限

root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是系统命令

文件基本权限、ACL权限、文件特殊权限、不可改变位权限:都是针对的文件
sudo是针对系统命令的

sudo使用

# 修改sudo,注意visudo,没有空格
visudo # 实际修改的是/etc/sudoers文件

# 为用户赋予权限
# 用户名  被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
root ALL=(ALL) ALL
# %组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL

示例1:授权普通用户chencye可以重启服务器

visudo
# 添加chencye ALL=(ALL) /sbin/shutdown -r now
# 配置的是-r,所以user1用户只能执行重启(sudo /sbin/shutdown -r now),而不能执行关机

# 普通用户执行sudo赋予的命令
su - chencye
sudo -l # 查看可用的sudo命令
sudo /sbin/shutdown -r now

示例2:授权普通用户可以添加其他用户,注意限制修改root用户密码

# 查看添加用户命令绝对路径
whereis useradd
visudo
# 添加新建用户授权,等号后不加(ALL)时,默认为root
# chencye ALL=/usr/sbin/useradd
# 添加修改密码权限,注意限制修改root用户密码
# chencye ALL=/usr/sbin/passwd [A-Za-z]*, !/usr/bin/passwd "", !/usr/bin/passwd root

分配sudo权限时,注意限制权限大小
如1:/usr/sbin/passwd修改root密码
如2: /bin/vi修改用户密码文件/etc/shadow

文件特殊权限

SetUIDSetGIDSticky BIT都是非常不安全的权限

umask中的第一个值就是设定这个

SetUID

功能
只有可以执行的二进制程序才能设定SUID权限
命令执行者要对该程序拥有x执行权限
命令执行者执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

示例:/usr/bin/passwd
普通用户拥有/usr/bin/passwd文件的执行权限
普通用户在调用passwd命令修改密码时,在执行passwd过程中使用的是root的身份
普通用户执行完passwd命令后,就不具有root身份了
普通用户调用passwd命令时,后面不能跟着用户名

cat命令没有SUID权限,所以普通用户不能查看/etc/shadow文件内容
ll /bin/cat

设定SetSUID方法

# 4代表SUID
chmod 4755 文件名
# 所有者设定SUID
chmod u+s 文件名
# 所属组设定SUID
chmod g+s 文件名
# 其他人设定SUID
chmod o+s 文件名

取消SetSUID方法

chmod 0755 文件名
chmod u-s 文件名
chmod g-s 文件名
chmod o-s 文件名

危险的SetSUID:太危险,不要新加任何SUID权限的
关键目录就严格控制写权限。如//usr
用户的密码设置要严格遵守密码三原则
对系统中默认应该具有SetUID权限的文件作一列表,定时检查有没有这之外的文件被设置了SetUID权限

特殊权限检测脚本

suid_check.sh

#!/bin/bash

# 搜索系统中所有拥有SUID和SGID权限的文件,并保存到临时目录中
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check

for i in $(cat /tmp/setuid.check)
do
    # 与列表对比
    grep $i /root/suid.list > /dev/null

    if [[ $? != 0 ]]; then
        # 如果文件不在列表中,则输出日志到日志文件中
        echo "$i isn't in /root/suid.list!" >> /root/suid_log_$(date +%F)
    fi
done
rm -rf /tmp/setuid.check
find / -perm -4000 -o -perm -2000 > /tmp/setuid.check
# 去除注释与空行 grep -v ^# list | grep -v ^$ 
# 从标准输入读取作为pattern:-f /dev/stdin  或  -f -
grep -v ^# /root/suid.list | grep -v ^$ | grep  -vf /dev/stdin /tmp/setuid.check
rm -rf /tmp/setuid.check

SetGID

SGID可以针对文件也可以针对目录,SUID只能针对文件

SGID针对文件的作用,与SUID比较相似
只有可以执行的二进制程序才能设定SGID权限
命令执行者要对该程序拥有x执行权限
命令执行者执行该程序时,组身份升级为该程序文件的属组
SetUID权限只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

示例:/usr/bin/locate
/usr/bin/locate是可执行二进制程序,可以赋予SGID
执行用户user1对/usr/bin/locate命令拥有执行权限x
执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
命令结束,user1用户的组身份返回为user1组

SetGID针对目录的作用
普通用户必须对目录拥有rx权限,才能进入目录
普通用户在此目录的有效组(一个用户可以有多个组)会变成此目录的属组
若普通用户对此目录拥有w权限时,新创建的文件的默认属组都是这个目录的属组

示例


# root操作
mkdir /tmp/test
chmod 777 /tmp/test
su - chencye
touch /tmp/test/test2
# 观察test2属组
ll /tmp/test
exit
# root操作
chmod 2777 /tmp/test
# 观察权限变化
ll -d /tmp/test
su - chencye
touch /tmp/test/test3
# 观察test2与test3属组
ll /tmp/test
exit
rm -rf /tmp/test

设定SetGID
chmod 2755 文件名
chmod g+s 文件名

Sticky BIT

SBIT粘着位权限的作用: 只对目录有作用
普通用户对该目录拥有wx权限,即普通用户可以在此目录拥有写入权限
如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件;一但赋予粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件
不建议手工建立拥有粘着位权限的目录


# root操作
mkdir /home/chencye/sbit
chmod 777 /home/chencye/sbit
touch /home/chencye/sbit/test.txt
su - chencye
# 可以删除
rm -rf /home/chencye/sbit/test.txt  && echo "删除成功"  || echo "删除失败"
exit
# root操作
chmod o+t /home/chencye/sbit
# 观察权限
ll -d /home/chencye/sbit
touch /home/chencye/sbit/test.txt
su - chencye
# 不能删除
rm -rf /home/chencye/sbit/test.txt
exit
rm -rf /home/chencye/sbit

示例: ll -d /tmp

不可改变位权限

chattr [+-=] [选项] 文件或目录名
i: insert 如果是文件,则不允许对文件删除、改名,也不能添加或修改数据;如果是目录,则只能修改目录下文件数据,不允许建立和删除文件。root用户也有效
a: append 如果是文件,则只能在文件增加数据,不能删除也不能修改数据;如果是目录,则只允许在目录中建立和修改文件,不允许删除

lsattr 文件名
lsattr -d 目录名

pam与selinux

原文地址:https://www.cnblogs.com/chencye/p/6220946.html