linux下的权限、特殊权限、acl

首先,我们都知道Linux是一个多用户操作系统,那么问题就来了,假设我有一个文件叫file1,这个文件是用户user1的,user1有一个项目组g1,他希望他项目组里的同事可以查看修改这个文件,但是不希望其他人看到文件中的内容当然也不能编辑。那怎么解决这个问题靠的就是我们下面要说的权限。通过对文件权限的配置我们就可以实现不同的用户或用户组在访问相同资源时不同的访问权限。

UGO模型

所谓UGO就是把对于文件所有的用户的三种身份,所属主user即文件主人,所属组group即文件所属群组,其他other即不是user也不在所属组。
用户已经分好了类别,那么一个文件需要什么属性的权限呢,在linux下一个文件的权限包括rwx,即read(读取)、write(写入)、excute(执行)对于一个普通文件(不包括目录)来说拥有read权限代表用户只可以查看文件中的内容,拥有write权限用户就可以修改文件中的内容(不需要read权限就可以修改),excute权限对于文件比较敏感,对于普通文件没有意义,但是一旦文件内容可以执行,也就意味着用户可以执行此文件(仅拥有执行权限即可执行不需要read权限),除非必要执行权限不应该配给任何人。
有了以上的内容上面的例子就很容易解决了,给file的所属主rw权限,把file的所属组改为g1并赋予rw权限,其他人权限为空。然后我们看一下文件信息中的权限位代表的含义。使用ll命令可以查看文件的详细信息。

-rw-r--r--. 1 root root      0 Apr  3 21:17 file1
-rw-r--r--. 这其中,第一位是文件类型-代表是普通文件
            后面9位,3位一组代表ugo的权限-表示没有对应权限
            最后一位是acl权限,此位为+表示该文件设置了acl权限

chown修改所有者

chown命令可以用来修改文件的所有者,包括所属主和所属组(处文件所属主和root其他用户不可使用此命令)

chown user1.g1 file1    \\把file所属主所属组改为user1,g1

chown可以使用-R选项对目录进行递归处理

chown -R username dir   \\把dir目录及其目录下文件递归处理

chgrp修改所属组

chgrp使用方法和chown类似,通常很少使用同样支持-R进行递归

chgrp -R grpname dir    \\把敌人目录及其目录下文件一并处理

chmod修改文件权限

chmod使用比较灵活也很常用,可以通过不同的方法指定文件权限

chmod u=rw,g=rw,o= file1    \\指定file1针对ugo的权限分别为rw,rw和空

上面的示例中,等号前面的u,g,o代表权限修改范围,可以分开指定也可以一次指定,也可以使用a表示全部修改,如下

chmod ug=rw,o= file1    \\和上条命令效果相同
chmod a=rw file1        \\所有用户权限设置为rw

同时还可以使用‘-’‘+’运算符如下

chmod u-w,g+r,o+r file1      \\去掉u的w权限,g和o加上r权限
chmod a-x file1              \\去掉file1文件所有用户的x权限

除了这种的方法,使用数字方法直接指定是我们更常用的方法。使用数字方法的时候我们用4,2,1分别表示rwx,在是使用的时候把ugo对应权限的对应数字相加就可以直接给文件设定对应的权限例如:

chmod 660 file1         \\指定file1针对ugo的权限分别为rw,rw,和空

chmod同样支持-R递归,不在示例。

扩展:目录权限

目录本质是一种特殊的文件,所以rwx对应的权限在目录上表现出来的和文件上不太一样,简单总结了一下,供参考

r 只能列出文件夹下文件名,不包括详细信息 rw 和只给r一样
w 没用 rx 对于一般
x 可进,可以执行目录下程序 wx 无法列出目录下文件,可以进入,可删除目录下文件

可以看出和文件不同的是,对于目录x权限属于基础权限,如果只给rw没有意义,但是需要注意的是,目录的w权限不能随便给,因为一般目录都会给rx权限,而wx权限的组合意味着用户可以删除目录下文件,所以对于目录来说,wx的权限组合是相当危险的。

默认权限和umask

我们在新建文件或者目录的时候都是有权限设定的,这个权限就叫做默认权限,对于文件来说这个权限是644,对于目录来说是755,那这个权限就是由umask决定的。可以使umask查看当前设定的umask值,umask值是四位数,第一位是特殊权限位(suid,sgid,sticky)。可以通过修改~/.bashrc文件修改当前用户umask也可以通过修改/etc/bashrc文件改变全局umask设定。和网上很多对umask的解释不同,下面介绍的umask和默认权限的计算应该更为精确。
首先,文件的最大默认权限为666,目录为777,通常我们用最大权限减去umask认为是默认权限,这种计算方法对目录来说并无问题,不过有些值这样算可能结果和实际并不相同。如umask为125,上面的方法默认文件权限应该为541,但实际创建会发现是642。
先给结论:umask代表取消对应的权限。具体是这样运算的
666
125
转换为二进制,这9位分别对应ugo权限组合中的9个权限位,1代表有对应权限,0表示没有对应权限
110110110
001010101
然后取消最大权限里umask中对应的权限解释如下
取消第一位和第二位的0权限,也就是不做更改,取消第三位的1权限也就是还是0,第四位取消0不变,第五位取消1为0……以此计算最后得出的二进制权限为
110100010也就是642
可以看一下下面的示例:

[[email protected] ~]# umask 125
[[email protected] ~]# umask
0125
[[email protected] ~]# touch file
[[email protected] ~]# mkdir dir
[[email protected] ~]# ll
total 4
drw-r-x-w-. 2 root root 4096 Apr  4 18:06 dir
-rw-r---w-. 1 root root    0 Apr  4 18:06 file

不过上面的计算方法太过繁杂,我们依然可以直接使用666减去umask值进行运算,不过需要在运算结果的奇数位加1还是以上为例,666-125=541,奇数位分别+1也就是642

特殊权限SUID,SGID,sticky

还是先说结论,SUID通常用来提权,SGID用来继承组权限,sticky用来防止非所属主用户删除文件。

SUID

举个例子,一个普通用户想要修改密码,但是修改密码必然需要更改/etc/shadow文件中的内容,那我们来看一下shadow文件的权限

----------. 1 root root 1077 Apr  3 23:33 /etc/shadow

全部为空,也就是说除了root,其他用户并没有权限修改此文件,但很显然所有用户都可以修改自己的密码,这就是suid权限在起作用,但在shadow文件上并没有看到任何权限信息,实际上,这个权限加在了/usr/bin/passwd文件上。原理是,当用户执行passwd命令的时候,系统会以root身份执行这个程序,这就是suid的作用。当一个程序配置了suid权限,普通用户在执行时程序时会以此程序所有者身份进行执行。
suid权限可以使用chmod命令进行配置,如下

chmod u+s file          \\给指定文件添加suid权限
chmod 4777 file         \\suid对应的权限位数字为4

suid权限信息表现在权限位中所有者中的x位如:

-rwsr-xr-x. 1 root root 30768 Nov 24  2015 /usr/bin/passwd

由于suid的特性,对于普通文件和目录,suid没有意义,只在二进制程序上生效
!!注:程序的权限继承自程序的发起者

SGID

sgid权限和suid类似,只是suid继承所属主的权限,sgid继承所属组的权限,不同的是对于目录设置sgid会让目录下所有新建文件属于目录所属组如下:

[[email protected] tmp]$ mkdir dir
[[email protected] tmp]$ ll -d /tmp/dir
drwxrwxr-x. 2 mrhan mrhan 4096 Apr  4 19:01 /tmp/dir
[[email protected] tmp]$ touch dir/file
[[email protected] tmp]# touch dir/file1
[[email protected] tmp]# ll dir
total 0
-rw-rw-r--. 1 mrhan mrhan 0 Apr  4 19:01 file
-rw-r---w-. 1 root  root  0 Apr  4 19:01 file1

上面的示例中,我先用普通用户在/tmp创建了目录dir,并且在dir目录下创建文件file,同时用root在/tmp/dir/下创建file1,但是我们可以看到虽然dir目录属于普通用户mrhan但是目录下新建的文件依然属于root(实际上是属于创建者的主组)那么我如果想让dir目录下所有新建的文件全部属于mrhan,就需要用到sgid权限
sgid的指定和suid类似。sgid权限信息表现在所属组权限位的x权限位,同样也可以使用数字方式指定,suid对应权限数字为2,和suid指定方法相同。

[[email protected] tmp]$ chmod g+s dir
[[email protected] tmp]$ ll -d /tmp/dir
drwxrwsr-x. 2 mrhan mrhan 4096 Apr  4 19:01 /tmp/dir
[[email protected] tmp]# touch dir/file2
[[email protected] tmp]# ll dir
total 0
-rw-rw-r--. 1 mrhan mrhan 0 Apr  4 19:01 file
-rw-r---w-. 1 root  root  0 Apr  4 19:01 file1
-rw-r---w-. 1 root  mrhan 0 Apr  4 19:11 file2

上面例子中,dir目录在配置sgid之后新建文件file2所属组默认继承dir所属组

sticky

也叫粘滞位,公共目录下配置sticky权限,可以防止用户对目录下文件随意删除,只能删除所属主的文件,sticky权限只针对目录生效,对应权限数字为1,设置方法和suid类似。如对一个目录配置了777权限又不希望目录下的文件被随便删除的时候就可以使用sicky权限,配置之后将只能删除自己的文件。

ACL权限控制列表

还是上面的例子,出于工作需要user1想让另一个项目g2里的同事可以看file1里面的内容,但是并不希望他们修改,还有一位同事user2他不在任何一个项目里,但是要查看这个文件必要的时候还会修改一下,显然对于这种需求,UGO这种简单的配置已经无法解决了,这时候就需要acl权限了。
acl访问控制列表,也就是说当用户不满足ugo中的任何一个时或者无法通过配置ugo解决时直接指定对应用户或对应组的权限,使用也很简单。

setfacl -m g:g2:r file1     \\指定g2组对file1的权限为r
setfacl -m u:user2:rw file1 \\指定user2对file1的权限为rw
setfacl -x g:grpname file 删除file文件中组的acl权限
setfacl -x u:username file 删除file文件中用户的acl权限
setfacl -b file1            \\清除file1的acl规则
        -d                  \\-d参数用来对目录设置acl,目录下新建文件默认设置acl
        -M                  \\从文件读取权限列表批量设置acl
                            \\文件内容格式同设置参数

使用getfacl file命令可以查看指定文件的acl权限列表
一旦启用acl权限,ugo权限位g部分权限会变为mask权限,使用chmod修改此部分权限等同于设置mask权限,mask权限控制acl权限的最大权限
小技巧:当权限包含奇数时,必然有x权限

原文地址:http://blog.51cto.com/13672361/2095038

时间: 2024-10-06 04:24:14

linux下的权限、特殊权限、acl的相关文章

Linux下ThinkPHP网站目录权限设置

在windows上运行好好的项目,迁移到Linux上就遇到了很多问题,其中最为重要的是网站目录权限的设置,当然简单期间你可以用 命令 "chmod 777 -R you web site" ,这样你就不用担心项目运行的时候会涉及到权限问题.通常来说如果你的项目时部署在公网或者是部 署在租用的Linux服务器上不建议这么做,应为如果这样设置了那么任何用户都可以对这个站点下的文件,目录进行操作,这样也会影响网站的运营, 同样不安全.下面以ubuntu14.4 系统为主进行分析. 最简单的做

【Linux学习】Linux下用户组、文件权限详解

原文地址:http://www.cnblogs.com/123-/p/4189072.html Linux下用户组.文件权限详解 用户组 在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者 用ls ‐ahl命令可以看到文件的所有者 也可以使用chown 用户名 文件名来修改文件的所有者 文件所在组 当某个用户创

Linux 下SVN安全及权限配置

