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

一、什么是权限

在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在如今的环境如此盛行的原因,当然使用容器本身也会带来很多技术性难题,这里不做讨论。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容