美文网首页
开发者进阶——浅析linux文件权限设计

开发者进阶——浅析linux文件权限设计

作者: zachary_lee726 | 来源:发表于2023-10-15 15:17 被阅读0次

    一、什么是权限

    在linux系统中主要包含三种权限rwx,rwx权限对于文件和目录而言,分别代表了不同的含义

    tips:这里暂不讨论suid,sgid等复杂权限

    1. rwx的含义——读?写?执行?

    • 对于文件来说:

      r: 读文件内容的权限

      w: 编辑文件内容

      x: 执行文件的权限,例如shell脚本需要有x权限才可以被执行

    • 对于目录来说:

      r: 读取目录下文件列表权限

      w: 新增、删除目录下文件,对已存在的文件或目录改名、移动

      x: 进入目录的权限

    # 如果某个文件的权限设置为rwx,那我可以随意操作这个文件吗?包括cat, vi, mv, rm?
    # 答案:可以cat和vi,  能否mv和rm取决于父级目录的w权限
    
    # 如果某个目录的权限设置为rwx, 那我可以随意操作这个目录下所有文件吗?包括cat, vi, mv, rm?
    # 答案:可以mv和rm,  能否cat和vi取决于子文件的rw权限
    

    tips: 所以,即便我限制了当前文件的权限,但如果父级目录权限没有控制好,这个文件也有可能不翼而飞,反之亦然。

    2. ls -l命令下权限列表的含义

    linux权限ls -l (1).jpg
    1) 第1个字符代表是目录、文件还是软链接
        "-"代表文件,"d"代表目录,"l"代表软链接
        # 扩展:软链接和硬链接有什么区别,两者的rwx权限有何不同
        
    2) 第2-4字符代表owner的权限
    
    3) 第5-7字符代表group的权限
    
    4) 第8-10字符代表others的权限
    
    5) 第11字符代表是否有acl权限设置
    
        "."代表没有配置acl权限,"+"代表有配置有acl权限
    

    如果在src目录下你有一个private目录,不想让领导和其他开发者看,你要怎么设置权限?
    chmod 700 ./private

    tips: 常用命令chmod的744、777的含义

    777.jpg

    将每组3位二进制数转化为十进制,就分别代表各自的权限

    二、怎么改权限

    1. chmod 命令——修改owner, grouper, others权限
    # 递归修改某个目录下所有文件权限
    # drwxrwx---.   aa  agroup  src
    chmod -R 774 ./src
    
    # 修改某个目录的权限
    # drwxrwxr--.   aa  agroup  private
    chmod 700 ./private
    
    # 修改某个文件权限
    # -rwxr--r--.     aa  agroup  README.md
    chmod 764 ./README.md
    
    # 给某个文件去除写权限,增加执行权限
    # -rwxrw-r--.     aa  agroup  README.md
    chmod -w ./README.md
    chmod +x ./README.md
    
    # 细粒度权限配置,u代表owner, g代表group, o代表others
    chmod u=rw,g=rx,o=r /README.md
    
    1. chown 命令——修改文件属主和群属主(需要root权限)
    # 例如:将file文件属主改为${name}, group改为${group}
    chown ${name}:${group} ./file
    
    1. usermod命令——修改用户信息,可以将某用户加入群组,获得该群组权限
    # 例如:将${name}用户加入到docker group
    usermod -aG docker ${name}
    
    1. setfacl——细粒度修改文件权限(赋予某用户特定权限)
    # 对src目录,单独为aa用户配置r-x权限
    setfacl -m u:aa:r-x src/
    # 对test及其下属子目录,单独为myuser用户配置r-x权限
    setfacl -m d:u:myuser:r-x test/
    # 删除test目录的acl配置
    setfacl -b test/
    # 查询用户细粒度配置
    getfacl test/
    

    显示权限列表时,-rwxr-xr-x**+ ** 中"+"代表该文件配置了acl权限

    三、如何用权限

    1. 权限管理的作用

    • 系统保护

      在你的系统中,关于系统服务的文件通常只有root才能读写,系统的重要命令只有root才能执行。

      # 例如:test-api 服务去年有log4j漏洞,假设不法分子侵入行内网络发现并利用这个漏洞植入了脚本
      
      # 如果启动app的用户是appuser,植入的脚本能够获得的权限也只有appuser的权限,无法对其他应用和系统层造成影响,
      # 如果启动app的用户是root,那整个应用层+系统层都有可能被侵入,影响层面会变得非常大。
      
    • 保证应用规范合理

      # 举个testapp的例子,testapp应用会把dsApp上传的文件归档到testapp自己的目录内,如果把这个目录权限放得太大[ rwxrwxrwx ], 当dsApp在sftp过来操作的时候不小心给你把归档目录误删了,会导致很严重的问题,而且追溯和恢复都不简单,最后的责任还很可能是自己,谁让文件权限设置这么大呢?
      
    • 团队开发软件或数据共享

      # 如果你有一个软件开发团队,在你的团队中有三个人aa, bb, cc,你希望每个人都可以使用某一些目录下的文件, 而不是你团队的其他人则不予以开放呢?
      
      # 可以新建一个dev的群组,将aa, bb, cc账号加入dev群组,那么我就可以将团队所需的文件和目录权限订为           [ rwxrwx--- ]来提供给dev的工作团队使用!
      

    2. 权限的使用原则

    • 谨慎使用root用户进行操作

      1)防止误操作造成无法挽回的后果

      # 例如:当开发人员本来想要执行rm -rf ./ 时,输入成了rm -rf / , root用户不会提示,直接执行
      

      2)权限升级容易,权限降级难,用root用户操作衍生出的所有文件的属主都是root

      # 例如我第一次启动一个应用使用的是root账户,假设应用会生成某些目录,比如日志目录,目录的默认权限775,后面学习了权限知识之后知道了不应该用root起应用,我决定直接创建一个新用户去运行应用,会出现什么结果?
      # 新用户启动该应用会报错,因为无法将日志写入到日志目录内。
      
    • 最小可用权限原则——权限层次划分清晰,保证系统层、应用层权限最小可用

      1)应用层:我们应该为每个应用单独创建属于自己应用的用户(有部分应用在安装时会自动生成本应用用户,如nginx)

      # 例如:创建test用户启动test-app,创建mysql用户启动mysql应用,创建nginx用户启动nginx服务;
      # 创建dsapp-sftp用户给ds-app端负责上传文件
      

    2)系统层:创建root权限用户(approot),授予对linux系统熟悉的开发者使用, 如果需要多个root权限用户,可以建立一个root权限组,将用户加入root权限组。

    # 正常情况下,以下常用的系统相关文件,需要root权限用户才能进行修改
    /etc/profile # 环境文件
    /etc/crontab # job文件
    /etc/sudoers # root权限用户文件
    /etc/ssh/sshd_config # ssh配置文件
    /etc/passwd # 用户信息文件
    
    # 以前公司有个同事,在某CSDN上看ssh相关文档去学习私钥登陆服务器,需要配置/etc/ssh/sshd_config,文件里有一项是PasswordAuthentication, 意思是ssh是否允许通过密码登陆,他把这个配置改成了no,导致这台服务器没办法ssh登陆
    # 这个问题一方面说明,熟悉linux系统的开发者才能成为root权限用户的使用者;另一方面也说明要带着批判的眼光去看待开源博客!
    

    四、练习

    1) 假设aa, bb, cc同属于devgroup这个群组,都不属于root群组,如果有下面的两个文件,请说明aa, bb, cc用户对以下两个文件的相关权限为何?
    -rw-r--r-- 1 root root 238 Jun 18 17:22 config.conf
    -rwxr-xr-- 1 bb devgroup 5238 Jun 19 10:25 text.txt

    config.conf text.txt
    aa r rx
    bb r rwx
    cc r rx

    2) 假设有个账号名称为aa,他的home目录在/home/aa/,cloris对此目录具有[rwx]的权限。 若在此目录下有个名为text.data的文件,该文件的权限如下:
    -rwx------ 1 root root 4365 Sep 19 23:20 text.data
    请问aa是否可以读、修改、删除此文件?

        aa不能读和修改这个文件,但可以删除该文件。
    

    3)案例:某服务器目录/home/test 下,交换文件目录名称 EXCHANGE_DIR
    该目录有以下功能:test-app系统向该目录上传交换文件,ds-app系统拉取交换文件,如何设计目录和文件权限?

        分析:为了保证最小权限原则,我们可以创建testusr用户由test-app系统使用,执行交换文件上传,创建dsappusr用户由ds-app使用,执行交换文件下载,因此,testusr用户需要 EXCHANGE_DIR 目录的rwx权限,dsappusr需要 EXCHANGE_DIR 目录的rx权限
    
        方案1)EXCHANGE_DIR目录owner:group为testusr:testusr, 权限设置成775
        方案2)创建exchangegroup群组,将testusr, dsappusr加入exchangegroup, EXCHANGE_DIR目录owner:group设为testusr:exchangegroup, 权限设置成750
        方案3)EXCHANGE_DIR目录owner:group为testusr:testusr, 权限设置成770, 给予dsappusr用户额外权限,即setfacl -m u:dsappusr:r-x EXCHANGE_DIR/,第三种方案更像是前期设计阶段未设计完善而做出的补救措施
    

    除了目录的权限外,那生成的文件权限也可以按同样的方案进行设计

    五、 更多linux资料

    网页版《鸟叔的linux私房菜》:可以系统学习linux相关技能

    http://cn.linux.vbird.org/linux_basic/linux_basic.php

    备注:linux是开发者进阶的必要能力之一!

    扩展思考:

    所以,从权限和安全问题上看,要考虑的问题非常多,那IT行业经历了这么久,有没有一个很好的工具简化权限和安全管理呢?

    有没有一个工具可以做到应用间隔离?

    虚拟化容器技术, 容器技术极大的规范和简化了安全和权限问题,容器的使用使得本来容易被忽略的安全和权限问题,得到了强制规划和预防:

    1)容器的设计鼓励所有应用容器间通过网络进行交互,尽量少通过文件交互,避免了文件权限耦合

    2)容器应用即使遇到安全问题被攻破,影响也不会溢出到容器外

    这也是docker在如今的环境如此盛行的原因,当然使用容器本身也会带来很多技术性难题,这里不做讨论。

    相关文章

      网友评论

          本文标题:开发者进阶——浅析linux文件权限设计

          本文链接:https://www.haomeiwen.com/subject/qbmtidtx.html