当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

Python3 Bottleフレームワーク入門(その13)- HTTP/2対応hproxで ReverseProxy SSL対応 & Bottle連携

Python3 Bottleフレームワーク入門(その13)- HTTP/2対応hproxで ReverseProxy SSL対応 & Bottle連携


最近は何かと話題のhttp/2対応のWEB接続がかなり増えてきました。オリジナルアプリケーションをフレームワークで作ったものをhttp2対応させる事もフレームワークのライブラリーに既に実装されているのもあり手軽になってきているとはいえ、まだまだ敷居が高いかもしれません。

今回は、非http2対応のウェブアプリをリバースプロキシーで簡単に対応させるサーバを紹介します。haskellベースのプロキシーですが簡単に構築できます。もちろん、Apache,nginx,h2o,Caddyでもできますができるだけ設定が単純なもので行きたいのでこれを使用しました。但しバーストのメモリ消費は多いみたいだ。

ソフトのダウンロード

hproxをgithubから取得します。

作成するとデフォルトで~/.local/bin/hproxにバイナリーが設置されます。.bashrcに環境変数PATHで追加登録しておきましょう。

使い方

Proxyサーバは8000番ポートでリッスン状態にします。http/2接続の場合は証明書は当然ですが必須です。h2オプションスイッチはありませんがSSL仕様にすると標準でhttp/2対応になるようになっています。証明書がなければ自動でhttp/1.1接続になります。後は末端にあるリバースプロキシー先のアプリサーバ設定を- -revで指定します。

ソースコード(test.py)

毎度のお決まりのソースコードですが。。。。python bottleのサーバで実験してみます。下記はシングルスレッドですが、実運用ではマルチスレッド対応のWSGIにしてpythonアプリサーバを動作させてください。

ブラウザーで確認するか、curlコマンドで確認してみましょう。

hproxの使えるオプション

このサーバはwebsocket接続のproxyにも対応しておりますので、- -wsで後方にあるwebsocketのサーバを指定すれば利用できます。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , , , , ,

delegated proxyサーバで1台のサーバに仮想サーバを複数立ち上げる方法


delegated proxyサーバを運用する場合、1台のサーバで複数サイトをどうやったら起ち上げられるのか悩んでしまう人が多いみたいなのでやり方をご紹介しようと思います。apacheサーバだと簡単に仮想サーバ作れるのですがdelegated proxyサーバだとあまり情報がネット上にも落ちていなく困ってしまうのでしょう。



下記のスクリプトは1台のサーバに複数の仮想サーバをdelegated proxyで起動したいケースのスクリプトです。delegatedでのやり方は複数あるのですが一番手間のかからないやり方は下記のポート番号を複数台でユニークに設定して割り付ける方法かと思います。内部サーバを予め起動して外部の接続を名前ベース(FQDNドメイン名)で振り分ける手法になります。nvhostは名前ベースの名称割付箇所で外部からのリクエストをproxyが名前で任意の内部サーバへ割り当てる基準とするオプションです。nvservは共通の IP アドレスを持つ内部サーバー郡のホスト名を検出し、 それらを仮想サーバーとして表す場合のオプションになります。nvservはIPベースでは同じサーバを指しても問題ないのですが、proxyが勘違いしないように名前で判別するためのものです。nvhostがフロントエンドでnvservが1IPの際のバックエンド名前割当と考えればわかりやすいかもしれません。





他にも内部サーバの1枚のNICに複数のIPアドレスを割り付けてやる方法もあります。この場合はMOUNT行を変更するだけで実現できます。nvservが不要です。

タグ: , , ,

delegated Reverse Proxy SSL接続 ワンライナーWEBサーバとの連携にどうぞ!


昔からある和製ProxyサーバDelegated Proxy Server。海外のオープンソースがひしめく中で高機能で堅牢なProxyサーバです。他のProxy Serverにはない機能が沢山あり使う度にこんなこともできるんだと感心することもあります。今回の投稿ではこの和製ProxyサーバでSSL接続する方法を紹介したいと思います。


