蚊章汇 - SELinux
type: channel
link: https://linuxcn.bwsl.wang/tag/SELinux/
items: 硬核观察 #1110 SELinux 移除了 NSA 的名字
items: 硬核观察 #781 DeepMind 用游戏的方式打破了矩阵相乘 50 年来的记录
items: 用 SELinux 保护你的容器
items: 系统管理员的 SELinux 指南：这个大问题的 42 个答案
items: 从蓝瘦“想哭”到 SELinux 看操作系统安全何在
items: 如何在 CentOS 7 中在 HHVM 和 Nginx 之上安装 WordPress
items: 看漫画学 SELinux 强制策略
items: 在 Linux 上用 SELinux 或 AppArmor 实现强制访问控制（MAC）
items: SELinux 入门

硬核观察 #1110 SELinux 移除了 NSA 的名字
type: item
date: 2023-08-31T23:10:07+08:00
description: SELinux 移除了 NSA 的名字二十年来，安全增强型 Linux（SELinux）一直是主线内核的一部分，它提供了一个实施访问控制安全策略的安全模块，现在已被广泛用于增强生产型 Linux 服务器和其他系统的安全性。SELinux 最初是美国国家安全局（NSA）开发并贡献给 Linux 内核的，并且多年来一直参与贡献，因此其正式的名称是 “NSA SELinux”。但鉴于 NSA 不良的信誉，它一直被怀疑在 SELinux 代码中埋有不为人知的后门，虽然并没有公开的证据可以证明这一点。由于社区的质疑，以及 SELinux 越来越多的由社区参与开发，Linux 内核将从 6.6 开始，NSA SELinux 的名称中将不再包含 “NSA”。消息来源：Phoronix老王点评：虽然我对 NSA 也持不信任的态度，但是我对这一做法不以为然。OpenAI 称以变革的方式使用受版权保护的材料并不违反版权OpenAI 针对作者们提起的一系列诉讼做出了回应，这些诉讼指控 OpenAI 非法使用他们的作品未经许可的副本训练了 ChatGPT。OpenAI 请求法院驳回除一项直接著作权侵权外的所有指控。OpenAI 称作者们 “误解了版权的范围，没有考虑到限制和例外情况（包括合理使用）”。OpenAI 认为，即使 ChatGPT 庞大数据集中的 “极小一部分” 包含了作者们的书籍，但 “创新者以变革的方式使用受版权保护的材料并不违反版权”。OpenAI 辩称，与试图通过传播版权材料直接获利的剽窃者不同，他们的目标是 “教会其模型推导出人类语言的基本规则”，并提醒法庭注意：“虽然作者可以为其图书注册版权，但该图书中与‘词频、句法模式和主题标记’相关的‘统计信息’却不在版权保护范围之内”。消息来源：Ars Technica老王点评：从一定意义上，这些诉讼反映了当前 AI 技术发展与版权法之间的矛盾，其判决可以视为未来 AI 领域的一个重要法律参考。值得持续关注。微软使用类似恶意软件的弹窗让人们放弃谷歌有人反馈，当他使用 Chrome 浏览器时，他的 Windows 11 弹出了一个窗口，要求将 Chrome 浏览器中的默认搜索引擎切换为微软必应。它并不是一个普通的通知，它既没有出现在通知中心，也与 Windows 11 向你推荐新功能的部分无关。它是一个以某种方式出现在临时目录中的可执行文件，并带有微软的数字签名。这种行为让用户感觉像“被安装了恶意软件”一样。微软回应称，他们“已经意识到了这些报告，并暂停了这一通知”。消息来源：The Verge老王点评：我本来想说，“已经为微软许可证付费的用户有理由不受这种广告、分析的影响，而开源的操作系统就可以避免这种情况”，但是我想起来 Canonical 也做过类似的事情，所以我无话可说。

