4.【SELinux学习笔记】SELinu策略语言

一.SELinux 客体类别和许可
1.SELinux客体类别
    客体类别(文件、套接字)及其许可(访问权限,如读或发送)是SELinux中访问控制的基础。一个客体类别代表某个确定类型(如文件、套接字)的所有资源。对于SELinux策略开发者我们通常不会创建一个全新的客体类别,但是了解课类别的定义流程对我们客体类别和客体许可是有非常大的帮助的。
allow user_t bin_t : file {read execute getattr};
    上面的allow规则中,file指的就是客体类别-文件;read、execute、getattr就是指的客体许可。


2.添加新的客体类别和许可
    添加客体类别和许可需要同时修改策略和基于新的客体类别或许可的强制访问控制系统代码。
①声明客体类别,声明语句如下:
class dir//为目录声明一个客体类别
    声明语句是由关键字class加上需要定义的类别名组成,在声明语句的末尾没有分号。标准的类别声明语句语法如下:
class 类别名字
②声明客体许可-通用许可
    声明许可有两种方法:1.通用许可,允许创建一套与多个客体类别一起构成组的许可。例如:UNIX基本原理“一切都是许可”意味着许多与文件有关的客体类别都有一套通用许可,在SELinux中,通用许可声明与文件有关的许可语句如下:
common file
{
    ioctl
    read
    write
    create
    getattr
    setattr
    lock
    relabelfrom
    relabelto
    append
    unlink
    link
    rename
    execute
    swapon
    quotaon
    mounton
}
    这个语句声明了叫做file的通用许可集,这里的file并不是指客体类别中的file,它们在策略中属于不同的组件,仅仅是名字相同而已。我们必须要明白的是客体类别与客体许可中声明的关键字都是存在于自身独立的命名空间中的。
    通用许可语法:
common 通用名 {许可集}
③声明客体许可-联合许可
    我们可以使用访问向量语句将许可与客体联合起来,详细语法如下:
class dir { search }
        联合许可的声明语句看起来与类别声明语句比较相似,首先都使用了关键词class,但实际上两者不能混为一谈。上面联合许可声明语句中定义了一个特定类别的一个许可-search,且这个语句结尾无分号。通常情况下我们看到的客体类别会存在多个,如下:
class dir { search add_name remove_name }
    那么这个例子将特定类别许可和dir客体类别联合在一起进行声明。那么在访问向量语句中,我们也可以使用inherits来联合通用许可。如:
