xiguaqq20 发表于 2018-5-19 11:20:42

linux系统文件权限

第1章 文件权限概述
  linux中每个文件或目录都有一组共9个基础权限位,每三位字符被分为一组,分别是:属主权限位,属组权限位,其他用户权限位。比如rwxr-xr-x,在linux中正式9个权限位(跟多权限位会在后面提到)位来控制文件属性、用户组以及其他用户的权限。
1.1 linux的文件基础权限:
字母
英文
对文件可执行的操作
对应数字权限
r
read
可读权限
4
w
write
可写权限
2
x
excute
可执行权限
1
-


0
1.2 linux用户或用户组定义:
u   代表属主用户(ower/user)
g   代表属组(group)
o   代表其他用户(other)
a   代表属主,属组00和其他用户(all),即所有的用户(或组)  

第2章 基础权限对普通文件的作用
  打开四个窗口分别用root、oldboy、oldgirl、test用户登录。
2.1 分别测试oldboy、oldgirl、test用户对test.sh 文件的权限
# mv /oldboy   /tmp/oldboy_bak
# mkdir /oldboy -p
# echo "echo oldboylinux">/oldboy/test.sh
# chmod +x /oldboy/test.sh
# ls -l /oldboy/test.sh
-rwxr-xr-x. 1 root root 17 Sep6 08:59 /oldboy/test.sh
# cat /oldboy/test.sh
echo 123
# id oldboy
uid=500(oldboy) gid=502(incahome)groups=502(incahome)
# id oldgirl
uid=502(oldgirl) gid=502(incahome)groups=502(incahome)
# id test
uid=503(test) gid=503(test) groups=503(test)
$ ll -d /oldboy/test.sh
-rwxr-xr-x. 1 root root 9 Sep6 11:50 /oldboy/test.sh
$ cat /oldboy/test.sh
echo 123
$ echo >/oldboy/test.sh
-bash: /oldboy/test.sh: Permission denied
$ /oldboy/test.sh
123
将文件对应的用户改为oldboy,用户组改为incahome,分别测试oldboy,oldgirl,test用户对/oldboy/test.sh文件的权限。
# chown oldboy.incahome/oldboy/test.sh
# ll -d /oldboy/test.sh
-rwxr-xr-x. 1 oldboy incahome 9 Sep6 11:50 /oldboy/test.sh2.2 结论:
  oldboy用户拥有对应用户的权限,及读写执行的权限
  oldgirl用户拥有对应组(incahome)的权限,及读和执行的权限,没有写的权限。
  test用户拥有对用其他用户(others)的权限,及读和执行的权限,没有写的权限。
  分别对每个权限(读写执行)进行控制变量的方法进行测试,查看他们的关系,结论如下:
2.3 linux普通文件的读写执行的权限的说明:
  1、可读r:表示用户可以读取文件的内容
  2、可写w:表示用户可以增加,删除,修改文件的内容。

[*]  如果没有r配合,那么vi编辑文件会提示无法编辑(但可以强制编辑,之前的内容会被覆盖),echo可以重定向或追加(之前的内容还在)。
[*]  特别提示:删除文件(修改文件名称等)的权限受上级目录的权限控制,和文件本身权限无关。
  3、可执行x:表示用户可以执行文件。

