VPNサーバ on windows server 2012 R2

windows serverでVPNサーバを構築した際のメモ。

iOS, android->windowsは苦労せずに接続できたが、CentOS->windowsは設定が厄介。 windows serverでのVPNサーバ構成自体はサーバーマネージャの役割と機能の追加から出来るし、記事も複数あるので割愛してはまったことだけメモしておく。

環境

VPNサーバ: windows server 2012 R2 VPNクライアント: iOS, android, CentOS7(libreswan)

はまったこと(すべてCentOS->windows

  • エラーメッセージのログ

CentOSIPSec関連のログって /var/log/pluto.logを指定していたからすべてここに出るかと思っていたら、 接続関係のエラーは/var/log/messageに出力されていた。 これに気づくまで、ログの出力少なすぎだと思っていた。 ログの出力ファイルの確認は大事。

  • no prosal chosen

使用可能な暗号方式がマッチせずにno proposal chosenになっていた。 暗号方式の調査はike-scanを用いて確認すればいい。

CentOS7ではyumでインストール出来ないためgithubからソースを入手する。

今回は一時的に使えればいいので./configureとmakeだけして、インストールはしなかった。

使い方

ike-scan <VPNサーバのIPアドレス>

コマンドの出力結果を元にipsecのコンフィグファイルに

        ike=3des-sha1;modp1024
        esp=3des-sha1;modp1024

を追加する。

なお、ipsecサービスが動いているとike-scanがポートを使用できないため、サービスの停止が必要。

  • libreswanとstrongswanは別物

調べているとstrongswanとかopenswanとかの記事が見つかって設定参考にしたりしたけど、 設定の記述方法が微妙に異なっているので動作しなかったり、変なログが出ている場合は 疑った方がいい。

例えば上記のikeやespの暗号化の指定はstringswanだと

        ike=3des-sha1-modp1024
        esp=3des-sha1-modp1024

になる(sha1とmodp1024の間が"-"になる)

  • refuse chap

IPSecがつながったと思ったら、chapがrefuseされてL2TPの接続が確立できなかった。

/etc/ppp以下のコンフィグファイルに

refuse-pap
refuse-eap
refuse-chap
refuse-mschap
require-mppe

を追記して解消。

感想

windows<->CentOSの接続をやってみると、IPSecの設定が難しいと言われるのが少しわかった気がする。 パラメータが多すぎて対向で合わせるのが大変なのでike-scanとかをうまく使う必要がある。 一方でandroidとかiOSはすんなりつながったので、簡易につながるのを意識して実装してるんですね。

情報処理安全確保支援士 受験メモ

資格の名称がセキュリティスペシャリストだった頃に受験準備だけはしていたが、今回ちゃんと受験をしたので勉強内容のまとめ。

教材

  • 情報処理安全確保支援士 合格教本

午前Ⅱ〜午後Ⅱまでに必要な用語や概念を広くカバーしているので、一読して確認をした。 暗号の種類や鍵長、EAPの種類などは午後試験でも問われることがあるので、暗記しておくといい。 ページ数は多いが、内容は平易なため過去問を解き始める前に読んでおくといいと思います。

また、付属のディスクに午前Ⅰ及びⅡがwindows PC上で解けるソフトが入っている。 年度ごとの得点管理や、分野ごとの正答率を出せるので、午前問題の得点を上げたい人にも向いています。 特に、午前Ⅰは範囲が広いので、分野ごとに分析が出来ると対策しやすい。

  • ポケットスタディ

午後試験の対策として使用。 本書の冒頭に記載の通り、午後Ⅰ、Ⅱの試験では設問に対してきちんと方針に沿った解答を書く必要があり、 その方針を型として身に付けるための本。

  • その他

規格とか最近のセキュリティ情勢とか勉強しておくにこしたことはないけれど、 余力があればって感じだと思います。 JISQ27002くらいは読んでおくといいかもしれませんね。

試験対策 午前Ⅰ

ひたすら過去問を解いて対策をした。 数年分すればだいたい解けるようになると思う。 範囲が広いので、手を広げ過ぎない程度に、知識が足りない分野を抑えておく勉強の仕方がいいと思います。 やり過ぎると勉強時間が足りなくなるので、コンスタントに7割取れるようになる程度で効率化するといい。

試験対策 午前Ⅱ

午後試験メインの勉強の仕方で、午前Ⅱは合格点取れていたので、これと言った対策はしていません。 教材を読みこめば解けると思います。

試験対策 午後Ⅰ

3問から2問を選ぶので、どの問題を解くかの選定がまず必要になる。 自分は、ざっと全部眺めて、得点できそうな問題を選んだ。 (知識的にはプログラミングよりもネットワーク系の方が得意) 解答の推敲も含めると1問30分はかかるので、時間配分もそこそこ気にしたほうがいい。

過去問とかポケットスタディをもとに、どういった方針で設問に回答すればいいかを考える。

試験対策 午後Ⅱ

試験の文章量が午後Ⅰよりも多いので、設問に対応する範囲だけを読んで答えるやり方がおすすめ。 また、解答の方針として考慮すべき事項が文章中にあったりするので、 読み飛ばしはせずに、文章の読解はきちんとしたほうがいい。

試験時間は2問中1問選択で2時間とたっぷりあるので、両方解答を考えて得点できそうな方を選択すればいい。

試験勉強時には、文章量が多く過去問解いて勉強するのも疲れるので、1日1問とかのペースで継続して勉強するのがいいと思います。

午後Ⅰ、Ⅱ共通のこととして、記述問題の得点基準や、全体の配点がわからないので、対策しにくいけれど、 きちんとした解答文を作るよう心掛けて、自分なりに考えてやっていくしかないのかなと思います。 推敲の練習も多少したほうが、試験本番で苦労しないと思う。

何となく、安全確保支援士に求められているのは、ある程度のセキュリティ知識と国語力じゃないのかという気がします。

emacsとzshで共有できるクリップボード(キルリング)もどきの自作

sshでサーバにつないでscreen上でzshとかemacs使っていると emacs<->zshとかscreen上のシェル間でkill, yank出来なくてもどかしい。

ホスト側でマウス操作するなりすればいいんだけど、 最近ipadからsshしてるからそれも面倒くさい。 x windowも動かしていないからxselも使えない。

screenにコピーペーストもあるんだけど、 コマンドでやりたいので自作することにする。

実装方針

kill ring用のファイルを用意し、そのファイルで共有することにする。

  1. ファイルに書き込む用の関数
  2. ファイルから読み込む用の関数 をemacszshでそれぞれ実装する。

関数名はshared-yankとshared-killとする。 ショートカットはshared-yankをESC-uとshared-killをESC-jにする。 emacsにしてもzshにしても大したキーバインドが割り当てられていないのでちょうどいい。

kill ring用のファイルは~/.tmp/shared_kill_ringとする。 個人用なので~以下でパーミッションは400推奨。

emacs

(defun shared-yank ()
  "yank from shared kill ring file"
  (interactive)
  (with-temp-buffer
    (insert-file-contents "~/.tmp/shared_kill_ring")
    (setq shared_kill_ring (read (buffer-string))))
  (insert-before-markers (format "%s" shared_kill_ring)))
(global-set-key "\M-u" 'shared-yank)

(defun shared-kill (beg end)
  "kill to shared kill ring file"
  (interactive "r")
  (if (and mark-active transient-mark-mode)
      (progn
        (setq temp (buffer-substring beg end))
        (with-temp-buffer
          (insert (format "%s" temp))
          (write-file "~/.tmp/shared_kill_ring")))))
(global-set-key "\M-j" 'shared-kill)

zsh

function shared-kill(){
  echo $RBUFFER > ~/.tmp/shared_kill_ring; RBUFFER=""
}
function shared-yank(){
  LBUFFER=$LBUFFER"`cat ~/.tmp/shared_kill_ring`";
}
zle -N shared-kill
zle -N shared-yank
bindkey '^[j' shared-kill
bindkey '^[u' shared-yank

最後に

ringと書いているが、あれは嘘だ。 あと、killの方はzshemacsで挙動が違います。 (emacsの方はcopy-regionの挙動)

実践パケット解析第3版 レビュー

Interop TokyoでO’reillyが10%割引で販売してて、かつ実践パケット解析の第3版が先行販売してた。前々から読みたい本だったので、つい買ってしまった。というわけでせっかくだからレビューする。

TL; DR

  • サンプルのpcapファイルを用いて、Wiresharkの使い方を手を動かしながら身につけることが出来る
  • Tsharkとtcpdumの使い方もわかる←new
  • TCP/IPの仕組みをパケットを解析しながら理解できる
  • ネットワークのトラブルシューティングやセキュリティの解説もある
  • TCP/IPがよくわかっていない人、wiresharkなどパケットキャプチャを使いこなしたい人は買って損はないと思う。

メモ書き

  • Wiresharkにて一連のTCPをストリーム表示できる
  • IOグラフなどの統計の取得も基本機能として備えている
  • ARPスプーフィングのやり取りを見るだけでも、自作自演感が結構面白い
  • tcpのRSTフラグがセットされたパケットをフィルタ出来る(ビット単位でのフィルタ)
  • 著者のChris Sandersはケンタッキー州でビーチに面した土地を売りに出している。

落ち穂拾い

  • Cain & Abel
  • Wiresharkソースコードリーディング (epan/disectors/packets-*.c)
  • Damn Vulnerable Web Application
  • Snort
  • Sguil
  • Cryptwall tracker
  • CapTipper
  • Chris Sandersのブログ
  • Malware Traffic Analysis
  • Practical Packet Analysis, SANSオンラインコース

Conoha × Let’s encryptにてワイルドカード証明書を自動取得する

Let’s encryptではワイルドカード証明書を取得できるようになっているが、ワイルドカード証明書の場合にはDNSでの認証が必須となっている。

3ヶ月ごとに手動で更新+DNSに認証用のレコード追加は手間になるのでこれを今回自動化する。

DNSのレコード追加は使用しているDNSサーバ次第であるが、ConohaではDNS用のAPIがあるためこちらを利用してスクリプトを作成する。作成スクリプトは認証レコード追加用と削除用の2種類。

それぞれのスクリプトcertbot実行時に—manual-auth-hook及び—manual-cleanup-hookのオプションで指定することで実行できる。なお、スクリプト内では認証用のトークンは$CERTBOT_VALIDATIONにて取得できる。

作成したスクリプト github.com

なお、スクリプトを指定せずにcertbot renewすると The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.',). Skipping. といったエラーが出る。

FW設定とL2TP/IPsec 接続エラー

概要

  • 原因はFWによりIPsecが弾かれていることだった。windowsのみグローバルIPを持っていたため問題が発生したが、Android/iOSはnatを使用していたため接続が出来ていた。
  • FWの設定変更(任意のプロトコル接続の許可設定追加)により事象は解決した。

背景

CentOSL2TP/IPsecを構築し、Android/iOS/windowsからVPN接続出来るようにしていた。どの環境においても標準機能で接続できるため、結構便利。

CentOSではfirewalldの設定をしていたが、特定のポート宛に頻繁にアクセスが来ていたため、dropログの容量が1日1G近くなっており、運用上の懸案であった。とはいうものの、ログを取らないようにするのは気持ちが悪い。

このため、openstack側のFWを設定し、これらを遮断することにした。運用が面倒になるだでスマートな感じはしないのだけれど、firewalldのdropログが増えなくなるのは何となく安心感がある。

もろもろサービスが動くのを確認してFWの設定(稼働サービス用のポートのホワイトリスト登録)を完了したのだが、ある日windowsVPNが切れて、再接続出来なくなった。
(FW設定時にwindowsVPNはつなぎっぱなしだったため、すぐには問題が発生せず、FWの設定から数日経ってから発覚した)

原因

windows端末はVPSを使用していたため、グローバルIPを持っており、ESP(プロトコル番号50)にて通信を行っていたが、これがFWにて弾かれていた。windowsVPNエラー番号としては800や809などが発生(windowsVPN設定により若干変動)
エラー809は「リモートサーバが応答しないため、使用するコンピューターとVPNサーバー側のネットワーク接続を確立できませんでした。」等の表示。
こちらのエラー番号で検索すると、大体がNAT超えのための設定にたどり着くのだが、今回はNATをそもそも使用していないので非該当。

なお、AndroidiOSはnatを使用していたため、ESPを使用せずUDPカプセル化して通信するので事象が発生しなかった。これにより、当初はwindows側の設定を疑ったので、パケットキャプチャで双方のパケットを確認しESPパケットがCentOS側に届いていないのを発見するまで原因にたどり着けなかった。

対策

FWの設定にて任意のプロトコルを許可するよう設定することで解消。なお、conohaではプロトコル指定が出来るのはTCPUDP、ICMPのみであるため、それ以外のプロトコルを許可するためにはすべて許可の設定になる。

感想

windows側がグローバルIPで、conoha(openstack)のFW使用なので珍しいケースにハマった感があるが、IPsecプロトコルを理解してなかったことを痛感した。もうちょっとちゃんと勉強したい。

追記

任意のプロトコルを許可すると、拒否したい通信も通ってしまう(ホワイトリストだから当然の動作!!)

よって、今回はグローバルIPを用いているwindows側でもNAT使用時と同様にUDPカプセル化を用いるように設定する。
設定項目は

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgentにAssumeUDPEncapsulationContextOnSendRuleを作成し、値を2にする

  • IPsecサーバ側のIPsecの設定でencapsulation=yesを追記 ※libreswanの場合

forceencapsとかnat_traversalとかの項目を指定している記事も見つかるがlibreswanでは廃止されている模様。
(/var/log/messagesにobsolete keyword 'forceencaps' ignoredが記録される)

mod_securityとAuditConsoleを使ってみる

OSSなWAFがどんなものか気になったのでmod_securityとAuditConsoleを使ってみた。
また、両者の連携のためにmlogcが必要なため、併せて入れる。

おおむねこちらの記事を参考にした。
AuditConsoleを設定 - あるシステム管理者の日常

差分としては、AuditConsoleをyumにてインストールしたことくらい。
ちなみに、Javaのバージョンは特に意識しなくても問題なかった。
(1.8系のJavaが依存パッケージとしてインストールされていた)

環境

OS: CentOS Linux release 7.4.1708 (Core)
httpd: apache 2.4.6-67

mod_security

install / setup

epelのリポジトリからインストールする。
yum install mod_securityで入る。あわせて、mod_security_crsも入れてみる。
crsはCore Rule Setのこと。
初期設定は/etc/httpd/conf.d/mod_security.confに記載してあるので、インストール後httpをリスタートすれば動く。

AuditConsole

AuditConsoleはtomcatで動くmod_securityのログの監視用Webインターフェースである。
mod_securityのコンソールはAuditConsoleとWAF-FLEの2種類あるようであるが、
今回はAuditConsoleを動かしてみる。WAF-FLEもそのうち試してみたい。

..:: jwall.org ::..

install / setup

こちらもyumで入れる。
標準のリポジトリには入っていないため、jwallのリポジトリを追加する。
手順はjwallのUser Guideに記載してある。
サービス開始前に
/etc/default/auditconsoleに
JAVA_HOMEを追記する。
JAVA_HOMEの確認は
readlink $(which java)
で出来る。
(設定時はbin/javaを除く。例えば、/usr/lib/jvm/java-1.6.0-openjdk)

ポート番号を変えたい場合にはここの設定で変えておく(デフォルトでは8080と8443)。

# systemctl start auditconsole
http://localhost:8080にアクセスして初期設定をする。
設定内容を変更する必要は特になかった。

mlogc

ソースからコンパイルする。
mod_securityのソースに含まれているのでダウンロードして、
./configure
make
する。
mlogcだけ欲しいのでmake installはしない。
mlogc.con及びmod_security.confを設定する。

なお、iusのリポジトリであればyumでインストールできるが、httpdもiusのものを入れる必要があるため、今回は却下。

エラー対応

mlogc-error.logに
Invalid entry (failed to match regex)
が出て、ログが正常にAuditConsoleに連携しない事象が発生。

mod_security.conにて
SecAuditLogType Serial
になっているのが原因であった。
SerialをConcurrentに変更して解消。

動作確認

curl http://localhost/?name="><script>alert(document.cookie)</script><!--

とかしてみる。
403 Forbiddenが帰ってきて、AuditConsoleのイベントにログが表示されれば正常。


とりあえずhttpdのお守りに入れておくにはいいのではないでしょうか。
ただ、AuditConsole(tomcat)を動かすと常時200MB程度メモリ確保してるので、攻撃を検知したらメール通知して、定期的にAuditConsoleを確認するとかが良さそう。