実家にサーバ(HP ProLiant MicroServer)を設置している。
IPMIに対応していて、ブラウザからも電源管理ができるのだが、この管理コンソールを直接インターネットに公開するのはチョット怖い。
ということで、前段にリバースプロキシをかまして、証明書でクライアント認証をかけてみようと思う。
24時間起動させてても電気代が気にならないraspberry piで構築してみる。
#インストール
apt-get install nginx
では一部のモジュールが有効になっていないので、extrasを入れる
$ sudo apt-get install nginx-extras
#IP固定化
以下を追記
interface eth0
static ip_address=10.0.1.40/24
static routers=10.0.1.1
static domain_name_servers=10.0.1.1
#nginxの設定
##サーバ固有の情報をレスポンスに含めない設定
server_tokens off;
##リバースプロキシの設定
server {
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
more_set_headers "Server: Apache";
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl on;
ssl_certificate サーバ証明書のパス;
ssl_certificate_key サーバの秘密鍵のパス;
ssl_verify_client on;
ssl_client_certificate ルート証明書のパス;
server_name _;
proxy_set_header Host $http_host;
location / {
proxy_intercept_errors on;
proxy_pass http://backend-url;
proxy_redirect http:// https://;
}
error_page 400 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 495 496 497 500 501 502 503 504 505 = /404.html;
location /404.html {
return 404 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>404 Not Found</title>\n</head><body>\n<h1>Not Found</h1>\n<p>The requested URL $request_uri was not found on this server.</p>\n<hr>\n<address>Apache/2.2.31 Server at $host Port $server_port</address>\n</body></html>";
}
}
ここでも、nginxを使っていることを隠すために、httpエラー(400番代と500番代)のページを独自の物に変更している。
で、ここで面白いことをやってたのでマネしている。
(エラー画面をapache風にする)
ちょっとハマった点は、クライアント認証がエラーになった時に、レスポンス400となって、nginxの固有のエラーページが返されるが、error_page 400
を設定してもlocation /404.html
で設定している内容が反映されない。
ここによると、nginxは認証関連のエラーを内部的に495 496 497
の3つのコードで扱っている為、それらのコード値で設定しないといけない。
ここを参考に3つのコードを独自エラー画面に飛ばしてみる。
401はクライアント認証時に一発目で返されるので除外している。