如何在 Ubuntu 14.04 上为 Nginx 创建 AppArmor 配置文件

介绍

一个好的服务器管理员会注意新的漏洞,当你运行一个向公众开放的端口的服务器时,你应该对其安全性感到困惑。

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

当AppArmor对一个应用程序是活跃的,操作系统允许该应用程序只访问其安全配置文件中提到的那些文件和文件夹.因此,有了精心策划的安全配置文件,即使应用程序在攻击过程中受到威胁,它也不会做太多伤害。

这个教程涵盖了什么

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

为了展示 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:

1sudo apt-get update
2sudo apt-get install nginx

您的 Nginx 服务器现在正在运行. 默认服务器将运行在端口 80. 您可以通过访问您的 Droplet 的 IP 地址来测试它: http://:80. 您应该看到默认的 Nginx 欢迎页面。

Nginx welcome page

步骤2:配置 Nginx 以服务静态文件

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

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

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

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

让文件具有以下内容:

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

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

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

Nginx 的配置文件位于 /etc/nginx/nginx.conf. 编辑此文件以创建一个新的服务器,该服务器在端口 8080 上收听并服务来自 /data/www 的文件. 忽略了评论的行,编辑后,您的文件应该看起来像下面显示的文件。 您需要添加一个哈希标记来评论包括 /etc/nginx/sites-enabled/*; 行。

 1user www-data;
 2worker_processes 4;
 3pid /run/nginx.pid;
 4
 5events {
 6    worker_connections 768;
 7}
 8
 9http {
10    sendfile on;
11    tcp_nopush on;
12    tcp_nodelay on;
13    keepalive_timeout 65;
14    types_hash_max_size 2048;
15
16    include /etc/nginx/mime.types;
17    default_type application/octet-stream;
18
19    access_log /var/log/nginx/access.log;
20    error_log /var/log/nginx/error.log;
21
22    gzip on;
23    gzip_disable "msie6";
24
25    include /etc/nginx/conf.d/*.conf;
26
27    server {
28        listen 8080;
29        location / { 
30                root /data/www;
31        }
32    }
33}

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

1sudo nginx -s reload

此时,由于AppArmor尚未为 Nginx启用,您应该能够访问 http://:8080/safe/index.html 和 http://:8080/unsafe/index.html。

Safe Page

Nginx 配置已完成。

步骤三 - 检查现有 AppArmor 配置文件

Ubuntu 14.04 配备了一些预先加载的 AppArmor 配置文件,使用此命令安装更多:

1sudo apt-get install apparmor-profiles

列出所有可用的配置文件,通过执行这个命令:

1sudo apparmor_status

您应该看到相当多的配置文件. 有些将处于 _enforce 模式中,有些则处于 _complain 模式中. 当应用程序的配置文件处于 complain 模式中 时,AppArmor 会记录应用程序的活动,而不会以任何方式限制它。

一旦有东西要登录,你会在 /var/log/nginx 目录中找到 Nginx 服务器的日志文件。

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

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

第四步:为 Nginx 创建新的 AppArmor 配置文件

安装 apparmor-utils. 这些是帮助您管理 AppArmor 的工具集合。

1sudo apt-get install apparmor-utils

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

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

一旦配置文件被创建,使用 aa-complain 将该配置文件放入投诉模式。

1sudo aa-complain nginx

重新启动 Nginx。

1sudo service nginx restart

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

现在,我们将使用 AppArmor 实用程序来浏览 Nginx 日志,并批准或驳回它在那里发现的每个操作。

1sudo aa-logprof

此命令会扫描日志文件并更新 AppArmor Nginx 配置文件. 您将被提示多次允许或拒绝某个功能. 假设您的服务器目前没有受到攻击,您可以每次按 A ,因为所有所要求的功能都是必要的,以便 Nginx 正常工作。

启用 AppArmor 用于新应用程序的这一一般过程如下:

  • 为应用程序创建一个新的空格配置文件 * 将其放入投诉模式 * 与应用程序进行正常操作,以便将适当的条目添加到日志 * 运行 AppArmor 实用程序来浏览日志并批准或驳回各种应用程序操作

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

对于 Nginx 来说,您需要对自动生成的文件进行一些更改,以便它能正常工作。 打开 /etc/apparmor.d/usr.sbin.nginx 文件进行编辑。

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

你至少应该做出以下变化:

  • 添加 # include <abstractions/apache2-common> 行 - 是的,哈希标记是故意的 * 添加功能设置行 * 添加功能设置行 * 更新 /data/www/safe/ 行以包含整个目录以表示星座 () * 添加否定 /data/www/unsafe/ r 行,包括条纹 * 确保 Nginx 可以通过设置 w 为 /var/log/nginx/error.log 来写入错误日志

apache2-common include 允许 Nginx 在各种端口上聆听。新的 capability 线允许 Nginx 启动新的流程。

一个工作配置文件看起来像这样:

 1#include <tunables/global>
 2
 3/usr/sbin/nginx {
 4  #include <abstractions/apache2-common>
 5  #include <abstractions/base>
 6  #include <abstractions/nis>
 7
 8  capability dac_override,
 9  capability dac_read_search,
10  capability net_bind_service,
11  capability setgid,
12  capability setuid,
13
14  /data/www/safe/* r,
15  deny /data/www/unsafe/* r,
16  /etc/group r,
17  /etc/nginx/conf.d/ r,
18  /etc/nginx/mime.types r,
19  /etc/nginx/nginx.conf r,
20  /etc/nsswitch.conf r,
21  /etc/passwd r,
22  /etc/ssl/openssl.cnf r,
23  /run/nginx.pid rw,
24  /usr/sbin/nginx mr,
25  /var/log/nginx/access.log w,
26  /var/log/nginx/error.log w,
27}

您的个人资料可能看起来有点不同,因为它是基于您的日志文件生成的。你要么更喜欢研究和更新个别参数,要么更喜欢批发这个文件,用通常的警告来考虑自己的服务器环境 AppArmor的权限可能很难得到正确,所以你可以使用这个示例文件和自动生成的这些作为起点,但要做好一些故障排除的准备。

AppArmor Nginx 配置文件已准备好. 使用 aa-enforce 将配置文件放入执行模式。

1sudo aa-enforce nginx

建议您重新加载所有配置文件并重新启动 Nginx,以确保最新更改生效。

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

如果您在这些步骤中遇到错误,请阅读错误,双重检查配置文件,然后检查 /var/log/syslog 以指向正确的方向。

查看AppArmor的状态:

1sudo apparmor_status

你应该看到 Nginx 流程在执行模式中运行。

返回浏览器并访问 http://:8080/safe/index.html. 您应该能够查看该页面,然后访问 http://:8080/unsafe/index.html. 您应该看到一个错误页面,如下所示。 这证明我们的个人资料按预期工作。

Forbidden Error

解决问题

如果您的 Nginx 服务器在执行配置文件后未能启动,那么您的配置文件可能不包含 Nginx 需要的权限。

  • 错误文本 * var/log/syslog * /var/log/nginx/error.log

然后,您将需要根据这些错误来修改您的个人资料。

例如,如果您忘记在配置文件中包含抽象/apache2 常见,则会看到一个错误,如:

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

在现实世界的情况下,为一个新的应用程序找到一个有用的AppArmor配置文件需要大量的尝试和错误,而且也非常耗时。

结论

借助本教程,您已经学会了如何从头开始创建AppArmor配置文件,在现实生活中,您希望在为大型应用程序启用AppArmor之前遵循更严格的过程。

首先,使用 aa-complain 命令启用投诉模式,然后,系统管理员通常在运行 aa-logprof 命令之前等待几天,以便给系统时间记录应用程序的更多常见操作。

Published At
Categories with 技术
comments powered by Disqus