linux系统下的权限知识梳理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux系统下的权限知识梳理相关的知识,希望对你有一定的参考价值。
下面对linux系统下的有关权限操作命令进行了梳理总结,并配合简单实例进行说明。
linux中除了常见的读(r)、写(w)、执行(x)权限以外,还有其他的一些特殊或隐藏权限,熟练掌握这些权限知识的使用,可以大大提高我们运维工作的效率。
(0)umask是权限码,默认是022
使用命令"umask"就能查询出来 文件默认的权限是666,目录默认的权限是777 新建文件和目录的权限分别是各自默认权限减去umask权限码值 即: 新建文件权限,666-022=644 新建目录权限,777-022=755
(1)chmod,chown,chgrp
chmod 设置数字权限4,2,1,分别对应的是r,w,x,即可读,可写,可执行。 对目录设置权限时,可以加-R递归参数 [[email protected] src]# chmod 755 test.txt [[email protected] src]# ll test.txt -rwxr-xr-x. 1 root root 0 Nov 3 16:33 test.txt [[email protected] src]# chmod 700 test.txt [[email protected] src]# ll test.txt -rwx------. 1 root root 0 Nov 3 16:33 test.txt [[email protected] src]# chmod 775 -R hello [[email protected] src]# ll hello total 4 -rwxrwxr-x. 1 root root 4 Nov 3 17:30 test.txt chown 设置字符权限,默认表示所属者权限 chgrp 表示所属组权限 通常我们可以直接用chown设置所属者和所属者 比如给a文件授权所属者是dengaosky,所属组是wutao,做法如下: [[email protected] src]# ll test.txt -rwx------. 1 root root 0 Nov 3 16:33 test.txt [[email protected] src]# chown dengaosky test.txt [[email protected] src]# ll test.txt -rwx------. 1 dengaosky root 0 Nov 3 16:33 test.txt [[email protected] src]# chgrp dengaosky test.txt [[email protected] src]# ll test.txt -rwx------. 1 dengaosky dengaosky 0 Nov 3 16:33 test.txt 也可以直接使用chown设置 [[email protected] src]# chown dengaosky.dengaosky test.txt [或者chown dengaosky:dengaosky test.txt] [[email protected] src]# ll test.txt -rwx------. 1 dengaosky dengaosky 0 Nov 3 16:33 test.txt --------------------------------------------------------------------------------------------------- root账号在普通用户家目录下创建的文件,默认该文件的所有者和所属组权限是root。 1)此普通用户不能使用echo命令覆盖和追加文件。 2)但是该用户对此文件有有直接vim编辑的权限,并且编辑后,文件的所有者和所属组权限就变成普通用户的了。 如下: [[email protected] ~]# cd /home/dengaosky/ [[email protected] dengaosky]# vim test [[email protected] dengaosky]# cat test 123456 [[email protected] dengaosky]# ll total 4 -rw-r--r--. 1 root root 7 Dec 3 10:47 test [[email protected] ~]$ echo "dengaosky" >> test -bash: test: Permission denied [[email protected] ~]$ echo "dengaosky" > test -bash: test: Permission denied [[email protected] ~]$ vim test [[email protected] ~]$ ll total 4 -rw-r--r--. 1 dengaosky dengaosky 15 Dec 3 10:48 test [[email protected] ~]$ cat test 123456 dengaosky
(2)chattr隐藏权限,这个很重要!!!通常用于锁定文件
有时候你发现用root权限都不能修改某个文件,大部分原因是这个文件曾经使用chattr命令锁定了。 chattr命令的作用很大,其中一些功能是由Linux内核版本来支持的。 通过chattr命令修改属性能够提高系统的安全性,但是它并不适合所有的目录。 chattr命令不能保护/、/dev、/tmp、/var目录。 lsattr命令是显示chattr命令设置的文件属性。 这两个命令是用来查看和改变文件、目录属性的,与chmod这个命令相比,chmod只是改变文件的读写、执行权限,更底层的属性控制是由chattr来改变的。 chattr在使用时一般常用到两个参数:i和a chattr +i 表示只有查看文件权限,其他诸如删除,修改,更名等权限统统没有! chattr +a 表示除了查看文件权限外,还可以echo命令(是echo >>,不能echo >覆盖)追加文件内容的权限(不能直接vim进行编辑),其他诸如删除,修改,更名等权限统统没有! chattr -i或chattr -a 表示删除这个参数权限 案例说明1:---针对文件 如下,给文件test.txt文件设置+i权限后,就等于锁定了这个文件。任何用户(包括root)都不能操作这个文件了。 [[email protected] src]# touch test.txt [[email protected] src]# chattr +i test.txt [[email protected] src]# lsattr test.txt ----i----------- test.txt [[email protected] src]# cat test.txt 123 [[email protected] src]# echo "asdfs" > test.txt -bash: test.txt: Permission denied [[email protected] src]# rm -f test.txt rm: cannot remove ‘test.txt’: Operation not permitted 设置+a权限,除了查看之外,就只能echo追加内容(是追加,而不是覆盖),其他操作都干不了! [[email protected] src]# chattr -i test.txt [[email protected] src]# chattr +a test.txt [[email protected] src]# lsattr test.txt -----a---------- test.txt [[email protected] src]# cat test.txt 123 [[email protected] src]# echo "asdfs" > test.txt -bash: test.txt: Operation not permitted [[email protected] src]# echo "asdfs" >> test.txt [[email protected] src]# cat test.txt 123 asdfs [[email protected] src]# rm -f test.txt rm: cannot remove ‘test.txt’: Operation not permitted [[email protected] src]# 可以将系统的账号信息文件/etc/passwd和密码文件/etc/shadow使用chattr命令锁定(+ai),这样后续就不能添加账号和修改用户密码了。 案例说明2:---针对目录 "chattr -R +i 目录名" #只能cd切换到该目录下,对该目录下的文件除了查看权限,其他的都不能操作 "chattr -R +a 目录名" #除了cd切换到该目录下,对于该目录下的文件除了查看权限,也只能echo追加内容,其他的也都干不了 注意一点,删除权限: "chattr -ai -R 目录名" #表示连同目录下的文件权限都删除了 [[email protected] src]# mkdir hello [[email protected] src]# echo "123123" > hello/test.txt [[email protected] src]# chattr -R +i hello [[email protected] src]# lsattr -R hello ----i----------- hello/test.txt 由于添加权限的时候加了-R参数,所以这个目录下的文件也被锁定了! [[email protected] src]# rm -rf hello rm: cannot remove ‘hello/test.txt’: Permission denied [[email protected] src]# rm -rf hello/test.txt rm: cannot remove ‘hello/test.txt’: Permission denied [[email protected] src]# echo "huhuhu" > hello/test.txt -bash: hello/test.txt: Permission denied [[email protected] src]# chattr -R -i hello [[email protected] src]# chattr -R +a hello [[email protected] src]# lsattr -R hello -----a---------- hello/test.txt [[email protected] src]# rm -rf hello rm: cannot remove ‘hello/test.txt’: Operation not permitted [[email protected] src]# rm -rf hello/test.txt rm: cannot remove ‘hello/test.txt’: Operation not permitted [[email protected] src]# echo "asdf" > hello/test.txt -bash: hello/test.txt: Operation not permitted [[email protected] src]# echo "asdf" >> hello/test.txt [[email protected] src]# 注意: 如果chattr针对目录设置+i权限,不加-R参数时,那么只针对该目录有效,目录下的文件不受约束! 这种情况下: 目录不能删除,不能更名。 目录下的文件也不能删除,不能更名。文件可以被echo追加、覆盖内容。vim可以任意修改文件内容。 [[email protected] src]# chattr -R -ai hello [[email protected] src]# chattr +i hello [[email protected] src]# lsattr -R hello ---------------- hello/test.txt #可以看出不加-R,目录下的文件没有连带权限 [[email protected] src]# rm -rf hello rm: cannot remove ‘hello/test.txt’: Permission denied [[email protected] src]# rm -rf hello/test.txt #由于上一级目录删除不了,所以文件也删除不了 rm: cannot remove ‘hello/test.txt’: Permission denied [[email protected] src]# echo "123" > hello/test.txt #可以修改文件内容 [[email protected] src]# echo "123sdf" >> hello/test.txt [[email protected] src]# vim hello/test.txt #vim里可以任意编辑文件 [[email protected] src]# mv hello hello233 mv: cannot move ‘hello’ to ‘hello233’: Operation not permitted [[email protected] src]# mv hello/test.txt hello233/haha #由于上一级目录被锁定不能更名,所以目录下的文件也不能更名 mv: cannot move ‘hello/test.txt’ to ‘hello233/haha’: No such file or directory 如果chattr针对目录设置+a权限,不加-R参数时,那么只针对该目录有效,目录下的文件不受约束! 这种情况下: 目录不能删除,不能更名。 目录下的文件也不能删除,不能更名。文件可以被echo追加、覆盖内容。但是!但是不能使用vim编辑内容。
(3)facl权限,setfacl表示设置权限,getfacl表示查看权限
ACL权限: Access Control List:访问控制列表,最初好像是unix里面为了提供更高级的权限管理而搞出来的,可能是被chmod命令的3个权限控制无法满足,而被迫搞出来的吧! 主要目的是提供传统的owner,group,others的read,write,execute权限之外的具体权限设置。 ACL可以针对单一用户、单一文件或目录来进行r,w,x的权限控制,对于需要特殊权限的使用状况有一定帮助。如,某一个文件不让单一的某个用户访问等。 ACL使用两个命令来对其进行控制 setfacl:设置某个文件/目录的ACL设置项目 getfacl:取得某个文件/目录的ACL设置项目 setfacl设置acl控制规则的时候跟的参数: -m:设置后续acl参数 -x:删除后续acl参数 -b:删除全部的acl参数 -k:删除默认的acl参数 -R:递归设置acl,包括子目录 -d:设置默认acl setfacl操作acl权限的主要命令: "setfacl -m u:用户名:权限 文件名" #通过所属者方式 "setfacl -m g:用户组:权限 文件名" #通过所属组方式 "setfacl -R -m u:用户名:权限 目录名" #通过所属者方式 //如果这个目录被mount挂载或nfs挂载上了,就不支持setfacl权限操作了 "setfacl -R -m g:用户组:权限 目录名" #通过所属组方式 "setfacl -b 文件名" #删除文件上的全部acl权限 "setfacl -x u:用户名 文件名" #删除文件上的这个用户的acl权限 "setfacl -x g:用户组 文件名" #删除文件上的这个用户组的acl权限 "setfacl -R -b 目录名" #删除目录上的全部acl权限 "setfacl -R -x u:用户名 目录名" #删除目录上的这个用户的acl权限 "setfacl -R -x g:用户组 目录名" #删除目录上的这个用户的acl权限 案例说明1:针对文件操作 /usr/local/src下有一个文件test.txt,文件权限是gaogao [[email protected] src]# pwd /usr/local/src [[email protected] src]# ll test.txt -rw-r--r--. 1 gaogao gaogao 5 Nov 3 13:19 test.txt [[email protected] src]# cat test.txt 3457 默认情况下,dengaosky用户对这个文件是没有写权限的。 [[email protected] ~]# su - dengaosky [[email protected] ~]$ cd /usr/local/src/ [[email protected] src]$ ll test.txt -rw-rw--r--. 1 gaogao gaogao 14 Nov 3 13:21 test.txt [[email protected] src]$ echo "dengaosky123" > test.txt -bash: test.txt: Permission denied [[email protected] src]$ 现在使用setfacl命令赋予dengaosky用户对这个文件具有rwx的操作权限 [[email protected] src]# setfacl -m u:dengaosky:rwx test.txt [[email protected] src]# getfacl test.txt # file: test.txt #文件名 # owner: gaogao #文件所属者 # group: gaogao #文件所属组 user::rw- #文件所属者的权限 user:dengaosky:rwx #可以看出,添加了dengaosky用户对这个文件的rwx权限 group::rw-- #文件所属组的权限 mask::rwx #文件当前的umask值 other::r-- #其他用户对这个文件的权限 现在dengaosky用户可以操作这个文件了(权限设置后,退出来重新登录dengaosky用户) [[email protected] src]$ echo "dengaosky123" > test.txt [[email protected] src]$ cat test.txt dengaosky123 删除文件test.txt上所有的acl权限 [[email protected] src]# setfacl -b test.txt [[email protected] src]# getfacl test.txt # file: test.txt # owner: gaogao # group: gaogao user::rw- group::rw-- other::r-- 删除test.txt文件对于dengaosky用户的acl权限 [[email protected] src]# setfacl -x u:dengaosky test.txt [[email protected] src]# getfacl test.txt # file: test.txt # owner: gaogao # group: gaogao user::rw- group::rw- mask::rw- other::r-- [[email protected] src]$ echo "1234123" > test.txt -bash: test.txt: Permission denied [[email protected] src]$ 上面是针对文件所属者设置的acl权限,也可以针对文件所属组设置acl权限: [[email protected] src]# getfacl test.txt # file: test.txt # owner: gaogao # group: gaogao user::rw- group::rw- other::r-- 如下设置dengaosky用户组对这个文件的特殊权限是rwx [[email protected] src]# setfacl -m g:dengaosky:rwx test.txt [[email protected] src]# getfacl test.txt # file: test.txt # owner: gaogao # group: gaogao user::rw- group::rw- group:dengaosky:rwx mask::rwx other::r-- 那么dengaosky用户就可以写入这个文件 [[email protected] src]$ echo "sadfasdf" > test.txt 案例说明2:针对目录操作 [[email protected] src]# ll -d hello drwxr-xr-x. 2 root root 21 Nov 3 15:41 hello [[email protected] src]# getfacl hello # file: hello # owner: root # group: root user::rwx group::r-x other::r-x 让dengaosky用户对这个hello目录及其子目录下的文件都无访问权限 [[email protected] src]# setfacl -R -m u:dengaosky:r hello [[email protected] src]# getfacl hello # file: hello # owner: root # group: root user::rwx user:dengaosky:r-- group::r-x mask::r-x other::r-x 这样,dengaosky用户就访问不了这个hello目录了 [[email protected] src]# su - dengaosky Last login: Thu Nov 3 15:42:41 CST 2016 on pts/0 [[email protected] ~]$ cd /usr/local/src/hello/ -bash: cd: /usr/local/src/hello/: Permission denied 删除这个hello目录上所有的acl规则 [[email protected] src]# setfacl -R -b hello [[email protected] src]# getfacl hello # file: hello # owner: root # group: root user::rwx group::r-x other::r-x 删除这个hello目录上的dengaosky这个用户的acl权限 [[email protected] src]# setfacl -R -x u:dengaosky hello [[email protected] src]# getfacl hello # file: hello # owner: root # group: root user::rwx group::r-x mask::r-x other::r-x 上面使用的是针对目录所属者的acl权限设置,当然也可以使用目录所属组设置acl设置 设置dengaosky用户组对于目录hello的acl设置 [[email protected] src]# setfacl -R -m g:dengaosky:r hello 删除hello目录上针对dengaosky用户组的acl权限 [[email protected] src]# setfacl -R -x g:dengaosky: hello *************************************************************************************************************************** 除了上面设置setfacl权限的方法外,要想让dengaosky用户对test.txt文件操作写,还可以将dengaosky用户添加到这个文件的所属组内即可 [[email protected] src]# ll test.txt -rw-rw-r--. 1 gaogao gaogao 5 Nov 3 13:29 test.txt 默认dengaosky用户不能写入这个文件 [[email protected] src]$ echo "erere" > test.txt -bash: test.txt: Permission denied 将dengaosky用户添加到gaogao用户组内 [[email protected] src]# gpasswd -a dengaosky gaogao [[email protected] src]# id dengaosky uid=1001(dengaosky) gid=1001(dengaosky) groups=1001(dengaosky),1002(gaogao) 这样,dengaosky用户就可以写入这个文件了 [[email protected] src]$ echo "erere" > test.txt [[email protected] src]$
(4)特殊权限
1)suid:只对二进制程序有效;执行者对于程序需要有x权限;在程序运行过程中,执行者拥有程序拥有者的权限; suid会在所属用户权限本应是x的地方显示s; 设置suid权限,只需在文件当前数字权限前面加4。这个权限很危险,一般不要乱给! 注意: 除了直接在数字权限前加4设置suid权限外,还可以用下面的方法 chmod u+s filenae #设置suid权限 chmod u-s filename #取消suid权限 案例说明:普通用户执行passwd命令修改自己的密码。 首先查看passwd命令的绝对路径: [[email protected] ~]# which passwd /usr/bin/passwd 查看passwd命令权限,发现passwd的拥有者是root,且拥有者权限里面本应是x的那一列显示的是s,这说明这个命令具有SUID权限。 同时发现普通用户没有w权限,所以按理来说普通用户是不能执行这个命令的,因为这个命令修改了密码肯定是要写文件的。 [[email protected] ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd 进一步分析,实际上passwd这个命令会操作/etc/shadow这个文件,因为密码都是放在这里,查看密码文件权限:发现权限是000! 注意:root用户对所有文件都是有rw权限的,对所有目录都是有rwx权限的,这意味着普通用户确实不能独读或写这个文件。 [[email protected] ~]# ll /etc/shadow ----------. 1 root root 1205 Nov 3 10:54 /etc/shadow 不过因为passwd命令具有SUID权限,所以普通用户执行这个命令时,当系统生成对应的进程后,这个进程就拥有了/usr/bin/passwd文件拥有者root的权限。 [[email protected] ~]# su - dengaosky Last login: Thu Nov 3 10:53:38 CST 2016 on pts/0 [[email protected] ~]$ passwd Changing password for user dengaosky. Changing password for dengaosky. (current) UNIX password: New password: Retype new password: passwd: all authentication tokens updated successfully. [[email protected] ~]$ 如果将/usr/bin/passwd文件的suid权限收回,则普通用户就不能修改自己的密码了。 [[email protected] ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd [[email protected] ~]# chmod 755 /usr/bin/passwd [或者chmod u-s /usr/bin/passwd] [[email protected] ~]# ll /usr/bin/passwd -rwxr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd [[email protected] ~]# su - dengaosky Last login: Thu Nov 3 11:03:34 CST 2016 on pts/0 [[email protected] ~]$ passwd Changing password for user dengaosky. Changing password for dengaosky. (current) UNIX password: New password: Retype new password: passwd: Authentication token manipulation error [[email protected] ~]$ [[email protected] ~]$ passwd Changing password for user dengaosky. Changing password for dengaosky. (current) UNIX password: 在上面要输入密码的时候,按ctrl+z挂起。然后接着输入pstree -u命令,如下,发现passwd的权限确实是root,而不是dengaosky! [[email protected] ~]$ pstree -u systemd─┬─NetworkManager───2*[{NetworkManager}] ├─agetty ├─auditd───{auditd} ├─crond ├─dbus-daemon(dbus)───{dbus-daemon} ├─dnsmasq(nobody)───dnsmasq(root) ├─epmd(epmd) ├─gssproxy───5*[{gssproxy}] ├─ipmievd ├─irqbalance ├─ksmtuned───sleep ├─lvmetad ├─master─┬─pickup(postfix) │ └─qmgr(postfix) ├─polkitd(polkitd)───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd─┬─sshd───bash───su───bash(dengaosky) │ └─sshd───bash───su───bash(dengaosky)─┬─passwd(root) │ └─pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─wpa_supplicant 再看一例: 由于/etc/shadow文件权限是000,也就是说只有root用户能对它有查看权限。普通用户都无法查看它的内容。 [[email protected] ~]# ll /etc/shadow ----------. 1 root root 1205 Nov 3 11:11 /etc/shadow [[email protected] ~]# su - dengaosky Last login: Thu Nov 3 11:11:10 CST 2016 on pts/1 [[email protected] ~]$ cat /etc/shadow cat: /etc/shadow: Permission denied 现在只需要给/usr/bin/cat文件赋予suid权限,普通用户即可有查看/etc/shadow的权限 [[email protected] ~]# which cat /usr/bin/cat [[email protected] ~]# ll /usr/bin/cat -rwxr-xr-x. 1 root root 54048 Nov 20 2015 /usr/bin/cat [[email protected] ~]# chmod 4755 /usr/bin/cat [或者chmod u+s /us/bin/cat] [[email protected] ~]# ll /usr/bin/cat -rwsr-xr-x. 1 root root 54048 Nov 20 2015 /usr/bin/cat [[email protected] ~]# su - dengaosky Last login: Thu Nov 3 11:11:10 CST 2016 on pts/1 [[email protected] ~]$ cat /etc/shadow root:$6$MeFkhhGG$4XBmni8ZudmW.Im1ZMRYOAV209Z0iTFH4Xxmonew/qL8x3K/iA1p86LUyFdHmeV5.2fOhU3KsXMPajE5GmGjx1:17093:0:99999:7::: bin:*:16659:0:99999:7::: daemon:*:16659:0:99999:7::: adm:*:16659:0:99999:7::: ....... 2)sgid权限:针对文件的话,sgid只对二进制程序有用;程序执行着要有x权限;执行者在执行过程中会获得改程序用户组的权限(相当于临时加入了程序的用户组) sgid会在所属用户组权限本应是x的地方显示s; 设置sgid权限,只需在文件当前数字权限前面加2。 注意: 除了直接在数字权限前加2设置sgid权限外,还可以用下面的方法 chmod g+s filenae #设置suid权限 chmod g-s filename #取消suid权限 案例说明:普通用户使用locate命令(yum install mlocate,之后就会有locate命令) [[email protected] src]# which locate /usr/bin/locate [[email protected] src]# ll /usr/bin/locate -rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate 发现/usr/bin/locate文件中用户组权限中应该出现x的位置显示的s,表示这个locate命令具有sgid权限,而普通用户只有x权限而没有rw权限。 locate这个命令,实际上会去访问/var/lib/mlocate/mlocate.db这个文件。如下可知: 这个mlocate.db文件对于普通用户没有任何权限,所以理论上普通用户执行locate命令是不行的。 不过因为locate命令有sgid权限,所以运行locate生成进程时,这个进程会得到locate命令的用户组权限,相当于dengaosky这个用户被临时加入了用户组slocate。 于是就对mlocate.db这个文件有了r权限,可以访问了! [[email protected] ~]# ll /var/lib/mlocate/mlocate.db -rw-r-----. 1 root slocate 4238642 Nov 3 11:51 /var/lib/mlocate/mlocate.db sgid针对目录的话:用户对此目录有rx权限可以进入目录,用户进入此目录后,有效用户组会变成该目录的用户组;若用户在此目录有w权限,则用户创建的文件用户组与该目录用户组相同。 案例说明: 如果我们团队想在linux某个目录(比如/home/project)下协同工作来做一个项目,那么每个团队成员都得对这个project目录下的所有文件具有rwx权限。 做法: 首先新建一个用户组(比如work),再新建几个账号(比如dengaosky、gaogao),每个账号的用户组都加入刚才新建的那个用户组。 然后再把/home/project权限设为770,把这个目录的用户组改为work用户组,接着给这个目录加入sgid权限。 也就是说在这个目录下,work组内的任意一个用户创建的文件,文件用户组都会是这个目录的用户组(即work)。 这样的话,所有work组内的用户在/home/project目录下创建的文件,其他同组用户都有权限操作。 [[email protected] home]# groupadd work [[email protected] home]# gpasswd -a gaogao work Adding user gaogao to group work [[email protected] home]# usermod -G work dengaosky [[email protected] home]# id gaogao uid=1002(gaogao) gid=1002(gaogao) groups=1002(gaogao),1003(work) [[email protected] home]# id dengaosky uid=1001(dengaosky) gid=1001(dengaosky) groups=1001(dengaosky),1003(work) [[email protected] home]# mkdir project [[email protected] home]# ll -d project drwxr-xr-x. 2 root root 6 Nov 3 12:03 project [[email protected] home]# chmod 770 project [[email protected] home]# ll -d project drwxrwx---. 2 root root 6 Nov 3 12:03 project [[email protected] home]# chgrp work project/ [[email protected] home]# ll -d project/ drwxrwx---. 2 root work 6 Nov 3 12:03 project/ [[email protected] home]# chmod g+s /home/project [[email protected] home]# ll -d project/ drwxrws---. 2 root work 18 Nov 3 13:07 project/ 接着来看下效果:现在在dengaosky账号下操作 [[email protected] ~]# su - dengaosky [[email protected] ~]$ ll -d /home/project/ drwxrws---. 2 root work 6 Nov 3 13:10 /home/project/ [[email protected] ~]$ cd /home/project/ [[email protected] project]$ echo "123" > dengaosky.txt [[email protected] project]$ ll dengaosky.txt #发现创建的文件的权限的所有者是work -rw-rw-r--. 1 dengaosky work 4 Nov 3 13:11 dengaosky.txt 然后登陆gaogao账号验证下,发现可以正常操作上面的dengaosky.txt文件。 [[email protected] ~]# su - gaogao [[email protected] ~]$ cd /home/project/ [[email protected] project]$ ll dengaosky.txt -rw-rw-r--. 1 dengaosky work 4 Nov 3 13:11 dengaosky.txt [[email protected] project]$ echo "gaogao123123" > dengaosky.txt [[email protected] project]$ cat dengaosky.txt gaogao123123 [[email protected] project]$ touch gaogao.txt [[email protected] project]$ ll -rw-rw-r--. 1 gaogao work 0 Nov 3 13:12 gaogao.txt -rw-rw-r--. 1 dengaosky work 16 Nov 3 13:12 dengaosky.txt ******************************************************************************************************************************** 小知识点: 将一个用户添加到一个组内的两种方法: "gpasswd -a 用户名 组名" "usermod -G 组名 用户名" 将一个用户从组内删除 "gpasswd -d 用户名 组名 " ******************************************************************************************************************************* 3)t权限:只能针对目录而言,对文件来说无效!当用户对目录拥有wx权限时,用户在该目录创建的文件或目录,只有自己与root才可以删除。 案例说明: [[email protected] src]#cd /usr/local/src [[email protected] src]# touch aa [[email protected] src]# ll 总用量 0 -rw-rw-r--. 1 root root 0 8月 28 05:21 aa 【注意,设置sgid权限,要保证文件的所属组有操作权限】 [[email protected] src]# chown wutao.wutao aa [[email protected] src]# ll 总用量 0 -rw-r--r--. 1 wutao wutao 0 8月 28 05:15 aa [[email protected] src]# su - dengaosky [[email protected] ~]$ cd /usr/local/src/ [[email protected] src]$ ls aa [[email protected] src]$ echo 123 > aa 由于a文件是wutao帐号下的文件,dengaosky用户没有操作权限 -bash: aa: 权限不够 [[email protected] src]$ 现在给a文件设置sgid权限,那么dengaosky用户只要在wutao组内,就能对a文件有操作权限 ******************************************************************************************************************************* 小知识点: 将一个用户拉到一个组内的两种方法: "gpasswd -a 用户名 组名" "usermod -G 组名 用户名" 将一个用户从组内删除 "gpasswd -d 用户名 组名 " ******************************************************************************************************************************* [[email protected] src]# chmod 2664 aa 【设置sgid权限】 [[email protected] src]# ll 总用量 0 -rw-rwSr--. 1 wutao wutao 0 8月 28 05:21 aa [[email protected] src]# gpasswd -a dengaosky wutao 【将dengaosky用户拉到wutao组内】 Adding user dengaosky to group wutao [[email protected] src]# id dengaosky uid=501(dengaosky) gid=501(dengaosky) 组=501(dengaosky),500(wutao) [[email protected] src]# su - dengaosky [[email protected] ~]$ cd /usr/local/src/ [[email protected] src]$ echo 123 > aa 这样,dengaosky用户就能草组aa文件了 [[email protected] src]$ 针对t权限的例子: 注意:t权限只对目录设置有效! /tmp目录是linux下的一个临时目录,一般会设置777权限,为了方面其他用户都能在这个目录下操作,其实就是一个共用目录,大家都可以用! 但有时有些目录在tmp下存放自己的比较重要的文件,不想让其他用户操作,安全起见,会给tmp目录设置t权限! [[email protected] ~]# ll -d /tmp drwxrwxrwx. 20 root root 4096 8月 28 05:32 /tmp 【tmp临时目录是777权限】 [[email protected] ~]# su - wutao [[email protected] ~]$ cd /tmp/ [[email protected] tmp]$ vim sss [[email protected] tmp]$ ll sss -rw-rw-r--. 1 wutao wutao 7 8月 28 05:33 sss 【这个文件所有者是wutao】 [[email protected] tmp]$ logout [[email protected] ~]# su - dengaosky [[email protected] ~]$ ll /tmp/sss 【其他用户对tmp临时目录下非自己所创建的文件也开可以操作】 -rw-rw-r--. 1 wutao wutao 7 8月 28 05:33 /tmp/sss [[email protected] ~]$ echo 123123 > /tmp/s 现在为了安全起见,在tmp临时目录下创建的文件,除了自己和root外,其他用户都不能操作。也就是非共用了!! 那么这个时候就要给tmp设置t权限了! [[email protected] ~]# ll -d /tmp drwxrwxrwx. 20 root root 4096 8月 28 05:33 /tmp [[email protected] ~]# chmod 1777 /tmp 【设置t权限】 [[email protected] ~]# ll -d /tmp drwxrwxrwt. 20 root root 4096 8月 28 05:33 /tmp [[email protected] ~]# su - dengaosky [[email protected] ~]$ ll -d /tmp drwxrwxrwt. 20 root root 4096 8月 28 05:37 /tmp [[email protected] ~]$ ll /tmp/sss -rw-rw-r--. 1 wutao wutao 4 8月 28 05:36 /tmp/sss [[email protected] ~]$ echo 555 > /tmp/sss -bash: /tmp/sss: 权限不够 [[email protected] ~]$ 这个时候,dengaosky用户就不能操作sss文件了。如果要想再拥有操作权限,可以把dengaosky用户加到wutao组内,因为sss文件所在组有w写权限。
(5)sudo权限
一般情况下,使用su命令在用户之间切换,需要知道对方密码。比如su切换到root下,需要知道root密码。 但使用sudo命令,就不需要知道root密码,只需要输入自己账号密码即可!前提是需要将相关账号设置sudo权限 sudo权限: 是为了让普通用户执行只有root用户才能执行的操作命令(这种方式无需知道root密码) sudo所在文件:/etc/sudoers,编辑该文件的命令是visudo,不过只能在root账号下可以使用该命令,且如果上一次visudo编译未退出状态下,不能重新visudo进行编辑(也可以直接vi编辑/etc/sudoers文件) 强烈推荐使用visudo命令修改sudoers,因为它会帮你校验文件配置是否正确,如果不正确,在保存退出时就会提示你哪段配置出错的。 sudo的工作过程如下: 1)当用户执行sudo时,系统会主动寻找/etc/sudoers文件,判断该用户是否有执行sudo的权限 2)确认用户具有可执行sudo的权限后,让用户输入用户自己的密码确认 3)若密码输入成功,则开始执行sudo后续的命令 4)root执行sudo时不需要输入密码(eudoers文件中有配置root ALL=(ALL) ALL这样一条规则) 5)若欲切换的身份与执行者的身份相同,也不需要输入密码 Sudo的特性: sudo能够限制用户只在某台主机上运行某些命令。 sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器。 sudo使用时间戳文件来执行类似的"检票"系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票(这个值可以在编译的时候改变)。也就是说,我刚刚输入了sudocat /etc/issue 然后可以再次只需要输入cat/etc/issue即可,不需要再次输入sudo。 sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在/etc/sudoers,属性必须为0411。 --------------------------------------------------------------------------------------------------------------------------------------------- su和sudo切换命令的时候,注意有个- 加-,表示不仅切换到用户下,连同用户的系统环境变量也切换进来了 【切换前后执行env看下环境变量】 不加-,表示仅仅切换到用户状态下,用户的系统环境变量没有切换进来 su root 仅仅切换到root用户状态下,root的系统环境变量没有切换过来 【比如说有些只能在root下操作的命令,不加-虽然切换到root下了,但是还不能操作】 su - root 不仅切换到root下了,root的系统环境变量也切换过来了 --------------------------------------------------------------------------------------------------------------------------------------------- 常用sudo权限的安全设置一般可以满足下面4个条件: 1.禁止普通用户使用sudo 命令切换到root模式下 2.用户使用sudo命令,必须每次都输入密码 3.用户组管理(组内添加和删除用户)以及组权限管理设置 4.使用别名(用户名以及命令的别名)进行设置 1.禁止普通用户使用sudo su切换到root用户模式下 总所周知,只要给普通用户设置了sudo权限,那么它就可以使用"sudo su root"命令切换到root用户下(只要知道自己的密码即可,sudo权限只要输入自己的密码),这是很不安全的。必须禁止这种做法。 只需要在sudo的配置文件里添加下面内容即可。 sudo切换到root模式下有以下几种方式: 1)sudo su - 2)sudo -s 3)sudo su root 4)sudo su - root 5)sudo -u root su 在root账号下输入visudo(或/etc/sudoers)命令,设置如下: 如上设置,表示dengaosky用户在使用sudo权限后,禁止使用bash和su命令。也就是说:禁止了该用户使用sudo切换到root模式下了。 其中: !/bin/bash 是禁止了sudo -s的切换 !/bin/su 是禁止了sudo中带su的切换 ************************************禁止账号间使用su命令切换************************************ su的缺点 1)不安全su工具在多人参与的系统管理中,并不是最好的选择,su只适用于一两个人参与管理的系统,毕竟su并不能让普通用户受限的使用;超级用户root密码应该掌握在少数用户手中。 2)麻烦:需要把root密码告知每个需要root权限的人。 可以在/etc/pam.d/su文件里设置禁止用户使用su命令 #vim /etc/pam.d/su auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. #auth required pam_wheel.so use_uid 以上标红的两行是默认状态,这种状态下是允许所有用户间使用su命令进行切换的! 如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令。 如果注释第一行,开启第二行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。 ****************************************************************************************** 以上设置表示:dengaosky账号在使用sudo时不享有root用户状态下的权限,即sudo状态下享有除root之外的其他用户状态下的权限。 默认是(ALL),即sudo享有所有用户状态下的权限。 -------------------------------------------------------------------------------------------------------------- root ALL=(ALL) ALL 以上是/etc/sudoers配置文件中默认定义的用户sudo设置,其中解释如下: 1)第一个字段root指定的是用户:可以是用户名,也可以是别名。每个用户设置一行,多个用户设置多行,也可以将多个用户设置成一个别名后再进行设置。 2)第二个字段ALL指定的是用户所在的主机:可以是ip,也可以是主机名,表示这个sudo设置后的文件(/etc/sudoers)只在这个主机上生效,ALL表示在所有主机上都生效!限制的一般都是本机,也就是限制使用这个文件的主机,如果指定为:192.168.1.88= 表示这个文件只有在这台主机上生效,如果拷贝到别的机子上是不起作用的!一般都指定为:ALL 表示所有的主机,不管文件拷到那里都可以用。 3)第三个字段(ALL)括号里指定的也是用户:指定以什么用户身份执行sudo,即使用sudo后可以享有所有账号下的权限。如果要排除个别用户,可以在括号内设置,比如ALL=(ALL,!root,!ops)。也可以设置别名 4)第四个字段ALL指定的是执行的命令:即使用sudo后可以执行所有的命令。也可以设置别名 -------------------------------------------------------------------------------------------------------------- 2.用户使用sudo命令,必须每次都输入密码 在/etc/sudoers文件里添加内容"Defaults timestamp_timeout=0" 即表示每次使用sudo命令时都要输入密码。 ----------------------------------------------------------------------------------------- 还可以通过设置命令的别名进行权限设置。 即将一系列命令放在一起设置一个别名,然后对别名进行权限设置。注意:别名一定要是大写字母。 Delegating permissions 代理权限相关命令别名 以上设置说明: wnagshibo用户在sudo权限下只能使用ls,rm,tail命令 ---------------------------------------------------------------------------------------- 3.用户组管理(组内添加和删除用户)以及组权限管理设置 进行用户权限管理,设置sudo权限时,可以设置组的权限,不同的组有不同的权限,然后将用户拉到相应权限的组内。 将一个用户拉入到一个组内,有下面两种方法: 1)usermod -G 组名 用户名 2)gpasswd -a 用户名 组名 #添加到组内 gpasswd -d 用户名 组名 #从组内删除 以上设置表示wheel组内的用户在使用sudo权限后,禁止使用bash和su命令,也就是禁止了该组内用户使用sudo切换到root模式下了。 4.使用别名进行sudo权限设置。 Alise设置别名有以下四种情况: Host_Alias Cmnd_Alias User_Alias Runas_Alias 1)配置Host_Alias:就是主机的列表,可以使用主机名,也可以使用ip,不过在同一个别名内不能同时混用主机名和ip地址! Host_Alias HOST_FLAG = hostname1, hostname2, hostname3 Host_Alias HOST_FLAG1 = 192.168.1.12, 192.1681.13, 192.168.1.14 Host_Alias HOST_FLAG2 = hostname1, 192.1681.13, 192.168.1.14 #这种设置是错误的!不能在同一个别名内混用主机名和ip 2)配置Cmnd_Alias:就是允许执行的命令的列表,命令前加上!表示不能执行此命令. 命令一定要使用绝对路径,避免其他目录的同名命令被执行,造成安全隐患,因此使用的时候也是使用绝对路径! Cmnd_Alias COMMAND_FLAG = command1, command2, command3 ,!command4 3)配置User_Alias:就是具有sudo权限的用户的列表 User_Alias USER_FLAG = user1, user2, user3 4)配置Runas_Alias:就是用户以什么身份执行(例如root)的列表 Runas_Alias RUNAS_FLAG = operator1, operator2, operator3 使用别名配置权限的格式如下: USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG 如果不需要密码验证的话,则按照这样的格式来配置 USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD:COMMAND_FLAG 案例说明: 例如1:把wangsb,wangbz,songj用户设置成别名ADMINS,都拥有duso权限 #visudo User_Alias ADMINS = wangsb, songj,wangbz ...... ADMINS ALL=(ALL) ALL 例如2:把visudo、chown、chmod等命令设置成别名DELEGATING,别名ADMINS里面的用户都禁用DELEGATING里面的命令 #visudo Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp ...... ADMINS ALL=(ALL) ALL,!DELEGATING ....... 综合使用: [[email protected] ~]# visudo ........ User_Alias ADMINS = wangbz,zhoulw,songj,wangsb ....... Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp ....... root ALL=(ALL) ALL ADMINS ALL=(ALL) ALL,!DELEGATING,!/bin/bash,!/bin/su ....... Defaults timestamp_timeout = 0 其他的可以参考:sudo命令使用的几个场景 ----------------------------------------------------------------------- 下面是在线上服务器上用过的一个小设置: [[email protected]_web1 ~]# visudo ....... Defaults timestamp_timeout=0 //表示每次sudo时都要强行输入密码 ....... kevin ALL=(ALL) /usr/bin/tail,/bin/gzip,/usr/bin/vim,/bin/chown,/bin/chmod,/Data/app/nginx/sbin/nginx //kevin用户在使用sudo时只能使用这几个命令,其他sudo命令全部禁止! grace ALL=(ALL) ALL,!/bin/bash,!/bin/su,!/bin/chown,!/bin/chmod,!/sbin/init,!/sbin/reboot,!/sbin/poweroff //grace用户使用sudo时,禁止后面设置的命令,其他的都可以使用。 ------------------------------------------------------------------------------------------------------------------- 最后解释下sudo权限配置文件: 使用visudo命令打开sudo配置文件,如下: ## Sudoers allows particular users to run various commands as ## the root user, without needing the root password. ## 该文件允许特定用户像root用户一样使用各种各样的命令,而不需要root用户的密码 ## ## Examples are provided at the bottom of the file for collections ## of related commands, which can then be delegated out to particular ## users or groups. ## 在文件的底部提供了很多相关命令的示例以供选择,这些示例都可以被特定用户或 ## 用户组所使用 ## ## This file must be edited with the 'visudo' command. ## 该文件必须使用"visudo"命令编辑 ## Host Aliases ## Groups of machines. You may prefer to use hostnames (perhaps using ## wildcards for entire domains) or IP addresses instead. ## 对于一组服务器,你可能会更喜欢使用主机名(可能是全域名的通配符) ## 、或IP地址,这时可以配置主机别名 # Host_Alias FILESERVERS = fs1, fs2 # Host_Alias MAILSERVERS = smtp, smtp2 ## User Aliases ## These aren't often necessary, as you can use regular groups ## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname ## rather than USERALIAS ## 这并不很常用,因为你可以通过使用组来代替一组用户的别名 # User_Alias ADMINS = jsmith, mikem ## Command Aliases ## These are groups of related commands... ## 指定一系列相互关联的命令(当然可以是一个)的别名,通过赋予该别名sudo权限, ## 可以通过sudo调用所有别名包含的命令,下面是一些示例 ## Networking 网络操作相关命令别名 # Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient , /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig , /sbin/mii-tool ## Installation and management of software 软件安装管理相关命令别名 # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum ## Services 服务相关命令别名 # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig ## Updating the locate database 本地数据库升级命令别名 # Cmnd_Alias LOCATE = /usr/bin/updatedb ## Storage 磁盘操作相关命令别名 # Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe , /bin/mount, /bin/umount ## Delegating permissions 代理权限相关命令别名 # Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp ## Processes 进程相关命令别名 # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall ## Drivers 驱动命令别名 # Cmnd_Alias DRIVERS = /sbin/modprobe # Defaults specification # # Disable "ssh hostname sudo <cmd>", because it will show the password in clear. # You have to run "ssh -t hostname sudo <cmd>". # 一些环境变量的相关配置,具体情况可见man soduers Defaults requiretty Defaults env_reset Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin ## Next comes the main part: which users can run what software on ## which machines (the sudoers file can be shared between multiple ## systems). ## 下面是规则配置:什么用户在哪台服务器上可以执行哪些命令(sudoers文件可以在多个系统上共享) ## Syntax(语法): ## ## user MACHINE=COMMANDS 用户 登录的主机=(可以变换的身份) 可以执行的命令 ## ## The COMMANDS section may have other options added to it. ## 命令部分可以附带一些其它的选项 ## ## Allow root to run any commands anywhere ## 允许root用户执行任意路径下的任意命令 root ALL=(ALL) ALL ## Allows members of the 'sys' group to run networking, software, ## service management apps and more. ## 允许sys中户组中的用户使用NETWORKING等所有别名中配置的命令 # %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE , DRIVERS ## Allows people in group wheel to run all commands ## 允许wheel用户组中的用户执行所有命令 %wheel ALL=(ALL) ALL ## Same thing without a password ## 允许wheel用户组中的用户在不输入该用户的密码的情况下使用所有命令 # %wheel ALL=(ALL) NOPASSWD: ALL ## Allows members of the users group to mount and unmount the ## cdrom as root ## 允许users用户组中的用户像root用户一样使用mount、unmount、chrom命令 # %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom ## Allows members of the users group to shutdown this system ## 允许users用户组中的用户关闭localhost这台服务器 # %users localhost=/sbin/shutdown -h now ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment) ## 读取放置在/etc/sudoers.d/文件夹中的文件(此处的#不意味着这是一个声明) #includedir /etc/sudoers.d
以上是关于linux系统下的权限知识梳理的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )(代码片段