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
文件权限修改: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
安全上下文:
前提条件: 进程有属主和属组,文件有属主和属组。
- 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否有执行权限。
- 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属组。
- 进程访问文件时候的权限,取决于进程的发起者。
- 进程的发起者同文件的属主,则应用文件的属主权限。
- 进程的发起者同文件的属组,则应用文件的属组权限。
- 应用文件其他位权限。
suid:set uid
前提: 此类文件有可执行权限的命令
- 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有执行权限。
- 启动为进程之后,其进程的属主为原有程序文件的属主
这个地方有点绕,给大家举个示例吧,如果一个程序文件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,以免发生混淆。