如何在Ubuntu14.04上为Nginx创建AppArmor配置文件

来自菜鸟教程
跳转至:导航、​搜索

介绍

优秀的服务器管理员会留意新的漏洞。 当你运行一个端口向公众开放的服务器时,你应该关注它的安全性。

不幸的是,即使您为您的应用程序和操作系统安装了所有最新的安全补丁,您的服务器仍然可能容易受到零日攻击:针对没有任何补丁的未知漏洞的攻击。 AppArmor 是一个 Linux 内核模块,充当访问控制系统,保护您的服务器免受此类攻击。 自 Ubuntu 8.04 发布以来,该模块默认在 Ubuntu 上可用。

当 AppArmor 对应用程序处于活动状态时,操作系统允许应用程序仅访问其安全配置文件中提到的那些文件和文件夹。 因此,通过精心规划的安全配置文件,即使应用程序在攻击期间受到威胁,也不会造成太大伤害。

本教程涵盖的内容

在本教程中,我们将创建一个简单的 AppArmor 安全配置文件,它是一个文本文件,其中包含流行的 HTTP 服务器 Nginx 的权限详细信息。

为了演示 AppArmor 的工作原理,我们将配置 Nginx 以从两个目录提供静态文件:/data/www/safe/data/www/unsafe,并配置 AppArmor将 Nginx 限制在 /data/www/safe

使用此设置,当 AppArmor 处于非活动状态时,外部用户将能够访问这两个目录中的文件。 当 AppArmor 处于活动状态时,用户将只能访问 /data/www/safe 中的文件。

先决条件

您将需要以下内容:

  • Ubuntu 14.04 服务器
  • 一个 sudo 用户

第一步——安装 Nginx

使用 apt-get 更新您的服务器并安装 Nginx:

sudo apt-get update
sudo apt-get install nginx

您的 Nginx 服务器现在可以运行了。 默认服务器将在端口 80 上运行。 您可以通过访问您的 Droplet 的 IP 地址作为 URL 在浏览器中对其进行测试: http:// :80 . 您应该会看到默认的 Nginx 欢迎页面。

第 2 步:配置 Nginx 以提供静态文件

创建将提供静态文件的目录。

sudo mkdir -p /data/www/safe
sudo mkdir -p /data/www/unsafe

使用 nano 将文件添加到 safe 目录:

sudo nano /data/www/safe/index.html

让文件具有以下内容:

<html>
    <b>Hello! Accessing this file is allowed.</b>
</html>

同样,在 /data/www/unsafe 中创建另一个名为 index.html 的文件,内容如下:

<html>
    <b>Hello! Accessing this file is NOT allowed.</b>
</html>