硬核观察 #781 DeepMind 用游戏的方式打破了矩阵相乘 50 年来的记录
type: item
date: 2022-10-07T01:48:52+08:00
description: DeepMind 用游戏的方式打破了矩阵相乘 50 年来的记录矩阵乘法问题是一种关键的计算类型，它是许多不同应用的核心，从屏幕上显示图像到模拟复杂的物理学。加快这种计算可能会对成千上万的日常计算机任务产生重大影响。但想优化矩阵相乘的步骤很难。DeepMind 将该问题变成一种三维棋盘游戏 TensorGame。训练了一个新版本的 AlphaZero，称为 AlphaTensor，来玩这个游戏，以尽可能少的动作赢得游戏。AlphaTensor 发现了一种将两个四乘四的矩阵相乘的方法，只需要 47 步，基本的高中数学方法需要 64 步，而之前的最佳方法是德国数学家在 1969 年发明的 49 步的方法。此外，“AlphaTensor 在超过 70 种不同大小的矩阵中击败了现有的最佳算法。”消息来源：Technology Review老王点评：没想到 AI 居然可以在数学上找到更好的算法，果然人力有时而穷。此外，对矩阵相乘的改进，应该会从底层提升很多你想不到的地方的性能。英特尔推动 GPU 通用编程库 SYCL 的发展如今在加速计算和 GPU 领域，CUDA 只能在英伟达的 GPU 上运行，AMD 的 CUDA 可以在 AMD 的 GPU 上运行，但你不能用 CUDA 为英特尔的 GPU 编程。因此，英特尔推动开源 SYCL 规范的发展，该规范旨在为 GPU 和加速计算做几十年前 Java 为应用开发所做的工作。SYCL 是一种用 C++ 语言进行数据并行编程的方法，它看起来很像 CUDA，可以在英特尔、AMD 和英伟达的 GPU 上运行，而无需改变你的代码。消息来源：Venture Beat老王点评：这就是一个英特尔的 CUDA，但是以开放的名义。SELinux 继续废弃运行时禁用功能SELinux 已经废弃了运行时禁用功能，即通过编辑配置文件或 sys 文件系统来即时禁用它。但相关的代码和功能尚未从内核中删除，Linux 6.1 仍然具有处理 SELinux 运行时禁用的废弃能力。在最新的 Linux 6.1 的合并请求中，SELinux 删除了对该能力的一个文档参考，向废弃该能力小小的迈了一步，其它的部分几乎没有什么大的变化。一种简单和非侵入性的正确禁用 SELINUX 的方法是，在启动 Linux 时可以将 selinux=0 作为一个内核参数传递进去。消息来源：Phoronix老王点评：抛开 SELinux 的 NSA 背景不谈，SELinux 其实安全但繁琐，所以运行时禁用 SELinux 往往成为了一种偷懒行为或安全缺陷。

用 SELinux 保护你的容器
type: item
date: 2022-03-02T17:36:24+08:00
description: 黑掉你的系统，了解为什么配置 SELinux 作为你的第一道容器防线是很重要的。当有些事情在你的 Linux 环境中不能正常工作时，最简单的方法就是禁用 安全增强型 Linux Security-Enhanced Linux （SELinux）。而当它突然可以工作了，你就会忘记了禁用这件事 —— 这是一个常见的陷阱，意味着你已经失去了一个非常强大的安全工具。随着容器、微服务和分布式架构的兴起，威胁也在上升。这是由于一个老的、众所周知的问题：速度。容器的优势在于它们能让你快速行动，做更多的事情，并迅速改变。这意味着容器的采用已经飞速发展，但它所提供的速度也意味着你会遇到更多的问题和漏洞。当你越来越快地做更多的事情时，这自然会发生。如何减轻威胁正如孙子所说，“不战而屈人之兵”。当涉及到容器的基本防御时，这句话真的很有共鸣。为了避免问题（战斗），确保你的容器主机是安全的，你可以使用 SELinux 作为你的第一道防线。SELinux 是一个开源项目，于 2000 年发布，2003 年集成到 Linux 内核中。根据 红帽公司的解释，“SELinux 是 Linux 系统 的一个安全架构，允许管理员对谁可以访问系统有更多的控制。它最初是由美国国家安全局（NSA）开发的，是使用 Linux 安全模块（LSM）对 Linux 内核 的一系列补丁。”开始吧当你想到容器时，首先想到的可能是 Docker。Docker 在 2013 年出现后掀起了一场容器采用革命。它是容器爆炸性流行的主要原因之一，但如上所述，大量采用增加了用户对安全风险的脆弱性。在你用 SELinux 保护你的 Docker 容器之前，你需要设置一些东西。前置条件安装并配置了 CentOS 8/RHEL 8。安装并配置好 Docker CE创建两个账户：root 和 非 root 用户（下面的例子中是 mcalizo）。如果你需要在你的 RHEL 8/CentOS 8 服务器上设置 Docker，你可以按照这些 说明。如果你运行的是 RHEL 8，你需要在开始之前删除预装的 Podman 和 runc 包。首先，确保 SELinux 被启用：[mcalizo@Rhel82 ~]$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31 [mcalizo@Rhel82 ~]$ 然后，验证你的操作系统版本和 Docker 正在运行。以 root 身份登录并运行：[root@rhel82 ~]# cat /etc/redhat-release Red Hat Enterprise Linux release 8.2 (Ootpa) [root@rhel82 ~]# [root@rhel82 ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2020-10-28 19:10:14 EDT; 15s ago Docs: https://docs.docker.com Main PID: 30768 (dockerd) Tasks: 8 Memory: 39.0M CGroup: /system.slice/docker.service └─30768 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock Oct 28 19:10:13 rhel82.home.labs.com dockerd[30768]: time="2020-10-28T19:10:13.889602941-04:00" level=error msg="> Oct 28 19:10:…

