首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的。教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈~我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转到教程
1. 简介
SELinux策略语言主要描述policy.conf的相关语法,其相关部分如下图所示:
2. 客体类别
定义内核支持的客体类别和许可的策略语言指令,并对SELinux系统中内核客体类别标准做一个概述。
2.1 SELinux中客体类别的用途
客体类别及其许可是SELinux中访问控制的基础,客体类别代表资源的范畴,如文件和套接字,许可代表对这些资源的访问权限,如读或发送。理解客体类别和许可是SELinux中比较困难的部分,因为这需要SELinux和Linux两方面的知识。
一个客体类别代表某个确定类型(如文件或套接字)的所有资源,一个客体类别的实例(如某个特定的文件或套接字)被称为一个客体,通常,客体类别和客体这两个术语可以交替使用,但是理解其定义是相当重要的,客体类别指的是资源(文件)的所有范畴,客体指的是客体类别的某个特定实例(/etc/passwd)。
2.2 在SELinux策略中定义客体类别
策略中必须包括所有SELinux内核支持的客体类别和许可的声明,以及其他客体管理器。添加新的客体类别和修改现有客体类别的许可是一项复杂的任务,仅当修改真实系统代码本身时应该这样做,与SELinux策略语言的其他方面不同,客体类别和许可依赖于Linux的实现细节,特别是内核。实际上,客体类别和许可被设计为尽可能准确地代表系统执行的资源,正是由于这个原因,改变客体类别或在系统中改变对应的许可才变得有意义。
声明许可有两种方法,第一种叫做通用许可(被多个客体类别所共用),它允许我们创建与客体类别一起作为一个组的许可,通用许可在类似的客体类别(如文件和符号连接)共享一套访问许可时很有用;第二种方法叫做特定类别许可(由某个客体类别所独用),它允许我们单独为客体类别声明特定的许可,正如将会看到的,有一些客体类别只有特定的许可,有一些只有通用许可,还有一些是这两者都有。
客体类别和许可定义方法如下:
• 声明客体类别:class 类别名字
• 通用许可:common 通用名 {许可集}
• 联合许可和客体类别:class 类别名 [inherits 通用许可集名] [{许可集}]
2.3 有效的客体类别和许可
在Kernel3.0.36客体类别和许可定义如下(定义见kernel/security/selinux/include/classmap.h),共有49个客体类别 被定义:
#define COMMON_FILE_SOCK_PERMS "ioctl", "read", "write", "create", \ "getattr", "setattr", "lock", "relabelfrom", "relabelto", "append"#define COMMON_FILE_PERMS COMMON_FILE_SOCK_PERMS, "unlink", "link", \ "rename", "execute", "swapon", "quotaon", "mounton", "audit_access", \ "open", "execmod"#define COMMON_SOCK_PERMS COMMON_FILE_SOCK_PERMS, "bind", "connect", \ "listen", "accept", "getopt", "setopt", "shutdown", "recvfrom", \ "sendto", "recv_msg", "send_msg", "name_bind"#define COMMON_IPC_PERMS "create", "destroy", "getattr", "setattr", "read", \ "write", "associate", "unix_read", "unix_write"/* * Note: The name for any socket class should be suffixed by "socket", * and doesn't contain more than one substr of "socket". */struct security_class_mapping secclass_map[] = {
{ "security", //客体类别 { "compute_av", "compute_create", "compute_member", //许可 "check_context", "load_policy", "compute_relabel", "compute_user", "setenforce", "setbool", "setsecparam", "setcheckreqprot", "read_policy", NULL } }, { "process", //客体类别 { "fork", "transition", "sigchld", "sigkill", "sigstop", "signull", "signal", "ptrace", "getsched", "setsched", "getsession", "getpgid", "setpgid", "getcap", "setcap", "share", "getattr", "setexec", "setfscreate", "noatsecure", "siginh", "setrlimit", "rlimitinh", "dyntransition", "setcurrent", "execmem", "execstack", "execheap", "setkeycreate", "setsockcreate", NULL } }, {