Linux系统文件权限管理

2022-12-28 14:05:45 浏览数 (1)

Linux操作系统是多任务(Multi-tasks)多用户(Multi-users)分时操作系统,linux操作系统的用户就是让我们登录到linux的权限,每当我们使用用户名登录操作系统时,linux都会对该用户进行认证、授权审计等操作,本章主要内容就是围绕着权限来讲解的,我会讲解Linux系统中的所有常用权限包括,普通权限/隐藏权限/特殊权限/ACL/SUDO/SELinux,等的设置与使用技巧.

♥ 文章声明 ♥ 该系列文章部分文字描述,整理于以下文献,化繁为简. 《鸟哥的Linux私房菜 (基础学习篇 第三版)》 - 作者:鸟哥 《Linux就该这么学》 - 作者:刘遄

Linux 文件普通权限

说到权限,首先我们先来了解一下Linux系统的基础权限吧,这里的内容几乎在使用Linux系统是经常用得到,所以请好好把握.首先,我们要来谈一谈,这个文件的权限要如何针对这些所谓的『使用者』与『群组』来设定呢,这个部分是相当重要的,因为文件的权限与属性是学习Linux的一个相当重要的关卡,如果没有这部份的概念,那么你将老是听不懂别人在讲什么,尤其是当你在你的屏幕前面出现了『Permission deny』的时候,不要担心,『肯定是权限设定错误』啦,好了,闲话不多聊,赶快来瞧一瞧先.

我们使用ls -l命令查询出了一下内容,下面我们就分别介绍一下下面内容的含义吧.

代码语言:javascript复制
[root@localhost ~]# ls -lh

d   rwxr-xr-x.  2   root   root       6   Nov 17 05:22   lyshark_dir
-   rw-r--r--.  1   root   root       0   Nov 17 05:22   lyshark_file
l   rwxrwxrwx.  1   root   root      12   Nov 17 05:22   lyshark_link -> lyshark_file
b   rw-rw----.  1   root   disk       8   Nov 17 05:21   /dev/sda
c   rw-rw-rw-.  1   root   root       1   Nov 17 05:21   /dev/zero
↑   ↑           ↑     ↑     ↑         ↑         ↑            ↑
①   ②           ③     ④     ⑤         ⑥         ⑦            ⑧

第一项:代表这个文件的类型与权限(permission): 当为[ d ]则是目录,例如上为『lyshark_dir』的那一行 当为[ - ]则是文件,例如上表名为『lyshark_file』那一行 若是[ l ]则是链接,例如上为『lyshark_link』的那一行 若是[ b ]则是设备,表示可供储存的接口设备(可随机存取装置) 若是[ c ]则表串口,的串行端口设备,例如键盘、鼠标,显示器

第二项:以三个为一组,且均为『rwx』的三个参数的组合,r=读取,w=写入,x=执行: 当为[ r ]则是读取权限,此权限还可以用数字4代表. 当为[ w ]则是写入权限,此权限还可以用数字2代表. 若是[ x ]则是执行权限,此权限还可以用数字1代表.

第三项:代表文件的链接数,引用计数(文件:硬链接数 目录:目录下的子目录个数). 第四项:代表文件的文件的所有者(属主) 第五项:代表文件的文件的所属组(属组) 第六项:代表文件大小(默认单位字节byte) 第七项:代表文件最后一次修改时间 第八项:代表文件的文件名

◆chmod 更改目录权限◆

chmod命令用来变更文件或目录的权限,在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用,用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可,符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件.

下面,来看一下这个命令的参数.

代码语言:javascript复制
[root@localhost ~]# chmod --help

命令语法:[ chmod [选项] [ugo][ -][rwx] 文件或目录 ]

        U               #属主,可用4代表
        G               #属组,可用2代表
        O               #其他人,可用1代表

        -c              #显示权限修改过程,但仅显示改变的
        -v              #显示权限修改过程,显示所有过程
        -f              #不显示错误信息
        -R              #递归设置权限

实例1:使用chmod -Rv给指定目录设置一个777的权限.

代码语言:javascript复制
[root@localhost ~]# ls -lh lyshark_dir
total 0
drwxr-xr-x. 2 root root  6 Nov 17 05:22 lyshark_dir

[root@localhost ~]# chmod -Rv 777 lyshark_dir/
mode of ‘lyshark_dir/’ changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx)