系统管理员的 SELinux 指南：这个大问题的 42 个答案
type: item
date: 2018-08-09T08:50:56+08:00
description: 获取有关生活、宇宙和除了有关 SELinux 的重要问题的答案“一个重要而普遍的事实是，事情并不总是你看上去的那样 …” ―Douglas Adams，《银河系漫游指南》安全、坚固、遵从性、策略是末世中系统管理员的四骑士。除了我们的日常任务之外 —— 监控、备份、实施、调优、更新等等 —— 我们还需要负责我们的系统安全。即使这些系统是第三方提供商告诉我们该禁用增强安全性的系统。这看起来像《碟中碟》中 Ethan Hunt 的工作一样。面对这种窘境，一些系统管理员决定去服用蓝色小药丸，因为他们认为他们永远也不会知道如生命、宇宙、以及其它一些大问题的答案。而我们都知道，它的答案就是这个 42。按《银河系漫游指南》的精神，这里是关于在你的系统上管理和使用 SELinux 这个大问题的 42 个答案。SELinux 是一个标签系统，这意味着每个进程都有一个标签。每个文件、目录、以及系统对象都有一个标签。策略规则负责控制标签化的进程和标签化的对象之间的访问。由内核强制执行这些规则。两个最重要的概念是：标签化（文件、进程、端口等等）和类型强制（基于不同的类型隔离不同的的进程）。正确的标签格式是 user:role:type:level（可选）。 多级别安全 Multi-Level Security （MLS）强制的目的是基于它们所使用数据的安全级别，对进程（域）强制实施控制。比如，一个秘密级别的进程是不能读取极机密级别的数据。 多类别安全 Multi-Category Security （MCS）强制相互保护相似的进程（如虚拟机、OpenShift gears、SELinux 沙盒、容器等等）。在启动时改变 SELinux 模式的内核参数有：autorelabel=1 → 强制给系统重新标签化selinux=0 → 内核不加载 SELinux 基础设施的任何部分enforcing=0 → 以 许可 permissive 模式启动如果给整个系统重新标签化：# touch /.autorelabel # reboot 如果系统标签中有大量的错误，为了能够让 autorelabel 成功，你可以用许可模式引导系统。检查 SELinux 是否启用：# getenforce临时启用/禁用 SELinux：# setenforce [1|0]SELinux 状态工具：# sestatus配置文件：/etc/selinux/configSELinux 是如何工作的？这是一个为 Apache Web Server 标签化的示例：* 二进制文件：`/usr/sbin/httpd`→`httpd_exec_t` * 配置文件目录：`/etc/httpd`→`httpd_config_t` * 日志文件目录：`/var/log/httpd` → `httpd_log_t` * 内容目录：`/var/www/html` → `httpd_sys_content_t` * 启动脚本：`/usr/lib/systemd/system/httpd.service` → `httpd_unit_file_d` * 进程：`/usr/sbin/httpd -DFOREGROUND` → `httpd_t` * 端口：`80/tcp, 443/tcp` → `httpd_t, http_port_t`在 `httpd_t` 安全上下文中运行的一个进程可以与具有 `httpd_something_t` 标签的对象交互。许多命令都可以接收一个 -Z 参数去查看、创建、和修改安全上下文：* `ls -Z` * `id -Z` * `ps -Z` * `netstat -Z` * `cp -Z` * `mkdir -Z`当文件被创建时，它们的安全上下文会根据它们父目录的安全上下文来创建（可能有某些例外）。RPM 可以在安装过程中设定安全上下文。这里有导致 SELinux 出错的四个关键原因，它们将在下面的 15 - 21 条中展开描述：* 标签化问题 * SELinux 需要知道一些东西 * SELinux 策略或者应用有 bug * 你的信息可能被损坏标签化问题：如果在 /srv/myweb 中你的文件没有被正确的标签化，访问可能会被拒绝。这里有一些修复这类问题的方法：* 如果你知道标签：`# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'` * 如果你知道和它有相同标签的文件：`# semanage fcontext -a -e /srv/myweb /var/www` * 恢复安全上下文（对于以上两种情况）：`# restorecon -vR /srv/myweb`标签化问题：如果你是移动了一个文件…

