通过一个Linux Shell脚本学习文件的特殊权限

刚开始学习 Linux ,对 Linux 的安全模型一直都有点迷糊,这次通过一个脚本对它进行了比较透彻的分析,下面就来分析一点我的心得,希望给遇到和我一样问题的同学有个参考,好了,现在书归正传:

首先说一下题目:

写一个脚本,目标:创建一个目录,并设置其具有 sgid 和 sticky 的功能:

1 .   创建目录 /data/share ,如果此目录存在并且不空,就提示用户此目录中可能有正在使用的数据,是否继续?如果否,就退出脚   本。

2 .   创建组 peguin ,组 id 为 3306 ,创建用 Ubuntu 和 CentOS ,要求此两用户都以 peguin 为附加组,且密码为 RedHat 。

3 .   设定目录

A )   ubuntu 和 centos 用户均可以在 /data/share 目录中建立文件或子目录。但其属组均为 peguin ,而非用户的基本组。

B )   此两用户均不能删除对方的文件,但可以删除自己的文件。

问题如上,首先我们先来分析一下这个题目,前面的创建目录和用户就不说了,我们重点分析一下目录的设定,根据题目要求,这个目录的属主是 root ,而其属组被改为是 peguin ,这时根据 Linux 的文件安全模型,其他用户想要对这个目录进行操作就只能用同组或其他用户的身份了。 ubuntu 和 centos 属于 peguin 组,可以以组的身份操作,但是由于 pegin 只是他们的附加组,这时他们创建的文件的属组将属于各自的基本组,而是不附加组 pegin ,这时第一个问题。第二个问题,怎么让上方只删除自己的文件呢?根据现有的文件安全模型,同组的用户对文件所有的权限是相同的,这样就不能满足要就了,这个要怎么解决呢 ? 下面我们来一一解答。

在解答之前我们先来说另外一个概念——安全上下文!什么是安全上下文呢?我们知道任何时刻用户操作计算机是靠进程实现的,所以一个进程是否能访问某个文件当然取决于发起进程的用户对文件的权限了,如果进程的运行者身份是文件的属组,则以属组的身份操作,如果不匹配就查看属组,如果再不匹配就只能是 other 了。这就是安全上下文。这时也许有人会问,这很正确啊,但和我们的问题有什么关系呢?那么我们下面来看一个文件,在 /etc/shadow 文件中存放有用户的密码,但是这个文件的权限为 -r-------- 也就是说出了 root 用户其他人连看一眼都是问题,但是按照这种机制我们怎么修改自己的密码呢?我们没权限啊!但是我们却可以通过 passwd 来修改,这时就有问题了,根据安全上下文的概念,一个进程对一个文件的权限取决于执行它的用户对文件的权限,这时我们没权限那根据推理 passwd 也是没有权限的啊!但是我们确实可以该自己的密码,这就让人迷糊了,这到底是为什么呢?这时解决我们上述问题文件的特殊权限就派上用场了。细心的同学一定注意到 passwd 命令的权限为 -r-s — x — x  怎么会出个 s 呢不是只有 rwx 吗?这就是我们要介绍的文件的特殊权限。 Set uid

SUID : 仅可用在『二进制制档案 (binary file) 』上, SUID 因为是程序在执行的过程中拥有档案拥有者的权限,因此,他仅可用于 binary file , 不能够用在批次档 (shell script) 上面的!这是因为 shell script 只是将很多的 binary 执行档叫进来执行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的设定, 而不是 shell script 本身。当然, SUID 对于目录也是无效的~这点要特别留意。

Set GID

进一步来说,如果 s 的权限是在 group 时,那么就是 Set GID ,简称为 SGID 。 SGID 可以用在两个部分喔!

