zoukankan      html  css  js  c++  java
  • linux权限问题学习总结

    寒假里看的权限问题,现在来总结一下。

    文件权限除了r、w、x外还有s、t、i、a权限:

    1、s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(chmod命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)

    2、t :设置粘着位,一个文件可读写的用户并一定相让他有删除此文件的权限,如果文件设置了t权限则只用属主和root有删除文件的权限,通过chmod +t filename 来设置t权限

    这里关于粘着位有个概念,举个例子,linux中有一个存放临时文件的目录/tmp,每个用户产生的临时文件都存放在此目录下,也就是说每个用户对/tmp目录都应该有写权限(否则无法拷贝生成文件),这样造成一个问题,比如,zrq在/tmp目录下创建了一个文件,cz看着不爽就删掉,这如何控制?但其实这种情况不会发生,因为/tmp目录有个特殊的标记 可以用ls -ld /tmp看一下

    drwxrwxrwt 20 root root 4096 2013-03-21 16:39 /tmp/

    可以看到后面有个t,那就是粘着位或者也叫粘滞位权限,定义为:比如说权限为777的目录设置粘着位t以后,具有写权限每个用户都可以在目录下创建文件,不同的是每个用户只能删除自己是所有者的文件,也就是说只能删除自己创建的文件。

    3、chatrr

    chatrr只有root用户可以使用,用来修改文件的权限属性,建立凌驾于rwx基础权限之上的授权 有两个常用选项。

    i:不可修改权限  例:chattr u+i filename 则filename文件就不可修改,无论任何人,如果需要修改需要先删除i权限,用chattr -i filename就可以了。查看文件是否设置了i权限用lsattr filename。

    如果目录有此属性,系统只允许在目录下建立和修改文件,而不允许删除任何文件。

    a:只追加权限, 对于日志系统很好用,这个权限让目标文件只能追加,不能删除,而且不能通过编辑器追加。可以使用chattr +a设置追加权限。举个例子,比如说每天自动化实现把上海服务器的日志通过scp和rsync远程备份到北京的备份服务器上,就可以设置成只可以追加但不可以删除。

    chattr命令不宜对目录/、/dev、/tmp、/var等设置,严重者甚至容易导致系统无法启动,比如根目录如果设置了i属性,所以谨慎设置。

    4、如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

    (1)-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置

    (2)-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置

    (3)-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置

    (4)-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被社

    其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是1,表示有相应的权限:

    11 10 9 8 7 6 5 4 3 2 1 0

       S  G T r w x r w x r w x

    第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。

                                           11 10 9 8 7 6 5 4 3 2 1 0

    上面的-rwsr-xr-x的值为: 1  0 0 1 1 1 1 0 1 1 0 1

               -rw-r-Sr--的值为: 0  1 0 1 1 0 1 0 0 1 0 0 

    给文件加SUID和SUID的命令如下:

    (1)chmod u+s filename   设置SUID位

    (2)chmod u-s filename   去掉SUID设置

    (3)chmod g+s filename   设置SGID位

    (4)chmod g-s filename   去掉SGID设置

    也可以使用绝对模式进行设置

    设置suid:将相应的权限位之前的那一位设置为4;

    设置guid:将相应的权限位之前的那一位设置为2;

    设置sticky:将相应的权限位之前的那一位设置为1;

    三者都置位:将相应的权限位之前的那一位设置为4+2+1=7。

    chmod 4764 filename   //设置SUID

    chmod 2764 filename   //设置GUID

    chmod 1764 filename   //设置STICKY

    5、SUID和SGID的详细解析

    由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。首先说普通文件的SUID和SGID的作用。举个例子:

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

    -rwxr-xr-x   1 foo   staff  7734 2013-03-21 1659 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。

    说明一下SGID对目录的影响。SUID对目录没有影响。

    如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话

    6、文件系统权限

    配置文件/etc/fstab保存了linux启动时自动加载的分区信息,/etc/fstab文件中第四项定义了加载时的设置,默认为defaults ,包括rw、suid、dev、exec、auto、nouser、async ,如果想改变整个分区的限定,可以利用这些选项。

    (1) 比如只读分区默认加载分区是可读写rw的,但是如果特殊应用希望分区加载后是只读的,可以做一下设置:
    vi /etc/fstab # 编辑/etc/fstab文件在defaults后加入ro选项(逗号分隔)

    LABEL=/soft /soft ext3 defaults,ro 1 2
    mount -o remount /soft #

    重新加载/soft分区,使设置生效

    如果你不嫌麻烦也可以重启系统,设置同样会生效。
    此时整个/soft分区都是只读的,用root登录后执行:

    touch /soft/testfile
    touch: cannot touch `testfile’: Read-only file system

    会提示/soft分区是只读的,即便牛X到是root也不可以创建文件,这是凌驾于rwx权限之上的文件系统权限。

    (2)数据存储的分区,如用做备份的分区,我们可以增加下安全设置。

    寒假在安装gentoo的时候手册上就有:“为了提高系统的安全性,一部分用户不希望/boot分区自动挂载。这些用户应该用noauto替换defaults。这就表示用户每次使用该分区时,需要手动挂载”。

    gentoo手册上的解释

    /etc/fstab使用一种特殊语法格式。每行都包含六个字段。这些字段之间由空白键(空格键,tab键,或者两者混合使用)分隔。每个字段都有自己的含意:

    第一个字段是对分区的描述,也就是设备文件的路径 第二个字段是分区挂载点,也就是分区应该挂载到的地方 第三个字段给出分区所用的文件系统 第四个字段给出的是挂载分区时mount命令所用的挂载选项。由于每个文件系统都有自己的挂载选项,阅读mount手册(man mount)可以获得所有挂载选项的列表。多个挂载选项之间是用逗号分隔的。第五个字段是给dump使用的,用以决定这个分区是否需要dump。一般情况下,你可以把该字段设为0(零)。第六个字段是给fsck使用的,用以决定系统非正常关机之后文件系统的检查顺序。根文件系统应该为1,而其它的应该为2(如果不需要文件系统自检的话可以设为0)。

    auto选项可以使mount猜测文件系统(推荐对于可移动设备采用这个选项,因为它们可能采用很多不同的文件系统),而user选项使得非root用户可以挂载光驱。

    为了提高性能,大部分用户会添加noatime挂载选项。由于不记录该分区中文件的访问时间,这个选项能够提高系统速度。

    noexec是不执行二进制文件。比如:

    LABEL=/backup /backup ext3 defaults,noexec 1 2
    mount -o remount /backup #

    7、权限之ACL

    linux中默认的权限管理比较菜,难以实现复杂的权限控制,如针对一个文件设置几个用户或用户组具有不同权限,这就需要依靠ACL(Access Control List)访问控制列表实现,可以针对任意指定的用户/用户组分配权限。
    开启分区的ACL功能 ,需要在/etc/fstab文件中加入acl选项,如:

    LABEL=/backup /backup ext3 defaults,acl 1 2

    然后重新加载分区即可生效:
    mount -o remount /backup
    如果想临时生效可不修改/etc/fstab文件,直接执行命令“mount -o remount,acl /backup”即可。
    比如:设定复杂权限控制目录
    设定目录/backup/log用户zhangsan有读写执行权限,用户lisi有读权限,用户wangwu有读写权限,而用户组bakgroup有读和执行权限,则可做如下设置:

    setfacl -m u:zhangsan:rwx,u:lisi:r,u:wangwu:rw,g:bakgroup:rx /backup/log

    setfacl -m可以设置文件/目录的访问权限,至于权限设定的写法包括三个组成部分,第一部分列出设定对象是用户u或用户组g ;第二部分指定用户名或用户组名;第三部分指定访问权限rwx ,设定多组权限中间用逗号分隔。如“u:lisi:r”表示设定用户lisi为只读权限。

    查看目录属性:

    ls -ld /backup/log
    drwxrwxr-x+ 2 root root 4096 2013-03-21 17:23 /backup/log

    会发现文件权限位后增加了一个加号,这说明/backup/log设置了ACL ,同时可以查看其详细的权限设置:

    getfacl /backup/log
    # file: backup/log
    # owner: root
    # group: root
    user::rwx
    user:zhangsan:rwx
    user:lisi:r–
    user:wangwu:rw-
    group::r-x
    group:bakgroup:r-x
    mask::rwx
    other::r-x

    这样即可实现linux中文件/目录的复杂权限控制,要注意的是ACL优先于基本权限设置,也就是说如果默认所属组为rx权限,但是ACL若指定了所属组中某个成员为rwx权限,则此成员拥有rwx权限。

    8、权限之管理员授权

    管理员做为特权用户,很容易误操作造成不必要的损失,再者都是root管理也怪累的,健康的管理方法是linux服务架构好后,可授权普通用户协助完成日常管理。

    Sudo使用简单,管理员root使用visudo命令即可编辑其配置文件/etc/sudoers进行授权,具体格式为:
    用户名/用户组名 主机地址=授权命令(绝对路径)
    如,授权用户zrq可以关机和重启,则添加如下行:

    zrq Helen=/sbin/shutdown,/sbin/reboot

    指定组名用百分号标记,如%admgroup ,多个授权命令之间用逗号分隔。

    用户zrq可以使用sudo查看授权的命令列表:

    提示输入密码为zrq的密码,验证其是否为管理员通过sudo授权的用户,执行命令:

    sudo -l
    Password:
    User zhaoliu may run the following commands on this host:
    (root) /sbin/shutdown
    (root) /sbin/reboot

    sudo /sbin/shutdown -h now
    zrq即可关机,注意命令写绝对路径,或者把/sbin路径导入到用户缺省路径中,否则无法执行。

    例如 授权用户管理Apache。首先要分析授权用户管理Apache至少要实现哪些基本授权:1、可以使用Apache管理脚本 2、可以修改Apache配置文件 3、可以更新网页内容

    假设Aapche管理脚本为/etc/rc.d/init.d/httpd ,满足1,用visudo进行授权:

    zrq Helen=/etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest

    授权用户zrq可以通过Apache管理脚本重新读取配置文件让更改的设置生效(reload)和可以检测Apache配置文件语法错误(configtest),但不允许其执行关闭(stop)、重启(restart)等操作。

    满足2,同样使用visudo授权:

    zrq Helen=/bin/vi /etc/httpd/conf/httpd.conf

    授权用户可以root身份使用vi编辑Apache配置文件。

    以上两种sudo的设置,要特别注意,很多人使用sudo会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令。

    3则比较简单,假设网页存放目录为/var/www/html ,则只需要授权zrq对此目录具有写权限或者索性更改目录所有者为zhaoliu即可,如果需要还可以设置zrq可以通过FTP等文件共享服务更新网页。


    花了点时间学习总结了下权限问题,我感觉无论是在管理服务器还是个人使用过程中都挺有帮助的。

  • 相关阅读:
    Django restfull规范
    Python3中的zip()
    关于负数的isdigit()判断
    Win7 x64安装Paramiko
    深度学习性能提高
    神经网络激励函数
    机器学习十大算法
    深度学习十大框架比较
    python 换行
    python sort() sorted() 与argsort()函数的区别
  • 原文地址:https://www.cnblogs.com/timeship/p/2973977.html
Copyright © 2011-2022 走看看