[*]  文件本身要能够执行(命令,脚本文件)
[*]  普通用户同时还需具备r的权限才能执行。
[*]  root只要有x的授权就能执行。
[*]2.4 关于文件删除的说明:
实例2-1
  $ ll -d /oldboy/test.sh
  -rwxr-xr-x. 1 oldboy incahome 9 Sep6 11:50 /oldboy/test.sh
  $ rm -f /oldboy/test.sh
  rm: cannot remove `/oldboy/test.sh': Permissiondenied
  # ll -d /oldboy/
  drwxr-xr-x. 7 root root 4096 Sep6 13:31 /oldboy/
  上述实例可以看出:
  虽然oldboy是test.sh文件的用户,但是无法删除该文件,原因是oldboy用户对test.sh的父目录oldboy目录没有w权限,即不能删除oldboy目录下的文件。
  总结:
文件的删除跟文件本身的权限没有关系,看用户对应该文件的上级目录是否拥有写的权限。
  文件删除的说明。
  linux中的文件名是存在与上级目录的block里面,并指向这个文件的inode节点,这个文件的inode节点在标记指向存放这个文件的block的数据块。我们删除一个文件,实际上并不清除inode节点和block的数据,只是在这个文件的上一级目录里面的block中删除这个文件的名字和这个文件inode的对应关系,是这个文件名消失。然后系统会释放inode节点和存放这个文件的数据块,并更新inodeMAP和blockMAP。让这些位置可以存放其他新文件的数据信息。
  所以说,当误删文件后,如果想恢复数据的话就,在恢复数据之前就不能向磁盘中再次写入新的数据,因为新的数据会优先覆盖删除文件后的数据块,这样的话以前的数据就被覆盖掉,无法恢复。
   linux下文件删除的原理精华讲解(考试题答案系列)
http://oldboy.blog.51cto.com/2561410/791322
第3章 基础权限对目录的rwx权限:
3.1 实例测试各位权限对目录的操作
实例3-1
  让用户只有r权限:
# ll -d test
dr--r-xr-x. 2 oldboy incahome 4096 Sep6 11:06 test
# pwd
/oldboy
$ ls /oldboy/test
ls: cannot access /oldboy/test/haha: Permissiondenied
ls: cannot access /oldboy/test/oldboy.txt:Permission denied
haha oldboy.txt
$ ls -l /oldboy/test/
ls: cannot access /oldboy/test/haha: Permissiondenied
ls: cannot access /oldboy/test/oldboy.txt:Permission denied
total 0
-????????? ? ? ? ?            ? haha
-????????? ? ? ? ?            ? oldboy.txt
$ cd /oldboy/test
-bash: cd: /oldboy/test: Permission denied
$ echo111>>/oldboy/test/haha
-bash: /oldboy/test/haha: Permission denied  让用户只有w权限
# chmod u=w test
# ll -d test
d-w-r-xr-x. 2 oldboy incahome 4096 Sep6 11:06 test
$ ll -d /oldboy/test
d-w-r-xr-x. 2 oldboy incahome 4096 Sep6 11:06 /oldboy/test
$ ls /oldboy/test
ls: cannot open directory /oldboy/test: Permissiondenied
$ cd /oldboy/test
-bash: cd: /oldboy/test: Permission denied
$ echo 111>>/oldboy/test/haha
-bash: /oldboy/test/haha: Permission denied  让用户只有x权限:
# chmod u=x test
# ll -d test
d--xr-xr-x. 2 oldboy incahome 4096 Sep6 11:06 test
$ ll -d /oldboy/test
d--xr-xr-x. 2 oldboy incahome 4096 Sep6 11:06 /oldboy/test
$ ls /oldboy/test
ls: cannot open directory /oldboy/test: Permissiondenied
$ cd /oldboy/test
$ echo111>>/oldboy/test/haha
-bash: /oldboy/test/haha: Permission denied  让用户拥有rw权限
# chmod u=rw test
# ll -d test
drw-r-xr-x. 2 oldboy incahome 4096 Sep6 11:06 test
$ ll -d /oldboy/test
drw-r-xr-x. 2 oldboy incahome 4096 Sep6 11:06 /oldboy/test
$ ls /oldboy/test
ls: cannot access /oldboy/test/oldboy.txt:Permission denied
oldboy.txt
$ cd /oldboy/test
-bash: cd: /oldboy/test: Permission denied
$ echo111>>/oldboy/test/haha
-bash: /oldboy/test/haha: Permission denied  让用户拥有rx权限
# chmod u=rx test
# ll -d test
dr-xr-xr-x. 2 oldboy incahome 4096 Sep6 11:06 test
$ ll -d /oldboy/test
dr-xr-xr-x. 2 oldboy incahome 4096 Sep6 11:06 /oldboy/test
$ ls /oldboy/test
oldboy.txt
$ cd /oldboy/test
$ echo111>>/oldboy/test/haha
-bash: /oldboy/test/haha: Permission denied  让用户拥有wx权限
# chmod u=wx test
# ll -d test
d-wxr-xr-x. 2 oldboy incahome 4096 Sep6 11:06 test
$ ll -d /oldboy/test
d-wxr-xr-x. 2 oldboy incahome 4096 Sep6 18:39 /oldboy/test
$ ls /oldboy/test
ls: cannot open directory /oldboy/test: Permissiondenied
$ cd /oldboy/test
$ echo 111>>/oldboy/test/haha
$ cat /oldboy/test/haha
111  让用户拥有rwx权限
# ll -d test
drwxr-xr-x. 2 oldboy incahome 4096 Sep6 18:37 test
# cat /oldboy/test/haha
$ ll -d /oldboy/test
drwxr-xr-x. 2 oldboy incahome 4096 Sep6 18:39 /oldboy/test
$ ls /oldboy/test
oldboy.txt
$ cd /oldboy/test
$ echo 111>>/oldboy/test/haha
$ cat /oldboy/test/haha
111  通过上面的实例可以分析总结出下表:
目录属主的各权限与其对应目录文件的操作
权限
对目录文件的可读权限(ls)
对文件的执行权限(cd)
对文件的可写权限(echo)
r--
OK,但会提示无法访问目录下文件
denied
denied
-w-
denied
denied
denied
--x
denied
OK
denied
rw-
OK,但会提示无法访问目录下文件
denied
denied
r-x
OK
OK
denied
-wx
denied
OK
OK
rwx
OK
OK
OK
3.2 总结测试结论:linux目录的读写执行权限说明:
  1、可读r:表示具有浏览目录下面文件及子目录的权限,即ls /oldboy/test

[*]  如果没有x权限,不能进到目录里,既无法cd/oldboy/test;
[*]  如果没有x权限,ls列表时可以看到所有文件名,但是会提示无权访问目录下文件;
[*]  如果ls -l 列表,所有的属性会带有问号,也会提示无权访问目录下文件,但是可以看到所有文件名。
  2、可写w:表示具有增加、删除或修改目录文件名(一般指文件名)的权限(需要x权限配合);
  3、课执行x:表示具有进入目录的权限;例如:cd /oldboy/test
但是没有r无法列表文件及目录,没有w无法新建和删除。
  站点目录的文件和目录给什么权限:
默认权限是安全权限的临界点,工作中尽量给这个临界点,或者小于临界点,不要大于临界点权限。
  问题:为什么默认权限目录755,文件644而不是其他的值呢?
  不管是操作系统还是网站站点目录,安全权限的临界点:
  1、目录755,文件644是相对安全的权限。(用户本身可以任意操作,其他用户仅可以查看)
  2、并且用户为root以及用户组。
以上权限兼顾了安全和使用,生产中要尽量让我们的文件和目录达到以上默认的权限,包括用户和属组都是root。
linux系统默认权限:允许浏览,查看,但是禁止创建和修改文件以及文件内容以及执行。
3.3 生产环境下,保护文件安全措施:
  1、通过对用户权限的设置。
  2、程序:控制文件扩展名
  3、http协议:请求方法(禁止.php get方法)
  4、磁盘挂载参数禁止上传或执行 可执行文件。


第4章 系统的umask:
  在linux系统下文件的默认权限是由umask决定的
  umask是通过八进制的数值来定义用户创建文件或目录的默认权限的。
  umask对应数值表示的是禁止的权限,具体细节文件和目录略有不同。
  # umask   //系统默认的umask指(系统管理员)
  0022
  设定系统默认umask值的地方:
# sed -n '65,69p' /etc/bashrc
    if [ $UID -gt 199 ] && ["`id -gn`" = "`id -un`" ]; then
       umask 002
    else
       umask 022
    fi  由上面可以看出:
  情况一:当用户的UID大于200并且uid与gid相等的情况,系统默认的umask值为002;
  情况二:当用户的UID小于200或者UID与GID不相等的情况,系统默认的umask值为022。
# id root
uid=0(root) gid=0(root) groups=0(root)                  //情况二
# umask
0022
$ id oldboy
uid=501(oldboy) gid=504(incahome)groups=504(incahome)//情况二
$ umask
0022
$ id test
uid=502(test) gid=502(test) groups=502(test)            //情况三
$ umask
00024.1 根据umask计算文件权限的方法:
  root下默认普通文件(默认权限666)权限的计算方法
  1、所有位为偶数位
假设umask值为022
6 6 6      //文件初始权限
  0 2 2 -          //umask的值
  --------------
  6 4 4            //最终的文件权限
  验证一下:
# umask 022
# umask
0022
# touch 022.file
# ll -d 022.file
-rw-r--r-- 1 root root 0 Sep7 10:14 022.file  2、umask有奇数为(所有为奇数的位加1)
  假设umask值为031
6 6 6         //文件初始权限
  0 3 1 -         //umask的值
  --------------
  6 3 5
0 1 1 +          //对应奇数各加上1
  --------------
6 4 6         //最终的文件权限
  验证一下:
# umask 031
# umask
0031
# touch 031.file
# ll -d 031.file
-rw-r--rw- 1 root root 0 Sep7 10:20031.file4.2 root下默认目录文件权限的计算方法
  目录权限(默认权限777)的计算就是直接用对应位的权限减去umask对应位的权限即可。
# umask 045
# umask
0045
# mkdir 045.dir
# ll -d 045.dir/
drwx-wx-w- 2 root root 4096 Sep7 10:25 045.dir/  直接用777减去045即得到目录权限为732
第5章 特殊权限位setuid、setgid、粘滞位
  linux系统基本权限位为9位权限,还有额外3位权限,共12位权限。
  SUID:通过S标识,如果用户位对应的x位上有x,则为s标识,对应的数字是4,用户对应的权限位(用户对应的3位上的x位如果有s就表示suid),文件显示白字红底。
  SGID:通过S标识,如果用户组对应的x位上有x,则为s标识,对应的数字是2,用户组对应的权限位,文件显示黑字黄底。
  sticky:通过T标识,如果其他用户位对应的x位上有x,则为t标识,对应的数字是1,其他用户位权限,文件显示黑字绿底。特殊权限语法:

5.1 设置特殊权限位权限语法:
  chmod u+s 文件名/目录名
提示:当 用户权限位 没有x权限时,SUID显示为S,大S就是无效的SUID,小s才是有效的SUID,SUID使用数字表示是4
设置SGID语法:
chmod g+s 文件名/目录名
提示:当 用户组权限位 没有x权限时,SGID显示为S,大S就是无效的SGID,小s才是有效的SGID,SGID使用数字表示是2
设置粘滞位语法:
chmod o+t 目录名
提示:当 其他人权限位 没有x权限时,粘滞位显示为S,大T就是无效的粘滞位,小t才是有效的粘滞位,粘滞位使用数字表示是1
5.2 SUID
  在二进制的程序上设置SUID,所有使用改命令的用户在使用该命令期间 都拥有和这个命令对应用户的权限。用八进制表示为4000。
实例5-1
# ll /bin/touch
-rwxr-xr-x. 1 root root 52560 May 11 16:59/bin/touch
# ll -d /oldboy/
drwxr-xr-x 3 root root 4096 Sep7 14:49 /oldboy/
$ pwd
/oldboy
$ ll -d ./
drwxr-xr-x 3 root root 4096 Sep4 11:56 ./
$ touch 11
touch: cannot touch `11': Permission denied
-------------------------------------------------------------
# chmod u+s /bin/touch
# ll /bin/touch
-rwsr-xr-x. 1 root root 52560 May 11 16:59 /bin/touch
# ll -d /oldboy/
drwxr-xr-x 3 root root 4096 Sep7 14:49 /oldboy/
$ touch 11
$ ll
total 8
-rw-r--r-- 1 rootincahome    0 Sep7 14:49 11
drwx-wx--x 2 oldboy incahome 4096 Sep4 12:09 test
-rwx-wxr-- 1 oldboy incahome   35 Sep 4 11:32 test.sh5.2.2 SUID知识小结:是针对命令和二进制命令的
  1、用户和属主对应的前三位权限的x位上如果有s就表示SUID权限。
