在 Linux 上用 SELinux 或 AppArmor 实现强制访问控制(MAC)

为了解决标准的“用户-组-其他/读-写-执行”权限以及访问控制列表[1]的限制以及加强安全机制,美国国家安全局(NSA)设计出一个灵活的<ruby>强制访问控制(MAC)方法 SELinux(Security Enhanced Linux
的缩写),来限制标准的权限之外的种种权限,在仍然允许对这个控制模型后续修改的情况下,让进程尽可能以最小权限访问或在系统对象(如文件,文件夹,网络端口等)上执行其他操作。

MAC

SELinux 和 AppArmor 加固 Linux 安全

另一个流行并且被广泛使用的 MAC 是 AppArmor,相比于 SELinux 它提供更多的特性,包括一个学习模式,可以让系统“学习”一个特定应用的行为,以及通过配置文件设置限制实现安全的应用使用。

在 CentOS 7 中,SELinux 合并进了内核并且默认启用强制模式(下一节会介绍这方面更多的内容),与之不同的是,openSUSE 和 Ubuntu 使用的是 AppArmor 。

在这篇文章中我们会解释 SELinux 和 AppArmor 的本质,以及如何在你选择的发行版上使用这两个工具之一并从中获益。

SELINUX 介绍以及如何在 CENTOS 7 中使用

Security Enhanced Linux 可以以两种不同模式运行:

  • 强制:这种情况下,SELinux 基于 SELinux 策略规则拒绝访问,策略规则是一套控制安全引擎的规则。
  • 宽容:这种情况下,SELinux 不拒绝访问,但如果在强制模式下会被拒绝的操作会被记录下来。

SELinux 也能被禁用。尽管这不是它的一个操作模式,不过也是一种选择。但学习如何使用这个工具强过只是忽略它。时刻牢记这一点!

使用 getenforce 命令来显示 SELinux 的当前模式。如果你想要更改模式,使用 setenforce 0(设置为宽容模式)或 setenforce 1(强制模式)。

因为这些设置重启后就失效了,你需要编辑 /etc/selinux/config 配置文件并设置 SELINUX 变量为 enforcingpermissive
disabled ,保存设置让其重启后也有效:

如何启用和禁用 SELinux 模式

还有一点要注意,如果 getenforce 返回 Disabled,你得编辑 /etc/selinux/config 配置文件为你想要的操作模式并重启。否则你无法利用 setenforce
设置(或切换)操作模式。

setenforce 的典型用法之一包括在 SELinux 模式之间切换(从强制到宽容或相反)来定位一个应用是否行为不端或没有像预期一样工作。如果它在你将 SELinux
设置为宽容模式正常工作,你就可以确定你遇到的是 SELinux 权限问题。

有两种我们使用 SELinux 可能需要解决的典型案例:

  • 改变一个守护进程监听的默认端口。
  • 给一个虚拟主机设置 /var/www/html 以外的文档根路径值。

让我们用以下例子来看看这两种情况。

例 1:更改 SSHD 守护进程的默认端口

大部分系统管理员为了加强服务器安全首先要做的事情之一就是更改 SSH 守护进程监听的端口,主要是为了阻止端口扫描和外部攻击。要达到这个目的,我们要更改 /etc/ssh/sshd_config 中的 Port
值为以下值(我们在这里使用端口 9999 为例):
Port 9999
在尝试重启服务并检查它的状态之后,我们会看到它启动失败:
systemctl restart sshd
# systemctl status sshd

检查 SSH 服务状态

如果我们看看 /var/log/audit/audit.log,就会看到 sshd 被 SELinux 阻止在端口 9999 上启动,因为它是 JBoss 管理服务的保留端口(SELinux
日志信息包含了词语“AVC”,所以应该很容易把它同其他信息区分开来):
cat /var/log/audit/audit``.log | grep AVC | tail -1
检查 Linux 审计日志

在这种情况下大部分人可能会禁用 SELinux,但我们不这么做。我们会看到有个让 SELinux 和监听其他端口的 sshd 和谐共处的方法。首先确保你有 policycoreutils-python
这个包,执行:
yum install policycoreutils-python
查看 SELinux 允许 sshd 监听的端口列表。在接下来的图片中我们还能看到端口 9999 是为其他服务保留的,所以我们暂时无法用它来运行其他服务:
semanage port -l | grep ssh
当然我们可以给 SSH 选择其他端口,但如果我们确定我们不会使用这台机器跑任何 JBoss 相关的服务,我们就可以修改 SELinux 已存在的规则,转而给 SSH 分配那个端口:
semanage port -m -t ssh_port_t -p tcp 9999
这之后,我们就可以用前一个 semanage 命令检查端口是否正确分配了,即使用 -lC 参数(list custom 的简称):
semanage port -lC
# semanage port -l | grep ssh

给 SSH 分配端口

我们现在可以重启 SSH 服务并通过端口 9999 连接了。注意这个更改重启之后依然有效。