まずはdelegated proxyサーバをダウンロードしましょう。ソースからコンパイルして使うのが良いですね。CentOSというかRedHat系はすんなりコンパイルできますが、Ubuntuは古いバージョンのDelegatedでないと確実にエラーが発生しますので、最新のDelegatedバージョンを入れるならバイナリーをダウンロードして設置しsslwayだけRedhat系でコンパイルしたものを持ってきて使うのが簡単です。当方で確認した限りでは特に問題なくこのやり方でSSLの接続動作しました。何故かsslwayはバイナリーパッケージにはバンドルされていなかった。

Delegated ダウンロード公式ページ(source) Delegated ダウンロード公式ページ (Binary)

※現在の最新は9.9.13でソースからコンパイルするならdelegate9.9.13.tar.gzをダウンロードしてください。

コンパイルの仕方

直接起動スクリプトにパラメータを設定してdelegatedを起動する場合の必要最低限のインストール

Reverse Proxy構成例

起動スクリプトの準備

下記は内部8080ポートで起動しているWEBサーバにproxy転送する場合だ。最近のプログラム言語は自前でWEBサーバが起動できるケースが殆どなので、マルチスレッドで内部WEBサーバを立てローカルホストでListen起動させておけば余計なポート&アドレスへの攻撃から遮断した上で本格的なSSL接続仕様にできる。
Reverse Proxy仕様でSSLを行う場合のメリットは元のサーバのソースコードを弄らなくて良いところ、そして堅牢性に不安がある場合にある一定の防御壁として動作してくれるため通常の外部WSGIサーバ連携などよりもいい場合もある。やはりケースバイケースのSSL接続の方式選択があると思う。

このケースではSSLの証明書は作成時にパスワード無しで処理しているがパスワード付きで証明書を生成しているなら「-pass file:path」or 「-pass pass:password」をsslwayの引数指定で設定すれば問題ない。尚「POODLE」攻撃を防ぐ施策として「-tls1 -tls1_1 -tls1_2 -no_ssl23」の指定を行っている。このパラメータは本サイトで紹介されていないので非公開のスイッチかもしれない。ソースコードから調査して見つけました。ペネトレーションテストでも調査済みで有効なSSLスイッチでした。またCipherSuiteに関しても環境変数(SSL_CIPHER)で指定できることがわかりましたのでご紹介しています。

SSL証明書の指定は-certと-keyが使えるので、もしCA rootの証明書があるならサーバ証明書「-cert」のファイルにサーバ証明書とCA root証明書を結合して設置すればOK。

実行権を付与しdelegatedの起動

タグ: , , , ,

超軽量WAF Raptor WAFのご紹介


軽量で簡単に設定できそうなWAF(Web application Firewall)を探していたところ「Raptor WAF」と言うソフトを見つけた。仕組み的にはリバースプロキシーを使ってインジェクション対策やらCSRF対策、マッチリスト、BLACKリストでブロックしてくれる。

様々なフレームワークを使用していると、おおよそ自前WEBサーバがついてくる。テスト用のWEBサーバなので完全に内部でやるなら外界からシャットアウトしてテストするといいのだが場合によっては、ちょっと本番的な使い方をしたい時にお気軽にWAFができたらと探していたところでした。使ってみたところ中々レベル的にはちょうどいい感じがします。SSLが現在非対応

導入方法

C言語やmake関連のユーティリティを事前にインストールしてください。コンパイルはあっという間に終わります。

WAF起動

raptor_wafのフォルダー直下で実行する必要があります。

  • -h : 接続先ホスト(ユーザがアクセスするIP or ホスト名)
  • -p : オリジナルのホストのポート番号
  • -r : WAFのポート番号(ユーザが実際にアクセスするポート番号)
  • -o : 不正アクセスした際に記録するログファイルの出力先
  • -w : WAFの検知レベルの強度を指定 levelは 1-4 まである。

ブラウザから次のように入力してテストしてみます。テストプログラムサイトはご自分でパラメータ引数があるプロ グラムを用意してください。

以下のようなページが表示できたら成功です。

BLACKリスト、マッチリスト

RaptorはBLACKリスト、マッチリストでもブロックが可能だ。

  • ブラックリスト:blacklist_ip.txt
  • マッチリスト:match_list_request.txt

タグ: , ,