ノウハウ
[エンジニア向け]

Plesk11 nginx環境でのIPアクセス制限(Order, Allow, Deny)

ノウハウ
テクニカルサポート

Plesk11では標準で、フロントエンドにnginxが使われています。
この環境下でのIPアクセス制限(Order, Allow, Deny)が特殊でしたので、2点まとめました。

server-statusに対するIPアクセス制限

MUNIN2で利用するため、IPアクセス制限したserver-statusを用意することになりました。
apacheでループバック以外からのアクセスを制限したのですが、グローバルからのアクセスが可能な状態でした。

# cat /etc/httpd/conf.d/munin.conf
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

グローバルからのアクセスはnginx(Port 80) → apache(Port 7080)と渡されます。
この場合、apacheはアクセス元IPが127.0.0.1に見えているので、IPベースのアクセス制限はできません。

nginxの設定を確認してみます。

# cat /usr/local/psa/admin/conf/generated/last_nginx.conf
server {
listen xxx.xxx.xxx.xxx:80 default_server ;
location / {
proxy_pass http://127.0.0.1:7080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

いくつかのヘッダが渡される設定がされていますので、HTTP リクエストヘッダベースの制限に切り替えます。
確認のためloのtcpdumpを取ってみます。

ローカルからのアクセス時

# tcpdump -i lo -X -s 0
18:29:42.250518 IP localhost.localdomain.41474 > localhost.localdomain.7080: P 1:151(150) ack 1 win 513 <nop,nop,timestamp 841414159 841414154>
0x0000:  4500 00ca 311b 4000 4006 0b11 7f00 0001  E...1.@.@.......
0x0010:  7f00 0001 a202 1ba8 804c c714 80df 30f7  .........L....0.
0x0020:  8018 0201 febe 0000 0101 080a 3226 f60f  ............2&..
0x0030:  3226 f60a 4745 5420 2f73 6572 7665 722d  2&..GET./server-
0x0040:  7374 6174 7573 3f61 7574 6f20 4854 5450  status?auto.HTTP
0x0050:  2f31 2e31 0d0a 5445 3a20 6465 666c 6174  /1.1..TE:.deflat
0x0060:  652c 677a 6970 3b71 3d30 2e33 0d0a 436f  e,gzip;q=0.3..Co
0x0070:  6e6e 6563 7469 6f6e 3a20 5445 2c20 636c  nnection:.TE,.cl
0x0080:  6f73 650d 0a48 6f73 743a 2031 3237 2e30  ose..Host:.127.0
0x0090:  2e30 2e31 3a37 3038 300d 0a55 7365 722d  .0.1:7080..User-
0x00a0:  4167 656e 743a 206d 756e 696e 2f32 2e30  Agent:.munin/2.0
0x00b0:  2e32 2028 6c69 6277 7777 2d70 6572 6c2f  .2.(libwww-perl/
0x00c0:  352e 3830 3529 0d0a 0d0a                 5.805)....
グローバルからのアクセス時

# tcpdump -i lo -X -s 0
18:30:44.119510 IP localhost.localdomain.53399 > localhost.localdomain.7080: P 1:453(452) ack 1 win 513 <nop,nop,timestamp 841476029 841476029>
0x0000:  4500 01f8 e510 4000 4006 55ed 7f00 0001  E.....@.@.U.....
0x0010:  7f00 0001 d097 1ba8 84ff 02b4 857b 0642  .............{.B
0x0020:  8018 0201 ffec 0000 0101 080a 3227 e7bd  ............2'..
0x0030:  3227 e7bd 4745 5420 2f73 6572 7665 722d  2'..GET./server-
0x0040:  7374 6174 7573 2048 5454 502f 312e 300d  status.HTTP/1.0.
0x0050:  0a48 6f73 743a 20xx xxxx xxxx xxxx xxxx  .Host:.xxx.xxx.x
0x0060:  xxxx xxxx xxxx 0d0a 582d 5265 616c 2d49  xx.xxx..X-Real-I
0x0070:  503a 20xx xxxx xxxx xxxx xxxx xxxx xxxx  P:.xxx.xxx.xx.xx
0x0080:  0d0a 582d 466f 7277 6172 6465 642d 466f  ..X-Forwarded-Fo
0x0090:  723a 20xx xxxx xxxx xxxx xxxx xxxx xxxx  r:.xxx.xxx.xx.xx
0x00a0:  0d0a 436f 6e6e 6563 7469 6f6e 3a20 636c  ..Connection:.cl
0x00b0:  6f73 650d 0a43 6163 6865 2d43 6f6e 7472  ose..Cache-Contr
0x00c0:  6f6c 3a20 6d61 782d 6167 653d 300d 0a55  ol:.max-age=0..U
0x00d0:  7365 722d 4167 656e 743a 204d 6f7a 696c  ser-Agent:.Mozil
0x00e0:  6c61 2f35 2e30 2028 5769 6e64 6f77 7320  la/5.0.(Windows.
0x00f0:  4e54 2036 2e31 2920 4170 706c 6557 6562  NT.6.1).AppleWeb
0x0100:  4b69 742f 3533 372e 3420 284b 4854 4d4c  Kit/537.4.(KHTML

フィールド名Hostで制限出来そうです。

# cat /etc/httpd/conf.d/munin.conf
SetEnvIf Host "^127.0.0.1:7080$" MUNIN
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from env=MUNIN
</Location>

munin2がserver-statusから数値を取得出来ているか確認してみます。

# munin-run apache_accesses
accesses80.value 10

数値を取得することが出来ました。

グローバルからのアクセス制限も出来ています。

127.0.0.1 - - [01/Oct/2012:13:06:41 +0900] "GET /server-status?auto HTTP/1.1" 200 610 "-" "munin/2.0.2 (libwww-perl/5.805)"
xxx.xxx.xx.xx - - [01/Oct/2012:13:06:47 +0900] "GET /server-status HTTP/1.0" 403 1255 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4"

Plesk11 VirtualHost領域での.htaccessによるIPアクセス制限

.htaccessによるIPアクセス制限を行なうと、phpファイルのみアクセス出来てしまうとお客様より問い合わせがありました。
調査してみるとPleskが作成するVirtualHostのコンフィグに原因がありました。

/var/www/vhosts/<hostname>/conf/last_httpd_ip_default.include

<IfModule mod_fcgid.c>
<Files ~ (\.php)>
SetHandler fcgid-script
FCGIWrapper /var/www/cgi-bin/cgi_wrapper/cgi_wrapper .php
Options +ExecCGI
allow from all
</Files>
</IfModule> 

Filesディレクティブで Allow from all されてしまっています。

.htaccessではこれを打ち消すためにFilesディレクティブを使ってアクセス制限をかけます。
フィールド名はX-Forwarded-Forを使用しました。

SetEnvIf X-Forwarded-For ^xxx.xxx.xxx.xxx$ AC
<Files ~ (.*)>
Order deny,allow
Deny from all
Allow from env=AC
</Files>

これで全ファイルに対して、アクセス制限することが出来ます。

Plesk11が使えて、13段階の無停止スケールアップが可能なエクスクラウドのクラウドシリーズを是非ご利用ください。

この記事を書いた人

テクニカルサポート

テクニカルサポートを得意とするエクスクラウドのサポートスタッフ。

この記事のタグ

オススメの記事

ページトップへ