例 2:给一个虚拟主机设置 /VAR/WWW/HTML 以外的文档根路径

如果你需要用除 /var/www/html 以外目录作为文档根目录设置一个Apache 虚拟主机[2](也就是说,比如 /websrv/sites/gabriel/public_html):
DocumentRoot “``/websrv/sites/gabriel/public_html``”
Apache 会拒绝提供内容,因为 index.html 已经被标记为了 default_t SELinux 类型,Apache 无法访问它:
wget http:``//localhost/index``.html
# ls -lZ /websrv/sites/gabriel/public_html/index.html


被标记为 default_t SELinux 类型
和之前的例子一样,你可以用以下命令验证这是不是 SELinux 相关的问题:
cat /var/log/audit/audit``.log | grep AVC | tail -1
image

检查日志确定是不是 SELinux 的问题
要将 /websrv/sites/gabriel/public_html 整个目录内容标记为 httpd_sys_content_t,执行:
semanage fcontext -a -t httpd_sys_content_t "/websrv/sites/gabriel/public_html(/.*)?"
上面这个命令会赋予 Apache 对那个目录以及其内容的读取权限。
最后,要应用这条策略(并让更改的标记立即生效),执行:
restorecon -R -``v /websrv/sites/gabriel/public_html
现在你应该可以访问这个目录了:
wget http:``//localhost/index``.html
image

访问 Apache 目录

要获取关于 SELinux 的更多信息,参阅 Fedora 22 中的 SELinux 用户及管理员指南[3]。

APPARMOR 介绍以及如何在 OPENSUSE 和 UBUNTU 上使用它

AppArmor 的操作是基于写在纯文本文件中的规则定义,该文件中含有允许权限和访问控制规则。安全配置文件用来限制应用程序如何与系统中的进程和文件进行交互。

系统初始就提供了一系列的配置文件,但其它的也可以由应用程序在安装的时候设置或由系统管理员手动设置。

像 SELinux 一样,AppArmor 以两种模式运行。在 <ruby>强制
<rt>enforce</rt></ruby> 模式下,应用被赋予它们运行所需要的最小权限,但在 <ruby>抱怨
<rt>complain</rt></ruby> 模式下 AppArmor 允许一个应用执行受限的操作并将操作造成的“抱怨”记录到日志里(/var/log/kern.log/var/log/audit/audit.log,和其它放在
/var/log/apparmor 中的日志)。

日志中会显示配置文件在强制模式下运行时会产生错误的记录,它们中带有 audit 这个词。因此,你可以在 AppArmor 的 <ruby>强制
<rt>enforce</rt></ruby> 模式下运行之前,先在 <ruby>抱怨
<rt>complain</rt></ruby> 模式下尝试运行一个应用并调整它的行为。

可以用这个命令显示 AppArmor 的当前状态:

sudo apparmor_status

查看 AppArmor 的状态

上面的图片指明配置 /sbin/dhclient/usr/sbin/,和 /usr/sbin/tcpdump 等处在强制 模式下(在 Ubuntu 下默认就是这样的)。

因为不是所有的应用都包含相关的 AppArmor 配置,apparmor-profiles 包给其它没有提供限制的包提供了配置。默认它们配置在抱怨模式下运行,以便系统管理员能够测试并选择一个所需要的配置。

我们将会利用 apparmor-profiles,因为写一份我们自己的配置已经超出了 LFCS 认证[4]的范围了。但是,由于配置都是纯文本文件,你可以查看并学习它们,为以后创建自己的配置做准备。

AppArmor 配置保存在 /etc/apparmor.d 中。让我们来看看这个文件夹在安装 apparmor-profiles 之前和之后有什么不同:
ls /etc/apparmor``.d

查看 AppArmor 文件夹内容

如果你再次执行 sudo apparmor_status,你会在抱怨模式看到更长的配置文件列表。你现在可以执行下列操作。

将当前在强制模式下的配置文件切换到 <ruby>抱怨模式:
sudo aa-complain /path/to/file
以及相反的操作(抱怨 –> 强制):
sudo aa-enforce /path/to/file
上面这些例子是允许使用通配符的。举个例子:
sudo aa-complain /etc/apparmor``.d/*
会将 /etc/apparmor.d 中的所有配置文件设置为 <ruby>抱怨
<rt>complain</rt></ruby> 模式,反之
sudo aa-enforce /etc/apparmor``.d/*
会将所有配置文件设置为 <ruby>强制
<rt>enforce</rt></ruby> 模式。
要完全禁用一个配置,在 /etc/apparmor.d/disabled 目录中创建一个符号链接:
sudo ln -s /etc/apparmor``.d``/profile``.name /etc/apparmor``.d``/disable/

要获取关于 AppArmor 的更多信息,参阅官方的AppArmor wiki[5] 以及 Ubuntu 提供的[6]文档。

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

推荐阅读更多精彩内容