Nginx的配置文件位于/etc/nginx/nginx.conf。 编辑此文件以创建一个新服务器,该服务器侦听端口 8080 并提供来自 /data/www 的文件。 忽略注释行,编辑后,您的文件应如下所示。 您需要添加一个井号来注释掉 include /etc/nginx/sites-enabled/*; 行。 您还需要添加下面红色显示的整个 server 块:

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;

    server {
        listen 8080;
        location / { 
                root /data/www;
        }
    }
}

保存更改,并通过执行以下命令加载新配置:

sudo nginx -s reload

此时,由于 Nginx 的 AppArmor 还没有开启,应该可以同时访问 http:// :8080/安全/index.html http:// :8080/不安全/index.html . 安全页面如下所示:

Nginx 配置现已完成。

第三步——检查现有的 AppArmor 配置文件

Ubuntu 14.04 预装了一些 AppArmor 配置文件。 使用以下命令安装更多:

sudo apt-get install apparmor-profiles

通过执行以下命令列出所有可用的配置文件:

sudo apparmor_status

您应该会看到很多配置文件。 有些会处于强制模式,有些会处于投诉模式。 当应用程序的配置文件处于 投诉模式 时,AppArmor 会记录应用程序的活动,而不以任何方式对其进行限制。

一旦有需要记录的内容,您将在 /var/log/nginx 目录中找到 Nginx 服务器的日志文件。

AppArmor 限制应用程序仅在其配置文件处于 强制模式 时才能执行的操作。

您还会注意到 Nginx 服务器没有配置文件。 我们将在下一步中创建一个。

第四步——为 Nginx 创建一个新的 AppArmor 配置文件

安装 apparmor-utils。 这些是帮助您管理 AppArmor 的实用程序的集合。

sudo apt-get install apparmor-utils

您现在已准备好开始分析 Nginx 的活动。 使用 aa-autodep 命令创建一个新的空白配置文件。 配置文件将在 /etc/apparmor.d 中创建。

cd /etc/apparmor.d/
sudo aa-autodep nginx

创建配置文件后,使用 aa-complain 将配置文件置于抱怨模式。

sudo aa-complain nginx

重启 Nginx。

sudo service nginx restart

打开浏览器,访问 http:// :8080/安全/index.html . 这将触发访问安全网站的正常条目出现在您的 Nginx 日志中。

回到终端。 现在我们将使用 AppArmor 实用程序检查 Nginx 日志并批准或拒绝它在其中找到的每个操作。

sudo aa-logprof

此命令扫描日志文件并更新 AppArmor Nginx 配置文件。 系统会多次提示您允许或拒绝某项功能。 假设您的服务器当前没有受到攻击,您可以每次按 A,因为请求的所有功能都是 Nginx 正常工作所必需的。 最后,当提示保存更改时,按 S

为新应用程序启用 AppArmor 的一般流程如下:

  • 为应用程序创建一个新的空白配置文件
  • 进入投诉模式
  • 对应用程序执行正常操作,以便将适当的条目添加到日志中
  • 运行 AppArmor 实用程序以查看日志并批准或不批准各种应用程序操作

第 5 步:编辑 AppArmor Nginx 配置文件

特别是对于 Nginx,您需要对自动生成的文件进行一些更改才能使其正常工作。 打开 /etc/apparmor.d/usr.sbin.nginx 文件进行编辑。

sudo nano /etc/apparmor.d/usr.sbin.nginx

您至少应该进行以下更改:

  • 添加 #include <abstractions/apache2-common> 行 - 是的,井号是故意的
  • 添加 功能 setgid
  • 添加 功能 setuid
  • 更新 /data/www/safe/ 行以包含带有星号 (*) 的整个目录
  • 添加 deny /data/www/unsafe/* r, 行,包括逗号
  • 通过为 /var/log/nginx/error.log 设置 w 确保 Nginx 可以写入错误日志

apache2-common 包含让 Nginx 监听各种端口。 新的 capability 行允许 Nginx 启动新进程。 deny 规则允许我们阻止 Nginx 访问 /data/www/unsafe/ 目录。

一个工作配置文件如下所示:

#include <tunables/global>

/usr/sbin/nginx {
  #include <abstractions/apache2-common>
  #include <abstractions/base>
  #include <abstractions/nis>

  capability dac_override,
  capability dac_read_search,
  capability net_bind_service,
  capability setgid,
  capability setuid,

  /data/www/safe/* r,
  deny /data/www/unsafe/* r,
  /etc/group r,
  /etc/nginx/conf.d/ r,
  /etc/nginx/mime.types r,
  /etc/nginx/nginx.conf r,
  /etc/nsswitch.conf r,
  /etc/passwd r,
  /etc/ssl/openssl.cnf r,
  /run/nginx.pid rw,
  /usr/sbin/nginx mr,
  /var/log/nginx/access.log w,
  /var/log/nginx/error.log w,
}

您的配置文件可能看起来有点不同,因为它是根据您的日志文件生成的。 您是否愿意研究和更新单个参数,或者批量复制此文件,取决于您自己的服务器环境。 AppArmor 权限可能很难获得正确的权限,因此您可以使用此示例文件和自动生成的文件作为起点,但要准备好进行一些故障排除。

AppArmor Nginx 配置文件已准备就绪。 使用 aa-enforce 将配置文件置于强制模式。

sudo aa-enforce nginx

建议您重新加载所有配置文件并重新启动 Nginx 以确保最新更改生效。 输入以下内容:

sudo /etc/init.d/apparmor reload
sudo service nginx restart

如果您在任何这些阶段遇到错误,请阅读错误,仔细检查您的配置文件,然后检查 /var/log/syslog 为您指明正确的方向。

检查 AppArmor 的状态:

sudo apparmor_status

您应该看到 Nginx 进程在强制模式下运行。

返回浏览器并访问 http:// :8080/安全/index.html . 您应该能够看到该页面。 然后访问 http:// :8080/不安全/index.html . 您应该会看到如下所示的错误页面。 这证明我们的配置文件按预期工作。

故障排除

如果您在强制执行配置文件后 Nginx 服务器无法启动,则很可能该配置文件不包含 Nginx 所需的权限。 你应该检查:

  • 错误文本
  • 变量/日志/系统日志
  • /var/log/nginx/error.log

然后,您将不得不根据这些错误修改您的个人资料。

例如,如果您忘记在配置文件中包含 abstractions/apache2-common,您将看到如下错误:

[emerg] 3611#0: socket() 0.0.0.0:8080 failed (13: Permission denied)

在实际场景中,为新应用程序获得有用的 AppArmor 配置文件涉及大量试验和错误,并且也非常耗时。

结论

通过本教程,您学会了从头开始创建 AppArmor 配置文件。 在现实生活场景中,您可能希望在为大型应用程序启用 AppArmor 之前遵循更严格的流程。

首先,使用 aa-complain 命令启用抱怨模式。 然后,系统管理员通常在运行 aa-logprof 命令之前等待几天,以便让系统有时间记录应用程序的更多常见操作。 如果您要创建将在生产系统中使用的配置文件,建议您执行相同的操作。