AppArmor零知识学习二、相识

news/2024/11/6 19:21:14/

本文内容参考:

AppArmor · GitBook,

Linux安全模块AppArmor总结-CSDN博客,

AppArmor快速入门-CSDN博客,

apparmor 初识(一)_domybest_nsg的博客-CSDN博客,

AppArmor与SElinux_apparmor selinux_weixin_45216475的博客-CSDN博客,

apparmor_什么是AppArmor?如何确保Ubuntu安全?_culingluan4376的博客-CSDN博客,

学习LSM(Linux security module)之三:Apparmor的前世今生和基本使用_wx5b7658e51ef04的技术博客_51CTO博客

接前一篇文章:AppArmor零知识学习一、初识

四、知识补强

1. DAC和MAC

  • DAC

DAC全称为Discretionary Access Control,中文译为自主访问控制,也有译为任意访问控制的。DAC是最常用的一类访问控制机制,意思为主体(文件所有者)可以自主指定系统中其它用户对其文件的所有权,最典型的就是Linux的“拥有者/同组用户/其他”。这种方式虽然为用户提供了很大的灵活性,但是缺乏必要的安全性。

  • MAC

MAC全称为Mandatory Access Control,中文译为强制访问控制。在MAC机制下,系统中的每一个进程、每一个文件、每一个IPC主体都被管理员按照严格的规则设置了相应的安全属性,不能被用户及其它直接或间接地修改。

2. AppArmor相关知识

  • 背景

由于SELinux使用复杂,适用于对安全要求特别高的企业或者组织,一般情况下不需要达到那么高的级别。为了简化操作,就推出了AppArmor,因此可以说AppArmor脱胎于SELinux。但与SELinux基于角色不同的是,AppArmor是与程序绑定的基于路径的MAC,也就是说如果路径发生改变,策略就会失效。一般的Linux系统,都会内置以上两种MAC中的一种。这也意味着,你需要对文件(其它)进行操作,你需要同时通过DAC和MAC的检测。

  • 与程序绑定的访问控制

AppArmor提供的访问控制是与程序绑定的:

AppArmor's unique security model is to bind access control attributes to programs rather than to users. —— AppArmor的独一无二的安全模型将访问控制属性绑定到程序而非用户。

比如我们安装了一个可执行程序,假其设路径为/usr/bin/nmcli。如果想用AppArmor对其进行访问控制,就需要新建一个配置文件到/etc/apparmor.d/目录下,配置文件名为usr.bin.nmcli。/etc/apparmor.d/是AppArmor专门放置配置文件的目录,其下的每一个配置文件都是跟一个可执行文件(程序)绑定的。因此不要随便修改配置文件名或程序路径,因为如果修改usr.bin.nmcli的文件名,将导致配置文件失效。

  • 工作模式

AppArmor有两种工作模式:enforcement、complain/learning(实际跟SELinux一样,也是三种,关闭模式这里未包含)。

  • Enforcement

在这种模式下,配置文件里列出的限制条件都会得到执行,并且对于违反这些限制条件的程序会进行日志记录。只有一些状态事件(比如加载配置文件)和导致拒绝的事件生成审核信息。

  • Complain

在这种模式下,配置文件里的限制条件不会得到执行,AppArmor只是对程序的行为进行记录。与Enforce类似,只是对于违反配置的事件也是允许的,不会拒绝。

例如程序可以写一个在配置文件里注明只读的文件,但AppArmor不会对程序的行为进行限制,只是进行记录。

那么既然complain不能限制程序,为什么还需要这种模式呢?因为如果某个程序的行为不符合其配置文件的限制,可以将其行为记录到系统日志,并且可以根据程序的行为,将日志转换成配置文件。因此这种模式也叫学习模式。

当然我们可以随时对配置文件进行修改,选择自己需要的模式。

  • 访问控制与资源限制

AppArmor可以对程序进行多方面的限制(详细可以看官方文档,这里只提供几个方面):

(1)文件系统的访问控制

AppArmor可以对某一个文件,或者某一个目录下的文件进行访问控制,包括以下几种访问模式:

rRead mode
wWrite mode (mutually exclusive to a)
aAppend mode (mutually exclusive to w)
kFile locking mode
lLink mode
linkfile->targetLink pair rule (cannot be combined with other access modes)

可读、可写、可扩展、可链接等(还有可执行x在表中没有列出)。

举例:

在配置文件中的写法示例如下:

/tmp r —— 表示可对/tmp目录下的文件进行读取。

/home/Desktop/a.c rw —— 表示程序可以对/home/Desktop/a.c 进行读和写。

注意:没在配置文件中列出的文件,程序是不能访问的,这有点像白名单。

