Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

11 / 37

Slide 12

Slide 12 text

検索エンジンを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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

rate limit rate limit 16 / 37

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

導入 導入 1 インストール 2 有効化 $ sudo apt install libapache2-mod-evasive $ sudo a2enmod evasive Module evasive already enabled 1 2 19 / 37

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

今の設定 今の設定 設定反映 $ 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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

修正 修正 改行コードを \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

Slide 27

Slide 27 text

テスト テスト $ 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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

メール形式が変 メール形式が変 メールは送信されるが, 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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

その他のバグ その他のバグ キャッシュサイズが間違っているらしい キャッシュサイズを 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

Slide 32

Slide 32 text

パッケージの作り直し パッケージの作り直し 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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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