2014年03月08日

OpenVPNのセキュリティ周りメモ

OpenVPNのセキュリティ周りの動作について気になった点をメモ

OpenVPN 2.3系、証明書認証を前提。だいたいmanpageから。 https://openvpn.net/index.php/open-source/documentation/manuals/65-openvpn-20x-manpage.html

OpenVPNプロトコル

  • 独自プロトコルで仕様書は見当たらない。ソースを読め。
  • 単一のUDPポート上で制御チャネル(認証など)とトラフィックチャネルを扱う(一応TCPでも動くが遅い)
  • L2イーサネットまたはL3仮想化
  • サーバー側からコントロールチャネルで、ルート設定とDHCP相当を配信可能
  • IPv6ルート通知も可能だが、IPv6なDNSアドレスなどはまだ非対応
  • コネクション毎に仮想ルータとサブネットを分けているため、IPv4アドレス消費はコネクション毎に4アドレス
  • L3モードは内部IPルーティングもできるが、クライアント間の隔離以外にフィルタ機能はないので、必要なら内部ルーティングを無効化してiptablesなりで

セキュリティフロー

  1. セッション開始パケットを事前共有鍵で署名(オプション)
  2. 独自実装のTLS over UDPで、独自ルートCAで認証し、制御チャネルを暗号化
  3. 実際の通信は別の鍵を共有してパケット単位で暗号化・署名

各設定項目はデフォルトで安全よりに設定されている。ca, cert, keyを正しく設定すればしばらくは問題なさそう。

参考 https://openvpn.net/index.php/open-source/documentation/security-overview.html

開始パケットの署名

オプション。 通常OpenVPNサーバーはUDP上で構成され、最初のパケットを処理する際にとてもコストの高いTLS(over UDP)セッションの確立処理が必要になる。 偽装されたUDPパケットを送られるとCPUとメモリを浪費させるDoS攻撃ができてしまうので、最初のパケットには専用の共通鍵を用いたHMAC検証機構がある。 この鍵ファイルは tls-auth オプションで指定する。

ここで使う鍵はプロセス毎にしか指定できず、複数のクライアントがいるなら全てのクライアントで共通になる。この鍵を自動更新する機構はプロトコルには無い。 漏洩時に切り分けと鍵更新が面倒になるので多人数で利用するサーバーでの利用は難しいかもしれない。

TLS over UDP

OpenVPNがUDP上に独自実装したTLS variant(バックエンドはOpenSSLまたはGnuTLS)で、通常のTLS同様に、サーバー検証とクライアント検証を行う。

このTLSで使う鍵交換・暗号・署名アルゴリズムは tls-ciphers で設定する。対応するラベルはopensslのアルゴリズム指定書式に準じていて openvpn −show-tlsで分かる。ひどい命名規則だ。 サーバーは共通のサーバー証明書を(SNIは非対応)、クライアントは個別のクライアント証明書を利用する。それぞれ cert, keyで証明書と秘密鍵を指定。 証明書は ca オプションで指定したCAから認証されているか検証され、オプションで名前(CommonNameだけらしい)の検証と証明書タイプの検証もできる。

証明書の失効はCRL(失効リスト)のみ対応、crl-verifyで有効化。

基本的にクライアント識別やログに記録されるクライアント名はクライアント証明書のcommon nameで行われる。一応一部文字は除去されるようだが、 証明書発行処理を自動化する際はログインジェクションや偽装に注意。 また一つのクライアント証明書を使いまわした複数端末から同時接続も許可できるが、ログが面倒になるのでおすすめしない。

鍵交換はECDHEも指定できるが、曲線の指定方法がない。DHEはdhparamが dh オプションで指定できる。

トラフィック暗号化

トラフィックは制御チャネルで共有した鍵を使って暗号化と署名を行っている

デフォルトの暗号アルゴリズムは Blowfish。 設定ファイル上では cipher で設定する。 鍵長を指定するkeysizeは古いアルゴリズム用なので今は使わずcipherで指定する。 パケット署名はHMACで、デフォルトはSHA1。 auth オプションで指定する。

暗号モード設定は外向きにのみ適用されるので、クライアントとサーバーの両方で個別に設定が必要。