从蓝瘦“想哭”到 SELinux 看操作系统安全何在
type: item
date: 2017-05-23T23:53:55+08:00
description: 最近一周，来自网络的 “想哭”勒索病毒 （ Wannacry Ransomware ） 在世界各地同时上演了一部绑匪大片，台词华丽，演技出色，当仁不让地新晋世界第一网红。全球各国除了默默忙于两弹一星足不出户的朝鲜外，无不为之动容。一时间，包括“想哭”病毒在内的各种病毒的各种传闻也火爆网络，我们并不准备跟风刷屏，只是打算本着实事求是的精神，科学的探讨一下如何与它们和睦相处、谈笑风生。“想哭”病毒的前世今生首先，让我们先简要回顾一下主角“想哭”病毒的前世今生。“想哭”病毒是基于网络攻击框架二次开发的结果，它利用了 NSA（美国国家安全局）的前辈们留下的非物质文化遗产： 永恒之蓝 （ ETERNAL BLUE ） 模块，针对 Windows SMB 服务的实现漏洞植入恶意代码，再结合自己的创新：加密用户文件和显示勒索声明，一代网红勒索病毒由此诞生。从病毒本身的设计流程来看，似乎并不需要高深的编码技巧或深厚的理论根基，然而这也恰恰是这一事件中最值得我们警惕的地方：NSA 泄漏的攻击模块远不止永恒之蓝一种，借助已有攻击框架进行二次开发的难度又如此之低，所以，可以预期，一大波未知的病毒正在来袭的路上。是不是细思极恐？所谓“知彼知己，百战不 殆 （ die ） ”，要想不 die，先要充分了解对手，所以接下来我们进一步了解一下什么是病毒？病毒是如何以危险方式危害公共安全的？又是怎样进入我们的系统的？病毒是什么，其实是老生常谈了，经常关注医疗卫生领域的朋友都知道：病毒由一段基因与蛋白质构成，自身不能实现新陈代谢，通过适当的途径侵入宿主体内，通过宿主细胞的代谢系统实现复制传播。跑题了？好吧，不要在意这些细节，我们改几个字就能用了：病毒由一段可执行代码与数据构成，自身不能在裸机上运行，通过适当的途径侵入宿主操作系统，通过宿主系统中的存储和网络实现复制传播。Wirth 教授教导我们：算法+数据结构=程序，病毒=代码+数据=算法+数据结构=程序没错，病毒就是一类特殊的计算机程序，广义上称为恶意软件。与自然界病毒的最大不同之处在于，它们不是纯天然的，而是 100% 人工打造。通常它们怀着对人类的深深的恶意来到世上，行为各不相同，有的在你的屏幕上画个圈圈诅咒你，有的会窃取你设备中的隐私照片，还有的会眨眼间转走你银行卡上的购房首付款......显然，它们的目标还是很一致的：危害人类设备，破坏世界和平。又扯远了，我们接着来看病毒是如何入侵操作系统的。病毒的入侵无外乎两个途径：主动和被动。所谓主动是针对目标系统尝试发起扫描和攻击，一般是远程发起，当发现了自己能吃定的漏洞之后，就通过各种阴险手段（其实技术实现上大多还是很优雅的）攫取系统权限，进而将恶意代码注入宿主系统中伺机作恶，对此没什么概念的小伙伴可以自行脑补一下《异形》中的人类被寄生的过程。病毒入侵的另一种方式，我们称之为被动方式。这种方式并不需要系统存在漏洞或缺陷，需要的是用户的经验、常识或智商存在缺陷。它们通过各种伪装诱骗用户去打开或运行自己，包括形形色色让你心动的邮件、链接、不明来源的安装程序等等，一旦获得机会运行，它们会悄无声息的在你的系统中安营扎寨、留下多道后门，然后为所欲为，这类病毒又被形象地称为（特洛伊）木马。如何应对各种病毒威胁了解了病毒的来龙去脉之后，我们就可以开始讨论如何应对各种病毒层出不穷的威胁了。对于大多数用户，良好的使用习惯是第一位的。堡垒往往从内部被攻克，再安全的操作系统，再强大的安全机制，都难以阻止用户自我毁灭的脚步。良好的使用习惯中最重要的，是安全更新，安全更新，安全更新！为什么呢？这要先谈一下操作系统漏洞的由来。漏洞实际是软件缺陷的一种，也就是俗称的 bug，是由于软件开发人员的疏忽而导致程序没有按照预期的方式运行。软件缺陷多种多样，有些很呆，有些很萌，也并不都会对系统安全构成威胁。那些侥幸逃脱开发和测试人员的轮番围剿，随着软件的发布散落人间的软件缺陷，一旦被黑客们发现、策反，并借助自己在系统内部的有利位置，披着合法软件的外衣，做出送人头、坑队友的恶劣行径时，就成为软件系统的公敌：漏洞。越是庞大和复杂的软件越容易产生漏洞，不幸的是操作系统就是一类极其庞大而复杂的软件系统。虽然操作系统漏洞常常难以完全避免，然而某个漏洞一旦被发现，开发厂商都会在第一时间发布安全更新对问题进行修复。以这次勒索病毒为例，针对被利用的 SMB 服务漏洞，事实上早在一个月前微软就公布了漏洞警告和补丁，提供了安全更新，那些开启自动更新并及时修复了漏洞的用户，他们可以用省下的三个比特币吃着火锅唱着歌，完全不用担心绑匪。所以请划重点：操作系统安全更新非常重要，不论个人用户、企业用户还是系统管理员，不论服务器，桌面还是移动终端，不论 Windows，Linux 还是 MacOS，都应该尽可能及时地从操作系统厂…