当x位上没有小写x执行权限的时候,SUID的权限显示就是大S。
  2、SUID作用是让普通用户可以以root(或其他)的角色运行只有root(或其他)账号才能运行的程序或命令,或程序命令对应本来没有权限操作的文件等。
(注意和du及sudo的区别),SUID为某一个命令设置特殊权限(使用者为所有人)。
  3、问题:希望oldboy用户能够删除本来无权限删除的文件。
  a.       sudo给oldboy授权root。b.给rm命令设置SUID。c.设置上级目录w权限。
  4、SUID修改的是执行命令passwd,而不是处理的目标文件/etc/shadow.
  5、仅对二进制命令程序有效,不能用在shell等类似脚本文件上。
(因为shell脚本进进是调用二进制命令程序而已,因此具体权限还要看二进制命令本身)
  6、二进制程序需要有可执行权限x配合。
  7、SUID权限仅在程序命令执行过程中有效。
  8、执行SUID命令的任意系统用户都可以获得该命令程序在执行期间对应的拥有者的所有权限。
  9、SUID是一把双刃剑,是一个比较危险的功能,对系统安全有一定的威胁。
系统SUID的无用功能取消SUID权限(安全优化)。
  查找系统中设置了SUID的命令
# find /usr/bin/ -type f -perm4755|xargs ls -l
-rwsr-xr-x. 1 root root 54496 Feb 202015 /usr/bin/at
-rwsr-xr-x. 1 root root 70480 May 11 05:23/usr/bin/chage
-rwsr-xr-x. 1 root root 51784 Nov 102015 /usr/bin/crontab
-rwsr-xr-x. 1 root root 75640 May 11 05:23/usr/bin/gpasswd
-rwsr-xr-x. 1 root root 40240 May 11 05:23/usr/bin/newgrp
-rwsr-xr-x. 1 root root 30768 Nov 242015 /usr/bin/passwd
-rwsr-xr-x. 1 root root 22544 Mar 172015 /usr/bin/pkexec5.3 SGID
  在文件或目录上设置SUID,所有执行命令的用户可以获得该命令程序执行期间所属组的权限。