ややこしいことにcipherで署名つきのAES-128-CBC-HMAC-SHA1も指定できる。GCMをつかったAEAD署名はパッチはあるもののまだ取り込まれていない。 利用可能な暗号は openvpn −show-ciphersでわかる。

comp-lzoオプションでLZOパケット圧縮が利用でき、他にもビルドオプションでsnappy、LZ4に対応する。 パケット圧縮を有効にすると、攻撃者がトラフィックを生成することでCRIME攻撃が原理的には可能になる。 ただ圧縮はパケット単位なので、TLS上のCRIME同様同一セッションに攻撃トラフィックが乗る必要がある。ブラウザとVPNの出口側がセキュアであれば問題はないはず。

暗号化パケットはシーケンス番号とsliding window(デフォルトで64パケット/15秒)で管理している。つまり短時間の順序変化と重複は許容され、パケットのドロップや重複は上位レイヤの回復処理に依存している。

no-replayとno-ivオプションがありシーケンス番号とIVを省略できるが、リプレイと暗号文一致攻撃による平文回復(BEAST攻撃と同じ)が可能になるため基本的に有効にしてはいけない。

floatオプションを指定しない限り、各コネクションのリモートIPアドレス・ポートは固定され他のアドレスからのパケットはドロップされる。

トラフィックとクライアント管理

L3モードでは内部ルーティング機能があり、最低限のルート管理とクライアント間トラフィックの分離が可能。

ファイアウォール的な機能はないので、OS側のフィルタ機構を使う。 特にL2モードではARPフィルタなどイーサネットレベルのフィルタリングも忘れずに設定する。

クライアント毎のトラフィックは status オプションで定期的にダンプ可能。IPアドレス割り当ては ifconfig-pool-persist で固定割り当てが可能。

shaperオプションでコネクション当りの外向き速度制限が可能で、client-connectフックを使えばクライアント毎に異なる速度制限を生成することも出来るようだ。ただし内向きの速度制限は見当たらない。

基本的にクライアント別に細かい設定や認証をしたい場合は、フックスクリプト経由で設定ファイルを動的生成する。 どのオプション項目が動的生成に対応しているか記載がないので、個別に検証が必要。

ラベル:OpenVPN 暗号化
posted by ko-zu at 17:40| Comment(1) | TrackBack(0) | セキュリティ | このブログの読者になる | 更新情報をチェックする

2014年02月23日

HP製サーバーのユーザは今すぐファームウェアのダウンロードを

HPがこれまでのサポート方針を変更し、今後のファームウェアアップデートは保証期間内あるいは長期サポートの契約者にのみにアクセスが制限されることになった。 HP社のFAQ

2014年1月以前に公開されたファームウェアは今のところ一般に公開されているようだが、いつまで配信が続くかは不透明だ。 PC world

Proliant ML110、ML115シリーズや、MicroServerなど、HP製の安価なサーバー製品は個人で利用している人も多いと思われるが、そのほとんど全ては延長サポートなど受けていないだろう。

セキュリティ上必要なアップデートは今後も提供されるということだが、今後公式ウェブサイトでのアップデータ一般公開が停止された場合、混乱に便乗してアップデータに偽装したウイルス・マルウェアをダウンロードさせようとするウェブサイトが現れるのは避けられない。 今のうちに公式ウェブサイトから安全なファイルをダウンロードして、手元にバックアップしておくことを強くおすすめする。

もし管理下にHP製のサーバーがあるなら、不用心な末端ユーザーが変なサイトからダウンロードしてきたアップデータもどきを実行することがないように、あらかじめ注意しておいたほうがいいかもしれない。

ラベル:MicroServer
posted by ko-zu at 23:18| Comment(0) | TrackBack(0) | サーバー | このブログの読者になる | 更新情報をチェックする

2014年02月12日

SSD VPSのDigitalOceanがシンガポールリージョンを追加

VPSプロバイダのDigitalOceanがシンガポールリージョンをリリースした。

DigitalOceanは標準でSSD、snapshotに対応、時間課金なのでAnsibleのテスト環境として利用している。ストレージがSSDだとテスト時間が大部分ネットワークレイテンシなので確認してみた。

レイテンシ