如何在 CentOS 7 中在 HHVM 和 Nginx 之上安装 WordPress
type: item
date: 2017-03-30T23:40:48+08:00
description: HHVM （HipHop Virtual Machine） 是一个用于执行以 PHP 和 Hack 语言编写的代码的虚拟环境。它是由 Facebook 开发的，提供了当前 PHP 7 的大多数功能。要在你的服务器上运行 HHVM，你需要使用 FastCGI 来将 HHVM 和 Nginx 或 Apache 衔接起来，或者你也可以使用 HHVM 中的内置 Web 服务器 Proxygen。在这篇教程中，我将展示给你如何在 Nginx Web 服务器的 HHVM 上安装 WordPress。这里我使用 CentOS 7 作为操作系统，所以你需要懂一点 CentOS 操作的基础。先决条件CentOS 7 - 64位Root 权限步骤 1 - 配置 SELinux 并添加 EPEL 仓库在本教程中，我们将使用 SELinux 的强制模式，所以我们需要在系统上安装一个 SELinux 管理工具。这里我们使用 setools 和 setrobleshoot 来管理 SELinux 的各项配置。CentOS 7 已经默认启用 SELinux，我们可以通过以下命令来确认：# sestatus # getenforce 如图，你能够看到，SELinux 已经开启了强制模式。接下来就是使用 yum 来安装 setools 和 setroubleshoot 了。# yum -y install setroubleshoot setools net-tools 安装好这两个后，再安装 EPEL 仓库。# yum -y install epel-release 步骤 2 - 安装 NginxNginx (发音：engine-x) 是一个高性能、低内存消耗的轻量级 Web 服务器软件。在 CentOS 中可以使用 yum 命令来安装 Nginx 包。确保你以 root 用户登录系统。使用 yum 命令从 CentOS 仓库中安装 nginx。# yum -y install nginx 现在可以使用 systemctl 命令来启动 Nginx，同时将其设置为跟随系统启动。# systemctl start nginx # systemctl enable nginx 为确保 Nginx 已经正确运行于服务器中，在浏览器上输入服务器的 IP，或者如下使用 curl 命令检查显示结果。# curl 192.168.1.110 我这里使用浏览器来验证。步骤 3 - 安装并配置 MariaDBMariaDB 是由原 MySQL 开发者 Monty Widenius 开发的一款开源数据库软件，它由 MySQL 分支而来，与 MySQL 的主要功能保持一致。在这一步中，我们要安装 MariaDB 数据库并为之配置好 root 密码，然后再为所要安装的 WordPress 创建一个新的数据库和用户。安装 mariadb 和 mariadb-server：# yum -y install mariadb mariadb-server 启动 MariaDB 并添加为服务，以便随系统启动。# systemctl start mariadb # systemctl enable mariadb 现在 MariaDB 已经启动了，还需要为 mariadb/mysql 数据库配置 root 用户密码。输入以下命令来设置 MariaDB root 密码。# mysql_secure_installation 提示设置 root 用户密码时，输入新密码进行设置：Set root password? [Y/n] Y New password: Re-enter new password: Remove anonymous users? [Y/n] Y ... Success! Disallow root login remotely? [Y/n] Y ... Success! Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y ... Success! 这样就设置好了 MariaDB 的 root 密码。现在登录到 MariaDB/MySQL shell 并为 WordPress 的安装创建一个新数据库 wordpressdb 和新用户 wpuser，密码设置为 wpuser@。为你的设置选用一个安全的密码。登录到 MariaDB/MySQL shell：# mysql -u root -p 接着输入你刚刚设置的 root 用户密码。创建数据库和用户：MariaDB [(none)]> create database wordpressdb; MariaDB [(none…

