一、用户身份与文件权限
1、文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉。
隐藏权限,不能用常规的ls命令查看,需使用专用的查看命令lsattr。
1)chattr 命令:用于设置文件的隐藏权限,语法格式为:“chattr [参数] 文件名称”。
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。
2)lsattr 命令: 用于查看文件的隐藏权限,语法格式为:“lsattr [参数] 文件名称”。
chattr命令中的参数及其作用
参数 | 作用 |
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
例:为文件赋予隐藏权限‘a’
一般将-a参数设置到日志文件(/var/log/messages)上面,这样在不影响系统正常写入日志的前提下,还可以防止黑客清理自己的作案证据。
如果希望彻底的保护起某个文件,不允许任何人修改和删除它的话,可以加上-i参数。
2、文件访问控制列表
前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性——权限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件访问控制列表(FACL,File Access Control Lists)了。
基于普通文件或目录设置ACL访问控制其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准的派发权限。
另外,如果针对某个目录设置了ACL,则目录中的文件会继承其权限;
若针对文件设置了ACL,则文件不再继承其所在目录的权限。
1)setfac l命令:用于管理文件的ACL权限规则,语法格式为:“ setfacl [参数] 文件名称”。
ACL权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。
其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。
setfacl命令中的参数以及作用:
参数 | 作用 |
-m | 修改权限 |
-M | 从文件中读取权限 |
-x | 删除某个权限 |
-b | 删除全部权限 |
-R | 递归子目录 |
例:创建happy文件夹并赋予777权限;创建两个用户;
对lisi设置happy文件夹的ACL,使lisi对happy文件夹没有任何权限,此时lisi无权限访问happy目录:
设置权限后可以访问:
对文件设置ACL后,文件的权限最后一个点(.)变成了加号(+)。
2)getfacl 命令:用于查看文件的ACL权限规则,语法格式为:“ getfacl [参数] 文件名称”。
ACL权限还可以针对某个用户组来设置,
例如允许某个组的用户都可以读写/etc/fstab个文件:
如果设置错了想删除,则可以使用-b参数清除所有ACL权限:
指定删除某一条权限可以用-x参数:
为避免错误设置权限导致覆盖文件原始的权限信息,可以操作前备份一下。
例:将/home目录上的ACL权限备份一份,使用-R递归参数,将目录本身及目录中的文件权限都自动备份,同时再外加上输出重定向操作,可以将原始权限配置信息保存到某个文件中。
注:getfacl在备份目录权限时不能使用绝对路径的形式,需要先切换到最上层根目录,然后再进行操作:
若此时我们修改了facl想恢复:
删除lisi权限:
恢复备份,使用--restore:
3、su命令与sudo命令
1)su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户:
注:su - 表示完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
当从root管理员切换到普通用户时无需密码验证,而从普通用户切换成root管理员就需要进行密码验证;使用su命令后,普通用户可以完全切换到root管理员,但这将暴露root密码,从而增大了系统密码泄露的几率,并不安全。
可以使用sudo命令避免上述问题。
2)sudo 命令:用于给普通用户提供额外的权限,语法格式为:“ sudo [参数] 用户名”。
使用sudo命令可以给普通用户提供额外的权限来完成原本只有root管理员才能完成的任务。可以限制用户执行指定的命令、记录用户执行过的每一条命令、集中的管理用户与权限(/etc/sudoers)以及验证密码后一段时间内免验证的方便措施。常见的sudo命令可用参数如下所示:
sudo命令中的可用参数以及作用
参数 | 作用 |
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
可以通过修改配置文件(/etc/sudoers),也可以使用sudo命令提供的visudo命令来配置用户权限。
3)visudo 命令:用于编辑配置用户sudo权限文件,语法格式为:“ visudo [参数]”。此命令会自动调用vi编辑器来配置/etc/sudoers权限文件,能够解决多个用户同时修改权限而导致的冲突问题。
规则如下:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
谁可以使用:稍后要为那位用户进行命令授权。
允许使用的主机:可以填写ALL代表不限制来源主机,亦可填写如192.168.10.0/24的网段限制来源地址,只有从允许网段登录时才能使用sudo命令。
以谁的身份:可以填写ALL代表系统最高权限,也可以是另外一位用户的名字。
可执行命令的列表:可以填写ALL代表不限制命令的列表,亦可填写如/usr/bin/cat的文件名称来限制命令列表,多个命令文件之间用逗号(,)间隔。
注:切记一定要给出可执行命令的绝对路径
例:使zhangsan可以使用任何主机,以管理员的身份,执行重启命令。
注:在Linux系统中配置服务文件时,新增的参数位置不建议太靠上,避免服务一些必要的功能没加载完成时,我们填写的新参数不被执行成功。一般会在配置文件中找一下相似的参数,然后在相邻位置进行新的修改,或者选择文件的中下部位置。
二、存储结构与管理硬盘
1、一切从“/”开始
Linux系统中的一切文件都是从“根(/)”目录开始的,并按照文件系统层次化标准(FHS:Filesystem Hierarchy Standard)采用倒树状结构来存放文件,以及定义了常见目录的用途。
在Linux系统中,最常见的目录以及所对应的存放内容如下表所示。
Linux系统中常见的目录名称以及相应内容:
目录名称 | 应放置文件的内容 |
/boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
/dev | 以文件形式存放任何设备与接口 |
/etc | 配置文件 |
/home | 用户主目录 |
/bin | 存放单用户模式下还可以操作的命令 |
/lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
/sbin | 开机过程中需要的命令 |
/media | 用于挂载设备文件的目录 |
/opt | 放置第三方的软件 |
/root | 系统管理员的家目录 |
/srv | 一些网络服务的数据文件目录 |
/tmp | 任何人均可使用的“共享”临时目录 |
/proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
/usr/local | 用户自行安装的软件 |
/usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
/usr/share | 帮助与说明文件,也可放置共享文件 |
/var | 主要存放经常变化的文件,如日志 |
/lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
在Linux系统中另外还有一个重要的概念—路径。路径指的是如何定位到某个文件,分为绝对路径与相对路径。绝对路径指的是从根目录(/)开始写起的文件或目录名称,而相对路径则指的是相对于当前路径的写法。
2、物理设备的命名规则
常见的硬件设备及其文件名称:
硬件设备 | 文件名称 |
IDE设备 | /dev/hd[a-d] |
SCSI/SATA/U盘 | /dev/sd[a-z] |
virtio设备 | /dev/vd[a-z] |
软驱 | /dev/fd[0-1] |
打印机 | /dev/lp[0-15] |
光驱 | /dev/cdrom |
鼠标 | /dev/mouse |
磁带机 | /dev/st0或/dev/ht0 |
一台主机上可以有多块硬盘,因此系统采用a~z来代表24块不同的硬盘(默认从a开始分配),而且硬盘的分区编号也有讲究:
主分区或扩展分区的编号从1开始,到4结束;
逻辑分区从编号5开始。
注:/dev目录中sda设备之所以是a,并不是由插槽决定的,而是由系统内核的识别顺序来决定的。
sda3只能表示是编号为3的分区,而不能判断sda设备上已经存在了3个分区。
例:/dev/sda5表示:系统中第一块被识别到的硬件设备中分区编号为5的逻辑分区的设备文件。
硬盘设备是由大量的扇区组成的,每个扇区的容量为512字节。其中第一个扇区最重要,它里面保存着主引导记录与分区表信息。就第一个扇区来讲,主引导记录需要占用446字节,分区表为64字节,结束符占用2字节;其中分区表中每记录一个分区信息就需要16字节,这样一来最多只有4个分区信息可以写到第一个扇区中,这4个分区就是4个主分区。第一个扇区中的数据信息如图6-3所示。
那么每块硬盘最多只能创建出4个分区吗?明显不够用也不合情理。
为了解决分区个数不够的问题,可以将第一个扇区的分区表中16字节(原本要写入主分区信息)的空间(称之为扩展分区)拿出来指向另外一个分区。也就是说,扩展分区其实并不是一个真正的分区,而更像是一个占用16字节分区表空间的指针—一个指向另外一个分区的指针。这样一来,用户一般会选择使用3个主分区加1个扩展分区的方法,然后在扩展分区中创建出数个逻辑分区,从而来满足多分区(大于4个)的需求。
注:扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向其它分区的指针,这种指针结构将形成一个单向链表。因此扩展分区自身不能够存储数据,用户需要在其指向的对应分区上进行操作,称之为逻辑分区。