十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在 Linux 上指定目录的读写权限赋予用户,有两种方法可以实现这个目标:第一种是使用 ACL (访问控制列表),第二种是创建用户组来管理文件权限,下面会一一介绍。为了完成这个教程,我们将使用以下设置:
创新互联服务项目包括新田网站建设、新田网站制作、新田网页制作以及新田网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,新田网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到新田省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
请确认所有的命令都是使用 root 用户执行的,或者使用 sudo 命令来享受与之同样的权限。让我们开始吧!下面,先使用 mkdir 命令来创建一个名为 share 的目录。
1. 使用 ACL 来为用户赋予目录的读写权限
重要提示: 打算使用此方法的话,您需要确认您的 Linux 文件系统类型(如 ext3 和 ext4, NTFS, BTRFS)支持 ACL。
1.1. 首先, 依照以下命令在您的系统中检查当前文件系统类型,并且查看内核是否支持 ACL:
从下方的截屏可以看到,文件系统类型是 ext4,并且从 CONFIG_EXT4_FS_POSIX_ACL=y 选项可以发现内核是支持 POSIX ACL 的。
[图片上传失败...(image-c85622-1574572716190)]
1.2. 查看文件系统(分区)挂载时是否使用了 ACL 选项。
[图片上传失败...(image-bdb4d9-1574572716190)]
通过上边的输出可以发现,默认的挂载项目中已经对 ACL 进行了支持。如果发现结果不如所愿,你可以通过以下命令对指定分区(此例中使用 /dev/sda3)开启 ACL 的支持)。
1.3. 指定目录 share 的读写权限分配给名为 shenweiyan 的用户了,依照以下命令执行即可。
[图片上传失败...(image-dfb909-1574572716190)]
在上方的截屏中,通过输出结果的第二行 getfacl 命令可以发现,用户 shenweiyan 已经成功的被赋予了 /data/share 目录的读写权限。
如果想要获取 ACL 列表的更多信息。请参考:
2. 使用用户组来为用户赋予指定目录的读写权限
2.1. 如果用户已经拥有了默认的用户组(通常组名与用户名相同),就可以简单的通过变更文件夹的所属用户组来完成。
另外,我们也可以通过以下方法为多个用户(需要赋予指定目录读写权限的)新建一个用户组。如此一来,也就创建了一个共享目录。
2.2. 接下来将用户 shenweiyan 添加到 dbshare 组中:
2.3. 将目录的所属用户组变更为 dbshare:
2.4. 现在,给组成员设置读写权限。
ok,在 Linux 上给用户赋予指定目录的读写权限就介绍到这里 !
参考资料:
在了解到Linux系统上的文件目录权限,有时候你会发现为什么刚创建的文件是 -rw-r--r-- 这个权限,目录是 drwxr-xr-x 权限,有些是 -rwsr-xr-x ,又有些是 drwsrws--T ?这些则与umask、特殊权限有关。
什么是umask?umask一般是用在你初始创建一个目录或者文件的时候赋予他们的权限。它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。一般在/etc/profile、
或用户家目录下的.bash_profile或.profile中设置umask值。
默认的umask是0022,0022四个数字代表是赋值初始化准备丢弃的权限。(相对应文件来说,x权限就算没说明出来丢弃一样必须默认丢弃)
第一个0代表suid 丢弃的权限;
第二个0代表本文件/目录拥有者什么权限都没丢弃;
第三个2代表本文件/目录的用户组丢弃了w权限;
第四个2代表本文件/目录的文件/目录的用户组丢弃了w权限。
一般我们会这样表示:
umask +default permission(默认权限) =777(目录)/666(文件)
但存在特殊情况如果把umask设为135呢?
要了解特殊权限需对安全上下文有一个概念:
前提:进程有属主和属组;文件有属主和属组
(1) 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限
(2) 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组
(3) 进程访问文件时的权限,取决于进程的发起者
(a) 进程的发起者,同文件的属主:则应用文件属主权限
(b) 进程的发起者,属于文件属组;则应用文件属组权限
(c) 应用文件“其它”权限
1.SUID 权限仅对二进制程序(binary program)有效;
2.执行者对于该程序需要具有x 的可执行权限;
3.本权限仅在执行该程序的过程中有效(run-time);
4.执行者将具有该程序拥有者(owner) 的权限。
5.SUID设置在目录上无意义
权限设定:
chmod u+s FILE...
chmod u-s FILE...
s 标志在文件拥有者的x 项目为SUID,那s 在群组的x 时则称为Set GID
[root@centos7 ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
与SUID 不同的是,SGID 可以针对文件或目录来设定!如果是对文件来说, SGID 有如下的功能:
-1.SGID 对二进制程序有用;
-2.程序执行者对于该程序来说,需具备x 的权限;
-3.执行者在执行的过程中将会获得该程序群组的支持!
[root@centos7 ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
-rw-r-----. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db
与SUID 非常的类似,使用xiaoming 这个账号去执行locate 时,那xiaoming将会取得slocate 群组的支持, 因此就能够去读取 mlocate.db 。
SGID 也能够用在目录上,这也是非常常见的一种用途
目录设定了SGID 的权限后,他将具有如下的功能:
-1. 用户若对于此目录具有r 与x 的权限时,该用户能够进入此目录;
-2.用户在此目录下的有效群组(effective group)将会变成该目录的群组;
-3.用途:若用户在此目录下具有w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此目录的群组相同。
这个 Sticky Bit, SBIT 目前只针对目录有效,sticky 设置在文件上无意义。SBIT 对于目录的作用是:
-1.当用户对于此目录具有w, x 权限,亦即具有写入的权限时;
-2.当用户在该目录下建立文件或目录时,仅有自己与root 才有权力删除该文件
SUID/SGID/SBIT 权限设定
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test
设定权限成为 -rws--x--x 的模样:
[root@centos7 tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@centos7 tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test
1】ACL 是Access Control List 的缩写,主要的目的是在提供传统的owner,group,others 的read,write,execute 权限之外的细部权限设定。ACL 可以针对单一使用者,单一文件或目录来进行
ACL 主要可以针以下来控制权限呢:
1.使用者 (user):可以针对使用者来设定权限;
2.群组 (group):针对群组为对象来设定其权限;
3.默认属性(mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;
及1.ACL:Access Control List,实现灵活的权限管理;2.CentOS7默认创建的xfs和ext4文件系统具有ACL功能;3.CentOS7之前版本,默认手工创建的ext4文件系统无ACL功能,需手动增加tune2fs –o acl/dev/sdb1
mount –o acl/dev/sdb1 /mnt/test
4.ACL生效顺序:所有者,自定义用户,自定义组,其他人
为多用户或者组的文件和目录赋予访问权限rwx
2】ACL 的设定技巧: getfacl, setfacl
-x :删除后续的 acl 参数,不可与 -m 合用;
-b :移除『所有的』 ACL 设定参数;
-k :移除『预设的』 ACL 参数,
-R :递归设定 acl ,亦即包括次目录都会被设定起来;
-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值
例:[root@centos7 ~]# touch acl_test1
[root@centos7 ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@centos7 ~]# setfacl -m u:xiaoming:rx acl_test1
[root@centos7 ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
[root@centos7 ~]# setfacl -m u::rwx acl_test1
[root@centos7 ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
设定值中的 u 后面无使用者列表,代表设定该文件拥有者
2.getfacl 指令用法余setfacl一样
例:[root@centos7 ~]# getfacl acl_test1
file: acl_test1 ==说明档名而已!
owner: root ==说明此文件的拥有者,亦即 ls -l 看到的第三使用者字段
group: root ==此文件的所属群组,亦即 ls -l 看到的第四群组字段
user::rwx ==使用者列表栏是空的,代表文件拥有者的权限
user:xiaoming:r-x ==针对xiaoming 的权限设定为 rx ,与拥有者并不同!
group::r-- ==针对文件群组的权限设定仅有 r
mask::r-x ==此文件预设的有效权限 (mask)
other::r--
3】特定的单一群组的权限设定:『g:群组名:权限』
4】主要的文件操作命令cp和mv都支持ACL,只是cp命令需要加上-p 参数。但是tar等常见的备份工具是不会保留目录和文件的ACL信息
getfacl -R /tmp/dir1 acl.txt
setfacl -R -b /tmp/dir1
清除dir目录的ACL权限
setfacl -R --set-file=acl.txt /tmp/dir1
setfacl --restore acl.txt
getfacl -R /tmp/dir1
自主访问控制(Discretionary Access Control, DAC)是指对象(比如程序、文件、进程)的拥有者可以任意修改或者授予此对象相应的权限。Linux的UGO(User, Group, Other)和ACL(Access Control List)权限管理方式就是典型的自主访问控制。UGO将权限信息存储在节点的权限中,ACL将权限位信息存储在节点的扩展属性中。
当一个文件创建后,它具有读(r)、写(w)、执行(x)三种操作方式。UGO权限管理方式将访问文件的操作者简单分为三类:文件属主(u)、同组用户(g)与其他组用户(o)。
文件的三种操作方式用三个二进制位表示,第一位表示读权限,第二位表示写权限,第三位表示执行权限。一个文件的权限属性就是有三类用户对该文件的权限使能的集合。
当我们用ls查看一个文件的时候,会显示如下结果
最前面的’-’,表示文件为普通类型
第一组的‘rw-’,表示文件属主对文件具有读和写权限,但没有执行权限
第二组的’rw-’,表示同组其他用户对文件具有读和写权限,但没有执行权限
第三组的’r--’,表示其他组用户对文件具有读权限,但没有写和执行权限
上述每一组权限用可以用二进制表示,例如’rw-’,二进制表示是110,十进制数值是6,‘r--’,二进制表示100, 十进制数值是4;所以对每一组权限都可以用十进制来表示。当使用chmod修改文件权限的时候就可以使用十进制代替‘rwx’,例如
当然也可以通过chmod u+x,o+w test实现与上述同样的功能。具体使用哪种方式,单凭个人喜好。
在linux下一切皆文件,目录也不例外,但目录的读写执行权限与普通文件的读写执行权限含义有所不同,如下所示
1.1节描述了常用的权限位,但还有几个特殊的权限位需要知道,分别是s(suid),s(sgid), t(Sticky Bit)。首先看一下linux下的/usr/passwd文件和/tmp目录
可以看到/usr/bin/passwd的第一组权限位和上一节有所不同,第三个标志位变成了s。当属主用户对文件设置了suid位后,其他用户在执行该文件的时候则具有等同于属主的权限。
还是以passwd命令为例,普通用户可以用passwd修改自己的密码,而用户密码的hash存储在/etc/shadow文件中,修改密码必然要修改此文件,我们看下此文件
发现只有root用户可以修改此文件,也就是说当普通用户执行passwd命令的时候,其权限变为root的权限,故可以修改/etc/shadow文件。
guid类似
SUID对目录没有影响,SGID对目录有影响,对于设置了SGID的目录,所有用户在该目录下新建的文件属主属于该用户,但GID是该目录所属的组,如下
而对于t,又叫粘着位,仅对目录生效。在具有t位的目录下,如果用户在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权力删除。/tmp目录则是最好的例子,每个应用都可以在tmp目录下新建删除自己的文件,但却不能删除其应用建立的文件。
那么如何修改文件的sst权限呢?还是使用chmod命令,由第一节我们知道可以用十进制数值设置UGO对文件的访问权限,同样对于特殊权限位,也可以使用。只需在原来的数值前面加上sst的十进制数值。有时候我们还会看到大写的SST,那是因为可执行位为0,所以显示为大写,例如
先做一个实验,在linux下分别建立一个目录和一个文件,查看其权限位
可以看到,新建的目录全显示775,新建的文件是664,为什么新建的文件和目录权限不是777呢?就是由于掩码的存在,当用户新建一个目录的时候,是777与掩码做与操作,当用户新建一个文件的时候,是666与掩码做与操作。可以用umask命令查看当前系统掩码
当然,还可以通过umask命令修改系统掩码,新建文件的权限位也跟着改变。
UGO权限管理方式只能对属主、同组用户和其他组用户进行权限管理,很难对每个用户或用户组进行权限管理。比如有多个用户想问房一个目录,但是每个人又要求不一样的权限,ACL就是为了这种局限性而生的。
例如下图所示:
从图中可以看出,传统的UGO权限管理,的确可以规定一些用户的rwx权限,但是管理粒度太粗糙了,如果想实现对指定用户,指定用户组精细化的权限控制,那么需要借助Linux ACL来实现!
Linux ACL(Access Control List, 访问控制列表),它是对UGO权限管理的方式进行了扩展、可以对任意的用户/组分配读、写和执行权限。
其常用的命令有getfacl和setfacl。
首先看一下几种类型
设置ACL的命令是setfacl,-m选项表示修改acl规则,使用方式是setfacl -m {u|g}:{user|group}:rwx;
u表示设置ACL_USER的权限,g表示修改ACL_GROUP的权限
例子如下
可以看到,当设置ACL规则后,ls 查看权限位,在权限位后增加了一个’+’号。
上述例子演示了如何给指定用户和指定组增加rwx权限,当然rwx权限和UGO权限一样,可以随意修改。
设置完成后,xlzh用户和dhcpd组的用户对该文件具有读、写、执行的权限。
再看定义,ACL掩码定义了ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大权限。举例如下
有上述例子可知两点:
1、当文件设置ACL规则后,权限位的第二组显示的不再是属主同组对该文件的访问权限,而是显示ACL的掩码。所以当ls看到权限位后面有‘+’号时,应该使用getfacl查看文件属主所在组的权限。
2、当修改ACL的掩码后,例如把掩码修改为r--,则可以看到ACL_USER,ACL_GROUP_OBJ和ACL_GROUP三行后面增加了#effective:r—,表示这三种类型实际生效的权限只有读权限,为什么会这样?再看ACL_MASK的定义:ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大权限。即当把掩码修改为r--后,也就限制了三种类型最大的权限范围,只能小于掩码,不能大于掩码。
默认ACL仅对目录有效, 为了让子目录和自文件继承父母路权限而生 。如果对一个目录设置了默认ACL规则,则在该目录下建立的所有文件都继承此目录的ACL规则。实例如下
上述实例有一点需要注意:
1、当为dir设置完默认ACl规则后,只是说dir目录下的所有文件和继承该目录的所有ACL规则,并不是是说该目录已经具备了该ACL规则。如果Nets也想拥有对应的权限,那么还要用相应的命令单独设置!
如果user权限和group权限遇到冲突的时候,会以user 权限为主。
还有一种用户比较隐晦,也是以user的第一个权限为最高优先级,这种用户就是文件所属的用户。
1、普通ACL规则可以设置普通文件和目录文件,是对UGO文件权限方式的补充
2、默认ACL规则只对目录生效,且被该目录下的文件继承,而对该目录本身的权限,还需要使用普通ACL规则
3、设置ACl规则后,文件属组的权限位显示的acl规则的掩码,不再是原来的含义
4、ACL规则的掩码限制了ACL_USER、ACL_GROUP、ACL_GROUP_OBJ的最大权限
1.
ACL可以为某个文件单独设置该文件具体的某用户或组的权限,不走三类权限位
默认 ACL 权限的作用是:如果给父目录设定了默认 ACL 权限,那么父目录中所有新建的子文件都会继承父目录的 ACL 权限。但是要加 -R
※ACL权限更高,会先查看ACL再看传统的权限。如果没有ACL才会走三类权限位
※如果一个用户在ACL的user中一个权限,他所在的ACL的group中是另外一个权限,会按照user权限来
• getfacl 文件名
获取文件的访问控制信息
• setfacl设置文件的acl
-m修改文件的acl
-x取消用户或组对文件的权限
语法:
• setfacl –m u:用户名:权限 文件名 设置某用户名的访问权限
• setfacl –m g:组名:权限 文件名 设置某个组的访问权限
例1: 想要实现这个↓需求
user1:rwx,user2:rw-,user3:r-x,user4:r--,user5:--x,user6:-w-,
传统权限无法满足上述要求,这时就可以用↓命令进行权限添加
建一个名字为1的文件,查看文件1的权限↓
设置权限
修改后看文件1的权限↓
例2:
有组A(groupA)和组B(groupB)两个组,文件1所属于A组,如果通过三类权限位设置文件权限,其他用户没有任何权限,而B组为其他用户,因此无法对文件1进行任何操作。这时可以通过ACL给组B设置权限:
setfacl -m g:groupB:r 1 B组里的所有成员就有读权限了
• setfacl –x u:用户名 文件名 //取消某用户的访问权限
• setfacl –x g:组名 文件名 //取消某个组的访问权限
❉↑这时是将这个user或group的ACL整个删除,如果只是想删除某一个权限,还是需要setfacl -m来进行重新设置
例3:
setfacl -m d:u:qin:rwx /caiwubu
d:default,即将caiwubu这个文件夹的权限对qin开放rwx权限,getfacl /caiwubu的时候会发现有一条default:user:qin:rwx。即在/caiwubu文件夹里 新建 的文件夹以及文件对qin的权限都为rwx,但是之前已经存在的文件及文件夹的权限在修改ACL权限之前是什么现在还是什么
setfacl -x u:qin /caiwubu/zhangben 取消qin这个用户对该文件的acl权限
取消qin这个用户对该文件的acl权限
❀如果这个文件给两个及两个以上的用户设定了ACL,取消其中一个用户的权限可以用这个命令。但是如果这个文件只给一个用户设定了ACL且想删除ACL,或者想把该文件里所有的ACL权限都删除的话,需要用↓的命令
setfacl -b /caiwubu/zhangben
关于权限列的.和+:
ls -lZ :
① drwxrwxrwt. root root system_u:object_r:tmp_t:s0 tmp
② dr-xr-xr-x root root system_u:object_r:boot_t:s0 boot
③ drwxrwxr-x+ root root unconfined_u:object_r:admin_home_t:s0 DCGH-DIR
Linux权限列的点不是无意义字符
・在开启SELinux的情况下创建的目录和文件有这个点,权限列有这个点说明该目录或文件设置了SELinux相关的权限①
・在禁用SELinux权限之后,在之前开启SELinux权限时创建的文件或目录保持原来的权限不便,权限列的点依然显示,而新创建的目录或文件在权限列无这个点显示②
・权限列中最后一个位置如果是加号,说明这个目录或文件已经设置了ACL权限相关的内容。如果加号存在,则已经有点的目录或文件中的点的显示会被覆盖,但原来的SELinux属性保持不变