在 Ubuntu 上配置 AppArmor 实现强制访问控制(MAC)

前言

随着云计算的发展,Linux 发行版像 RHEL、Debian、Ubuntu、SUSE 开始广泛的被使用,在很多新上手的用户可能会查看相关教程或者一键包,一般这些教程、一键包的开头第一件事情可能是升级软件,第二件事情就可能是关闭 SELinux 或 AppArmor,那这两个软件是不是真的就那么影响系统使用吗?这两个软件有什么用?

先说是不是

SELinux 即 Security Enhanced Linux,是由美国国家安全局(NSA)设计出来的一个灵活的强制访问控制系统,来限制标准的权限之外的种种权限,在仍然允许对这个控制模型后续修改的情况下,让进程尽可能以最小权限访问或在系统对象(如文件,文件夹,网络端口等)上执行其他操作。

简而言之就是 SELinux 相对于一键包、教程来说“太过于安全”而不是和新手,新手对 Linux 的使用并不稳定,网站建设也不稳定,如果使用了 SElinux 限制权限反而可能导致新手遇到权限不够的问题,比如说 监听不到 mysqld.sock 导致 phpMyAdmin 默认配置下无法登入这样的尴尬,又或者说 监听不到php.sock 导致 Nginx 无法反代 unix socket 模式的 PHP-FPM。

SELinux 在 RHEL 及其社区版 CentOS 上有着非常的应用,而在 Ubuntu 和 Debian 上,AppArmor 也有着非常好的支持,特别是 Ubuntu Server 上。

AppArmor (Application Armor) 是一个类似于 SELinux 的一个强制访问控制方法,通过它你可以指定程序可以读、写或运行哪些文件,是否可以打开网络端口等。AppArmor 配置比 SELinux 更加方便比较适合学习。

介绍

Apparmor 有两种工作模式:Complain(抱怨)和Enforcement(强制)

Complain– 即抱怨模式,在这种模式下,配置文件中的限制规则并不执行,仅仅对程序的行为进行记录,所以抱怨还是很贴切的。

Enforcement– 即强制模式,顾名思义在这种模式下,配置文件中的限制规则会执行,并且对违反限制规则的软件行为进行记录。

那 Complain 既然不能限制程序,那为什么还需要这种模式呢? 因为——如果某个程序的行为不符合其配置文件的限制,可以将其行为记录到系统日志,就可以根据日志转换成配置文件,因此 Complain 在一些地方也被称为Complain/Learning模式

教程

OpenResty 篇

这里将以 Ubuntu Server 16.04 LTS 并使用 OpenResty 为例,在过程中介绍 AppArmor 的一些使用细节和方法。

下面使用的是 OpenResty 官方提供的二进制软件包,编译教程可以查看:Ubuntu 编译安装 OpenResty 及拓展支持

复制代码

wget -qO - https://openresty.org/package/pubkey.gpg | sudo apt-key add -

sudo apt-get -y install software-properties-common

add-apt-repository -y "deb http://openresty.org/package/ubuntu $(lsb_release -sc) main"

sudo apt-get update

sudo apt-get install openresty

配置目录

一、创建演示用目录

复制代码

sudo mkdir -p /data/wwwroot/safe

sudo mkdir -p /data/wwwroot/unsafe

[font=-apple-system, system-ui, "]二、创建演示文件

复制代码

cat >> /data/wwwroot/safe/index.html <

Safe 文件

该文件允许被访问

EOF

复制代码

cat >> /data/wwwroot/unsafe/index.html <

Unsafe 文件

该文件不允许被访问

EOF

修改 nginx.conf

编辑 /usr/local/openresty/nginx/conf/nginx.conf 文件,在末尾 } 前添加:

复制代码

server {

listen 8080;

server_name  _;

location / {

root /data/wwwroot;

}

}

