目次
つぶやき
技術系や雑感等は再編集して本文の記事にする事を前提としているので、こっちにLinkを張らないでください。
Apache mod_security + OWASP CRS
NGiNXでうまくいかなかったので、とりあえず動く例が欲しくなって試す。 環境は、基本、NGiNXの時と同じ
pf/IPS/WAFと通信制御 雑感
最近、会社の仕事として、うちの会社のお客様限定で安価なWAFサービスを作った。 安価と言っても、一応ちゃんとしたWAFとhttp cache機能をもたせているので、理想的な状態(通信が十分にcacheされており、伝送遅延が少ないことが仮定できる状態)であれば、ピークで約2Gbps程度の通信性能を叩き出すことができた(ただし、検査対象の通信は400Mbps程度)。このシステムは全て仮想環境で組んだのだが、これだけの性能が出せる近年のハードウェアの性能には驚くばかりだ。
- packet filter firewall(以下pf)
- もっとも基本的な検査手法
- 対象はいわゆるIP通信
- 基本的には3層のヘッダ(IP Header)と4層のヘッダ(TCP/UDP/… Header)の情報を以って検査する
- 独立した機器として認識されることが多いが、多くの場合Routerなどのネットワーク機器や、node(サーバーや末端の端末)にも実装されている
- Intrusion Prevention System(以下IPS)
- 通信内容をもとにした検査手法
- 対象は通信内容そのもの
- 様々な通信の内容を検査しなんらかの手法で「攻撃と思われるもの」を検出する。
- 検査手法として有名なものに、攻撃パターン表(signature)を用いるものと、振る舞いから判断するものがある。
- signature型の場合、signatureの精度が重要になる
- 一般に、Rourterのような3層での中継デバイス(Network node)型の実装とSwitchのような2層での中継デバイス(Bridge)型(透過型などとも言う)の実装がある
- Web Application Firewall(以下WAF)
- Web通信(もっと言えばHTTP通信)に限定した、通信内容検査を行う
- 検査手法として有名なものに、攻撃パターン表(signature)を用いるものと、振る舞いから判断するものがある。
- signature型の場合、signatureの精度が重要になる
- 実装としては、HTTP proxyとしての実装と、2層での中継デバイス(Bridge)型(透過型などとも言う)の実装がある
一般に、pf/IPS/WAFは、検査項目の量に応じて転送性能が落ちる・CPUやメモリーを食うわけで、検査対象の通信量は少ないに越したことはない。
従って、検査対象外の通信をいかにして検査しないかが大変重要になる。 例えば、WAFにhttp以外の通信を食わせても仕方がないように、「通信検査対象外」の通信を検査システムに流し込むことは、単純に伝送遅延の増加とマシンリソースの無駄使いが発生するばかりで、いいことが何一つない。
以上から、個人的には、以下のような通信制御を行うのが良いのではないかと思っている。
- Externalとの境界、Network policyの境界に置いたRouterでpfを設定する
- ここでhttp系とそれ以外に通信を分離する
- policy routingはなかなか面倒だが、これは仕方がないと諦める
- 検査すべきhttp系通信はWAFで検査し、httpサーバーに直接転送する
- 検査すべきそれ以外の通信はIPSで検査し、転送する
こんな事は「論理的には」自明なのだが、実装を考えるとなかなか難しい。初段の通信分離がどうしても「面倒」なのだ。なぜなら、
- pf/IPS/WAFのポリシー作成が難しい
- pf/IPS/WAFのデバッグが難しい
- policy routingができるかがわからない
- policy routingの設定が難しい
- policy routingのデバッグが難しい
- この程度の構成にするだけで、障害時の切り分けが格段に大変になる
ここまで考えると、やっぱり少し高くてもオーバースペックな機器を入れて、全部見させる方が楽なのかもしれないとも思い始めてしまうわけで、まだまだネットワーク設計はちょっと踏み込むと罠があるなぁと思う。
Mail Serverをつくる
現行の MailServer が古くなってしまい、さすがに再構築しなければならなくなった。
この際だから、FreeBSD 10.2で構築してみる。
もちろん、NetBSDも考えたんだけど、最近はFreeBSDに体重をかけ始めているので、そちらで行く事にした。まぁ、実際にはApplication ServerのLayerなので、違いはほとんどないはず。
TaskBoard
自分のTaskを管理するにあたり、Agileでよく使われているTaskBoardを使ってみようかと思って調べてみた。
いろいろ書きかけ。
TaskBoardのApplicationを探しまくっているが、とりあえず
- kanboard
- SimpleTaskBoard
- Restyaboard
が見つかった。(いや、ものすごくたくさん、いろいろな実装があるのだが、複雑すぎて悩ましいのでこの程度に絞った。今後も適当に増えると思う)
FreeBSD 10.2 with CARP の設定でどはまりをブッこいたメモ
某所の某サービスの構築をするにあたって、FreeBSD/CARPを使った冗長構成を取らなければならなくなったわけだ。
その際に、FreeBSDがMultiUser modeでlogin promptまで行かなくなったので、その記録。
NICの設定に際し、一般にFreeBSDでは、以下のように記述する
ifconfig_xn1="inet 192.0.2.2/24 -rxcsum -txcsum -tso -lro"
ここに、CARPの設定を入れる場合、aliasで設定する
ifconfig_xn1="inet 192.0.2.2/24 -rxcsum -txcsum -tso -lro" ifconfig_xn1_alias0="inet vhid 1 advbase 1 advskew 100 pass Password-0-0-0 alias 192.0.2.1/32"
見た感じ、これで問題なさそうに見るのだが、実はこの設定を行うと、boot時にlogin promptまでたどり着かないことがある。
なぜそうなるかを追いかけるために /etc/rc.d/netif → /etc/network.subr の順に、そして呼ばれる関数ごとにprintf debugをかけた。 実は最後までは追いかけていないのだが、printf debugの結果
- network.subr内の ifalias_af_common_handler内のloopで「無限loop」している
- 原因は、CARP Passwordに記載している “数字-数字” を含んだ文字列
で、ここをexpandするために無限loopしているのではないかと推測される。
さすがに、こんなのわからないわけで…
というわけで、こういうパスワードを入れるのはやめましょう。絶対に。