国内からのtracerouteは良い時に85msくらい。 AS133165

NTT経由のときはいいけれど、telia.netに行ってしまうと西海岸経由で悲惨なことになる。経路依存なので、必要な場所から ping speedtest-sgp1.digitalocean.com してチェックしたほうが良さそう。

 7  xe-7-4.a16.tokyjp01.jp.ra.gin.ntt.net (61.213.145.93)  12.994 ms  13.205 ms  13.757 ms
 8  ae-6.r24.tokyjp05.jp.bb.gin.ntt.net (61.213.169.177)  14.429 ms  13.953 ms  13.817 ms
 9  as-0.r20.sngpsi02.sg.bb.gin.ntt.net (129.250.4.91)  76.973 ms  87.418 ms  87.652 ms
10  ae-1.r00.sngpsi02.sg.bb.gin.ntt.net (129.250.4.143)  76.893 ms  87.259 ms  76.356 ms
11  116.51.27.150 (116.51.27.150)  101.476 ms  101.557 ms  97.790 ms
12  103.253.144.242 (103.253.144.242)  85.614 ms  94.697 ms  94.266 ms
13  *** (***)  100.764 ms  89.258 ms  88.088 ms
 5  ae-12.r24.tokyjp05.jp.bb.gin.ntt.net (129.250.5.92)  1.547 ms  1.414 ms  1.474 ms
 6  as-0.r20.sngpsi02.sg.bb.gin.ntt.net (129.250.4.91)  79.530 ms  75.088 ms  75.270 ms
 7  ae-1.r00.sngpsi02.sg.bb.gin.ntt.net (129.250.4.143)  75.647 ms  75.388 ms  75.380 ms
 8  116.51.27.150 (116.51.27.150)  229.987 ms  229.558 ms  230.153 ms
 9  103.253.144.242 (103.253.144.242)  201.196 ms  201.171 ms  201.127 ms
13  *** (***)  249.515 ms  238.729 ms  238.970 ms

逆向きを見るとteliaの西海岸経由している

 3  103.253.144.250 (103.253.144.250)  10.348 ms  10.335 ms  10.336 ms
 4  10ge-v107-mad-prov-ixn.airenetworks.es (62.115.40.169)  6.781 ms  6.716 ms  6.683 ms
 5  hnk-b2-link.telia.net (213.155.136.118)  39.762 ms hnk-b2-link.telia.net (80.91.245.149)  39.921 ms  38.904 ms
 6  las-bb1-link.telia.net (213.155.132.215)  205.099 ms  200.264 ms las-bb1-link.telia.net (213.155.136.44)  211.212 ms

帯域

今のところシンガポール国外宛が詰まっているようで、シンガポール内のサーバー相手だと十分出ている。

またサービスイン直後なせいか直近の各種リポジトリからのパッケージダウンロードが重くなっている模様。

Hosted by World's Fastest Indian (Tokyo) [5320.20 km]: 21.617 ms
Testing download speed........................................
Download: 19.77 Mbit/s
Testing upload speed..................................................
Upload: 9.12 Mbit/s
Hosted by Viewqwest Pte Ltd (Singapore) [7.42 km]: 26.385 ms
Testing download speed........................................
Download: 151.81 Mbit/s
Testing upload speed..................................................
Upload: 27.08 Mbit/s

cpuinfo

メモリ512MBのドロップレット

processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 2
model name      : QEMU Virtual CPU version 1.5.0
stepping        : 3
cpu MHz         : 1999.999
cache size      : 4096 KB
fpu             : yes
fpu_exception   : yes
cpuid level     : 4
wp              : yes
flags           : fpu de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pse36 clflush mmx fxsr sse sse2 syscall nx lm up rep_good unfair_spinlock pni vmx cx16 popcnt hypervisor lahf_lm
bogomips        : 3999.99
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:
ラベル:VPS
posted by ko-zu at 23:07| Comment(0) | TrackBack(0) | サーバー | このブログの読者になる | 更新情報をチェックする

2013年12月31日

ツイッターのお気に入りリンク共有fav2markを公開

Twitterのお気に入り(ふぁぼったツイートのリスト)からリンクを抽出して、はてなブックマークで共有するOAuthアプリを作ってみた。

