一、 文件与目录的原始属性

由于不希望文件具有可执行的原始权限,默认情况下,文件是没有可执行(x)权限的,因此文件的原始属性是:-rw-rw-rw(0666)

目录的原始属性全部开放,为:-rwxrwxrwx(0777)

二、 umask

1. 文件的默认属性

在每个用户创建文件时,都有一个默认属性,这个属性是由文件的原始属性减去一个掩码而生成的,通过umask可以查看该用户的掩码,如:

[root@yxyz_test sdz]# umask

0022

或者

[root@yxyz_test test]# umask -S

u=rwx,g=rx,o=rx

这种是符号的方式直接显示用户最多拥有的权限,至于实际拥有的还与上面说的原始权限有关,譬如文件的原始属性中是没有x权限的,因此创建文件时自然也没有该权限。

root的掩码一般是0022(为什么是四位?第一位代表特殊权限,一般都为0),则root创建的文件默认权限是从原来的0666中减去相应的权限,为0644(-rw- r-- r--):

-rw-r--r-- 1 root root  0 Nov 25 09:57 test_file

目录的默认权限是0755(drwx r-x r-x):

drwxr-xr-x 2 root root 4096 Nov 25 09:54 test_dir

2. 修改掩码

(1) 直接在umask后面加上数字,如:

[root@yxyz_test test]# umask 0002

[root@yxyz_test test]# touch test_umask_file

[root@yxyz_test test]# mkdir test_umask_dir

[root@yxyz_test test]# ls -l

drwxrwxr-x 2 root root 4096 Nov 25 10:23 test_umask_dir

-rw-rw-r-- 1 root root  0 Nov 25 10:22 test_umask_file

(2) 如果在 shell 提示符下设置 umask,它将只适用于当前登录会话中的 shell 和 subshell

但不适用于以后登录的会话。要在登录时自动应用 umask 设置,就需要修改/ets/bashrc 中的内容,但一般不建议修改该文件。

三、 文件特殊权限:SUID/SGID/Sbit

1. Set User ID

使用 ls -l 命令查看文件的访问权限,通常都是rwx ,但有时会发现有些文件的执行权限位不是 "x" 而是 "s". 如:

-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

这说明 /usr/bin/passwd 文件被设置了SUID。SUID 表示"设置用户ID",SGID表示"设置组ID"。当用户执行一个设置了SUID文件时,用户的有效ID在程序运行过程中被置为文件拥有者的用户ID。如果文件属主是 root,当用户在程序的执行过程中就成为 root 用户,有着与 root 同样的权限。同样,当一个用户执行设置了SGID文件时,用户的属组在程序执行过程中被置为文件的属组。

根据现在的Unix机里,脚本是无法设置SUID/SGID的,因为真正运行的进程是脚本的解释程序而不是脚本本身;而bash shell script 在先天上不支持SUID/SGID,但/bin/zsh是支持SUID/SGID的。perl亦如此。

2. Set Group ID

s的权限如果是在用户组,那么就是SGUID,可以用在两个方面:

(1) 文件:如果SGUID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组id(effective group id)将会变成该程序的用户组所有者(group id);

(2) 目录:如果是设置在目录上,则这个目录内所建立的文件或目录的用户组,将是此目录的用户组。

一般来说SGUID多用在特定的多人团队的项目开发上,在系统中用得较少。

3. Sticky Bit

SBit当前只对目录有效,对文件没有效果。对目录的作用是:“在具有SBit的目录下,用户若在该目录下具有w和x权限,则当用户在该目录下建立文件或目录时,只有文件拥有者与root才有权利删除”。

例如,/tmp 本身的属性是drwxrwxrwt 4 root root 724992 Nov 25 15:10 /tmp,在tmp里谁都可以新增或者修改文件,但仅有该文件/目录的创建者或者root能删除。

4. SUID/SGID/Sbit 权限设置

在文章开始说到umask的时候,提到掩码的第一位是特殊权限位,因为创建任何文件时,原始属性中是没有设置特殊权限的,因此在umask中,第一位始终是0。而在特殊权限中,不同的权限也是用数字来表示的,SUID为4,SGUID为2,SBit为1。(注意,在设置特殊权限位之前,相应的执行权限位(x)必须要被设置,不然设置的特殊权限位也会无效,试想一下,拥有者都无法执行了,哪里给别人执行的权限?)

例如,如果有文件test_uid,

-rwxr-xr-x 1 root root  0 Nov 25 15:23 test_uid

要增加s权限,则要在原来的权限755之前加多一个4,即4775,则

chmod 4755 test_uid 或者用符号的形式:

chmod u+s test_uid

得到的最终属性是:

-rwsr-xr-x 1 root root  0 Nov 25 15:23 test_uid

如果想为目录设置Sbit为,如

drwxr-xr-x 2 root root 4096 Nov 25 16:11 test_sbit

则可以用chmod 1755 test_sbit或者chmod o+t test_sbit,得到:

drwxr-xr-t 2 root root 4096 Nov 25 16:11 test_sbit

 

5. 改变所有权对特殊权限位的影响

在改变一个文件的所有权时,相应的SUID/SGID也将被清除,这是出于安全性的考虑。

四、 关于进程运行时的有效用户id和有效组id

如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls -l命令显示如下:

-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile

任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括user id和group id用户可以用id命令来查到自己的或其他用户的user id和group id。

除了一般的user id和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

下面讨论一个例子:

UNIX系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:cr--r----- 1 root system 2, 1 May 25 1998 kmem

但ps等程序要读这个文件,而ps的权限设置如下:

-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps

这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置SUID来访问kmem,但大家注意了,bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话。

五、 安全性

SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐患。因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。因此在安全方面特别要注意那些设置了SUID的程序。

六、参考

1. 《shell十三问》

(完)

linux系统文件的安全与特殊权限的更多相关文章

  1. Linux系统文件权限管理(6)

    Linux操作系统是多任务(Multi-tasks)多用户(Multi-users)分时操作系统,linux操作系统的用户就是让我们登录到linux的权限,每当我们使用用户名登录操作系统时,linux ...

  2. Linux系统文件权限体系详解

    准备工作:先简单了解Linux文件权限 在Linux系统中,ls -l 命令可以查看文件的权限,如 [zhaohuizhen@localhost Test]$ ls -l a -rw-rw-r--. ...

  3. Linux分类笔记(一)-权限管理

    Linux分类笔记(一) 权限管理 普通权限 文件的普通权限 对一个普通的文件使用ls -ll命令后,看到下面的输出内容   而对于文件权限中的每一位,又分别代表了以下的意思 文件类型又有以下几类: ...

  4. 误删除 linux 系统文件了?这个方法教你解决

    转载于互联网并适当的修改 误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题.方法总比问题多~ 说在前面的话 针对日常维护操作,难免会出现文件误 ...

  5. linux系统文件

    关于linux系统文件命令 (1)Linux的文件系统目录配置要遵循FHS规范,规范定义的两级目录规范如下:        /home  每个账号在该目录下都有一个文件夹,进行数据的管理        ...

  6. 2.Linux的用户、用户组、权限、文件系统管理及其网络配置

    2.1 Linux的用户及用户组 2.1.1 Linux的用户管理 用户账号管理包含以下三个方面: 用户账号的添加.删除.与修改 用户口令(密码)的管理 用户组的添加.删除管理 Linux系统中用户信 ...

  7. linux 用户创建、管理、权限分配

    (1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮 ...

  8. linux系统文件说明

    linux系统文件说明 bin 系统命令目录 dev 设备目录 home 用户的家(每个系统用户在home下都有一个自己家) root超级用户在根目录下 lib 系统库目录.so动态库文件 media ...

  9. Linux常用命令_(文件权限)

    Linux权限管理: 二.权限管理1.3种基本权限在Linux中,将使用系统资源的人员分为4类:超级用户.文件或目录的属主.属主的同组人和其他人员.超级用户拥有对Linux系统一切操作权限,对 于其他 ...

随机推荐

  1. (转)JavaMail邮件发送-发送一个文本邮件和一些问题说明

    需要下载的JAR包: JavaMail:http://www.oracle.com/technetwork/java/javamail/index.html JAF:http://www.oracle ...

  2. (转)Android性能优化——工具篇

    Android性能优化是Android开发中经常遇见的一个问题,接下来将对Android性能优化方面的知识点做一个简单的梳理和总结,将从工具和代码两方面进行梳理.所谓工欲善其事必先利其器,本文首先来看 ...

  3. bzoj2184: 任意图的匹配

    Description 每天都要考,每天都要讲,大家注意力都集中不起来了,每天听解题报告时都有人交头接耳(也包括我,呵呵).这样做大大的影响的学习效率(可能吧).于是,有些好奇心重的同学就开始研究,怎 ...

  4. java封装后引用的例子

    封装好的文件: 另外一个文件引用封装文件的方法: 来源: https://www.runoob.com/java/java-encapsulation.html

  5. 【转】利用 Apache JMeter 测试 WebSphere 性能

    如果您预算紧张并且时间紧迫 —— 或者即使您不是这样 —— 那么,您可能希望考虑使用 JMeter 来对 Web 和其他应用程序进行压力测试.IBM 的 Greg Herringer 详细描述他使用这 ...

  6. 虚拟机桥接网卡下配置centOS静态IP

    前面我们讲了怎么去配置asterisk,但是配置完了,是没有什么效果出现的,因为asterisk相当于一个服务器,我们需要一个客户端去给它连接起来,如果你是在自己的机子上装了虚拟机,那最好配一下cen ...

  7. Go - 切片(Slice)

    定义 切片本身不是数组,它指向底层的数组或者数组的一部分.因此,可以使用Slice来处理变长数组的应用场景. Silice 是一种引用类型. 1.定义一个空的Slice package main im ...

  8. Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)

    Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建) 具体案例:局域网内有两台主机,一台Linux.一台Windows,现在需要配置一台Cacti监控服务器对这两台 ...

  9. Julia - 短路求值

    && 和 || 的布尔运算符被称为短路求值 它们连接一系列布尔表达式,仅计算最少的表达式来确定整个链的布尔值 在表达式 a && b 中,只有 a 为 true 时才计 ...

  10. ascii码与二进制码有何区别?

    ascii编码和二进制码是两个概念.ASCII主要是为了电脑显示和传输拉丁字母而发明的一套编码,二进制则是为了计算机方便计算.传输数据而使用的一种方法.ASCII(American Standard ...