实例5-2
# ll /bin/touch
-rwxr-xr-x. 1 root root 52560 May 11 16:59/bin/touch
# chmod g+s /bin/touch
# ll /bin/touch
-rwxr-sr-x. 1 root root 52560 May 11 16:59/bin/touch
$ ll
total 4
-r--r-xr-x 1 oldboy incahome 17 Sep7 19:40 test.sh
$ touch haha
$ ll
total 4
-rw-r--r-- 1 oldboy root      0Sep7 21:07 haha
-r--r-xr-x 1 oldboy incahome 17 Sep7 19:40 test.sh5.3.2 SGID小结
  1、与SUID不同的是,SGID既可以针对文件也可以针对目录设置!
  2、SGID是针对用户组权限位的
对文件来说,SGID的功能如下:
  a.       sgid仅对二进制命令程序有效。
  b.      二进制命令或程序需要有可执行权限x。
  c.       执行命令的任意用户可以获得该命令程序执行期间所属组的权限。
对文件来说:SGID的功能如下:
  a.       linux里默认情况多有用户创建文件,默认用户和组都是自身。
  b.      SGID可以让用户在此目录下创建文件和目录,具有和此目录相同的用户组设置。
setgid位主要用在目录中,当为某个目录设置了setgid位以后,在该目录中心创建的文件具有该目录所属组权限,而不是创建该文件的用户默认的所有者。这样,使得在多个用户之间共享一个目录中文件变得简单。用八进制表示为2000。
5.3.3 SGID基于目录案例:
  创建共享目录