(2)资源限制

AppArmor可以提供类似系统调用setrlimit一样的方式来限制程序可以使用的资源。在配置文件里的语法是:

set rlimit [resource] <= [value]

其中:

resource代表某一种资源;

value代表某一个值。

举例:

要对程序可以使用的虚拟内存做限制时,可以这样写:

set rlimit as<=1M

表示该程序可以使用的虚拟内存小于等于1M。

注意:Apparmor可以对程序要使用多种资源进行限制,如:fsize、data、stack、core、rss、as、memlock、msgqueue等),但暂不支持对程序可以使用CPU时间进行限制。

(3)访问网络

Apparmor可以程序是否可以访问网络进行限制,在配置文件里的语法是:

network [ [domain] [type] [protocol] ]

其中:

domain代表一个域;

type代表一种类型;

protocol代表一种协议。

举例:

要让程序可以进行所有的网络操作,只需在配置文件中写:

network

要允许程序可以在IPv4下使用TCP协议,可以在配置文件中这样写:

network inet tcp

(4)capability条目

Capability statements are simply the word capability followed by the name of the POSIX.1e capability as defined in the capabilities(7) man page. —— capability语句只是单词capability,后跟在Linux capabilities(7) man page中定义的POSIX.1e capability的名字。

linux的手册页里面有一个capablities列表,apparmor可以限制程序是否可以进行列表里的操作。

举例:

 要允许程序进行setgid操作,可以在配置文件中这样写:

capability setgid


http://www.ppmy.cn/news/623359.html

相关文章

我的k8s随笔:Kubernetes 1.17.0 部署讲解

k8s集群部署过程实践笔记共两种版本&#xff1a;一为专注部署操作&#xff0c;一为涉及部署操作讲解。本文为后者。 本文介绍了如何在两台 ubuntu 16.04 64 bit 双核 CPU 虚拟机上使用 kubeadm 部署 Kubernetes 1.17.0 集群的过程&#xff0c;网络插件为 flannel v0.11.0&#…

csredis-in-asp.net core理论实战-使用示例

csredis GitHub https://github.com/2881099/csredis 示例源码 https://github.com/luoyunchong/dotnetcore-examples/blob/master/Caching/OvOv.CsRedis/ 前提 安装并配置好redis服务&#xff0c;可用。vs2017或vs2019或vscode.net core 2.2 sdk 创建一个. NET Core Web…

printf段错误(core dump): 一个格式化输出引起的问题

1、printf段错误&#xff08;core dump&#xff09;: 一个格式化输出引起的问题 贴一个简单的例子&#xff1a; #include <stdio.h>int main(){int len sizeof(int);printf("%s\n",len);return 0; }rootubuntu:test#gcc test.c test.c: In function ‘main’…

关于使用ESP报错问题解决记录

1.封装udp透传函数报错 … WiFi connected CORRUPT HEAP: Bad head at 0x3ffdfbe8. Expected 0xabba1234 got 0x3ffdfcb0 abort() was called at PC 0x4008a481 on core 0 ELF file SHA256: 0000000000000000 Backtrace: 0x4008dad4:0x3ffd5a40 0x4008dd4d:0x3ffd5a60 0x4008a4…

Linux core dump在Android上的应用

&#xfeff;&#xfeff; 之前整理过一篇linux core dump的文章&#xff0c;一直想把这个特性在手机上应用起来&#xff0c;帮助排查错误&#xff0c;今天终于如愿以偿&#xff0c;记录如下。 【1】概述 在Android系统上&#xff0c;java应用程序出错时很容易通过logcat获取出…

vue解析系列(二):core vue instance vue

core vue github.com/vuejs/vue/b… import Vue from ./instance/index // 引入初始化全局api函数 import {initGlobalAPI } from ./global-api/index // 引入服务端端判断变量 import {isServerRendering } from core/util/env // 引入函数组件context构造函数 import {Functi…

axios Post请求 .Net Core中的接口以及FromBody特性和FromForm特性的使用

.Net Core中Get请求接口的参数一般可以在url中获取,但是Post请求接口一般建议使用[FromBody]特性来绑定参数,而前端发请求时也得需要注意,前端代码如下(vue): const postData = {id: 12 }; // post请求的数据,可自行定义 this.$axios({url: api.postUrl,method: post,par…

【浅度渣文】Jackson之jackson-core

原文链接&#xff1a;http://www.dubby.cn/detail.html?id9069 我们在这里使用jackson-core提供的JsonParser和JsonGenerator来实现基本的序列化和反序列化。 1.数据和实体类 我们先定义出JSON字符串: {"id":123456789,"text":"我是杨正&#xff0c;…