nginx + ModSecurity

表題の通り。nginxをソースコンパイルしてModSecurityを組み込む。

■ 環境

  • nginx 1.12.0
  • ModSecurity 2.9
  • CentOS 6.7

■ ModSecurity

ModSecurity: Open Source Web Application Firewall
http://www.modsecurity.org/

nginxへのインストールは下記を参照する。

Installion for NGINX
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Mannual#Installation_for_NGINX

まずは依存パッケージをインストールする。

$ sudo yum install httpd httpd-devel pcre pcre-devel libxml2-devel

httpd“自体もインストールしなければならないのか…。”pcre“あたりは理解できるが…。ソースはModSecurityのページから取得する。現在の最新versionは”2.9“のようである。

$ wget https://www.modsecurity.org/tarball/2.9/modsecurity-2.9.tar.gz

展開して`configure`。

$ tar zxf modsecurity-2.9.tar.gz
$ cd modsecurity-2.9
$ ./configure --enable-standalone --disable-mlogc
  :
$ make
  :
$

あとはソースコンパイルだけである。先日のエントリのようにやる。

$ cd nginx-1.12.0
$ configure --add-module=../modsecurity-2.9/nginx/modsecurity
  :
$ make
  :
$ sudo make install
  :
$

CRSとかも入れないと意味無いが、とりあえず今日はここまで。

以上。

■ 関連

nginxをソースインストール

nginxをソースインストール

表題の通り。2017/04/12に”1.12.0“がリリースされているのでこれをソースからインストールしてみる。

■ 環境

  • nginx 1.12.0
  • CentOS 6.3

■ nginx

取得、展開。

$ wget https://nginx.org/download/nginx-1.12.0.tar.gz
$ tar zxf nginx-1.12.0.tar.gz
$ cd nginx-1.12.0

また、公式のページには下記のようにある。

nginx news
https://nginx.org/

nginx-1.12.0 stable version has been released, incorporating new features and bug 
fixes from the 1.11.x mainline branch - including variables support and other 
improvements in the stream module, HTTP/2 fixes, support for multiple SSL 
certificates of different types, improved dynamic modules support, and more.

とのこと。

とりあえず`configure`してインストールする。オプションは今段階では特に設定しない。

$ ./configure

下記の依存があったので、これらのパッケージをインストールしておいた。

  • pcre-devel
  • zlib-devel
$ make && make install

インストールできたか確認する。`configure`で”prefix“を指定しないと下記の場所になるようだ。

$ /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.0
$

これからいろいろ試していこうかな。

以上。

■ 関連

nginx + ModSecurity

stub_status

nginxにおいて表題のモジュールを試す。

■ 環境

  • Nginx 1.11.8
  • Docker for Mac 1.12.6
  • Mac OSX El Capitan

■ stub_status

設定ファイルを下記のように追加した。今回の環境では`/etc/nginx/conf.d/default.conf`にとりあえず追記して試している。

    location = /status {
        stub_status;
    }

入れているのは、”server“ディレクティブ内である。これでnginxを起動してアクセスしてみる。ちなみにDockerのnginxのコンテナは下記のように起動している。

docker run -ti --rm -p 8080:80 -v `pwd`/nginx.conf:/etc/nginx/nginx.conf nginx

アクセスしてみると下記のように取得できた。

$ curl localhost:8080/status
Active connections: 1
server accepts handled requests
5 5 8
Reading: 0 Writing: 1 Waiting: 0
$

たいした情報は得られないようで少々寂しい。

以上。

■ 関連

nginxでserver_tokensを表示させない

表題の通り。

■ 環境

  • nginx 1.11.6

■ server_tokens

デフォルトでは下記のように情報を取得されてしまう。※下記は少々細工

Server: nginx/1.11.6 (Ubuntu)

これを表示したくない。nginxを使用しているのが表示されてしまうのはしょうがないのであるが、設定ファイルを1行追記するだけでnginxのversion等が消えるのであれば、設定しておいて良いであろう。

下記の設定を”nginx.conf“の”http“ディレクティブに追記する。

http {
  :
  server_tokens off;
  :
}

ブラウザでも確認ができるが、`telnet`で確認してみる。対象のnginxはDockerで起動したものである。

$ telnet localhost 10080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.0

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 23 Nov 2016 05:37:05 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 15 Nov 2016 15:11:46 GMT
Connection: close
ETag: "582b25b2-264"
Accept-Ranges: bytesWelcome to nginx!

  :

Connection closed by foreign host.
$

Server: nginx“だけになった。

以上。

■ 関連

nginxでSSI

表題の通り。Server Side Include (SSI)を試してみる。

■ 環境

  • nginx 1.11.5
  • Docker 1.12.1
  • Mac OSX El Capitan

■ SSI

単純にファイルをincludeしたりしたい。がPHPだのrubyだのでテンプレートを、、というのは面倒なのでSSIで対応する。

Module ngx_http_ssi_module
https://nginx.org/en/docs/http/ngx_http_ssi_module.html

設定ファイル(default.conf)は下記のようにした。

  1 server {
  2     listen       80;
  3     server_name  localhost;
  4     ssi on;
  :

これを反映させる。nginxはDockerで動かしている。

$ docker run -d --name nginx -v `pwd`:/usr/share/nginx/html:ro -v `pwd`/default.conf:/etc/nginx/conf.d/default.conf -p 10080:80 nginx

ここから本題のHTMLである。

2つのファイルを用意した。`include`する側のHTMLファイルと、`include`される側のHTMLファイルである。

`include`する側。

$ cat test.html
<!--#include virtual="/test2.html" -->
<div class="contents">ここはトップページです。(index.html)</div>
$

`include`される側。

$ cat test2.html
<!-- test2.html -->
<div class="header">ahahahaha</div>
<!-- test2.html --> 
$

実際にブラウザでアクセスすると`include`されているのがわかるであろう。ここでは`curl`で取得してみる。

$ curl localhost:10080/test.html
<!-- test2.html -->
<div class="header">ahahahaha</div>
<!-- test2.html -->
<div class="contents">ここはトップページです。(index.html)</div>
$

性能としてはどの程度になるのであろうか?いずれ計測してみよう。

以上。

■ 関連