创建共享目录/home/admins:属组为adminuser,adminuser组成员对目录有写入读写和执行的权限,其他所有用户没有任何权限(root除外):在/home/admins目录中创建的文件 会自动继成adminuser组(sgid).
# mkdir /home/admins
# ll -d admins/
drwxr-xr-x 2 root root 4096 Sep7 21:24 admins/
# groupadd adminuser
# chown .adminuser admins/
# ll -d admins/
drwxr-xr-x 2 root adminuser 4096 Sep7 21:24 admins/
# chmod g+w,o-rx admins/
# ll -d admins/
drwxrwx--- 2 root adminuser 4096 Sep7 21:24 admins/
# chmod g+s /home/admins/
# ll -d admins/
drwxrws--- 2 root adminuser 4096 Sep7 21:36 admins/
# usermod -g adminuser test
# id test
uid=502(test) gid=506(adminuser)groups=506(adminuser)
$ touch test1.sh
$ ll
total 0
-rw-r--r-- 1 test adminuser 0 Sep7 21:36 test1.sh  查看有SGID的系统命令:
$ find /usr -type f -perm2755|xargs ls -l
find: `/usr/lib64/audit': Permission denied
-rwxr-sr-x. 1 root nobody   141384 May 11 07:10 /usr/bin/ssh-agent
-rwxr-sr-x. 1 root tty       12016 May 11 06:58 /usr/bin/write
-rwxr-sr-x. 1 root postdrop 184904 Nov 102015 /usr/sbin/postdrop
-rwxr-sr-x. 1 root postdrop 217832 Nov 102015 /usr/sbin/postqueue设置小结:
SUID:chmod 4755 file或者chmod u+s file
sgid:chmod 2755 file 或者 chmodg+s file
同事设置SUID和SGIDchmod 6755 file 或者chmodug+s file
5.4 粘滞位sticky
  sticky:比SGID更安全的措施,让多个用户都具有写权限的目录,每个用户只能删除自己的文件。表现在other位!用t表示,如果没有执行权限,那么就是T;如果有执行权限,那么就是t表示。
# mkdir /test
# ll -d /test
drwxr-xr-x 2 root root 4096 Sep7 21:52 /test
# chmod 777 /test
# ll -d /test
drwxrwxrwx 2 root root 4096 Sep7 21:52 /test
$ touch test.txt
$ touch oldboy.txt
$ ll
total 0
-rw-r--r-- 1 oldboy incahome0 Sep 7 22:07 oldboy.txt
-rw-r--r-- 1 testadminuser 0 Sep7 22:07 test.txt
$ whoami
test
$ rm -f oldboy.txt
$ ll
total 0
-rw-r--r-- 1 test adminuser 0 Sep7 22:07 test.txt
————————————————————————可以删除修改其他用户创建的文件
# chmod o+t /test
# ll -d /test
drwxrwxrwt 2 root root 4096 Sep7 22:10 /test
$ ll -d /test
drwxrwxrwt 2 root root 4096 Sep7 22:10 /test
$ ll
total 0
-rw-r--r-- 1 test adminuser 0 Sep7 22:07 test.txt
$ rm -f test.txt
rm: cannot remove `test.txt': Operation notpermitted
加上粘滞位后,用户不能修改除自己以外的文件。  

三个特殊权限,SUID和SGID在企业基本上不用,为了安全起见,还需要把系统中具有此权限的命令和文件优化掉。sticky粘滞位,则多用在公共的共享目录中,这样,其他人就能随便修改其他用户创建的文件。
页: [1]
查看完整版本: linux系统文件权限