转载请注明,原创地址:点击打开链接 http://blog.csdn.net/u010587274/article/details/51015532 前期的步骤可参考我的另一篇博客:点击打开链接   Linux(CentOS 7.0)下使用yum安装配置和使用svn 个人微信公众号:tanzi_888 (潭子技术圈) [[email protected] ~] cd /root/svn/project/conf passwd: 里面保存用户信息,基本格式为:user = passwdauthz:

Linux下SVN安装与权限管理

cat /etc/redhat-release //查看系统版本号 CentOS release 7.1 (Final) 这里我们採用yum源安装方式: 1.安装svn yum install subversion  -y 2.建立SVN根文件夹 mkdir -p /var/svn/ 3.启动SVN服务指定服务的SVN根文件夹 svnserve -d  -r /var/svn/svndata/ --pid-file=/var/svn/svndata/svn.pid 4.查看 SVN 进程: ps

linux下文件以及目录权限修改(摘抄)

http://www.linuxidc.com/Linux/2014-10/108114.htm chagrp 改变所属组:chown 改变拥有者:chmod 改变权限: 1. 改变所属群组, chgrp [[email protected] ~]# chgrp [-R] dirname/filename ... 选项与参数: -R :进行递归(recursive)的持续变更,亦即连同次目录下的所有档案.目录都更新成为这个群组之意.常常用在变更某一目录内所有的档案之情况. 范例:[[email 

linux下的文件系统基本权限和高级权限的管理

文件系统基本权限和高级权限管理 一:实验要求 1:理解并运用文件基本权限 2:理解并运用文件高级权限 3:实战-创建一个让root都无法删除的黑客文件 二:实验验证步骤 1:文件基本权限 1):实验基本权限结构 2:文件权限结构 对于文件: r  ---  代表read 读的权限 w  - 代表write写的权限 x  -  代表执行的权限 对于目录: r  ---读(看到目录里面有什么) W  ---可以在文件先进行删除,新建 X----可以进入目录中   2:修改权限的相关命令: 1):Ch

Linux下用户组、文件权限详解

在linux中的每个用户必须属于一个组,不能独立于组外.在linux中每个文件有所有者.所在组.其它组的概念 - 所有者 - 所在组 - 其它组 - 改变用户所在的组 所有者 一般为文件的创建者,谁创建了该文件,就天然的成为该文件的所有者 用ls ‐ahl命令可以看到文件的所有者 也可以使用chown 用户名 文件名来修改文件的所有者 文件所在组 当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组 用ls ‐ahl命令可以看到文件的所有组 也可以使用chgrp 组名 文件名来修改文件

[转载]linux下文件的特殊权限s和t

先看看这两个文件的权限:[[email protected] ~]# ls -ld /usr/bin/passwd /tmpdrwxrwxrwt 4 root root 4096 Jun 2 17:33 /tmp-rwsr-xr-x 1 root root 22984 Jan 7 2007 /usr/bin/passwd 这里的s和t是针对执行权限来讲的.这个s权限,是为了让一般使用者临时具有该文件所属主/组的执行权限.就比如/usr/bin/passwd在执行它的时候需要去修改/etc/pas

Linux下文件的特殊权限笔记

特殊权限: SUID,SGID,STICKY 安全上下文: 1.进程以某用户的身份运行;进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作; 2.权限匹配: (1)判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2吧 (2)判断进程的属主,是否属于被访问的文件数组;如果是,则应用数组的权限;否则进入第3不 (3)应用other的权限 SUID: 默认情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行; SUID的功能:用户运行某个

linux 下解决mysql root 权限无法远程连接问题

问题描述:MySQL数据库安装成功后,在服务器本地可以连接成功,但是使用工具navicat无法进行远程连接,如图: 原因:MySQL默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接. 解决方法: 1. 进入mysql: /usr/local/mysql/bin/mysql -u root -p(根据服务器安装的数据库地址而定) 或者 mysql -uroot -p 如图 密码输入时,linux命令面板不会有任何反应,输入完后回车键 2. 使用mys