Linux系统文件权限管理
Linux操作系统是多任务(Multi-tasks)多用户(Multi-users)分时操作系统,linux操作系统的用户就是让我们登录到linux的权限,每当我们使用用户名登录操作系统时,linux都会对该用户进行认证、授权审计等操作,本章主要内容就是围绕着权限来讲解的,我会讲解Linux系统中的所有常用权限包括,普通权限/隐藏权限/特殊权限/ACL/SUDO/SELinux,等的设置与使用技巧.
Linux 文件普通权限
说到权限,首先我们先来了解一下Linux系统的基础权限吧,这里的内容几乎在使用Linux系统是经常用得到,所以请好好把握.首先,我们要来谈一谈,这个文件的权限要如何针对这些所谓的『使用者』与『群组』来设定呢,这个部分是相当重要的,因为文件的权限与属性是学习Linux的一个相当重要的关卡,如果没有这部份的概念,那么你将老是听不懂别人在讲什么,尤其是当你在你的屏幕前面出现了『Permission deny』的时候,不要担心,『肯定是权限设定错误』啦,好了,闲话不多聊,赶快来瞧一瞧先.
我们使用ls -l
命令查询出了一下内容,下面我们就分别介绍一下下面内容的含义吧.
[root@localhost ~]# ls -lh |
第一项:代表这个文件的类型与权限(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指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可,符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件.
下面,来看一下这个命令的参数.
[root@localhost ~]# chmod --help |
实例1:使用chmod -Rv
给指定目录设置一个777的权限.
[root@localhost ~]# ls -lh lyshark_dir |
实例2:使用chmod -R
给指定文件的其他人设置rwx权限.
[root@localhost ~]# ls -lh lyshark_file |
chown 更改属主属组
chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组,用户可以是用户或者是用户ID,用户组可以是组名或组ID,文件名可以使由空格分开的文件列表,在文件名中可以包含通配符.
下面,来看一下这个命令的参数.
[root@localhost ~]# chown --help |
实例1:使用chown -Rv
给指定文件设置lyshark为属主.
[root@localhost ~]# ls -lh lyshark_file |
实例2:使用chown -Rv
给指定文件设置lyshark为属组.
[root@localhost ~]# ls -lh lyshark_file |
umask 设置默认掩码
umask命令用来设置限制新建文件权限的掩码,当新文件被创建时,其最初的权限由文件创建掩码决定,用户每次注册进入系统时,umask命令都被执行,并自动设置掩码mode来限制新文件的权限,用户可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉.
下面,来看一下这个命令的参数.
[root@localhost ~]# umask --hlep |
实例1:使用umask
设置系统的默认Umask值.
[root@localhost ~]# umask -S |
Linux 文件特殊权限
Linux的特殊权限主要有,SUID,SGID,SBIG这三种,其主要作用会在下面加以说明.
Set UID 文件权限
SetUID:当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时,将以文件所有者的身份执行.
为了更加清楚的了解这个特性,我们打个比方,普通用户根本没有修改/etc/passwd和/etc/shadow的权利,但是它还是可以通过passwd命令修改自己的密码,这就与SUID这个权限有关啦
SetUID 权限的特点:
1.只有可以执行的二进制程序才能设定SUID权限
2.命令执行者要对该程序拥有x(执行)权限
3.命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
4.SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效
那么如何设置SGID权限呢? 很简单,看下面的两个小例子.
[root@localhost ~]# ls -l |
Set GID 目录权限
SetGID:如果可执行二进制文件需要读取一个数据文件,恰巧他们在一个组里,而二进制文件拥有SGID属性,则他们就可以直接访问.
为了更加清楚的了解这个特性,我们打个比方,普通用户在具有SGID的目录里创建文件时,文件的属组都会变成父目录的属组,其作用是方便组内其他成员的操作.
SetGID 针对文件的作用:
1.只有可执行的二进制程序才能设置SGID权限
2.命令执行者要对该程序拥有x(执行)权限
3.命令执行在执行程序的时候,组身份升级为该程序文件的属组
4.SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
SetGID 针对目录的作用:
1.普通用户必须对此目录拥有r和x权限,才能进入此目录
2.普通用户在此目录中的有效组会变成此目录的属组
3.普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
那么如何设置SGID权限呢? 很简单,看下面的两个小例子.
[root@localhost ~]# ls -l |
Set BIT 黏着权限
SetBID:黏着位只能对目录有效,在设置了黏着位的目录下,只能删除自己创建的文件,其他人创建的文件只能浏览,root除外.
讲白了说,就是除了Root能够删除别人创建的文件,否则其他人只能删除自己创建的文件.
SetBID 针对目录的作用:
1.粘着位目前只对目录有效
2.普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
3.赋予了粘着位后除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件
那么如何设置SBIT权限呢? 很简单,看下面的两个小例子.
[root@localhost ~]# ls -l |
Linux 文件隐藏权限
文件的隐藏属性有,chattr/lsattr,这些隐藏的属性确实对于系统有很大的帮助的,尤其是在系统安全(Security)上面,不过要先强调的是,chattr命令只能在Ext3/Ext4的文件系统上面生效,其他的文件系统可能就无法支持这个命令了,接下来我们就来谈一谈如何配置与检查这些隐藏的属性吧.
chattr 设置隐藏属性
chattr命令用来改变文件属性,这项指令可改变存放在ext3/ext4文件系统上的文件或目录属性,下面我们来看一下它的配置参数吧.
[root@localhost ~]# chattr --help |
实例1:将/lyshark目录设置为只能增加不能删除
[root@localhost /]# chattr +a /lyshark/ |
这个命令是很重要的,尤其是在系统的数据安全上面,由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性,其中个人认为最重要的当属 +i 与 +a 这个属性了,+i可以让一个文件无法被更动,对于需要强烈的系统安全的人来说真是相当的重要,里头还有相当多的属性是需要 root 才能配置的.
lsattr 查询隐藏属性
使用 chattr 配置后可以利用 lsattr 来查阅隐藏的属性,lsattr经常使用的几个选项-D,-E,-R这三个选项不可以一起使用,它们是互斥的,经常使用的还有-l,-H,使用lsattr时必须指出具体的设备名,用-l选项指出要显示设备的逻辑名称,否则要用-c,-s,-t等选项唯一的确定某个已存在的设备.
[root@localhost ~]# lsattr --help |
实例1:显示刚才配置的选项
[root@localhost ~]# lsattr -a /lyshark/ |
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 可以这样看:
[root@localhost ~]# dumpe2fs -h /dev/vdb |
如果你的系统默认不会帮你加上 acl 的支持呢,那你可以这样做,来手动开启ACL:
假定指定分区没有开启ACL我们可以重新挂载指定分区,并添加ACL权限
[root@localhost ~]# mount -o remove,acl /dev/vdb |
以上方法只是临时生效,如果想要永久生效则需要写入 /etc/fstab
a.首先我们找到/dev/vdb的UUID号
[root@localhost ~]# ll /dev/disk/by-uuid/ |
b.然后将它写入/etc/fstab文件里,写入以下虚线内部分
# /etc/fstab |
getfacl 查看ACL权限
getfacl命令主要用来查询指定目录的权限,下面我们来看一下它的参数说明:
[root@localhost ~]# getfacl --help |
接下来看一个输出结果,具体解释一下输出说明.
[root@localhost /]# getfacl lyshark |
上面的数据非常容易查阅吧,显示的数据前面加上 # 的,代表这个文件的默认属性,包括文件名、文件拥有者与文件所属群组,底下出现的 user,group,mask,other 则是属于不同使用者、群组与有效权限(mask)的配置值.
setfacl 设置ACL权限
setfacl命令是用来在命令行里设置ACL (访问控制列表) 在命令行里,一系列的命令跟随以一系列的文件名.
setfacl命令主要用来设置指定目录的权限,下面我们来看一下它的参数说明:
[root@localhost ~]# setfacl --help |
acl 权限配置小例子
添加ACL权限:添加lyshark用户对root目录的rwx权限
[root@localhost ~]# setfacl -m u:lyshark:rwx /root/ |
删除ACL权限:删除lyshark用户对root目录的rwx权限
[root@localhost ~]# setfacl -x u:lyshark /root/ |
清空所有ACL权限:清空指定目录或文件的所有ACL配置
[root@localhost ~]# setfacl -b /root/ |
递归设置ACL权限:实现对目录上的ACL权限的递归设置(目录)
[root@localhost ~]# setfacl -R -m u:lyshark:rwx /root/ |
对空目录设置默认ACL:添加lyshark用户对/root目录的rwx权限,并且在/root目录下新建的文件lyshark用户都有rwx权限
[root@localhost ~]# setfacl -d -m u:lyshark:rwx /root/ |
对非空目录设置默认ACL:添加lyshark用户对/root目录的rwx权限,并且在/root目录下新建的文件lyshark用户都有rwx权限
[root@localhost ~]# setfacl -R -m u:lyshark:rwx /root/ #递归设置ACL权限 |
设置最大有效权限mask(目录):为/root目录设置添加最大默认权限为rx,其他ACL权限不得超出此权限
[root@localhost ~]# setfacl -m m:rx /root/ |
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命令的常用参数吧:
[root@localhost ~]# sudo --help |
实例1:给lyshark用户授予root的所有命令
vim /etc/sudoers |
实例2:授权lyshark用户只可以重启服务器
vim /etc/sudoers |
实例3:授权lyshark用户仅可以管理192.168.1.10的服务器:可以使用Apache管理脚本
vim /etc/sudoers |
实例4:授权lyshark用户,可以修改Apache配置文件
vim /etc/sudoers |
实例5:授权lyshark用户可以添加普通用户并能修改密码
vim /etc/sudoers |
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 这个配置文件的内容是怎样吧
[root@localhost ~]# cat /etc/pam.d/passwd |
在这个配置文件当中,除了第一行 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的几个字段,并且分别解释一下它的含义吧.
[root@localhost ~]# ls -lZ |
身份识别 (Identify)
root:表示 root 的帐号身份
system_u:表示系统程序方面的标识,通常是进程
user_u:代表一般用户账号相关身份
角色段 (Role)
object_r:代表的是文件或目录等文件资源
system_r:代表的就是进程,不过一般用户也会被指明system_r
类型 (Type)
type:在文件资源(Object)上面称为类型(Type)
domain:在主体程序(Subject)则称为域(domain)
SeLinux的启动关闭与查询
查询SeLinux状态
查询我们可以使用以下命令,首先老样子,先看一下命令可用参数吧.
[root@localhost ~]# sestatus --help |
临时开启SeLinux
[root@localhost ~]# getenforce |
永久开启SeLinux
[root@localhost ~]# cat /etc/selinux/config |
设置与恢复SeLinux安全上下文
chcon 设置上下文
chcon命令是修改对象(文件)的安全上下文,比如:用户、角色、类型、安全级别,也就是将每个文件上下文变更为指定的上下文,chcon命令位于/usr/bin/chcon,下面就来看一下它的参数吧.
[root@localhost ~]# chcon --help |
实例1:给指定文件设置一个amba_share_t安全上下文.
[root@localhost ~]# ls -lZ |
实例2:依照/etc/passwd为模板,修改lyshark_dir目录的安全上下文.
[root@localhost ~]# ls -lZ |
restorecon 恢复上下文
restorecon命令用来恢复SELinux文件属性即恢复文件的安全上下文,当我们配置错误时,可以使用此命令恢复一下,看一下参数吧.
[root@localhost ~]# restorecon --help |
实例1: 将上面的文件上下文,全部恢复到默认状态.
[root@localhost ~]# ls -lZ |
SeLinux策略查询与布尔值管理
如果我们不知道策略的规则,那我们也很难设置规则,下面我们就来看一下如何查询到我们想要的策略吧.
seinfo 查询策略
通过Yum仓库,快速安装seinfo
[root@localhost ~]# yum install -y setools-libs setools-console |
其次我们来看一下它的配置参数吧.
[root@localhost ~]# seinfo --help |
实例:利用seinfo -b
命令查询所有与httpd相关的规则.
[root@localhost ~]# seinfo -b |grep httpd_use |
布尔值的查询与修改
查询:通过getsebool -a
查询httpd_use_openstack
的状态.
[root@localhost ~]# getsebool -a |grep httpd_use_openstack |
修改:通过setsebool -P [0|1]
开启httpd_use_openstack
状态.
[root@localhost ~]# getsebool -a |grep httpd_use_openstack |