一、什么是权限
在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).jpg1) 第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位二进制数转化为十进制,就分别代表各自的权限
二、怎么改权限
- 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
- chown 命令——修改文件属主和群属主(需要root权限)
# 例如:将file文件属主改为${name}, group改为${group}
chown ${name}:${group} ./file
- usermod命令——修改用户信息,可以将某用户加入群组,获得该群组权限
# 例如:将${name}用户加入到docker group
usermod -aG docker ${name}
- 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在如今的环境如此盛行的原因,当然使用容器本身也会带来很多技术性难题,这里不做讨论。
网友评论