class dir
inherits file
{
    add_name
    remove_name
    reparent 
    search
    rmdir
    如案例,通过关键词inherits,客体类别分别具有了file通用许可集和为dir指定的5个许可。
3.有效的客体类别
①与文件相关的客体类别
    在类Unix系统中,有这样一个概念-一切皆文件,但所有的文件也是不尽相同的。现代类UNIX系统中,Linux专门为设备、IPC以及标准的存储数据的文件设计了专用的文件,下面是SELinux中与与文件相关的客体类别:
Object Class(客体类别)Description(描述)
blk_fileBlock files(块文件)
chr_fileCharacter files(字符文件)
dir Directories(目录)
fdFile descriptors(文件描述符)
fifo_fileNamed pipes(命名管道)
fileOrdinary files(普通文件)
filesystemFilesystem (for example,an actual partition)(文件系统,如分区)
lnk_fileSymbolic links(符号链接)
sock_fileUNIX domain sockets(UNIX域套接字)

②与网络相关的客体类别
    网络资源如网络接口、不同种类的套接字和主机都是与网络有关的客体类别。详细如下:
客体类别描述
associationIPsec security association(IPsec 安全联盟)
key_socketSockets that are of protocol family  PF_KEY , used for key management in IPsec(PF_KEY协议家族的套接字,用于管理IPsec中的秘钥)
netif Network interface(网络接口,如eth0)
netlink_audit_socket Netlink socket for controlling auditing(用于控制审核的Netlink套接字)
netlink_dnrt_socketNetlink socket for controlling DECnet routing(控制DECnet路由的Netlink套接字)
netlink_firewall_socketNetlink socket for creating user space firewall filters(用于创建用户空间防火墙过滤器的Netlink套接字)
netlink_ip6fw_socket Netlink socket for creating user space firewall filters(用于创建用户空间防火墙过滤器的Netlink套接字  )
netlink_kobject_uevent_socketNetlink socket for receiving kernel event notifications in user space(用于在用户空间接收内核时间通知的Netlink套接字)
netlink_nflog_socket Netlink socket for receiving Netfilter logging messages(  用于接收Netfilter日志消息的Netlink套接字  )
netlink_route_socket Netlink socket for controlling and managing network resources such as the routing table and IP address(用于控制和管理网络资源如路由表和IP地址的Netlink套接字  )
netlink_selinux_socketNetlink socket for receiving notices of policy load, enforcement mode toggle, and AVC cache flush(用于接收策略载入通知,强制模式切换和清空AVC缓存的Netlink套接字 )
netlink_tcpdiag_socket Netlink socket for monitoring TCP connections( 用于件事TCP连接的Netlink套接字)
netlink_socket All other Netlink sockets(所有其他的Netlink套接字)
netlink_xfrm_socketNetlink socket for getting, maintaining, and setting IPsec parameters(用于获取、管理和设置IPsec参数的Netlink套接字)
node Host represented by an IP address or range of addresses(代表一个IP地址或一段IP地址的主机)
packet_socketRaw sockets where the protocol is implemented in userspace(协议在用户空间执行的原始套接字)
rawip_socket IP sockets that are neither TCP or UDP(既不是TCP也不是UDP的IP套接字)
socket All other sockets(其他套接字)
tcp_socket TCP sockets(TCP套接字)
udp_socket UDP sockets(UDP套接字)
unix_dgram_socket IPC datagram sockets on a local machine (UNIX domain)(本地机器上(unix域)的IPC数据报套接字)
unix_stream_socketIPC stream sockets on a local machine (UNIX domain)(本地机器上(unix域)的IPC流套接字)

③System V IPC客体类别
与PIC相关的客体类别,详细如下:
Object ClassDescription
ipcDeprecated; no longer used(不建议使用)
msgMessages within a message queue (消息队列中的消息)
msggMessage queues (消息队列)
semSemaphores (信号量)
shmShared memory segment (共享内存段)
 ④其他客体类别
Object CLassDescription
capabilityPrivileges that are implemented as capabilities in Linux 特权
processProcesses which are also objects in SELinux SELinux中的进程
securitySELinux security server in the kernel 内核中的SELinux
systemSystem as a whole (整个系统)

4.file、process客体类别许可示例
    撤销前面授予的访问权限是安全机制灵活和动态的重要体现,当策略发生变化或客体安全上下文发生变化时,就需要撤销之前授予的权限。SELinux支持多种环境下的撤销,如每次对文件进行读写操作时都会检查文件的访问权,如果文件的安全上先问发生变化,那么在下次进行读写时,相关访问权限就会被撤销。有很多时候访问权是不会撤销的,而且通常情况下,我们可以避免大多数撤销问题,通过设计系统不重新标记客体实现,SELinux提供对许可(relabelfrom和relabelto)来限制这个能力。
①文件客体类别许可
    下面详细列出了file客体类别的许可,大多数许可都是公用的,星号标记的是特定给file的客体类别。
PermissionDescription
appendAppend to file contents(that is,opend with O_APPEND flag).(追加,即用o_append标记打开)
createCreate new file.(创建一个新文件)
entrypoint*File can be used as the entry point of the new domain via a domain transition.(通过域转换可以将文件作为新域的入口)
execmod*Make executable a file mapping that has been modified (implied by a copy-on-write).(修改文件使其可执行,即写即拷)
executeExecute; corresponds to x access in standard Linux.(执行,与Linux访问权限中的x相类似。)
execute_no_trans*Execute file in the caller's domain (that is, without a domain transition).(表示主体的可执行文件,没有域转换)
getattrGet attributes for file, such as access mode (for example,  stat , some  ioctls ).(获取文件的属性,如访问模式)
ioctl ioctl(2) system call requests not addressed by other permissions.(ioctl系统调用)
link Create hard link to file.(创建一个硬链接)
lock Set and unset file locks.(设置和接触文件锁)
mountonUse as mount point.(挂载点)
quotaonAllow file to be used as a quota database.(允许文件作为一个配额数据库)
read Read file contents; corresponds to  r access in standard Linux.(读取权限,与Linux访问权限中r类似)
relabelfromChange the security context from the existing type.(从当前已存在的类型中改变安全上下文)
relabelto Change the security context to the new type.(将安全上下文改为新类型的安全上下文)
rename Rename a hard link.(重命名硬链接)
swaponDeprecated; was used to allow file to be used for paging/swapping space.(已废弃,不建议使用)
setattr Change attributes for file such as access mode (for example,  chmod , some ioctls ).(设置文件属性,如访问模式,类似于Linux中的chmod等)
unlinkRemove hard link (delete).(移除硬链接,即删除)
write Write file contents; corresponds to  w access in standard Linux.(写,对应与Linux访问权限中的w类似)
  • 标准Linux许可
    read、write和execute基本上Linux中对应权限类似,但并不完全相同,标准Linux中,访问权限通常在文件打开时进行检查,而SELinux中访问权限每次使用时都会检查,当一个文件被映射到内存中时,也会检查read和write许可。
  • 标准Linux访问控制的扩展
    标准Linux中,创建文件的能力收到该文件目录的权限限制。而SELinux中,create许可可以直接控制创建每个特定SELinux类型文件的能力,那么create许可允许我们一个域类型创建etc_t类型的文件,而不是shadow_t类型。与大多数SELinux许可类似,文件create许可是必须的,但并不充分,如:创建域类型也必须要有权在dir客体中创建客体,也需要有创建file客体的许可和write许可。
    查看和修改文件属性许可分别为getattr 和 setattr ,getattr 许可允许读取文件属性,setattr 许可允许设置文件属性。
    对文件内容进行追加的许可append,如:日志文件不能被覆盖,这样可以阻止攻击者清除证据,SELinux 单独提供了 append 许可,它在文件打开时强制实施了 o_append 模式, 允许域类型 append 许可而无 write 许可意味着那个域类型进程只能将数据追加到文件。
  • SELinxu特定许可
    SELinxu对于文件有五种特定的许可,分别是:relabelfrom、relabelto、execute_no_trans、enTRpoint、execmod。
    relabelfrom和relabelto许可控制域类型将文件从一个类型向另一个类型转变的能力。
    execute_to_trans许可允许域执行一个无域转换的文件,

②进程客体类别许可
下表列出了进程客体类别许可,如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高桐@BILL

分享快乐,快乐分享...

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值