如何在Ubuntu 14.04创建一个Nginx的AppArmor配置文件

请使用AppArmor,以提高安全性为你的Ubuntu的应用程序。本教程使用Nginx的作为一个例子。

介绍

一个好的服务器管理员寻找新的漏洞。 当您运行服务器端口对公众开放时,您应该沉迷其安全性。

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

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

这个教程包括

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

为了演示的AppArmor是如何工作的缘故,我们将配置的Nginx从两个目录提供静态文件:/数据/网络/安全 /数据/网络/不安全 ,并配置AppArmor配置来限制Nginx的到/数据/网络/安全

使用此设置,当AppArmor处于非活动状态时,外部用户将能够访问这两个目录中的文件。 AppArmor的时候被激活,用户将只能访问文件/数据/网络/安全

先决条件

您将需要以下:

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

第一步 - 安装Nginx

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

sudo apt-get update
sudo apt-get install nginx

您的Nginx服务器现在可以运行。 默认的服务器将在80端口上运行您可以通过访问您的Droplet的IP地址作为URL测试它在浏览器中:HTTP:// <服务器IP>:80。 你应该看到默认的Nginx欢迎页面。

Nginx欢迎页面

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

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

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

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

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

让文件具有以下内容:

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

同样,在/数据/网络/不安全名为index.html另一个文件,包含以下内容:

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

Nginx的配置文件位于/etc/nginx/nginx.conf。 编辑这个文件,以创建从/数据/网络侦听端口8080,并提供文件的新服务器。 忽略注释的行,编辑后,您的文件应该看起来像下面显示的文件。 您将需要添加一个井号注释掉include /etc/nginx/sites-enabled/*;行。 您还需要添加下面红色显示整个服务器块:

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

在这一点上,因为AppArmor配置尚未开启了Nginx的,你应该能够访问这两个HTTP:// <服务器IP>:8080 /安全/ index.html的http:// <服务器IP>: 8080 /不安全/ index.html的 安全页面如下所示:

安全页面

Nginx配置现在完成。

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

Ubuntu 14.04预装了几个AppArmor配置文件。 使用此命令安装更多:

sudo apt-get install apparmor-profiles

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

sudo apparmor_status

你应该会看到很多个配置文件。 有些人会在强制模式 ,有的在抱怨模式 当一个应用程序的资料是在提示模式 ,AppArmor的记录应用程序的活动不限制以任何方式。

一旦有什么东西记录,你会发现在/ var /日志/ 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-抱怨把个人资料提示模式。

sudo aa-complain nginx

重新启动Nginx。

sudo service nginx restart

打开浏览器,并访问http:// <服务器IP>: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线
  • 更新/数据/网络/安全/线,包括有星号的整个目录(*)
  • 添加拒绝/数据/网络/不安全/ * R,线,包括逗号
  • 确保Nginx的可以写入错误日志设置w代表/var/log/nginx/error.log

Apache2,常见的包括让Nginx的各种端口上侦听。 这一新功能线允许的Nginx开始新进程。 拒绝规则允许我们从访问/数据/网络/不安全/目录块Nginx的。

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

#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-强制把个人资料强制模式。

sudo aa-enforce nginx

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

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

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

查看AppArmor的状态:

sudo apparmor_status

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

返回到浏览器,访问http:// <服务器IP>:8080 /安全/ index.html的 您应该能够看到该页面。 然后访问http:// <服务器IP>:8080 /不安全/ index.html的 您应该看到一个错误页面,如下所示。 这证明我们的配置文件正常工作。

禁止错误

故障排除

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

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

然后,您将需要根据这些错误修改您的配置文件。

例如,如果您忘记了包括抽象/ Apache2的常见的配置文件,你会看到一个错误,如:

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

在现实世界的情况下,为新应用程序获得有用的AppArmor配置文件涉及大量试验和错误,并且也是相当耗时的。

结论

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

首先,能够与AA-怨怨命令模式。 然后,系统管理员通常运行AA-logprof命令给系统时间日志应用比较常见的操作之前,等待数日。 如果要创建将在生产系统中使用的配置文件,建议您执行相同操作。