zoukankan      html  css  js  c++  java
  • Linux文件系统

    根文件系统: linux识别的第一个与根直接关联的文件系统。

    FHS:LSB组织定义的LINUX发行版基础目录命名法则及功用规定。filesystem hierarchy standard,文件系统层级标准

    一.Linux根简介

    • /boot: 系统引导启动目录
    • /bin:系统相关的二进制程序
    • /sbin:系统相关的管理类基础命令
    • /lib:基础的共享库文件
    • /lib64:专用64系统上的辅助共享库
    • /etc:配置文件
    • /home:家目录
    • /root:管理员家目录
    • /media:便携式移动设备的挂载点
    • /mnt:临时文件系统挂载点
    • /dev:设备文件
    • /opt:第三方安装目录
    • /src:服务类存放目录
    • /tmp:临时文件存放目录
    • /usr:unix software resource
    • /var/cache:应用缓存目录
    • /var/lib:应用库目录
    • /var/local:应用程序可变存储目录
    • /var/lock:锁文件
    • /var/log:日志文件存放目录
    • /var/run:存储进程的pid目录
    • /var/spool:应用程序的数据池
    • /var/tmp:保存系统2次重启之间产生的临时数据
    • /proc:用于输入内核与进程信息相关的虚拟文件系统
    • /sys:用于输出当前系统上硬件设备相关信息的虚拟文件系统
    • /selinux:selinux相关的安全策略等信息

    二、应用程序主要组成部分

    • 二进制程序: /bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
    • 库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
    • 配置文件:/etc,/etc/DIRECTORY,/usr/local/etc
    • 帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man,/usr/local/share/doc

    三、文件系统上的权限

    文件系统上的权限是指文件系统上文件和目录的权限,主要针对三类对象:

    • owner 所有者,u
    • group 所在组,g
    • other 其他,o

    每个文件对每类访问者都定义了三种权限:

      r:readable

      w:writeable

      x:executable

    权限表如下:

    文件类型 读   执行
      文件           
    可查看文件内容:less file1 可修改文件内容 把此文件提请内核启动一个进程
     目录 查看目录文件列表:ls 目录中创建和删除文件 可cd进入目录,ls-l查看目录文件详情列表

    权限表示方

    示例

    [root@centos7 ~]#ll initial-setup-ks.cfg 
    -rw-r--r--. 1 root root 1949 Nov 8 19:34 initial-setup-ks.cfg
    第一个字符“-”表示普通文件;这个位置还可能会出现“l”链接;“d”表示目录
    第二三四个字符“rw-”表示当前所属用户的权限。 所以用数值表示为4+2=6
    第五六七个字符“rw-”表示当前所属组的权限。 所以用数值表示为4+2=6
    第八九十个字符“r--”表示其他用户权限。 所以用数值表示为2
    所以操作此文件的权限用数值表示为662

     文件权限修改:chmod

    修改权限方法:

    #1 : 直接设置所有权限的
    chmod 644 file1
    chmod a=rwx,g=rw,o=--- file1
    #2 : 添加和去除权限的
    chmod a+x file1
    chmod o-x file1
    

     可以指定”-R”选项来递归设置下。

    修改文件所有者权限:chown,chgrp

    # 修改属主和属组
    chown mysql.mysql file.txt
    # 修改属主
    chown mysql file.txt
    # 修改属组
    chown .mysql file.txt
    # 修改属组
    chgrp mysql file.txt
    文件的属主和属组仅root可以修改

    遮罩码:umask

    遮罩码是指创建一个文件或目录时的默认权限

    • file: 666-umask
    注意:对于文件,某类用户的权限减得的结果存在x权限,则将其权限加1
    
    • dir: 777-umask

    umask命令查看和修改umask值

    [root@centos-155 ~]# umask
    0022
    [root@centos-155 ~]# umask 0002
    [root@centos-155 ~]# umask
    0002
    [root@centos-155 ~]# umask 0022
    [root@centos-155 ~]# umask
    0022
    

     四、文件系统上的特殊权限

    在linux文件系统上,有是三个特殊权限,suid,sgid,sticky

    安全上下文:

    前提条件: 进程有属主和属组,文件有属主和属组。

    1. 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否有执行权限。
    2. 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属组。
    3. 进程访问文件时候的权限,取决于进程的发起者。
    4. 进程的发起者同文件的属主,则应用文件的属主权限。
    5. 进程的发起者同文件的属组,则应用文件的属组权限。
    6. 应用文件其他位权限。

    suid:set uid

    前提: 此类文件有可执行权限的命令

    1. 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限。
    2. 启动为进程之后,其进程的属主为原有程序文件的属主

    这个地方有点绕,给大家举个示例吧,如果一个程序文件passwd,属主root,属组root,且属主、 属组和其他人都有执行权限,且还有suid权限,那么zhao用户来执行这个命令的时候,对zhao来说 有执行权限,但是passwd这个进程起来的时候,进程的属主是root,而不是zhao。

    权限设定和查看

    [root@centos-155 bin]# cd /usr/bin                      # 进入bin目录
    [root@centos-155 bin]# ls -l vim                        # 查看默认权限信息
    -rwxr-xr-x. 1 root root 2289640 Aug  2  2017 vim
    [root@centos-155 bin]# chmod u+s vim                    # 添加suid
    [root@centos-155 bin]# ls -l vim                        # 查看
    -rwsr-xr-x. 1 root root 2289640 Aug  2  2017 vim
    [root@centos-155 bin]# chmod a-x vim                    # 去除执行权限
    [root@centos-155 bin]# ls -l vim                        # 查看
    -rwSr--r--. 1 root root 2289640 Aug  2  2017 vim
    [root@centos-155 bin]# chmod a+x vim                    # 恢复执行权限
    [root@centos-155 bin]# chmod u-s vim                    # 去除suid权限
    [root@centos-155 bin]# ls -l vim                        # 查看
    -rwxr-xr-x. 1 root root 2289640 Aug  2  2017 vim
    

     通过上面的实验,可以看出来原有属主有执行权限的时候添加suid对应执行权限位为s,如果 原有属主没有执行权限的时候,添加suid对应的执行权限为S。

    suid设置有风险,普通用户可以通过suid权限临时使用属主身份修改重要文件。慎用!

    sgid

    默认情况下,用户创建文件时候,其属组为此用户所属的基本组。

    一旦目录设置了sgid,则对此目录有写权限的用户在此目录创建的文件所属的组为此目录的属组。

    权限的设定

    chmod g+s dir
    chmod g-s dir
    

     这个权限在团队开发中非常有用的, 一个目录,你创建的文件团队其他人没法访问是不是很尴尬

    sticky

    对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除自己创建的文件。

    权限的设定

    chmod o+t dir
    chmod o-t dir
    

     这个权限在团队开发中是非常有用的,防止恶意删除别人的文件。

    setfaclt用法

    setfacl命令是用来在命令行里设置ACL(访问控制列表)

    选项:

    选项-m(--modify)-M(--modify-file)选项修改文件或目录的acl规则

    选项-x(--remove)-X(--remove-file)选项删除acl规则。

    选项-m-x后边跟以acl规则。多条acl规则以逗号(,)隔开

    getfacl命令来查看一个定义好了的ACL文件:

    [root@localhost ~]# getfacl ./test.txt
    # file: test.txt
    # owner: root
    # group: admin
    user::rw-
    user:john:rw-
    group::rw-
    group:dev:r--
    mask::rw- other::r--

    user::rw-       定义了ACL_USER_OBJ, 说明file owner拥有read and write permission
    user:john:rw-   定义了ACL_USER,这样用户john就拥有了对文件的读写权限,实现了我们一开始要达到的目的
    group::rw-      定义了ACL_GROUP_OBJ,说明文件的group拥有read and write permission
    group:dev:r--   定义了ACL_GROUP,使得dev组拥有了对文件的read permission
    mask::rw-       定义了ACL_MASK的权限为read and write
    other::r--      定义了ACL_OTHER的权限为read

    --omit-header来省略掉前面三个以#开头的定义了文件名,file owner和group

    下面我们就来看一下怎么设置test.txt这个文件的ACL让它来达到我们上面的要求

    一开始文件没有ACL的额外属性:

    [root@localhost ~]# ls -l
    -rw-rw-r-- 1 root admin 0 Jul 3 22:06 test.txt
    
    [root@localhost ~]# getfacl --omit-header ./test.txt
    user::rw- group::rw- other::r--

    我们先让用户john拥有对test.txt文件的读写权限:

    [root@localhost ~]# setfacl -m user:john:rw- ./test.txt
    [root@localhost ~]# getfacl --omit-header ./test.txt
    user::rw-
    user:john:rw-
    group::rw-
    mask::rw-
    other::r--

    在文件permission的最后多了一个+号,当任何一个文件拥有了ACL_USER或者ACL_GROUP的值以后我们就可以称它为ACL文件,这个+号就是用来提示我们的。我们还可以发现当一个文件拥有了ACL_USER或者ACL_GROUP的值时ACL_MASK同时也会被定义。

    接下来我们来设置dev组拥有read permission:

    [root@localhost ~]# setfacl -m group:dev:r-- ./test.txt
    [root@localhost ~]# getfacl --omit-header ./test.txt
    user::rw-
    user:john:rw-
    group::rw-
    group:dev:r--
    mask::rw-
    other::r--

    ACL_MASK

    让我们来看下面这个例子:

    [root@localhost ~]# ls -l
    -rwxrw-r-- 1 root admin 0 Jul 3 23:10 test.sh

    这里说明test.sh文件只有file owner: root拥有read, write, execute/search permission。admin组只有read and write permission,现在我们想让用户john也对test.sh具有和root一样的permission。

    [root@localhost ~]# setfacl -m user:john:rwx ./test.sh
    [root@localhost ~]# getfacl --omit-header ./test.sh
    user::rwx user:john:rwx
    group::rw-
    mask::rwx
    other::r--
    [root@localhost ~]# ls -l
    -rwxrwxr--+ 1 root admin 0 Jul 3 23:10 test.sh
     那么如果现在admin组的用户想要执行test.sh的程序会发生什么情况呢?它会被permission deny。原因在于实际上admin组的用户只有read and write permission,这里当中显示的rwx是ACL_MASK的值而不是group的permission。
    
    所以从这里我们就可以知道,如果一个文件后面有+标记,我们都需要用getfacl来确认它的permission,以免发生混淆。
  • 相关阅读:
    KVC KVO
    Objective-C的hook方案(一): Method Swizzling
    Method Swizzle黑魔法,修改 ios 系统类库方法 SEL IMP
    http 请求安全
    块对象block小结(2)
    块对象block小结
    springmvc项目目录总结
    软件开发实用标准流程——文档
    冷知识:反常识的margin-top与padding-top与%,你被坑过吗?
    菜鸟笔记:在公司内网下搭好Java项目环境(IDEA、maven、svn)
  • 原文地址:https://www.cnblogs.com/tanxiaojun/p/10425494.html
Copyright © 2011-2022 走看看