档案:如果 SGID 是设定在 binary file 上面,则不论使用者是谁,在执行该程序的时候, 他的有效群组 ( 及基本组 (effective group) 将会变成该程序的群组所有人 (group id) 。

目录:如果 SGID 是设定在 A 目录上面,则在该 A 目录内所建立的档案或目录的 group ,将会是 此 A 目录的 group !

一般来说, SGID 应该是比较多用在特定的多人团队的项目开发上, 在系统当中应该会比较少这个设定才对~

Sticky Bit

这个 Sticky Bit 目前只针对目录有效,对于档案已经没有效果了。 SBit 对于目录的作用是:『在具有 SBit 的目录下,使用者若在该目录下具有 w 及 x 的权限, 则当使用者在该目录下建立档案或目录时,只有档案拥有者与 root 才有权力删除』。换句话说:当甲这个使用者于 A 目录下是拥有 group 或者是 other 的项目,并且拥有 w 的权限, 这表示『甲使用者对该目录内任何人建立的目录或档案均可进行 " 删除 / 更名 / 搬移 " 等动作。』 不过,如果将 A 目录加上了 Sticky bit 的权限项目时, 则甲只能够针对自己建立的档案或目录进行删除 / 更名 / 移动等动作。

那特殊权限怎么设置呢? 下面我们来介绍方法

现在你应该已经知道数字型态个更改权限方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,那最前的面数字就代表这几个属性了! ( 注:通常我们使用 chmod xyz filename 的方式来设定 filename 的属性时,则是假设没有 SUID, SGID 及 Sticky bit 啦! )

? 4 为 SUID

? 2 为 SGID

? 1 为 Sticky bit

假设要将一个档案属性改为『 -rwsr-xr-x 』时,由于 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来设定!此外,还有大 S 与大 T 的产生喔!

呵呵,现在是自己写的脚本,希望大家指点:

1 #!/bin/bash
2 MYDIR='/data/share'
3
4 judgedirexist(){
5 if [ ! -d $1 ]; then
6    mkdir -p $1
7
8 else
9   if [ `ls $1 | wc -l` != '0' ];then
10
11          read -p 'this dir is exist,y\Y is continue esle exit!' CHOOSE
12          [ $CHOOSE == 'Y' -o $CHOOSE == 'y' ] && echo 'continue......' || exit 1
13    fi
14 fi
15 }
16
17 creatgroup(){
18   read -p 'please input a name:' MYGNAME
19 while grep "^$MYGNAME:x:" /etc/group &> /dev/null ; do
20 #  [ $? == '0' ] && echo 'groupname exit,input again....' && exit 1
21 # while [ $? == '0' ]; do
22    read -p 'gname is exist please input a name again:' MYGNAME
23 done
24
25 read -p 'please input a Gid:' MYGID
26
27 while grep ":x:$MYGID:" /etc/group &> /dev/null; do
28
29    read -p 'Gid is exist please input  again:' MYGID
30 done
31   groupadd -g $MYGID $MYGNAME &> /dev/null || echo ' GID exit ,input again.....'
32
33 }
34
35 creatuse(){
36   read -p 'please input a username:' MYUNAME
37    id $MYUNAME &> /dev/null && echo 'usre exist .....' || useradd $MYUNAME
38    [ $? == '0' ] && usermod -G $MYGID $MYUNAME
39 #  useradd $MYUNAME
40   read -p 'please input passwd ,null is default:' MYPASSWD
41
42  [ -z $MYPASSWD ] &&  MYPASSWD='redhat'
43  echo "$MYPASSWD" | passwd --stdin $MYUNAME &> /dev/null
44  [ $? == '0' ] && echo 'create scessfull....' || echo 'create fail!!!'
45 }
46
47 changgroup(){
48 #$1 is groupown $2 is file
49         chgrp $1 $2
50         chmod 3775 $2 && echo "change secssful `ls -dl $2`"
51
52 }
53
54
55
56
57 judgedirexist $MYDIR
58 creatgroup
59 creatuse
60 creatuse
61 changgroup $MYGNAME $MYDIR