[root@localhost ~]# ls -lh lyshark_dir
total 0
drwxrwxrwx. 2 root root  6 Nov 17 05:22 lyshark_dir

实例2:使用chmod -R给指定文件的其他人设置rwx权限.

代码语言:javascript复制
[root@localhost ~]# ls -lh lyshark_file
-rw-r--r--. 1 root root 0 Nov 17 05:22 lyshark_file

[root@localhost ~]# chmod o rwx lyshark_file

[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 root root 0 Nov 17 05:22 lyshark_file

◆chown 更改属主属组◆

chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组,用户可以是用户或者是用户ID,用户组可以是组名或组ID,文件名可以使由空格分开的文件列表,在文件名中可以包含通配符.

下面,来看一下这个命令的参数.

代码语言:javascript复制
[root@localhost ~]# chown  --help

命令语法:[ chown [选项] [属主].[属组] 文件或目录 ]

        -c              #显示权限修改过程,但仅显示改变的
        -v              #显示权限修改过程,显示所有过程
        -f              #不显示错误信息
        -R              #递归设置属性
        -h              #只对符号连接的文件作修改

实例1:使用chown -Rv给指定文件设置lyshark为属主.

代码语言:javascript复制
[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 root root 0 Nov 17 05:22 lyshark_file

[root@localhost ~]# chown -Rv lyshark lyshark_file
changed ownership of ‘lyshark_file’ from root to lyshark

[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark root 0 Nov 17 05:22 lyshark_file

实例2:使用chown -Rv给指定文件设置lyshark为属组.

代码语言:javascript复制
[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark root 0 Nov 17 05:22 lyshark_file

[root@localhost ~]# chown -Rv .lyshark lyshark_file
changed ownership of ‘lyshark_file’ from lyshark:root to :lyshark

[root@localhost ~]# ls -lh lyshark_file
-rw-r--rwx. 1 lyshark lyshark 0 Nov 17 05:22 lyshark_file

◆umask 设置默认掩码◆

umask命令用来设置限制新建文件权限的掩码,当新文件被创建时,其最初的权限由文件创建掩码决定,用户每次注册进入系统时,umask命令都被执行,并自动设置掩码mode来限制新文件的权限,用户可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉.

下面,来看一下这个命令的参数.

代码语言:javascript复制
[root@localhost ~]# umask --hlep

命令语法:[ umask [选项] [u=rwx] [g=rwx] [o=rwx] ]

        -p              #输出的权限掩码可直接作为指令来执行
        -S              #以符号方式输出权限掩码

实例1:使用umask设置系统的默认Umask值.

代码语言:javascript复制
[root@localhost ~]# umask -S
u=rwx,g=rwx,o=rwx

[root@localhost ~]# umask u=rwx,g=rw,o=r

[root@localhost ~]# umask -S
u=rwx,g=rw,o=r

Linux 文件特殊权限

Linux的特殊权限主要有,SUID,SGID,SBIG这三种,其主要作用会在下面加以说明.

◆Set UID 文件权限◆

SetUID:当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时,将以文件所有者的身份执行.

为了更加清楚的了解这个特性,我们打个比方,普通用户根本没有修改/etc/passwd和/etc/shadow的权利,但是它还是可以通过passwd命令修改自己的密码,这就与SUID这个权限有关啦

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

那么如何设置SGID权限呢? 很简单,看下面的两个小例子.

代码语言:javascript复制
[root@localhost ~]# ls -l
total 16
-rwxr-xr-x 1 root root 8464 Jun 21 18:05 lyshark     #这是一个可执行文件,SUID只能设置在可执行文件上,且执行者要对此文件拥有x权限
-rw-r--r-- 1 root root   46 Jun 21 18:05 lyshark.c

[root@localhost ~]# chmod u s ./lyshark              #设置方法也很简单只需要u s即可
[root@localhost ~]# chmod 4755 lyshark               #或者

[root@localhost ~]# ls -l
total 16
-rwsr-xr-x 1 root root 8464 Jun 21 18:05 lyshark    #看吧在权限上多出一个 s
-rw-r--r-- 1 root root   46 Jun 21 18:05 lyshark.c

◆Set GID 目录权限◆

SetGID:如果可执行二进制文件需要读取一个数据文件,恰巧他们在一个组里,而二进制文件拥有SGID属性,则他们就可以直接访问.

为了更加清楚的了解这个特性,我们打个比方,普通用户在具有SGID的目录里创建文件时,文件的属组都会变成父目录的属组,其作用是方便组内其他成员的操作.

SetGID 针对文件的作用: 1.只有可执行的二进制程序才能设置SGID权限 2.命令执行者要对该程序拥有x(执行)权限 3.命令执行在执行程序的时候,组身份升级为该程序文件的属组 4.SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

SetGID 针对目录的作用: 1.普通用户必须对此目录拥有r和x权限,才能进入此目录 2.普通用户在此目录中的有效组会变成此目录的属组 3.普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

那么如何设置SGID权限呢? 很简单,看下面的两个小例子.

代码语言:javascript复制
[root@localhost ~]# ls -l
total 4
drwxrwxrwx 2 root root 4096 Jun 21 18:19 lyshark

[root@localhost ~]# chmod g s lyshark/        #设置SGID属性
[root@localhost ~]# chmod 2644 lyshark/       #这样也可以

[root@localhost ~]# ls -l
total 4
drwxrwsrwx 2 root root 4096 Jun 21 18:19 lyshark  #看吧在权限上多出一个 s

◆Set BIT 黏着权限◆

SetBID:黏着位只能对目录有效,在设置了黏着位的目录下,只能删除自己创建的文件,其他人创建的文件只能浏览,root除外.

讲白了说,就是除了Root能够删除别人创建的文件,否则其他人只能删除自己创建的文件.

SetBID 针对目录的作用: 1.粘着位目前只对目录有效 2.普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限 3.赋予了粘着位后除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件

那么如何设置SBIT权限呢? 很简单,看下面的两个小例子.

代码语言:javascript复制
[root@localhost ~]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Jun 21 18:25 lyshark

[root@localhost ~]# chmod 1644 lyshark/

[root@localhost ~]# ls -l
total 4
drw-r--r-T 2 root root 4096 Jun 21 18:25 lyshark     #看吧在权限上多出一个 s

Linux 文件隐藏权限

文件的隐藏属性有,chattr/lsattr,这些隐藏的属性确实对于系统有很大的帮助的,尤其是在系统安全(Security)上面,不过要先强调的是,chattr命令只能在Ext3/Ext4的文件系统上面生效,其他的文件系统可能就无法支持这个命令了,接下来我们就来谈一谈如何配置与检查这些隐藏的属性吧.

◆chattr 设置隐藏属性◆

chattr命令用来改变文件属性,这项指令可改变存放在ext3/ext4文件系统上的文件或目录属性,下面我们来看一下它的配置参数吧.

代码语言:javascript复制
[root@localhost ~]# chattr --help

命令语法:[ chattr [ -=] [状态] [选项] 文件或目录 ]

        p              #输出的权限掩码可直接作为指令来执行
        A              #锁定(atime)访问时间
        S              #异步写入磁盘(sync)
        a              #设置只能添加数据,不能删除和修改
        c              #自动将此文件压缩,需要时自动解压缩
        d              #在dump备份时,不会备份此文件
        i              #将文件设置为只读
        s              #文件被删除将永久移除
        u              #文件删除不永久移除

        -R             #递归处理,连同子目录一起生效
        -V             #显示指令执行过程

实例1:将/lyshark目录设置为只能增加不能删除

代码语言:javascript复制
[root@localhost /]# chattr  a /lyshark/

[root@localhost /]# cd /lyshark/

[root@localhost lyshark]# mkdir hello
[root@localhost lyshark]# rm -fr hello/
rm: cannot remove hello/: Operation not permitted

这个命令是很重要的,尤其是在系统的数据安全上面,由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性,其中个人认为最重要的当属 i 与 a 这个属性了, i可以让一个文件无法被更动,对于需要强烈的系统安全的人来说真是相当的重要,里头还有相当多的属性是需要 root 才能配置的.

◆lsattr 查询隐藏属性◆

使用 chattr 配置后可以利用 lsattr 来查阅隐藏的属性,lsattr经常使用的几个选项-D,-E,-R这三个选项不可以一起使用,它们是互斥的,经常使用的还有-l,-H,使用lsattr时必须指出具体的设备名,用-l选项指出要显示设备的逻辑名称,否则要用-c,-s,-t等选项唯一的确定某个已存在的设备.

代码语言:javascript复制
[root@localhost ~]# lsattr --help

命令语法:[ lsattr [选项] 文件或目录 ]

        -R             #递归显示权限
        -V             #显示指令的版本信息
        -a             #列出目录中的所有文件,包括隐藏文件.

实例1:显示刚才配置的选项

代码语言:javascript复制
[root@localhost ~]# lsattr -a /lyshark/
-----a---------- /lyshark/.
---------------- /lyshark/..
---------------- /lyshark/wang
---------------- /lyshark/hello

Linux ACL 权限控制

ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner,group,others 的 read,write,execute 权限之外的细致权限配置,ACL 可以针对单一使用者,单一文件或目录来进行 r,w,x 的权限规范,对于需要特殊权限的使用状况非常有帮助.

那 ACL 主要可以针对哪些方面来控制权限呢?他主要可以针对几个项目: 使用属主 (user):可以针对使用者来配置权限 使用属主 (group):针对群组为对象来配置其权限 默认属性 (mask):还可以针对在该目录下在创建新文件/目录时,规范新数据的默认权限

◆acl 权限检测与开启◆

由于 ACL 是传统的 Unix-like 操作系统权限的额外支持项目,因此要使用 ACL 必须要有文件系统的支持才行,目前绝大部分的文件系统都有支持 ACL 的功能,包括 ReiserFS, EXT2/EXT3, JFS, XFS 等等,在我们的 redhat 7 当中,默认使用 ext4 是启动 ACL 支持的,至于察看你的文件系统是否支持 ACL 可以这样看:

代码语言:javascript复制
[root@localhost ~]# dumpe2fs -h /dev/vdb
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          /ghost
Filesystem UUID:          7b34e434-7e98-4480-9699-afef29afed2f
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index...
Filesystem flags:         signed_directory_hash 
--------------------------------------------------------------------
Default mount options:    user_xattr acl     #看到这句话说明开启了
--------------------------------------------------------------------
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              1310720

如果你的系统默认不会帮你加上 acl 的支持呢,那你可以这样做,来手动开启ACL:

假定指定分区没有开启ACL我们可以重新挂载指定分区,并添加ACL权限

代码语言:javascript复制
[root@localhost ~]# mount -o remove,acl /dev/vdb 

以上方法只是临时生效,如果想要永久生效则需要写入 /etc/fstab

a.首先我们找到/dev/vdb的UUID号

代码语言:javascript复制
[root@localhost ~]# ll /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root  9 Jun 17 15:40 7b34e434-7e98-4480-9699-afef29afed2f -> ../../vdb

b.然后将它写入/etc/fstab文件里,写入以下虚线内部分

代码语言:javascript复制
# /etc/fstab
# Created by anaconda on Sun Oct 15 15:19:00 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
--------------------------------------------------------------------
UUID=7b34e434-7e98-4480-9699-afef29afed2f /ghost                  ext4    defaults,acl    1 1
--------------------------------------------------------------------

◆getfacl 查看ACL权限◆

getfacl命令主要用来查询指定目录的权限,下面我们来看一下它的参数说明:

代码语言:javascript复制
[root@localhost ~]# getfacl --help

命令语法:[ getfacl [选项] 文件或目录 ]

        -p              #输出的权限掩码可直接作为指令来执行
        -a              #显示访问控制列表
        -d              #只显示默认访问控制列表
        -c              #忽略标题,只显示权限
        -R              #递归显示子目录
        -t              #以表格形式输出
        -n              #打印属主属组UID/GID

接下来看一个输出结果,具体解释一下输出说明.

代码语言:javascript复制
[root@localhost /]# getfacl lyshark

# file: lyshark          #说明文件名称
# owner: root           #说明文件的所有者
# group: root           #说明文件的所属组

user::rw-               #用户列表是空的,代表所有者的权限
group::r--              #针对用户组的权限设置
other::r--              #针对其他人的权限设置
mask::r-x               #此文件默认有效权限(mask)

上面的数据非常容易查阅吧,显示的数据前面加上 # 的,代表这个文件的默认属性,包括文件名、文件拥有者与文件所属群组,底下出现的 user,group,mask,other 则是属于不同使用者、群组与有效权限(mask)的配置值.

◆setfacl 设置ACL权限◆

setfacl命令是用来在命令行里设置ACL (访问控制列表) 在命令行里,一系列的命令跟随以一系列的文件名.

setfacl命令主要用来设置指定目录的权限,下面我们来看一下它的参数说明:

代码语言:javascript复制
[root@localhost ~]# setfacl --help

命令语法:[ setfacl [选项][ugo]:[用户][rwx] 文件或目录 ]

        -m              #添加ACL权限,不可与-x合用
        -x              #删除某用户的ACL权限,不可与-m合用
        -b              #清空所有ACL权限

        -R              #递归配置ACL,实现目录上ACL权限的递归
        -d              #设置默认ACL权限(传承)
        -k              #删除默认ACL权限参数

◆acl 权限配置小例子◆

添加ACL权限:添加lyshark用户对root目录的rwx权限

代码语言:javascript复制
[root@localhost ~]# setfacl -m u:lyshark:rwx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx    #此处可以看到,用户这里多出来了lyshark用户,此时lyshark用户可以任意操作/root目录下的文件
group::r-x
mask::rwx
other::---

删除ACL权限:删除lyshark用户对root目录的rwx权限

代码语言:javascript复制
[root@localhost ~]# setfacl -x u:lyshark /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x           #此处可以看到,用户lyshark的权限已被撤销了,此时再次访问/root目录会出现权限拒绝
group::r-x
mask::r-x
other::---

清空所有ACL权限:清空指定目录或文件的所有ACL配置

代码语言:javascript复制
[root@localhost ~]# setfacl -b /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
other::---

递归设置ACL权限:实现对目录上的ACL权限的递归设置(目录)

代码语言:javascript复制
[root@localhost ~]# setfacl -R -m u:lyshark:rwx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx
group::r-x
mask::rwx
other::---

#注释:如果不递归设置,那么普通用户无法在子目录下进行读写执行

对空目录设置默认ACL:添加lyshark用户对/root目录的rwx权限,并且在/root目录下新建的文件lyshark用户都有rwx权限

代码语言:javascript复制
[root@localhost ~]# setfacl -d -m u:lyshark:rwx /root/
[root@localhost ~]# setfacl -m d:u:lyshark:rwx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
mask::r-x
other::---
default:user::r-x
default:user:lyshark:rwx   #这边可以看到lyshark的默认权限是rwx,root用户不管创建什么文件都有权限
default:group::r-x
default:mask::rwx
default:other::---

对非空目录设置默认ACL:添加lyshark用户对/root目录的rwx权限,并且在/root目录下新建的文件lyshark用户都有rwx权限

代码语言:javascript复制
[root@localhost ~]# setfacl -R -m u:lyshark:rwx /root/   #递归设置ACL权限
[root@localhost ~]# setfacl -d -m u:lyshark:rwx /root/   #设置默认ACL权限
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx
group::r-x
mask::rwx
other::---
default:user::r-x
default:user:lyshark:rwx
default:group::r-x
default:mask::rwx
default:other::---

设置最大有效权限mask(目录):为/root目录设置添加最大默认权限为rx,其他ACL权限不得超出此权限

代码语言:javascript复制
[root@localhost ~]# setfacl -m m:rx /root/
[root@localhost ~]# 
[root@localhost ~]# getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:lyshark:rwx        #effective:r-x    #虽然lyshark对root目录有rwx权限,但是我们设置了最大有效权限,所以lyshark用户只能读和执行
group::r-x
mask::r-x                                 #最大有效权限r-x
other::---
default:user::r-x
default:user:lyshark:rwx
default:group::r-x
default:mask::rwx
default:other::---

Linux Sudo 用户授权

sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等,这样不仅减少了root用户的登录,和管理时间,同样也提高了安全性,sudo不是对shell的一个代替,它是面向每个命令的.

sudo命令用来以其他身份来执行命令,预设的身份为root,在/etc/sudoers中设置了可执行sudo指令的用户,若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员,用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码.

为什么会出现sudo授权? 首先在Linux的管理中,不是每一个系统管理员都能用root来管理服务器

Sudo的优缺点是什么? 平时使用普通用户管理操作系统,降低误操作几率,需要时su切换到root. su用户身份的切换,普通管理员要使用root的权限必须知道root的密码,这样会造成很多普通用户需要知道root的密码,导致系统的安全性降低. sudo可以为普通用户赋予一定权限,使普通用户能使用一些root才能执行的命令和操作,来完成正常的服务器管理工作,这种按需分配权限的方式可以让我们工作在一个相对安全的环境下,并且普通用户不需要知道root的密码.

Sudo工作步骤,或者说执行流程? a.通过visudo命令或者vim /etc/sudoers 来对某用户授权 b.当普通用户执行/sbin或/usr/sbin下的命令时,系统会查询/etc/sudoers文件中是否有root对其的授权 c.当查询普通用户已拥有授权后,需要输入普通用户的密码来确认用户身份 d.若密码输入成功后,则执行对应已经授权的命令

下面来看一下sudo命令的常用参数吧:

代码语言:javascript复制
[root@localhost ~]# sudo --help

命令语法:[ sudo [选项] 授权用户 ]

        -b              #在后台执行指令
        -H              #将HOME环境变量设为新身份的HOME环境变量
        -k              #结束密码的有效期限,也就是下次再执行sudo时便需要输入密码
        -l              #列出目前用户可执行与无法执行的指令
        -p              #改变询问密码的提示符号
        -s shell        #执行指定的shell
        -u 用户         #以指定的用户作为新的身份,若不加上此参数,则预设以root作为新的身份
        -v              #延长密码有效期限5分钟

实例1:给lyshark用户授予root的所有命令

代码语言:javascript复制
vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere 
root    ALL=(ALL)       ALL     
lyshark ALL=(ALL)       ALL   #写入以下参数

## Allows members of the 'sys' group to run networking, software,

实例2:授权lyshark用户只可以重启服务器

代码语言:javascript复制
vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /sbin/shutdown -r now   #写入以下参数

## Allows members of the 'sys' group to run networking, software,

实例3:授权lyshark用户仅可以管理192.168.1.10的服务器:可以使用Apache管理脚本

代码语言:javascript复制
vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark 192.168.1.10=(ALL)  /etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest   #写入以下参数

## Allows members of the 'sys' group to run networking, software,

实例4:授权lyshark用户,可以修改Apache配置文件

代码语言:javascript复制
vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /bin/vim,/etc/httpd/conf/httpd.conf   #写入以下参数

## Allows members of the 'sys' group to run networking, software,

实例5:授权lyshark用户可以添加普通用户并能修改密码

代码语言:javascript复制
vim /etc/sudoers

## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
lyshark ALL=(ALL)       /usr/sbin/useradd                                              #让lyshark用户可以创建普通用户
lyshark ALL=(ALL)       /usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd ""      #让lyshark用户可以给新用户改密码,但不允许修改root用户的密码

## Allows members of the 'sys' group to run networking, software,

Linux PAM 模块简介

PAM 可以说是一套应用程序编程接口(Application Programming Interface,API)他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后,PAM 就能够回报使用者验证的结果(成功或失败),由于 PAM 仅是一套验证的机制,又可以提供给其他程序所呼叫引用,因此不论你使用什么程序,都可以使用 PAM 来进行验证,如此一来,就能够让账号口令或者是其他方式的验证具有一致的结果,也让程序设计师方便处理验证的问题.

PAM 是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要求的通知, PAM 经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证的结果来进行可登陆或显示其他无法使用的信息.

PAM 用来进行验证的数据称为模块 (Modules) 每个 PAM 模块的功能都不太相同,举例来说,使用 passwd 命令时,如果随便输入字典上面找的到的字符串 passwd 就会回报错误信息了,这就是 PAM 的 pam_cracklib.so 模块的功能,他能够判断该口令是否在字典里面,并回报给口令修改程序,此时就能够了解你的口令强度了.

以运行passwd命令为例,我们来说明一下,系统是如何调用PAM验证的. 1.用户开始运行 /usr/bin/passwd 程序,并输入口令. 2.passwd 调用PAM模块进行验证. 3.PAM 模块会到 /etc/pam.d/ 找寻与程序 (passwd) 同名的配置文件. 4.依据 /etc/pam.d/passwd 内的配置,引用相关的 PAM 模块逐步进行验证分析. 5.将验证结果 (成功、失败以及其他信息) 回传给 passwd 这个程序 6.passwd 程序会根据 PAM 回传的结果决定下一个动作 (重新输入新口令或者通过验证)

从上面的说明,我们会知道重点其实是 /etc/pam.d/ 里面的配置文件,以及配置文件所调用的 PAM 模块进行的验证工作,既然一直谈到 passwd 这个口令修改命令,那我们就来看看 /etc/pam.d/passwd 这个配置文件的内容是怎样吧

代码语言:javascript复制
[root@localhost ~]# cat /etc/pam.d/passwd
#%PAM-1.0

[验证类别] [控制标准]   [PAM 模块与该模块的参数]
auth       include      system-auth            <==每一行都是一个验证的过程
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin

在这个配置文件当中,除了第一行 PAM 版本之外,其他任何『 # 』开头的都是批注,而每一行都是一个独立的验证流程,每一行可以区分为三个字段,分别是验证类别(type)、控制标准(flag)、PAM的模块与该模块的参数,在我们上面的表格当中出现的是『 include (包括) 』这个关键词,他代表的是『使用后面的文件作为验证方式』 所以,上述的每一行都要重复调用 /etc/pam.d/system-auth 那个文件来进行验证的意思.

Linux SELinux 权限配置

SELinux 是由美国国家安全局 (NSA) 开发的,当初开发这玩意儿的目的是因为很多企业界发现,通常系统出现问题的原因大部分都在于『内部员工的资源误用』所导致的,实际由外部发动的攻击反而没有这么严重,面对这样的处境NSA开始着手研究了这个项目,由于是在Linux上做的研发,因此它们便把自己的研究成果整合到了Linux里面来了,SELinux 是整合到内核的一个模块这也就是说:其实 SELinux 是在进行程序、文件等权限配置依据的一个核心模块.

传统的文件权限与帐号关系:自主访问控制,DAC

系统的帐号主要分为系统管理员(root)与一般用户,而这两种身份能否使用系统上面的文件资源则与rwx的权限配置有关,不过你要注意的是,各种权限配置对root是无效的,因此当某个程序想要对文件进行存取时,系统就会根据该程序的权限并比对文件的权限,若通过权限检查,就可以存取该文件了,这种存取文件系统的方式被称为 『自主式存取控制 (Discretionary Access Control,DAC)』 ,基本上就是依据程序的拥有者与文件资源的rwx权限来决定有无存取的能力,不过这种 DAC 的存取控制有几个困扰,那就是:

1.root具有最高的权限:如果不小心某个程序被有心人士取得,且该程序属于root的权限,那么这个程序就可以在系统上进行任何资源的存取,可想而知它的危险性.

2.使用者可以取得程序来变更文件资源的存取权限:如果你不小心将某个目录的权限配置为 777,由于对任何人的权限会变成rwx,因此该目录就会被任何人所任意存取.

这些问题是非常严重的 ! 尤其是当你的系统是被某些漫不经心的系统管理员所掌控时,她们甚至觉得目录权限调为 777 也没有什么了不起的.

以策略规则制定特定程序读取特定文件:委托访问控制,MAC

委托访问控制 (MAC) 他可以针对特定的程序与特定的文件资源来进行权限的控制,也就是说,即使你是root那么在使用不同的程序时,你所能取得的权限并不一定是root,而得要看当时该程序的配置而定,如此一来,我们针对控制的『主体』变成了『程序』而不是使用者.

下面呢,我们来看一下Selinux的几个字段,并且分别解释一下它的含义吧.

代码语言:javascript复制
[root@localhost ~]# ls -lZ

drwxr-xr-x. root root root:object_r:admin_home_t:s0 lyshark_dir
-rw-r--r--. root root system_u:object_r:passwd_file_t:s0 passwd
                        ↑           ↑         ↑
                        Identify    Role      Type(最重要)

身份识别 (Identify) root:表示 root 的帐号身份 system_u:表示系统程序方面的标识,通常是进程 user_u:代表一般用户账号相关身份

角色段 (Role) object_r:代表的是文件或目录等文件资源 system_r:代表的就是进程,不过一般用户也会被指明system_r

类型 (Type) type:在文件资源(Object)上面称为类型(Type) domain:在主体程序(Subject)则称为域(domain)

◆SeLinux的启动关闭与查询◆

查询SeLinux状态

查询我们可以使用以下命令,首先老样子,先看一下命令可用参数吧.

代码语言:javascript复制
[root@localhost ~]# sestatus --help

命令语法:[ sestatus [选项] ]

        -v              #检查位于/etc/sestatus.conf内文件的安全上下文
        -b              #将目前策略规则的布尔值列出

临时开启SeLinux

代码语言:javascript复制
[root@localhost ~]# getenforce
Enforcing
[root@localhost ~]# setenforce 1

永久开启SeLinux

代码语言:javascript复制
[root@localhost ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX= permissive   ← 改成enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

◆设置与恢复SeLinux安全上下文◆

chcon 设置上下文

chcon命令是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别,也就是将每个文件上下文变更为指定的上下文,chcon命令位于/usr/bin/chcon,下面就来看一下它的参数吧.

代码语言:javascript复制
[root@localhost ~]# chcon --help

命令语法:[ chcon [选项] [上下文] 文件或目录 ]

        -R              #递归设置目录的权限
        -t              #设置安全上下文,例如(httpd_sys_content_t)
        -u              #后面接身份标识,例如(system_u)
        -r              #后面接角色,例如(system_r)

实例1:给指定文件设置一个amba_share_t安全上下文.

代码语言:javascript复制
[root@localhost ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 lyshark_dir

[root@localhost ~]# chcon -R -t samba_share_t lyshark_dir/

[root@localhost ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 lyshark_dir

实例2:依照/etc/passwd为模板,修改lyshark_dir目录的安全上下文.

代码语言:javascript复制
[root@localhost ~]# ls -lZ
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 lyshark_dir

[root@localhost ~]# chcon -R --reference=/etc/passwd lyshark_dir/

[root@localhost ~]# ls -lZ
drwxr-xr-x. root root system_u:object_r:passwd_file_t:s0 lyshark_dir

restorecon 恢复上下文

restorecon命令用来恢复SELinux文件属性即恢复文件的安全上下文,当我们配置错误时,可以使用此命令恢复一下,看一下参数吧.

代码语言:javascript复制
[root@localhost ~]# restorecon --help

命令语法:[ restorecon [选项] 文件或目录 ]

        -R              #递归设置目录的权限
        -v              #显示执行过程

实例1: 将上面的文件上下文,全部恢复到默认状态.

代码语言:javascript复制
[root@localhost ~]# ls -lZ
drwxr-xr-x. root root system_u:object_r:passwd_file_t:s0 lyshark_dir

[root@localhost ~]# restorecon -R lyshark_dir/

[root@localhost ~]# ls -lZ
drwxr-xr-x. root root system_u:object_r:admin_home_t:s0 lyshark_dir

◆SeLinux策略查询与布尔值管理◆

如果我们不知道策略的规则,那我们也很难设置规则,下面我们就来看一下如何查询到我们想要的策略吧.

seinfo 查询策略

通过Yum仓库,快速安装seinfo

代码语言:javascript复制
[root@localhost ~]# yum install -y setools-libs setools-console

Loaded plugins: product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager.
Package setools-libs-3.3.8-2.el7.x86_64 already installed and latest version
Package setools-console-3.3.8-2.el7.x86_64 already installed and latest version
Nothing to do

其次我们来看一下它的配置参数吧.

代码语言:javascript复制
[root@localhost ~]# seinfo --help

命令语法:[ seinfo [选项] ]

        -A              #列出所有,规则布尔值,角色,类型等.
        -t              #列出所有类型(type)
        -r              #列出所有角色(role)
        -u              #列出所有身份标识(user)
        -b              #列出所有规则种类(布尔值)

实例:利用seinfo -b命令查询所有与httpd相关的规则.

代码语言:javascript复制
[root@localhost ~]# seinfo -b |grep httpd_use
   httpd_use_fusefs
   httpd_use_openstack
   httpd_use_nfs
   httpd_use_sasl
   httpd_use_gpg
   httpd_use_cifs

布尔值的查询与修改

查询:通过getsebool -a查询httpd_use_openstack的状态.

代码语言:javascript复制
[root@localhost ~]# getsebool -a |grep httpd_use_openstack
httpd_use_openstack --> off

修改:通过setsebool -P [0|1]开启httpd_use_openstack状态.

代码语言:javascript复制
[root@localhost ~]# getsebool -a |grep httpd_use_openstack
httpd_use_openstack --> off

[root@localhost ~]# setsebool -P httpd_use_openstack=1

[root@localhost ~]# getsebool -a |grep httpd_use_openstack
httpd_use_openstack --> on

0 人点赞