看漫画学 SELinux 强制策略
type: item
date: 2017-03-22T16:24:00+08:00
description: 今年是我们一起庆祝 SELinux 纪念日的第十个年头了（LCTT 译者注：本文发表于 2013 年）。真是太难以置信了！SELinux 最初在 Fedora Core 3 中被引入，随后加入了红帽企业版 Linux 4。从来没有使用过 SELinux 的家伙，你可要好好儿找个理由了……SElinux 是一个标签型系统。每一个进程都有一个标签。操作系统中的每一个文件/目录 客体 （ object ） 也都有一个标签。甚至连网络端口、设备，乃至潜在的主机名都被分配了标签。我们把控制访问进程的标签的规则写入一个类似文件的客体标签中，这些规则我们称之为 策略 （ policy ） 。内核强制实施了这些规则。有时候这种“强制”被称为 强制访问控制体系 （ Mandatory Access Control ） （MAC）。一个客体的拥有者对客体的安全属性并没有自主权。标准 Linux 访问控制体系，拥有者/分组 + 权限标志如 rwx，常常被称作 自主访问控制 （ Discretionary Access Control ） （DAC）。SELinux 没有文件 UID 或拥有权的概念。一切都被标签控制，这意味着在没有至高无上的 root 权限进程时，也可以设置 SELinux 系统。注意： SELinux 不允许你摒弃 DAC 控制。SELinux 是一个并行的强制模型。一个应用必须同时支持 SELinux 和 DAC 来完成特定的行为。这可能会导致管理员迷惑为什么进程被拒绝访问。管理员被拒绝访问是因为在 DAC 中有些问题，而不是在 SELinux 标签。类型强制让我们更深入的研究下标签。SELinux 最主要的“模型”或“强制”叫做 类型强制 （ type enforcement ） 。基本上这意味着我们根据进程的类型来定义其标签，以及根据文件系统客体的类型来定义其标签。打个比方想象一下在一个系统里定义客体的类型为猫和狗。猫（CAT）和狗（DOG）都是 进程类型 （ process type ） 。我们有一类希望能与之交互的客体，我们称之为食物。而我希望能够为食物增加类型：cat_food （猫的食物）和 dog_food（狗的食物）。作为一个策略制定者，我可以说一只狗有权限去吃狗粮（dog_chow），而一只猫有权限去吃猫粮（cat_chow）。在 SELinux 中我可以将这条规则写入策略中。allow cat cat_chow:food eat;允许 猫 猫粮：食物 吃；allow dog dog_chow:food eat;允许 狗 狗粮：食物 吃；有了这些规则，内核会允许猫进程去吃打上猫粮标签 cat_chow 的食物，允许狗去吃打上狗粮标签 dog_chow 的食物。此外，在 SELinux 系统中，由于禁止是默认规则，这意味着，如果狗进程想要去吃猫粮 cat_chow，内核会阻止它。同理，猫也不允许去接触狗粮。现实例子我们将 Apache 进程标为 httpd_t，将 Apache 上下文标为 httpd_sys_content_t 和 httpdsys_content_rw_t。假设我们把信用卡数据存储在 MySQL 数据库中，其标签为 msyqld_data_t。如果一个 Apache 进程被劫持，黑客可以获得 httpd_t 进程的控制权，从而能够去读取 httpd_sys_content_t 文件并向 httpd_sys_content_rw_t 文件执行写操作。但是黑客却不允许去读信用卡数据（mysqld_data_t），即使 Apache 进程是在 root 下运行。在这种情况下 SELinux 减轻了这次闯入的后果。多类别安全强制打个比方上面我们定义了狗进程和猫进程，但是如果你有多个狗进程：Fido 和 Spot，而你想要阻止 Fido 去吃 Spot 的狗粮 dog_chow 怎么办呢?一个解决方式是创建大量的新类型，如 Fido_dog 和 Fido_dog_chow。但是这很快会变得难以驾驭因为所有的狗都有差不多相同的权限。为了解决这个问题我们发明了一种新的强制形式，叫做 多类别安全 （ Multi Category Security ） （MCS）。在 MCS 中，我们在狗进程和狗粮的标签上增加了另外一部分标签。现在我们将狗进程标记为 dog:random1(Fido) 和 dog:random2(Spot)。我们将狗粮标记为 dog_chow:random1(Fido) 和 dog_chow:random2(Spot)。MCS 规则声明如果类型强制规则被遵守而且该 MCS 随机标签正确匹配，则访问是允许的，否则就会被拒绝。Fido (dog:random1) 尝试去吃 cat_chow:foo…

