序章
優れたサーバー管理者は、新しい脆弱性を探します。 ポートを公開してサーバーを実行する場合は、そのセキュリティにこだわる必要があります。
残念ながら、アプリケーションとオペレーティングシステムの最新のセキュリティパッチをすべて把握していても、サーバーはゼロデイ攻撃(パッチのない未知の脆弱性を標的とした攻撃)に対して脆弱である可能性があります。 AppArmor は、このような攻撃からサーバーを保護するアクセス制御システムとして機能するLinuxカーネルモジュールです。 このモジュールは、Ubuntu 8.04がリリースされて以来、デフォルトでUbuntuで使用できます。
AppArmorがアプリケーションに対してアクティブな場合、オペレーティングシステムは、アプリケーションがセキュリティプロファイルに記載されているファイルとフォルダーにのみアクセスすることを許可します。 したがって、適切に計画されたセキュリティプロファイルを使用すると、攻撃中にアプリケーションが危険にさらされたとしても、それほど害を及ぼすことはありません。
このチュートリアルの内容
このチュートリアルでは、簡単なAppArmorセキュリティプロファイルを作成します。これは、人気のあるHTTPサーバーであるNginxのアクセス許可の詳細を含むテキストファイルです。
AppArmorがどのように機能するかを示すために、 / data / www /safeと/data / www / unsafe の2つのディレクトリから静的ファイルを提供するようにNginxを構成し、AppArmorを構成しますNginxを/data / www /safeに制限します。
この設定では、AppArmorが非アクティブの場合、外部ユーザーは両方のディレクトリのファイルにアクセスできます。 AppArmorがアクティブな場合、ユーザーは / data / www /safe内のファイルにのみアクセスできます。
前提条件
次のものが必要になります。
- Ubuntu14.04サーバー
- sudoユーザー
ステップ1—Nginxをインストールします
apt-get を使用してサーバーを更新し、Nginxをインストールします。
sudo apt-get update
sudo apt-get install nginx
これで、Nginxサーバーが動作可能になりました。 デフォルトのサーバーはポート80で実行されます。 ドロップレットの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 / safe / index.html と http:// :8080 / unsafe / index.html 。 安全なページは次のようになります。
これでNginxの構成が完了しました。
ステップ3—既存のAppArmorプロファイルを確認する
Ubuntu 14.04には、いくつかのAppArmorプロファイルがプリロードされています。 次のコマンドを使用して、それらをさらにインストールします。
sudo apt-get install apparmor-profiles
次のコマンドを実行して、使用可能なすべてのプロファイルを一覧表示します。
sudo apparmor_status
かなりの数のプロファイルが表示されるはずです。 一部は強制モードになり、一部は不平モードになります。 アプリケーションのプロファイルが不平モードの場合、AppArmorはアプリケーションのアクティビティを制限せずにログに記録します。
ログに記録するものがあれば、 / var / log /nginxディレクトリにNginxサーバーのログファイルがあります。
AppArmorは、プロファイルが強制モードの場合にのみアプリケーションが実行できることを制限します。
また、Nginxサーバーのプロファイルが存在しないことにも気付くでしょう。 次のステップで作成します。
ステップ4—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 / safe / index.html 。 これにより、安全なWebサイトにアクセスするための通常のエントリがNginxログに表示されます。
ターミナルに戻ります。 次に、AppArmorユーティリティを使用してNginxログを調べ、そこで見つかった各アクションを承認または却下します。
sudo aa-logprof
このコマンドはログファイルをスキャンし、AppArmorNginxプロファイルを更新します。 機能を許可または拒否するように何度か求められます。 サーバーが現在攻撃を受けていない場合、Nginxが正しく機能するには、要求されたすべての機能が必要であるため、毎回Aを押すことができます。 最後に、変更を保存するように求められたら、Sを押します。
新しいアプリケーションでAppArmorを有効にするためのこの一般的なプロセスは次のとおりです。
- アプリケーションの新しい空白のプロファイルを作成します
- 不平モードにする
- 適切なエントリがログに追加されるように、アプリケーションで通常のアクションを実行します
- AppArmorユーティリティを実行してログを確認し、さまざまなアプリケーションアクションを承認または却下します
ステップ5:AppArmorNginxプロファイルを編集する
特にNginxの場合、正しく機能させるには、自動生成されたファイルにいくつかの変更を加える必要があります。 を開きます /etc/apparmor.d/usr.sbin.nginx
編集用のファイル。
sudo nano /etc/apparmor.d/usr.sbin.nginx
少なくとも次の変更を行う必要があります。
- 追加します
#include <abstractions/apache2-common>
行-はい、ハッシュマークは意図的なものです - capabilitysetgid行を追加します
- capabilitysetuid行を追加します
- / 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/ディレクトリにアクセスするのをブロックできます。
1つの作業プロファイルは次のようになります。
#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のパーミッションは正しく理解するのが難しい場合があるため、このサンプルファイルと自動生成されたファイルを開始点として使用できますが、トラブルシューティングを行う準備をしてください。
AppArmorNginxプロファイルの準備が整いました。 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 / safe / index.html 。 ページが表示されるはずです。 次に、 http:// :8080 / unsafe / index.html 。 次のようなエラーページが表示されます。 これは、プロファイルが期待どおりに機能していることを示しています。
トラブルシューティング
プロファイルを適用した後にNginxサーバーが起動しない場合は、プロファイルにNginxが必要とする権限が含まれていない可能性があります。 以下を確認する必要があります。
- エラーテキスト
- var / log / syslog
- /var/log/nginx/error.log
次に、これらのエラーに基づいてプロファイルを変更する必要があります。
たとえば、プロファイルに abstracts / apache2-common を含めるのを忘れた場合、次のようなエラーが表示されます。
[emerg] 3611#0: socket() 0.0.0.0:8080 failed (13: Permission denied)
実際のシナリオでは、新しいアプリケーションに役立つAppArmorプロファイルに到達するには、多くの試行錯誤が必要であり、非常に時間がかかります。
結論
このチュートリアルでは、AppArmorプロファイルを最初から作成する方法を学びました。 実際のシナリオでは、大規模なアプリケーションでAppArmorを有効にする前に、より厳密なプロセスに従う必要があります。
まず、aa-complainコマンドで不平モードを有効にします。 次に、システム管理者は通常、 aa-logprof コマンドを実行する前に数日間待機して、アプリケーションのより一般的なアクションをログに記録する時間をシステムに与えます。 実動システムで使用されるプロファイルを作成する場合は、同じことを行うことをお勧めします。