第二章讲过对于Linux而言一切皆文件,一切文件皆资源,Linux并没有默认权限,也就是说如果当前用户为最高级权限用户不小心该权限用户进行自杀式命令Linux不会进行自我阻止。早期Linux一个shell,一个内核总大小3-4M就能组成一个操作系统,不会存在过多垃圾文件干预用户形式的存在。这是Linux设计哲学思想之一。所以Linux提出了资源访问操作级别用来定义计算资源能力的访问,区别用户资源能力的控制,这就是权限。
    Linux系统有很多权限首先要搞清楚两个重要的模型概念即权限模型和安全模型,其次相对每一个文件的权限粒度的切换控制和用户角度的shell式权限加载次序
    权限模型:UGO/RWX。在Linux系统上每一个资源或服务的权限分别对应了三组用户的访问权限。对于用户而言权限就是获取计算机资源的凭证,而对于计算而言权限就是识别验证用户资源凭证。在计算机的内部定义某资源或文件权限的时候会映射三种权限标识即UGO。属主(U,user首字母),属组(G,group首字母),其他(O,other首字母)。假如有两位用户admin和root登录系统输入ls命令发起ls进程(命令是一个可执行文件,文件执行启动后成为进程故这里ls为进程),同为ls命令,ls进程这时候会寻找哪一位用户发起的对应的属组属主权限。最终两位用户同样的命令发起同样的进程与之对应的权限一定不一样。所以命令发起的进程是否有权限取决于该用户属组属主的权限。
    UGO分别对应三类权限RWX。三类权限三位一体。U对应着一组RWX,G对应着RWX,O对应着RWX。
    对于文件来讲R:可读,可以使用文本查看命令读取内容;W可写,可以使用文本编辑命令编辑或者删除文件;X可执行,可以适用命令提示符提交给内核执行。
    对于目录来讲R:可读,可以列出此目录下所有文件;W可写,可以在此目录下创建文件;X执行,可以切换进此目录,也可以查看内部文件的详细信息(没有X权限不能使用ls -l 列出详细信息)。
    权限模型的三位一体分别用2进制表示每一位只有一种变化。如果说无权限用0表示,有权限用1表示
    000 —-; 无权限
    001 —x; 执行
    010 -x-; 写
    011 -wx; 写和执行
    100 r—; 只读
    101 r-x; 读和执行
    110 rw-; 读写
    111 rwx; 读写执行
    2位二进制相当于4进制,3位二进制相当于8进制,4位二进制相当于16进制。如果将上面演算成8进制
    000 —-; 无权限 0(8进制表示)
    001 —x; 执行 1
    010 -x-; 写 2
    011 -wx; 写和执行 3
    100 r—; 只读 4
    101 r-x; 读和执行 5
    110 rw-; 读写 6
    111 rwx; 读写执行 7
    安全模型:也称作安全上下文。上面讲到,当不同的用户发起命令启动进程,而进程是用户操作计算机发起的代理,不同的用户同样的命令发起同样的进程最终是不同的进程代理。由内核来管理区分进程用户不同的代理权限称之为进程的安全上下文就是进程的安全模型。
    SUID和SUDO权限:首先来说SUID,上面讲到进程的安全模型。当用户发起命令启动进程,进程会根据用户的UGO权限来决定是否有权限。而当给某一资源或文件加上SUID那么这个进程或资源文件将会以自身附带的权限进行执行而不再根据用户启动的UGO权限来区分。有的时候权限是四位一体最前面就是SUID和sticky。SUID用s表示,sticky用t表示(sticky的作用可以通过设置在一个公共目录中每个人可以创建删除自己的文件却不能操作别人的文件)。SUDO在给某资源或文件执行的那一刻切换到另外一个用户身份所对应的该资源或文件的权限执行
    FACL权限:Filesystem Access Control List文件系统的访问控制列表。简单来讲就是利用文件系统的隐藏属性扩展属性保存额外的访问控制权限。访问控制权限可以再次或专门定义哪个用户或哪个组对当前文件有什么样的访问权限。前面讲过权限和安全模型。当用户发起一个进程,该进程就会寻找该用户对应的属主有没有该权限,没有的话就接着寻找该用户的属组在不在该进程下的基本组内。
    而当设定了facl访问控制列表后该进程就会寻找该用户对应的属主有没有该权限,没有的话会紧接着寻找facl列表中有没有该用户对应属主权限,接着会寻找该用户的属主在不在该进程的基本组内,最后会寻找facl列表中有没有该用户对应的属主在不在该进程的基本组内
    从用户角度立场的shell权限:
    当用户通过某一终端登录,Linux就相当于打开一个shell图形界面发起一个进程。而shell本身就是一个可执行程序。可执行程序一定会依赖于某些配置文件。那当用户登录shell会默认加载哪些配置文件呢?从用户角度而言shell分为两种类型(这不是zsh,bash)
    登录shell:有两种。第一种用户通过某终端输入账号密码登录的shell,第二种使用su - username、su -l username切换过去的。
    非登录shell:有三种。第一种使用su username没加 “-“以及”- l”选型登录的,第二种图形终端下打开的命令窗口。第三种,自动执行的shell脚本
    这两类登录式shell在执行程序的时候会读取bash的配置文件
    bash资源的配置分为两种,一种是全局配置,一种是用户配置。全局配置即对所有登录用户都生效用户配置只针对自己当前登录用户生效
    bash的全局配置文件路径在/etc/profile,/etc/profile.d/*.sh以及/etc/bashrc,个人配置文件路径在~/.bashprofile和 /.bashrc下。profile类的文件一般用来设定全局环境变量和运行命令或脚本,bashrc类的文件则用来设定本地变量以及命令别名。假如需要给Liunx设定别名如果是全局生效就修改/etc/bashrc配置文件,如果只是个人用户生效则修改/.bashrc。比如 通过 vim /etc/bashrc修改全局bashrc配置文件最后一行加上 alias cls=’clear’ 则下次登录进入即生效 cls==clear效果
    登录式shell会以此加载bash的配置文件——> /etc/profile —> /etc/profile.d/
    .sh —> ~/.bashprofile —> ./bashrc —> /etc/bashrc而非登录式shell则又会以此加载bash的配置的文件——> ~/.bashrc —> /etc/bashrc —> /etc/profile.d/.sh
    Linux权限涉及的知识比较多,比如用户密码/etc/passwd,影子口令/etc/shadow,用户密码加密(单向加密,对称加密)等知识点需要自行积累。密码安全可参考另一系列<密码安全>笔记