在 Linux 上用 SELinux 或 AppArmor 实现强制访问控制（MAC）
type: item
date: 2016-08-26T16:29:00+08:00
description: 为了解决标准的“用户-组-其他/读-写-执行”权限以及访问控制列表的限制以及加强安全机制，美国国家安全局（NSA）设计出一个灵活的 强制访问控制 （ Mandatory Access Control ） （MAC）方法 SELinux（Security Enhanced Linux 的缩写），来限制标准的权限之外的种种权限，在仍然允许对这个控制模型后续修改的情况下，让进程尽可能以最小权限访问或在系统对象（如文件，文件夹，网络端口等）上执行其他操作。SELinux 和 AppArmor 加固 Linux 安全另一个流行并且被广泛使用的 MAC 是 AppArmor，相比于 SELinux 它提供更多的特性，包括一个学习模式，可以让系统“学习”一个特定应用的行为，以及通过配置文件设置限制实现安全的应用使用。在 CentOS 7 中，SELinux 合并进了内核并且默认启用 强制 （ Enforcing ） 模式（下一节会介绍这方面更多的内容），与之不同的是，openSUSE 和 Ubuntu 使用的是 AppArmor 。在这篇文章中我们会解释 SELinux 和 AppArmor 的本质，以及如何在你选择的发行版上使用这两个工具之一并从中获益。SELinux 介绍以及如何在 CentOS 7 中使用Security Enhanced Linux 可以以两种不同模式运行： 强制 （ Enforcing ） ：这种情况下，SELinux 基于 SELinux 策略规则拒绝访问，策略规则是一套控制安全引擎的规则。 宽容 （ Permissive ） ：这种情况下，SELinux 不拒绝访问，但如果在强制模式下会被拒绝的操作会被记录下来。SELinux 也能被禁用。尽管这不是它的一个操作模式，不过也是一种选择。但学习如何使用这个工具强过只是忽略它。时刻牢记这一点！使用 getenforce 命令来显示 SELinux 的当前模式。如果你想要更改模式，使用 setenforce 0（设置为宽容模式）或 setenforce 1（强制模式）。因为这些设置重启后就失效了，你需要编辑 /etc/selinux/config 配置文件并设置 SELINUX 变量为 enforcing、permissive 或 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 是为其他服务保留的，所以我们暂时无法用它来运行其他服务：# sem…

