Linux中的文件或目录的权限和用户及用户组关联很大。
Linux中每个文件或目录都有一组(共9个)基础权限位,没三个字符被分为一组,它们分别是属主权限位,用户组权限位,其他用户权限位。
比如:rwxr-xr-x,在Linux中正是这9个权限来控制文件属主、用户组以及其他用户的权限。
Linux 文件或目录的权限位是由 9 个权限位来控制,每三位为一组,它们分别是文件属主(Owner)的读、写、执行,用户组(Group)的读、写、执行以及(Other)其他用户的读、写、执行:
特殊权限位:s S s S t T
创建组:groupadd incahome
创建用户oldboy并且添加到incahome组:
[root@oldboy test]# groupadd incahome [root@oldboy test]# useradd oldboy -g incahome useradd: user ‘oldboy‘ already exists [root@oldboy test]# id oldboy uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
如果用户已经存在,则直接使用usermod更改用户的组即可:
[root@oldboy test]# usermod -g incahome oldboy [root@oldboy test]# id oldboy uid=500(oldboy) gid=503(incahome) groups=503(incahome)
创建用户oldgirl,并添加到incahome
[root@oldboy test]# useradd oldgirl -g incahome [root@oldboy test]# id oldgirl uid=503(oldgirl) gid=503(incahome) groups=503(incahome)
创建用户test:
[root@oldboy test]# useradd test [root@oldboy test]# id test uid=504(test) gid=504(test) groups=504(test)
[root@oldboy oldboy]# mkdir /oldboy [root@oldboy oldboy]# echo "echo oldboylinux">/oldboy/test.sh [root@oldboy oldboy]# chmod +x /oldboy/test.sh [root@oldboy oldboy]# cat /oldboy/test.sh echo oldboylinux
打开四个窗口,分别用root, oldboy, oldgirl, test 用户登录。
分别测试 oldboy, oldgirl, test 用户对/oldboy/test.sh文件的权限。
[root@oldboy oldboy]# ls -l /oldboy/test.sh -rwxr-xr-x 1 root root 17 Sep 10 10:57 /oldboy/test.sh
结论1:
oldboy,oldgirl,test三个用户拥有同样的其他用户的权限,即读和执行,没有写的权限。(r-x)
更改属组和属组,改成文件属于oldboy,属组是incahome:
[root@oldboy ~]# chown oldboy.incahome /oldboy/test.sh
[root@oldboy ~]# ls -l /oldboy/test.sh -rwxr-xr-x 1 oldboy incahome 17 Sep 10 11:23 /oldboy/test.sh
查看文件属性,发现/oldboy/test.sh的属主是oldboy,属组是incahome。
用户oldboy拥有rwx权限;属组incahome,即oldgirl拥有r-x权限;其他用户拥有r-x权限。
更改属组的权限,添加w写权限,删除其他组用户的执行权限:
[root@oldboy ~]# chmod g+w,o-x /oldboy/test.sh [root@oldboy ~]# ls -l /oldboy/test.sh -rwxrwxr-- 1 oldboy incahome 35 Sep 10 11:32 /oldboy/test.sh
有关文件删除的说明:
Linux中的文件名是存在于父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块。
我们删除一个文件,实际上并不清除inode节点和block的数据块。
只是在这个文件的父目录里面的block中,删除这个文件的名字和这个文件inode的对应关系,使这个文件消失,并且无法指向这个文件的inode节点,当没有文件名指向这个inode节点的时候,系统会同时释放inode节点和存放这个文件的数据块,并更新inode MAP和block MAP,让这些位置可以用于防止其他新的文件数据。
因此,修改和删除文件名都是在操作文件的上级目录的block,修改或删除的是文件名和inode的关联数据。
因此,和上级目录权限关联。
企业面试题:请从linux文件系统的角度详细描述读取/tmp/oldboyfile文件的过程。
答案:
从/根目录的inode,获取存储数据的block,找到存储的对应的/tmp/的目录名,以及指向tmp目录存储block的inode,顺着inode找到对应的/tmp/目录的block,继续找到其中/tmp/oldboyfile的文件名与对应的inode的数值,顺着inode找到oldboyfile的block,加载读取数据。
范例:实操体会目录权限
开启两个窗口通过两个用户演示上面的权限(rwx)。
一个是root,一个是oldboy用户,一个是oldgirl用户,一个是test用户。
测试数据准备:
[root@oldboy /]# mkdir /oldboy/test -p [root@oldboy /]# ls -ld /oldboy/test drwxr-xr-x 2 root root 4096 Sep 10 12:25 /oldboy/test
特别是文件的删除!
总结测试结论:Linux 目录的读、写、执行权限说明
特别注意:
当删除或移动一个文件或目录,仅与该文件与目录所在的上一层权限有关,与该文件本身属性无任何关系。 对于文件来说,写文件是修改文件,而不是删除文件,因此写文件是与该文件的本身属性有关系的。
chmod:change mod,change file access permissions
chmod是用来改变文件或目录权限的命令,但只有文件的属主和超级用户root才有这种权限。
chmod来改变文件或目录的权限有两种方法:
使用数字权限方法设置权限的命令格式如下:
chmod [数字组合] 文件名
chmod 的数字语法简单直观,下表中列出了数字表示权限的8种组合,该组合由3位八进制数来表示文件的3类用户的权限组合。
chmod的数字方法的说明:
每个三位的权限代码(分别是属主、属组,其他用户)组合,有8种可能:
八进制数字 | 权限 |
---|---|
0 | --- |
1 | --x |
2 | -w- |
3 | -wx |
4 | r-- |
5 | r-x |
6 | rw- |
7 | rwx |
如果我们想改变的仅仅是打开目录的权限,使用chmod命令时不用加任何参数。
如果想把目录以下的所有文件或子目录也同时改变,需要使用-R参数:
所以当想改变一个目录下的所有.file权限,并且向保留该目录的原有权限时,请不要使用.*通配符。
可以用下面的匹配:
chmod -R 644 oldboy/test/[a-z]*
这样可以避免隐藏文件.和..被修改,导致出错。
使用权限字符设置权限的命令格式如下:
chmod [用户类型] [+|-|=] [权限符号] 文件名
用户类型:
操作:
权限符号:
例如:
chmod的字符式语法相对简单,对文件或目录权限的改变时,是通过比较直观的字符的形式来完成。
目录权限设置
对于目录权限的设置,要用到-R参数:
和数字权限方法一样,如果我们为一个目录及其下的子目录和文件具有相同的属性,就可以用-R参数:
chmod -R a+rwx ett_dir/
站点目录的文件和目录给什么权限?
默认权限是安全权限的临界点,工作中尽量给这个临界点,或者小于这个临界点权限。
超级用户创建目录默认是755,文件是644:
[root@oldboy oldboy]# mkdir dir [root@oldboy oldboy]# touch file [root@oldboy oldboy]# ls -lrtd dir file drwxr-xr-x 2 root root 4096 Sep 10 13:59 dir <=== 755 -rw-r--r-- 1 root root 0 Sep 10 13:59 file <=== 644
操作系统还是网站站点目录安全权限临界点:
以上权限兼顾了安全和使用,生产工作中一定要尽量要我们的文件和目录达到以上默认的权限,包括用户和属组都是root。
Linux系统默认权限的方针:允许浏览,查看,但是禁止创建和修改文件及文件内容以及执行。
在linux下文件的默认权限是由 umask值 决定的。
系统默认的umask值:
# 管理员用户默认值 [root@oldboy ~]# umask 0022 # 普通用户默认值 [zoe@oldboy ~]$ umask 0002
如果UID>199并且uid和gid相同,则umask默认值为002:
[root@oldboy ~]# sed -n ‘65,69p‘ /etc/bashrc if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002 else umask 022 fi [zoe@oldboy ~]$ id zoe uid=501(zoe) gid=501(zoe) groups=501(zoe) [zoe@oldboy ~]$ umask 0002
根据umask值计算文件权限3种方法:
文件权限计算小结论:
创建文件默认最大权限为666 (-rw-rw-rw-),默认创建的文件没有可执行权限x位。
对于文件来说,umask的设置是在假定文件拥有八进制666的权限上进行的,文件的权限就是666减去umask(umask的各个位数字也不能大于6,如,077就不符合条件)的掩码数值;重点在接下来的内容,如果umask的部分位或全部位为奇数,那么,在对应为奇数的文件权限位计算结果分别再加1就是最终文件权限值。
创建目录默认最大权限777(-rwx-rwx-rwx),默认创建的目录属主是有x权限,允许用户进入。 对于目录来说,umask的设置是在假定文件拥有八进制777权限上进行,目录八进制权限777减去umask的掩码数值。
文件权限的一般计算方法:
默认文件权限计算方法
1)假设umask值为:022(所有位为偶数)
6 6 6 ==>文件的起始权限值
0 2 2 - ==>umask的值
6 4 4
2)假设umask值为:045(其他用户组位为奇数)
6 6 6 ==>文件的起始权限值
0 4 5 - ==>umask的值
6 2 1 ==>计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
0 0 1 +
622 ==>真实文件权限
3)假设umask值为:035(其他用户组位为奇数)
6 6 6 ==>文件的起始权限值
0 3 5 - ==>umask的值
6 3 1 ==>计算出来的权限。由于umask的最后一位数字是5,所以,在其他用户组位再加1。
0 1 1 +
642 ==>真实文件权限
4)默认目录权限计算方法
7 7 7 ==>目录的起始权限值
0 2 2 - ==>umask的值
7 5 5
示例:
# 偶数位,文件666-044=0622 [root@oldboy test]# umask 044 [root@oldboy test]# touch file1 [root@oldboy test]# ll file1 -rw--w--w- 1 root root 0 Sep 10 14:33 file1 [root@oldboy test]# stat file1|grep Uid|egrep ‘[0-9]{4}‘ --color=auto -o 0622 # 0666-045= 0621+001=0622 奇数位加1 [root@oldboy test]# umask 045 [root@oldboy test]# touch file_2 [root@oldboy test]# stat file_2|grep Uid|egrep ‘[0-9]{4}‘ --color=auto -o 0622 # 0666-035=0631+011=0642 奇数位加1 [root@oldboy test]# umask 035 [root@oldboy test]# touch file3 [root@oldboy test]# stat file3|grep Uid|egrep ‘[0-9]{4}‘ --color=auto -o 0642
特别提示:
在一般的生产场景,umask的使用不多见,在此,了解一下即可。
企业面试题:什么是umask,作用是什么,怎么计算文件和目录的默认权限
特殊权限为基本说明: Linux系统基本权限位有9位,但还有额外3位权限位,共12位权限位:
当s这个标志出现在文件所有者的x权限上时,此时就被称为Set UID,简程SUID。
执行ls -l /bin/su或/usr/bin/passwd可以看到:
[root@oldboy test]# ls -l `which passwd` -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd [root@oldboy ~]# ls -l /bin/su -rwsr-xr-x. 1 root root 34904 Oct 15 2014 /bin/su
在文件所有者的x权限位上都出现了 s 权限,那么这个特殊权限的特殊性的作用是什么呢?
SUID的关键作用体现在第四句,SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。
例如:
1、大家都知道su这个命令,无论任何人,执行了它都将具有root权限,因为他的拥有者是root,而且这个权限仅在执行的su命令中有效,从上面的截图可以看到,不管是文件拥有者,文件拥有者所属组,还是其他人,都是具有x权限的,所以都可以执行该程序,执行之后就将具有该程序拥有者的权限,即root的权限,这也就是su命令能够切换用户权限的实现原理。
2、系统中的用户密码是保存在/etc/shadow中的,而这个文件的权限是———
[zoe@oldboy ~]$ ls -l /etc/passwd /etc/shadow -rw-r--r-- 1 root root 1296 Sep 10 10:49 /etc/passwd ---------- 1 root root 1245 Sep 10 14:58 /etc/shadow [root@oldboy test]# ls -l `which passwd` -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
关键是要把密码写入到/etc/shadow中。我们知道,除了root用户能修改密码外,用户自己同样也能修改密码,为什么没有写入权限,还能修改密码,就是因为这个SUID功能。从ls -l /usr/bin/passwd可以看到,passwd的文件拥有者,文件拥有者所属组,还是其他人,都是具有x权限的,所以都可以执行passwd,当执行了之后获得root的权限也就能进行密码的修改。
常规用户执行passwd命令,可以修改自身的密码;只有根用户才能执行passwd name 指定用户名称。
注:
这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在脚本上,同样也不能放到目录上,放上也是无效的。
删除文件的演示:
# 将/oldboy目录的权限设置为755,除了属主外,属组和其他用户都只有对该目录的读和执行的权限 [root@oldboy /]# chmod 755 /oldboy [root@oldboy /]# ll /oldboy -d drwxr-xr-x 4 root root 4096 Sep 10 15:01 /oldboy # 切换用户到oldboy,尝试删除/oldboy下的文件,Permission denied 无删除权限 [root@oldboy ~]# su - oldboy [oldboy@oldboy ~]$ ll /oldboy total 12 drwxr-xr-x 2 root root 4096 Sep 10 13:59 dir -rw-r--r-- 1 root root 0 Sep 10 13:59 file drw-rw-rw- 2 root root 4096 Sep 10 14:40 test -rw-rw-rw- 1 root root 51 Sep 10 12:10 test.sh.ori [oldboy@oldboy ~]$ rm /oldboy/file rm: remove write-protected regular empty file `/oldboy/file‘? y rm: cannot remove `/oldboy/file‘: Permission denied # 给rm命令(/bin/rm)的属主位添加suid权限 [root@oldboy /]# ll /bin/rm -rwxr-xr-x. 1 root root 57440 Oct 15 2014 /bin/rm [root@oldboy /]# chmod 4755 /bin/rm # 同chmod u+s /bin/rm等价 [root@oldboy /]# ll /bin/rm -rwsr-xr-x. 1 root root 57440 Oct 15 2014 /bin/rm # 在oldboy用户下,尝试删除/oldboy下的文件 # 删除成功 [oldboy@oldboy ~]$ rm /oldboy/file [oldboy@oldboy ~]$ ll /oldboy/ total 12 drwxr-xr-x 2 root root 4096 Sep 10 13:59 dir drw-rw-rw- 2 root root 4096 Sep 10 14:40 test -rw-rw-rw- 1 root root 51 Sep 10 12:10 test.sh.ori
删除文件受父目录的对应的w的权限影响。 oldboy用户在/oldboy/目录上,仅拥有其他用户的权限,即 "r-x",没有"w"的权限,即无法删除/oldboy下的子目录或文件。
通过对rm命令(二进制程序)添加suid权限,赋予了所有拥有执行rm权限的用户,在执行时,拥有属主的权限(即,rwx),故而,oldboy在执行 rm 命令时,拥有了删除/oldboy目录下文件的权限。——通过rm命令的suid位,在执行时获取了属主位的权限从而获得了删除的权限。
suid知识小结:针对命令和二进制程序的
下面是系统内常见的拥有suid的命令:
[root@oldboy ~]# find /usr/bin -type f -perm 4755 -exec ls -l {} \; -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd -rwsr-xr-x. 1 root root 51784 Mar 30 2015 /usr/bin/crontab -rwsr-xr-x. 1 root root 54496 Feb 20 2015 /usr/bin/at -rwsr-xr-x. 1 root root 22544 Mar 17 2015 /usr/bin/pkexec -rwsr-xr-x. 1 root root 66352 Apr 7 2015 /usr/bin/chage -rwsr-xr-x. 1 root root 36144 Apr 7 2015 /usr/bin/newgrp -rwsr-xr-x. 1 root root 71480 Apr 7 2015 /usr/bin/gpasswd [root@oldboy ~]# find / -type f -perm 4755 -exec ls -l {} \; -rwsr-xr-x. 1 root root 34840 Oct 15 2014 /sbin/unix_chkpwd -rwsr-xr-x. 1 root root 10272 Oct 15 2014 /sbin/pam_timestamp_check -rwsr-xr-x. 1 root root 9000 Jul 24 2015 /usr/sbin/usernetctl -rwsr-xr-x. 1 root root 257824 Jul 24 2015 /usr/libexec/openssh/ssh-keysign -rwsr-xr-x. 1 abrt abrt 10296 Jul 25 2015 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache -rwsr-xr-x. 1 root root 14368 Mar 17 2015 /usr/libexec/polkit-1/polkit-agent-helper-1 -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd -rwsr-xr-x. 1 root root 51784 Mar 30 2015 /usr/bin/crontab -rwsr-xr-x. 1 root root 54496 Feb 20 2015 /usr/bin/at -rwsr-xr-x. 1 root root 22544 Mar 17 2015 /usr/bin/pkexec -rwsr-xr-x. 1 root root 66352 Apr 7 2015 /usr/bin/chage -rwsr-xr-x. 1 root root 36144 Apr 7 2015 /usr/bin/newgrp -rwsr-xr-x. 1 root root 71480 Apr 7 2015 /usr/bin/gpasswd -rwsr-xr-x. 1 root root 38200 Jul 24 2015 /bin/ping -rwsr-xr-x. 1 root root 36488 Jul 24 2015 /bin/ping6 -rwsr-xr-x. 1 root root 53472 Oct 15 2014 /bin/umount -rwsr-xr-x. 1 root root 34904 Oct 15 2014 /bin/su -rwsr-xr-x. 1 root root 77336 Oct 15 2014 /bin/mount find: `/proc/1321/task/1321/fd/5‘: No such file or directory find: `/proc/1321/task/1321/fdinfo/5‘: No such file or directory find: `/proc/1321/fd/5‘: No such file or directory find: `/proc/1321/fdinfo/5‘: No such file or directory
当s出现在文件的所属用户组x权限位置上时,就是SGID,相对与SUID来说,SGID还是比较少见的。
那么SGID的功能是什么呢?
和SUID一样,只是SGID是获得该程序所属用户组的权限。 这相SGID有几点需要我们注意:
理解了SUID,我想SGID也很容易理解。如果用户在此目录下具有w权限的话,若使用者在此目录下建立新文件,则新文件的群组与此目录的群组相同。
例如:
[root@oldboy ~]# ls -l `which locate` -rwx--s--x. 1 root slocate 38464 Mar 12 2015 /usr/bin/locate
/usr/bin/locate二进制程序就是在sgid。
# 属组slocate拥有对mlocate.db有读的权限 # 同时/usr/bin/locate 属组位上有sgid的权限位,所以执行locate的用户拥有了slocate属组的权限,即执行locate命令,读取/var/lib/mlocate/mlocate.db的权限 [root@oldboy mlocate]# ls -l /var/lib/mlocate/mlocate.db -rw-r----- 1 root slocate 1368160 Sep 10 03:09 /var/lib/mlocate/mlocate.db
sgid知识总结介绍:
sgid是针对用户组权限位的
提示:用八进制数2000表示setgid权限位。
linux里默认情况所有用户创建文件,默认用户和组都是自身。
RHCE认证考试题:
创建共享目录/home/admins:
属组为adminuser:
adminuser组成员对目录有读写和执行的权限,其他所有用户没有任何权限(root除外):
在/home/admins 目录中创建的文件,会自动继承adminuser组。
文件只有属主可以删除。
# 创建/home/admins目录 [root@oldboy /]# mkdir /home/admins # 添加组 adminuser [root@oldboy /]# groupadd adminuser [root@oldboy /]# ls -ld /home/admins drwxr-xr-x 2 root root 4096 Sep 10 16:50 /home/admins # 更改/home/admins的属组 [root@oldboy /]# chown .adminuser /home/admins/ [root@oldboy /]# ls -ld /home/admins drwxr-xr-x 2 root adminuser 4096 Sep 10 16:50 /home/admins # 更改/home/admins/的权限 770 [root@oldboy /]# chmod g+w,o= /home/admins/ [root@oldboy /]# ls -ld /home/admins drwxrwx--- 2 root adminuser 4096 Sep 10 16:50 /home/admins [root@oldboy /]# chmod 770 /home/admins [root@oldboy /]# ls -ld /home/admins drwxrwx--- 2 root adminuser 4096 Sep 10 16:50 /home/admins # 创建oldboy.txt文件,默认权限为644,创建的文件默认的属主和属组还是root,root [root@oldboy /]# touch /home/admins/oldboy.txt [root@oldboy /]# ls -l /home/admins/oldboy.txt -rw-r--r-- 1 root root 0 Sep 10 16:54 /home/admins/oldboy.txt # 为/home/admins/目录添加sgid [root@oldboy /]# chmod g+s /home/admins/ [root@oldboy /]# ls -ld /home/admins/ drwxrws--- 2 root adminuser 4096 Sep 10 16:54 /home/admins/ # 在sgid的情况下,创建新文件,发现属组为/home/admins的属组: [root@oldboy /]# touch /home/admins/newfile [root@oldboy /]# ls -l /home/admins/ total 0 -rw-r--r-- 1 root adminuser 0 Sep 10 16:57 newfile -rw-r--r-- 1 root root 0 Sep 10 16:56 oldboy.txt
特殊权限位数字权限(八进制)方法:
setuid设置方法:
setgid的设置方法:
SBIT的设置方法:
这个就是针对others来设置的了,和上面两个一样,只是功能不同而已。
SBIT(Sticky Bit)目前只针对目录有效,对于目录的作用是:当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与 root能够删除自己的目录或文件。
粘滞位的功能现在也很少用了,不过对于像/tmp目录这样的,是整个系统临时文件存放地,还是有点意义。
一个目录既使它的使用权限都开放rwxrwxrwx,如果是设置了粘滞位,除非目录的属主和root用户有权限删除它,除此之外,其他用户不能删除这个目录。
用途一般是把一个文件夹的权限都打开,然后来共享文件,像/tmp目录一样。方便带来的安全隐患,生产环境我们一般不这样使用!
[root@oldboy /]# ls -ld /tmp drwxrwxrwt. 17 root root 4096 Sep 10 16:28 /tmp
sticky:比SGID的更安全措施,让多个用户都具有写权限的目录,每个用户只能删自己的文件。
表现在other位,如果有执行权限,用 t 表示; 如果没有执行权限,用 T 表示。
tmp经典的粘滞位目录案例,特点:谁都有写的权限,因此安全成问题。常常是木马第一手跳板地点。
当我们要改变一个文件的属主,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户。
只有超级用户才能改变文件的属主。
chown 语法:
chown [选项] ... [所有者] [:[组]] 文件...
举例:将example.txt文件的属主改为baixuan用户:
方法:
强调:
[root@oldboy /]# cd /oldboy [root@oldboy oldboy]# ls -l test.sh -rw-r--r-- 1 oldboy incahome 51 Sep 10 17:41 test.sh # 更改test.sh的属主 [root@oldboy oldboy]# chown zoe test.sh [root@oldboy oldboy]# ls -l test.sh -rw-r--r-- 1 zoe incahome 51 Sep 10 17:41 test.sh # 更改test.sh的属组 [root@oldboy oldboy]# chown .zoe test.sh [root@oldboy oldboy]# ls -l test.sh -rw-r--r-- 1 zoe zoe 51 Sep 10 17:41 test.sh
原文:https://www.cnblogs.com/zoe233/p/11922198.html