「ユーザーブロマガ」サービスの終了(10月7日を予定)にあたり、残したいユーザーブロマガ記事への投票を受け付けています

  • BINDでrpzとzoneブロックを試した設定ファイルめも

    2015-04-12 14:09

    BINDで水責め用にrpzとzoneブロックを試した設定ファイルのめも

    RPZに関しては
    http://www.zytrax.com/books/dns/ch7/rpz.html
    ここ参考

    性能云々に関しては
    http://www.slideshare.net/hdais/dns-32071366
    ここ参考

    DNSSECはとりあえず有効
    ACLはiptables上で弾く方向、なのでBINDのACLは全てany(よい子はまねしちゃいけません)
    設定ファイルはできるだけデフォルトの状態を維持


    ■OSとか
    VmwarePlayer上で構築
    CPU:Core i7 4702MQ
    Mem:4G
    OS:CentOS7
    BIND:9.10.1-P1
    (最新落とそうとしたらiscつながらね。)
    パッケージ:RPM化してCentOS7のルールに準拠

    関連パッケージ達
    ------------------------------------------------------
    bind-9.10.1-0.2.P1.el7.x86_64
    bind-chroot-9.10.1-0.2.P1.el7.x86_64
    bind-libs-lite-9.9.4-18.el7_1.1.x86_64
    bind-license-9.9.4-18.el7_1.1.noarch
    bind-utils-9.10.1-0.2.P1.el7.x86_64
    bind-libs-9.10.1-0.2.P1.el7.x86_64
    ------------------------------------------------------

    SELinux:Disable
    DNSSEC:ON

    ■必要ファイルとディレクトリの作成
    ------------------------------------------------------
    mkdir /var/named/ddos
    chmod 750 /var/named/ddos
    chown named:named /var/named/ddos
    touch /etc/named/rpz.conf
    touch /etc/named/zone.conf
    touch /etc/named/slave.conf
    touch /etc/named/ddos.conf
    chown root:named /etc/named/rpz.conf
    chown root:named /etc/named/zone.conf
    chown root:named /etc/named/slave.conf
    chown root:named /etc/named/ddos.conf
    chmod 640 /etc/named/rpz.conf
    chmod 640 /etc/named/zone.conf
    chmod 640 /etc/named/slave.conf
    chmod 640 /etc/named/ddos.conf
    ------------------------------------------------------

    ■/etc/sysctl.conf
    ------------------------------------------------------

    net.core.rmem_default = 8192000
    net.core.rmem_max = 16384000
    net.core.wmem_default = 8192000
    net.core.wmem_max = 16384000
    ------------------------------------------------------
    値はてけとー


    ■/etc/modprobe.d/conntrack.conf
    ------------------------------------------------------
    options nf_conntrack hashsize=65536
    ------------------------------------------------------
    デフォルト値:65536なのですぐ壁にぶち当たる。
    65536*8=524288に変更
    iptables 再起動時にconntrack_maxにぶち当たらないように。

    水責めでは
    「IP+Port」の組み合わせが同一でない問い合わせ+外部DNSが死ぬことによってリトライが増える=conntrackを利用するフィルターが存在していた場合は値をどんどん消費する。
    「IP+Port」が同一なベンチマークでは見えてこない。

    ■/etc/sysconfig/named
    ------------------------------------------------------
    ROOTDIR=/var/named/chroot
    OPTIONS="-4 -S 8192";
    ------------------------------------------------------
    標準値:4096
    とりあえず:8192
    大規模なら16384ぐらい増やすのもあり。

    IPv6生きてるとログうっとーしーのでIPv4のみで。
    大手の共有権威DNSが死ぬとここ結構消費。
    VALUE DOMAINで発生したDNSサーバー障害についてまとめてみた


    ■/etc/named.conf
    ------------------------------------------------------
    options {
    listen-on port 53 { any; };
    listen-on-v6 port 53 { ::1; };
    directory "/var/named";
    dump-file "/var/named/data/cache_dump.db";
    pid-file "/var/run/named/named.pid";
    statistics-file "/var/named/data/named_stats.txt";
    memstatistics-file "/var/named/data/named_mem_stats.txt";
    recursive-clients 32768;
    allow-query {
    any;
    };
    allow-transfer {
    localhost;
    };

    recursion yes;

    allow-recursion {
    any;
    };

    dnssec-enable yes;
    dnssec-validation yes;
    dnssec-lookaside auto;

    /* Path to ISC DLV key */
    bindkeys-file "/etc/named.iscdlv.key";

    managed-keys-directory "/var/named/dynamic";

    session-keyfile "/var/run/named/session.key";

    response-policy {zone "rpz.invalid";} qname-wait-recurse no;
    };

    logging {
    channel default_debug {
    file "data/named.run";
    severity dynamic;
    };
    };

    zone "." IN {
    type hint;
    file "named.ca";
    };

    include "/etc/named.rfc1912.zones";
    include "/etc/named.root.key";
    include "/etc/named/rpz.conf";
    include "/etc/named/zone.conf";
    include "/etc/named/slave.conf";
    include "/etc/named/ddos.conf";
    ------------------------------------------------------
    recursive-client
    標準値:1000(すぐ壁にぶち当たる。)
    標準値のままだと
    recursive-socket(4096)>recursive-client(1000)
    なので水責めでは攻撃即断になるっぽ

    recursive-client>recursive-socket
    になるようにすべし

    水責めの場合recursive-socketの値(ここでは8192)が完全にふさがれることを考慮して
    「recursive-sokcetの値」+「通常クエリーを投げている予想クライアント数」を考慮していればキャッシュに入ってる問い合わせにはとりあえず返す事ができる。
    外部への問い合わせが必要な場合は知らぬ。

    recursive-scoketの食いつぶし対策は
    QTNetのこれの14ページのiptablesのhashlimitを使用する方法
    http://www.slideshare.net/apnic/dnswatertortureonqtnet-1425130417-1425507043
    とか

    ISCの
    fetch-per-zone
    fetch-per-server
    https://kb.isc.org/article/AA-01215/0/BIND-9.9.6-S1-Subscription-Edition-Release-Notes.html

    とか

    ■/etc/named/zone.conf
    ------------------------------------------------------
    zone "example.com" {type master;file "example.com.zone";};
    ------------------------------------------------------

    ■/var/named/example.com.zone
    ------------------------------------------------------
    $TTL 1D
    $ORIGIN example.com.
    @ IN SOA example.com. hostmaster.example.com. (
    1 ; serial
    1D ; refresh
    1H ; retry
    1W ; expire
    3H ) ; minimum
    NS ns1
    NS ns2
    ns1 A 192.168.0.1
    ns2 A 192.168.0.2
    www A 192.168.0.3
    mail A 192.168.0.4
    ftp CNAME www
    @ MX 10 mail
    @ TXT "Txt Record"
    ------------------------------------------------------
    パーミッションmissらないように

    ■/etc/named/slave.conf
    ------------------------------------------------------
    zone "example.jp"{type slave;file "slaves/example.jp.zone";masters{192.168.0.2;};};
    ------------------------------------------------------


    ■/etc/named/rpz.conf
    ------------------------------------------------------
    zone "rpz.invalid"{type master;file "rpz.zone";};
    ------------------------------------------------------


    ■/var/named/rpz.zone
    ------------------------------------------------------
    $TTL 2h;
    $ORIGIN rpz.invalid.
    @ SOA ns.rpz.invalid. hostmaster.rpz.invalid ( 1 12h 15m 3w 2h)
    NS ns.rpz.invalid.
    ns.rpz.invalid. A 127.0.0.1

    *.cname.example.org A 127.0.0.1
    nxdomain.example.org NS ns.rpz.invalid.

    ;nxdomain.example.org CNAME .
    *.nxdomain.example.org CNAME .

    ;nodata.example.org CNAME *.
    *.nodata.example.org CNAME *.

    mail.example.org CNAME rpz-passthru.

    ;drop.example.org CNAME rpz-drop.
    *.drop.example.org CNAME rpz-drop.

    ;tcp.example.org CNAME rpz-tcp-only.
    *.tcp.example.org CNAME rpz-tcp-only.

    *.ns.example.net A 127.0.0.1
    *.www.example.net A 127.0.0.1
    ------------------------------------------------------
    これは別にrpz用マスターサーバ立てたほうがよさげ。できればDBで管理。
    こんなもんファイルで管理してたらしぬる。
    オーバーブロッキングはないので放置可能
    いつ消していいかはわからぬ。
    パーミッションmissらないように


    ■/etc/named/ddos.conf
    ------------------------------------------------------
    #zone "ddosdomainname" {type master; file "ddos/ddostemplate.zone";};
    zone "ddos.org" {type master; file "ddos/ddos.org.zone";};
    ------------------------------------------------------


    ■/var/named/ddos/ddos.org.zone
    ------------------------------------------------------
    $TTL 1800
    @ IN SOA domain.ddos. hostmaster.domain.ddos. (
    1 ; serial
    1D ; refresh
    1H ; retry
    1w ; expire
    3H ) ; minimum
    NS ns
    TXT "Type:BlockDomain,Reason:water torture,Date:From:2015/04/12 To:2015/04/13"
    ns A 127.0.0.1
    * A 127.0.0.1
    ------------------------------------------------------
    オーバーブロッキング仕様でつ。
    有効期限決めないと放置かましてどっかのISPのようになる。
    conf汚すと面倒なので試しにゾーンファイルにtxtレコードいれて、そこに理由やらゾーンの有効期限なぞ記述してみる。
    この用途ではないとは思うがゾーン数増えすぎると起動時間長すぎてしぬる。
    パーミッションmissらないように

    メリットは何も考えずにかけられる。
    デメリットは問い合わせを受け付けるのでqpsの限界以上は攻撃受けられない。

    ■iptablesでのブロック
    iptablesでu32/string/bpf等を使用してクエリーのINをブロック

    ・u32
    http://dnsamplificationattacks.blogspot.jp/p/iptables-block-list.html

    ・string
    https://www.perturb.org/display/1186_Linux_Block_DNS_queries_for_specific_zone_with_IPTables.html

    ・bpf
    http://www.slideshare.net/twovs/how-to-defend-dns-authoritative-server-against-dns-watertorture?related=1
    http://www.slideshare.net/twovs/iptables-bpf-module

    メリットはINを止めるのでキャッシュを汚されない。
    qpsの限界のクエリーが飛んできても耐えられる。
    random.ddos.orgの様な攻撃だけブロックも可能。
    攻撃クエリーのみブロックが可能なので放置可
    攻撃が来ているかどうかをiptablesの統計で確認可能
    デメリットはブロックに穴がある。
    (穴をつぶそうとすると非現実的な記述量になる。)
    単純最大qpsは下がる。

    ■攻撃されているクエリー状況の確認
    rndc recursingの出力有効化
    デフォルトでは/var/named/named.recursingに出力されるため
    ファイルを作成し権限を適正なものにする。
    (named.confのoptions内でrecursing-file指定するのも可


    ・ファイル作成
    touch /var/named/named.recursing
    chown named:named /var/named/named.recursing
    ファイルは自動では作られないので自分で作る事。ファイルがないとエラーでまする。
    あとnamedユーザーに書き込み権限が必要

    ・実行
    /usr/sbin/rndc recursing

    ・結果表示
    cat /var/named/named.recursing

    named.recursingの内容
    ----------------------------------------------------------------------

    ;
    ; Recursing Queries
    ;
    ; client 123.123.123.1#12345: 'example.co.jp' requesttime 1438653752
    ; client 123.123.123.2#23456: 'example.ne.jp' requesttime 1438653752
    ; Dump complete

    左から
    client {問い合わせ元クライアントIPアドレス}#{問い合わせ元クライアントポート番号}: '問い合わせクエリ' requesttime {問い合わせ時刻}
    となっているので問い合わせ元クライアントIPアドレスと問い合わせクエリを集計すれば水責めで行われているランダムクエリーや権威DNSが死亡した際の状況確認を行う事が出来る。

    これの実行自体はそれほどコストにはならない模様。

  • 広告
  • PMXEプラグイン説明ブロマガ記事のコメント欄について

    2015-04-04 15:464
    そもそも説明書きに機能説明しか書いてないので

    「これどーゆー時に必要なのか?」

    という部分から検索できないものかと言われたりするのだけど
    よほど理由がない限り自分で書く気一ミリもないので

    PMXEプラグインの説明が書かれた記事のコメント欄解放しますw

    ブロマガのコメント欄は他のところを見ていてもどうもコメント記述するのに見えないハードル(ブロマガ主とコミュニケーションを取らないといけないという見えない圧力)があるように見えるのでPMXEプラグイン説明のコメント欄は以下の様に使用してもらってかまいません。(使用例が記述されてるとそちらから検索できるので便利かもYO!w)

    使用方法:
    OKなもの

    ・こーゆー時に使ったとかのメモ書き/独り言
     (あってる・間違ってる・中途半端・馬鹿みたいにコメント欄が延びる等気にしません)
    ・使用方法について記述した自分のブロマガ等の外部サイトへの誘導
    ・だめぽ事象例
    ・機能更新きぼー
    ・ソースコードクレクレ

    NGなもの(気が向いたらしれっと消したりするもの)
    ・明らかにMMDやPMXEに無関係と判断したもの
    ・他者等への誹謗中傷等にあたるもの

    希望としては「誰が記述したかをわかるよう」にしてもらうのが望ましいです。
    (捨てアカでもかまわないけど)

    放置基本なので反応なければOKとみなしてもらってかまいません。

    ※なお、この記事は各PMXEプラグインの記事最後にリンクするようにしていきます。

    以上です。
  • 闇鍋プラグイン 変化量の小さなモーフオフセット削除機能追加

    2015-03-15 01:163
    闇鍋プラグイン(https://bowlroll.net/file/9765)に
    ・変化量の小さなモーフオフセット削除機能
    を追加しました。

    使用目的は頂点モーフ/ボーンモーフで変化量の極小さなオフセットが大量にあるとモデルのサイズが大きくなったりするのでダイエットのために作成しました。

    2015/08/13更新 要素数が10以下のモーフは対象外に。処理方法によりグループモーフに影響が出る場合があった為、修正。

    ■RemoveMorphOffsets
    ・選択した頂点モーフ/ボーンモーフで変化量の小さなオフセットを削除します。

    ■使い方
    ・プラグイン実行
    「User」→「MORPH」→「[MORPH] 変化量の小さなモーフオフセットを削除する。」
    を選択して実行してください。



    実行すると以下の様なウィンドウが表示されます。
    変化量に任意の数字を入力し左のリストからモーフを選択し
    「選択したモーフの変化量の小さなオフセットを削除」をクリックしてください。


    実行しましたら以下の様に該当したオフセットが削除されます。
    ・実行前



    ・実行後


    以上です。

    この記事のコメント欄は以下の記事通り解放します。
    http://ch.nicovideo.jp/t0r0/blomaga/ar760385