[font=-apple-system, system-ui, "]保存后,重新 OpenResty:

复制代码

systemctl restart openresty

[font=-apple-system, system-ui, "]访问http://yourdomain/safe/[font=-apple-system, system-ui, "] 和http://yourdomain/unsafe/[font=-apple-system, system-ui, "] 就可以看到结果页,目前两个页面均可以访问。

AppArmor 篇

安装 AppArmor

复制代码

sudo apt-get install apparmor-profiles apparmor-utils

创建配置文件, 使用 aa-autodep 命令创建 OpenResty 的空白配置文件:

引用

cd /etc/apparmor.d/

sudo aa-autodep openresty

切换为 Complain 模式,使用 aa-complain 命令:

复制代码

sudo aa-complain openresty

重启 Openresty

复制代码

sudo systemctl restart openresty

配置规则

访问网页,访问http://yourdomain/safe/http://yourdomain/unsafe/来触发软件记录相关日志。

配置规则,运行 sudo aa-logprof 通过日志的记录来获得日志,例如:

复制代码

Profile:        /usr/local/openresty/nginx/sbin/nginx

Network Family: inet

Socket Type:    stream

[1 - #include ]

2 - #include

3 - #include

4 - #include

5 - network inet stream,

(A)llow / [(D)eny] / (I)gnore / Audi(t) / Abo(r)t / (F)inish

Adding #include to profile.

看到相关提示,一般来说走 A 即 Allow 同意就可以走全程了,不过要让 unsafe 目录无法被访问,所以 unsafe 目录需要 D 即 Deny全部过了以后查看 /etc/apparmor.d/usr.local.openresty.nginx.sbin.nginx 内容:

复制代码

root@www.mf8.biz:~# cat /etc/apparmor.d/usr.local.openresty.nginx.sbin.nginx

# Last Modified: Sat Jul 15 15:36:02 2017

# From www.mf8.biz

#include

/usr/local/openresty/nginx/sbin/nginx flags=(complain) {

#include

#include

/data/wwwroot/safe/* r,

deny /data/wwwroot/unsafe/* r,

/usr/local/openresty/luajit/lib/libluajit-5.1.so.* r,

/usr/local/openresty/nginx/conf/mime.types r,

/usr/local/openresty/nginx/conf/nginx.conf r,

/usr/local/openresty/nginx/logs/error.log w,

/usr/local/openresty/nginx/sbin/nginx mr,

/usr/local/openresty/openssl/lib/libcrypto.so.* r,

/usr/local/openresty/openssl/lib/libssl.so.* r,

/usr/local/openresty/openssl/openssl.cnf r,

/usr/local/openresty/pcre/lib/libpcre.so.* r,

/usr/local/openresty/zlib/lib/libz.so.* r,

}

不过通过日志判断的内容还是不够用的,我们还要继续遇到错误改正错误。注:其实 AppArmor 的 # 不一定是注释,例如:#include 就是记载 abstractions/base 文件的规则。

切换为 Enforce 模式

复制代码

sudo aa-enforce openresty

[font=-apple-system, system-ui, "]重启使规则生效

复制代码

sudo /etc/init.d/apparmor reload

sudo service openresty restart

[font=-apple-system, system-ui, "]哈哈,这时候可能会报错,例如:

复制代码

root@www.mf8.biz:~# systemctl restart  openresty

Job for openresty.service failed because the control process exited with error code. See "systemctl status openresty.service" and "journalctl -xe" for details.

那我们就需要来判断是那里出错了,以 OpenResty 为例,可以查看错误的地方有:

openresty -t 的错误提示

/var/log/syslog 文件中的错误日志

/nginx/logs/error.log 中的错误日志

排错,例如我的错误是:

复制代码

root@www.mf8.biz:~# openresty -t

nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok

nginx: [emerg] open() "/usr/local/openresty/nginx/logs/nginx.pid" failed (13: Permission denied)

nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test failed

即 /usr/local/openresty/nginx/logs/nginx.pid 没有权限,

那么编辑 /etc/apparmor.d/usr.local.openresty.nginx.sbin.nginx 文件,加入:

复制代码

/usr/local/openresty/nginx/logs/error.log w,

继续重启 apparmor 和 openresty

复制代码

sudo /etc/init.d/apparmor reload

sudo service openresty restart

还报错:

复制代码

root@www.mf8.biz:~# openresty -t

nginx: the configuration file /usr/local/openresty/nginx/conf/nginx.conf syntax is ok

nginx: [emerg] open() "/usr/local/openresty/nginx/logs/access.log" failed (13: Permission denied)

nginx: configuration file /usr/local/openresty/nginx/conf/nginx.conf test failed

加入:

复制代码

/usr/local/openresty/nginx/logs/access.log w,

重启后,终于正常了,再访问http://yourdomain/safe/http://yourdomain/unsafe/,发现http://yourdomain/unsafe/403 报错了,也就是无法访问了,很棒!

我的最终规则以供大家参考:

复制代码

# Last Modified: Sat Jul 15 15:36:02 2017

# From www.mf8.biz

#include

/usr/local/openresty/nginx/sbin/nginx {

#include

#include

/data/wwwroot/safe/* r,

deny /data/wwwroot/unsafe/* r,

/usr/local/openresty/luajit/lib/libluajit-5.1.so.* r,

/usr/local/openresty/nginx/conf/mime.types r,

/usr/local/openresty/nginx/conf/nginx.conf r,

/usr/local/openresty/nginx/logs/error.log w,

/usr/local/openresty/nginx/sbin/nginx mr,

/usr/local/openresty/openssl/lib/libcrypto.so.* r,

/usr/local/openresty/openssl/lib/libssl.so.* r,

/usr/local/openresty/openssl/openssl.cnf r,

/usr/local/openresty/pcre/lib/libpcre.so.* r,

/usr/local/openresty/zlib/lib/libz.so.* r,

/usr/local/openresty/nginx/logs/nginx.pid rw,

/usr/local/openresty/nginx/logs/access.log w,

}

结语

AppArmor 配置 OpenResty 的教程就到这里结束了,AppArmor 的安全配置还是比较复杂的,因为不同服务器势必用法不同,所以不可能千篇一律所以自己的服务器还是需要自己进行针对性规则配置,而且往往越复杂,功能越多的服务配置规则越麻烦越容易出现小问题。

一般来说,建议在 Complain 模式下积累个一星期的 “抱怨” 再做判断可能会更好。当然还需要多结合日志进行管理。

再解释一下权限的意思:

引用

r: 读

w: 写

m: 存储器映射,

k: 文件锁定

l: 创建硬链接

ix: 执行并继承该安全配置

Px: 在清理环境之后,执行并使用其他安全配置

Ux: 在清理环境之后,执行不做限制

原文链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容