SELinux 入门
type: item
date: 2016-05-09T19:47:00+08:00
description: 回到 Kernel 2.6 时代，那时候引入了一个新的安全系统，用以提供访问控制安全策略的机制。这个系统就是 Security Enhanced Linux (SELinux)，它是由美国国家安全局（NSA）贡献的，它为 Linux 内核子系统引入了一个健壮的 强制控制访问 （ Mandatory Access Control ） 架构。如果你在之前的 Linux 生涯中都禁用或忽略了 SELinux，这篇文章就是专门为你写的：这是一篇对存在于你的 Linux 桌面或服务器之下的 SELinux 系统的介绍，它能够限制权限，甚至消除程序或守护进程的脆弱性而造成破坏的可能性。在我开始之前，你应该已经了解的是 SELinux 主要是红帽 Red Hat Linux 以及它的衍生发行版上的一个工具。类似地， Ubuntu 和 SUSE（以及它们的衍生发行版）使用的是 AppArmor。SELinux 和 AppArmor 有显著的不同。你可以在 SUSE，openSUSE，Ubuntu 等等发行版上安装 SELinux，但这是项难以置信的挑战，除非你十分精通 Linux。说了这么多，让我来向你介绍 SELinux。DAC vs. MACLinux 上传统的访问控制标准是 自主访问控制 （ Discretionary Access Control ） （DAC）。在这种形式下，一个软件或守护进程以 User ID（UID）或 Set owner User ID（SUID）的身份运行，并且拥有该用户的目标（文件、套接字、以及其它进程）权限。这使得恶意代码很容易运行在特定权限之下，从而取得访问关键的子系统的权限。另一方面， 强制访问控制 （ Mandatory Access Control ） （MAC）基于保密性和完整性强制信息的隔离以限制破坏。该限制单元独立于传统的 Linux 安全机制运作，并且没有超级用户的概念。SELinux 如何工作考虑一下 SELinux 的相关概念: 主体 （ Subjects ） 目标 （ Objects ） 策略 （ Policy ） 模式 （ Mode ） 当一个 主体 （ Subject ） （如一个程序）尝试访问一个 目标 （ Object ） （如一个文件）， SELinux 安全服务器 （ SELinux Security Server ） （在内核中）从 策略数据库 （ Policy Database ） 中运行一个检查。基于当前的 模式 （ mode ） ，如果 SELinux 安全服务器授予权限，该主体就能够访问该目标。如果 SELinux 安全服务器拒绝了权限，就会在 /var/log/messages 中记录一条拒绝信息。听起来相对比较简单是不是？实际上过程要更加复杂，但为了简化介绍，只列出了重要的步骤。模式SELinux 有三个模式（可以由用户设置）。这些模式将规定 SELinux 在主体请求时如何应对。这些模式是： Enforcing （ 强制 ） — SELinux 策略强制执行，基于 SELinux 策略规则授予或拒绝主体对目标的访问 Permissive （ 宽容 ） — SELinux 策略不强制执行，不实际拒绝访问，但会有拒绝信息写入日志 Disabled （ 禁用 ） — 完全禁用 SELinux图 1：getenforce 命令显示 SELinux 的状态是 Enforcing 启用状态。默认情况下，大部分系统的 SELinux 设置为 Enforcing。你要如何知道你的系统当前是什么模式？你可以使用一条简单的命令来查看，这条命令就是 getenforce。这个命令用起来难以置信的简单（因为它仅仅用来报告 SELinux 的模式）。要使用这个工具，打开一个终端窗口并执行 getenforce 命令。命令会返回 Enforcing、Permissive，或者 Disabled（见上方图 1）。设置 SELinux 的模式实际上很简单——取决于你想设置什么模式。记住：永远不推荐关闭 SELinux。为什么？当你这么做了，就会出现这种可能性：你磁盘上的文件可能会被打上错误的权限标签，需要你重新标记权限才能修复。而且你无法修改一个以 Disabled 模式启动的系统的模式。你的最佳模式是 Enforcing 或者 Permissive。你可以从命令行或 /etc/selinux/config 文件更改 SELinux 的模式。要从命令行设置模式，你可以使用 setenforce 工具。要设置 Enforcing 模式，按下面这么做：打开一个终端窗口执行 su 然后输入你的管理员密码执行 setenforce 1执行 getenforce 确定模式已经正确设置（图 2）图 …