Upgrade to Pro — share decks privately, control downloads, hide ads and more …

軽量TwitterフロントエンドのNitterのアクセス制限

 軽量TwitterフロントエンドのNitterのアクセス制限

Kenichiro MATOHARA

June 20, 2021
Tweet

More Decks by Kenichiro MATOHARA

Other Decks in Technology

Transcript

  1. 軽量Twitterフロン
    軽量Twitterフロン
    トエンドのNitter
    トエンドのNitter
    のアクセス制限
    のアクセス制限
    Kenichiro Matohara(matoken)
    1 / 37

    View Slide

  2. 南隅から参加(鹿児島の右下)
    好きなLinuxディストリビューションはDebian
    お仕事募集 mailto:work@matohara.org
    Kenichiro Matohara(matoken)
    Kenichiro Matohara(matoken)
    https://matoken.org
    https://matoken.org
    2 / 37

    View Slide

  3. 以前のNitter
    以前のNitter
    Twitterをちっちゃいリソースで - Speaker Deck
    軽量TwitterフロントエンドのNitterの最近のこと - Speaker Deck
    3 / 37

    View Slide

  4. Nitter
    Nitter
    Nim製AGPL3.0のTwitterフロントエンド
    軽量,JavaScript不要.Twitterによる追跡の回避,RSS対応など(RSS
    Agregatorの他にもIFTTTなどにも)
    GETは共通なのでドメイン転送しても便利
    いまのところログインや投稿はできない
    検索キーワードと期間を指定してあるイベントのまとめURLを作っ
    ても便利
    たくさんのユーザを購読したい場合はパラメーター長の制限に引
    っかかるので公開リストを作っておくといい
    に公開Nitterインスタンスの一覧がある
    Instances · zedeus/nitter Wiki
    4 / 37

    View Slide

  5. JavaScript非対応ブラウザで閲覧
    JavaScript非対応ブラウザで閲覧
    5 / 37

    View Slide

  6. rsstailでRSS購読
    rsstailでRSS購読
    $ rsstail -p -l -a -c -N -H -r -i 60 -u 'https://nitter.matoken.org/search/rss?f=twee
    今日の #koedolug 発表ネタ

    「軽量TwitterフロントエンドのNitterの最近のこと」

    https://wiki.matoken.org/study_meeting/2021#%E5%B0%8F%E6%B1%9F%E6%88%B8%E3%82%89%E3%8
    %E3%81%BE%E3%82%8A_%E7%AC%AC227%E5%9B%9E

    https://nitter.matoken.org/matoken1/status/1403685603309363207#m

    Sat, 12 Jun 2021 12:08:21 GMT

    #osc21do までにこの辺2,3本欲しい

    https://nitter.matoken.org/matoken1/status/1403698153082089475#m

    Sat, 12 Jun 2021 12:58:13 GMT
    6 / 37

    View Slide

  7. blogにTwitter検索結果を埋め込み
    blogにTwitter検索結果を埋め込み
    7 / 37

    View Slide

  8. Nitterをセルフホスト
    Nitterをセルフホスト
    Nitter.net で試せていたけどTwitterによるrate limit で使えないことが
    多い
    固定URLが欲しい(Nitterインスタンスを切り替えるとURLが変わる)
    VPSでセルフホスト(ドイツのContabo VPS300 €3.99/月)
    快適に :)
    詳細はこちら → 「軽量TwitterフロントエンドのNitterをセルフホス
    ト」
    8 / 37

    View Slide

  9. 最近サーバが重い?
    最近サーバが重い?
    サーバが重くなっている
    VPSが制限を掛けられているぽい
    Nitterがいっぱい使われているぽい
    アクセスログが数百MB/日
    ログを見ると検索エンジン&検索エンジンからの流入が主のよう
    Nitterを使いたいと使われるのはいいけど使いたいときに自分が使
    えなかったりしてちょっとあれ><
    9 / 37

    View Slide

  10. アクセス状況
    アクセス状況
    10 / 37

    View Slide

  11. 11 / 37

    View Slide

  12. 検索エンジンをrobots.txtで制限
    検索エンジンをrobots.txtで制限
    robots.txt を用意
    Apache httpdのreverse proxy環境でAlias設定
    詳細 →
    Alias /robots.txt /home/nitter/robots.txt



    Require all granted


    Nitterにrobots.txtを設定(Apache httpdのreverse proxy環境でAlias
    設定)
    12 / 37

    View Slide

  13. だんだんアクセスが減る
    だんだんアクセスが減る
    検索エンジンのスパイダーが居なくなることでサーバーが安定 :)
    検索エンジンの検索結果からもだんだん減っている
    検索エンジンから消さなくても良さそう?
    13 / 37

    View Slide

  14. アクセス日 件数
    06/04 1150k
    06/09 978k
    06/10 808k
    06/11 772k
    Google検索結果
    Google検索結果
    14 / 37

    View Slide

  15. 急にアクセスが減る
    急にアクセスが減る
    15 / 37

    View Slide

  16. rate limit
    rate limit
    16 / 37

    View Slide

  17. アクセスが減ったのにrate limit
    アクセスが減ったのにrate limit
    今度はTwitterからVPSに対しての制限( nitter.net でよく見ていたもの
    )
    制限されたのでアクセスが減る,解除されて戻るを繰り返してそ

    一部の大量アクセスの人を制限したら解除される?
    17 / 37

    View Slide

  18. libapache-mod-evasive でアクセス
    libapache-mod-evasive でアクセス
    制限を試みる
    制限を試みる
    DebianパッケージのApache2 httpd で動作するDoS対策モジュールを試
    してみる
    $ apt-cache search apache dos

    libapache2-mod-evasive - evasive module to minimize HTTP DoS or brute force attacks

    libfile-listing-perl - module to parse directory listings

    $ apt show libapache2-mod-evasive

    Package: libapache2-mod-evasive

    Version: 1.10.1-3

    Priority: optional

    Section: httpd

    Source: libapache-mod-evasive

    Maintainer: Alberto Gonzalez Iniesta

    Installed-Size: 82.9 kB

    Depends: libc6 (>= 2.14), apache2-api-20120211, bsd-mailx | mailx

    Homepage: http://www.zdziarski.com/blog/?page_id=442

    Tag: protocol::http, role::program, role::shared-lib, suite::apache

    Download-Size: 15.0 kB

    APT-Manual-Installed: yes

    APT-Sources: http://deb.debian.org/debian buster/main amd64 Packages

    Description: evasive module to minimize HTTP DoS or brute force attacks

    mod_evasive is an evasive maneuvers module for Apache to provide some

    protection in the event of an HTTP DoS or DDoS attack or brute force attack.

    18 / 37

    View Slide

  19. 導入
    導入
    1 インストール
    2 有効化
    $ sudo apt install libapache2-mod-evasive

    $ sudo a2enmod evasive

    Module evasive already enabled
    1
    2
    19 / 37

    View Slide

  20. 設定
    設定
    設定ファイル: /etc/apache2/mods-available/evasive.conf
    DOSHashTableSize
    ハッシュテーブルサイズ.大きくすると高速になるけどメモリ
    使用量が増える.
    DOSPageCount
    同一ページでのDoSカウント
    DOSSiteCount
    サイト単位でのDoSカウント
    DOSPageInterval
    同一ページでのDoSカウント間隔(秒)
    20 / 37

    View Slide

  21. DOSSiteInterval
    サイト単位でのDoSカウント間隔(秒)
    DOSBlockingPeriod
    DoSと判定されたときのブロック時間(秒)
    DOSEmailNotify
    DoSと判定されたときの通知メール宛先
    DOSSystemCommand
    DoSと判定されたときに実行するコマンド(動作未確認)
    DOSLogDir
    DoSと判定されたときに作られるログファイル格納ディレクト

    21 / 37

    View Slide

  22. DOSWhitelist
    DoSと判定されないアドレスを設定(複数行設定可能)
    22 / 37

    View Slide

  23. mod_evasive20.c より既定値
    mod_evasive20.c より既定値
    #define DEFAULT_HASH_TBL_SIZE 3079ul // Default hash table size

    #define DEFAULT_PAGE_COUNT 2 // Default maximum page hit count per interva
    #define DEFAULT_SITE_COUNT 50 // Default maximum site hit count per interva
    #define DEFAULT_PAGE_INTERVAL 1 // Default 1 Second page interval

    #define DEFAULT_SITE_INTERVAL 1 // Default 1 Second site interval

    #define DEFAULT_BLOCKING_PERIOD 10 // Default for Detected IPs; blocked for 10 s
    #define DEFAULT_LOG_DIR "/tmp" // Default temp directory
    23 / 37

    View Slide

  24. 今の設定
    今の設定
    設定反映
    $ sudo service apache2 reload


    #DOSHashTableSize 3079

    #DOSPageCount 2

    DOSSiteCount 30

    #DOSPageInterval 1

    DOSSiteInterval 60

    DOSBlockingPeriod 180

    DOSEmailNotify [email protected]

    #DOSSystemCommand "su - someuser -c '/sbin/... %s ...'"

    DOSLogDir "/var/log/mod_evasive"

    DOSWhitelist 153.121.44.87


    24 / 37

    View Slide

  25. test script
    test script
    test script( /usr/share/doc/libapache2-mod-
    evasive/examples/test.pl )があるが,現在のapache httpdでは動
    作しない
    $ perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl

    HTTP/1.1 400 Bad Request

    HTTP/1.1 400 Bad Request

    HTTP/1.1 400 Bad Request

    :
    25 / 37

    View Slide

  26. 修正
    修正
    改行コードを \n から \r\n に変更する.
    @@ -10,7 +10,7 @@

    my($SOCKET) = new IO::Socket::INET( Proto => "tcp",

    PeerAddr=> "127.0.0.1:80");

    if (! defined $SOCKET) { die $!; }

    - print $SOCKET "GET /?$_ HTTP/1.0\n\n";

    + print $SOCKET "GET /?$_ HTTP/1.0\r\n\r\n";

    $response = <$SOCKET>;

    print $response;

    close($SOCKET);
    26 / 37

    View Slide

  27. テスト
    テスト
    $ perl /usr/share/doc/libapache2-mod-evasive/examples/test.pl

    HTTP/1.1 200 OK

    HTTP/1.1 200 OK

    HTTP/1.1 200 OK

    HTTP/1.1 200 OK

    HTTP/1.1 403 Forbidden

    HTTP/1.1 200 OK

    HTTP/1.1 403 Forbidden

    HTTP/1.1 200 OK

    HTTP/1.1 200 OK

    HTTP/1.1 200 OK

    :
    27 / 37

    View Slide

  28. アクセス制限確認
    アクセス制限確認
    syslogにメッセージ

    mod_evasive[809]: Blacklisting address 127.0.0.1:
    possible DoS attack.
    DOS- というファイル名で中身はPIDのログファイル
    が作成される.
    メールが送信される
    アクセスがしばらく制限される(既定値で10s)
    28 / 37

    View Slide

  29. メール形式が変
    メール形式が変
    メールは送信されるが, To: , Subject: も body の中に入ってしまって
    いる.
    mod_evasive20.c の MAILER に -t オプションを加える.
    From: www-data

    To: [email protected]

    Subject: HTTP BLACKLIST 127.0.0.1

    mod_evasive HTTP Blacklisted 127.0.0.1
    #define MAILER "/usr/bin/mail -t %s"
    29 / 37

    View Slide

  30. ログファイルがクリーンアップ
    ログファイルがクリーンアップ
    されない(2度目以降の通知が飛
    されない(2度目以降の通知が飛
    ばない)
    ばない)
    1度目のDoS検出でログファイル( dos- )が作られ,同
    じIPアドレスでの2度目以降の検出時に403は返すが,syslogやメール
    に記録されない. 以下のissueによると制限解除時に該当ログファイ
    ルのクリーンアップ処理が必要.
    修正中
    とりあえずsyslogには出すようにした.
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=931813
    30 / 37

    View Slide

  31. その他のバグ
    その他のバグ
    キャッシュサイズが間違っているらしい

    キャッシュサイズを 3097 から 3079 に
    mod_evasive20.c
    #define DEFAULT_HASH_TBL_SIZE 3079ul // Default hash table size
    #833448 - libapache2-mod-evasive: Wrong prime number. Should be 3079
    instead of 3097 - Debian Bug report logs
    31 / 37

    View Slide

  32. パッケージの作り直し
    パッケージの作り直し
    1 ビルドに必要なパッケージの導入
    2 sourceパケージのダウンロード
    3 署名なしでビルド
    4 既存のパッケージを削除(設定は残す)
    5 出来上がったパッケージの導入
    $ sudo apt build-dep libapache2-mod-evasive

    $ sudo apt source libapache2-mod-evasive

    $ cd libapache-mod-evasive-1.10.1

    $ #修正

    $ debuild -uc -us -b

    $ sudo apt remove libapache2-mod-evasive

    $ sudo dpkg -i ../libapache2-mod-evasive_1.10.1-3_amd64.deb
    1
    2
    3
    4
    5
    32 / 37

    View Slide

  33. pinを設定してapt upgradeでアッ
    pinを設定してapt upgradeでアッ
    プデートされないようにする
    プデートされないようにする
    /etc/apt/preferences
    Package: libapache2-mod-evasive

    Pin: version *

    Pin-Priority: -1
    33 / 37

    View Slide

  34. アクセス制限について
    アクセス制限について
    今の所1時間に数人引っかかる感じでアクセスは2/3程に → アクセ
    スが戻ってきたので厳しく
    手動では引っかからないのでもう少し厳しくしても良さそう
    まだTwitter の制限はある
    34 / 37

    View Slide

  35. アクセス制限に使った libapache-
    アクセス制限に使った libapache-
    mod-evasive について
    mod-evasive について
    アクセス制限の動作自体は問題なさそう
    設定どおりにアクセス制限できている
    細かいバグがいくつか
    Debianには されているが数年放置されている
    は消えている
    → を見たら
    別のものを使ったほうが良さそう
    バグレポ
    upstream sidのpkg情報 GitHubに移動してい

    35 / 37

    View Slide

  36. まとめ
    まとめ
    自分用に立てていたサービスが検索エンジンに見つかってアクセ
    スが大量に
    自分が使えなくなって困る
    Proxy的なサービスなのでもっと注意するべきだった
    VPSが固定料金で良かった
    💰
    36 / 37

    View Slide

  37. 奥付
    奥付
    発表
    発表者
    利用ソフトウェア
    ライセンス
    CC BY-NC-SA 4.0
    鹿児島Linux勉強会 2021.06(オンライン開催) - connpass
    Kenichiro Matohara(matoken)
    Asciidoctor Reveal.js
    37 / 37

    View Slide