https://fav2mark.usb0.net/

conohaが開催しているこのこんというのに応募しようと思って約3日で作ったもの。基本機能はテストしているものの、実アカウントが少ないので絶賛人柱募集中。

とにかくPythonでアプリ、プロセス管理、サーバー管理まで揃えている。 応募用にSlideShareでまとめ(?)たもの↓

 

時間がかかったのはだいたいOAuthとMongoEngineのせい。 MongoEngineのシリアライズが変なのでモンキーパッチして性能を稼いでいたりと、内部的には余り美しくないけれど、そこそこのアカウントをopenvzなVPSでも裁けるようにgevent、celery、redis で頑張ってみた。

共有先サンプルは http://b.hatena.ne.jp/causeless/bookmark (リツイートしたリンクの共有とツイートのコメント化有効)

2013-03-01追記

  • 内部的に色々と変更、全ての短縮URLを展開するように
ラベル:VPS
posted by ko-zu at 21:22| Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする

2013年12月05日

uWSGIで複数バージョンのPythonを動かす

今のところuWSGIはvirtualenvで作ったアプリ別のモジュールをロードすることは出来るものの、システムのlibpython.soを直接使っているため、そのままではビルド時のPythonしか動かない。

異なるバージョンのpythonを含むvirutalenvに入ろうとすると、PYTHONPATHが違うためimport siteの時点でモジュールのロードに失敗する。

Python version: 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)  [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)]
...
Set PythonHome to /path/to/py27env
'import site' failed; use -v for traceback

他のバージョンのpythonを使うには、対応するpythonとpythonプラグイン対応のuWSGIをビルドし直す必要がある。

ビルド手順

デフォルトのままpipなどでインストールすると、python他プラグイン全部入りのuwsgiバイナリが出来ているはず。 (pipで入れていれば/tmp/pip-build-root/uwsgiに必要なファイルが展開されているので、これを元にビルド)

uwsgiソースのbuildconfディレクトリには、uwsgi本体ビルド用の設定ファイルが含まれている。 pythonを含まないバイナリを作るには、buildconf/nolang.iniを使ってビルドするか、main_plugin=からpythonとgeventを抜いておく必要がある。(geventもpythonに依存しているためビルド出来ない)

python uwsgiconfig.py --build nolang

次にプラグインをビルドするのだが、uwsgiconfig.pyはリンクするlibpython.soをビルド時のPython環境から探しているらしく、ほしいバージョンのsharedなpythonとlibpythonがセットで必要。 さらに面倒なことにpythonビルドツールのpythonzはデフォルトではsharedなビルドを作ってくれない。(OSXは別?)

一応configureオプションを渡すことでビルドは可能で、

pythonz install 2.7.6 --verbose --configure='--enable-shared LDFLAGS="-Wl,-rpath -Wl,\\$$ORIGIN/../lib"'

あるいは手動でインストール

./configure --prefix=/usr/local/python27 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/python27/lib"
make
sudo make altinstall

必要なバージョンのsharedなpythonバイナリでプラグインをビルド。pluginsディレクトリにプラグインのテンプレートが入っている。

python2.7 uwsgiconfig.py --plugin plugins/python nolang python27
python2.7 uwsgiconfig.py --plugin plugins/gevent nolang gevent27

これでuwsgiバイナリと*_plugin.soが出来るのでバイナリを置き換え。

sudo cp uwsgi /usr/bin/uwsgi
sudo mkdir -p /usr/lib/uwsgi
sudo cp *.so /usr/lib/uwsgi

アプリの設定ファイルから

[uwsgi]
plugins-dir=/usr/lib/uwsgi
plugin=python27_plugin.so
virtualenv=/path/to/py27env
chdir=/path/to/py27app

とロードさせればpython2.7を利用できる。

同様にphp-embeddedの入った環境で

python uwsgiconfig.py --plugin plugins/php nolang php

でphpプラグインもビルドできた。

ものすごく面倒なのでuwsgi側でvirtualenvから自動ロードするか、libpython.soをplugins-dirに持ってくるようにパッチを当てたい……

参考:http://projects.unbit.it/uwsgi/wiki/MultiPython

posted by ko-zu at 21:58| Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする