Elaboration in, Garbage out

Twitt*r ではメモできない何かそれ的なモノ・コトを

ShellShock: Bash 脆弱性

いやー,すっげぇ脆弱性があるもんですな.SQL Injection なみ?
幸い,個人的に公開してるサーバには攻撃はきてないみたい*1
関心している場合ではないんだが,とりあえず

bashの脆弱性(CVE-2014-6271) #ShellShock の関連リンクをまとめてみた - piyolog
を読みましょう.

脆弱性があるかの確認コマンド.

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

わるだくみコマンドも日本語情報でさえ探したら出てくるので,ゼロデイアタックを喰らわないよう気をつけましょう(という俺も対応が遅れたのだが……).

OSX の Marvericks も,"vulnerable" とでました.zsh に切り替える派もいるらしいけど,zsh も実は違う方法でアタックできちゃうとか…いう噂が.あくまでも噂.
とりあえず,リバーシプロキシ側ですべて防ぐという運用で行きます.

*1:まぁ HTTP 用のポートをランダムな値にしてるし,そもそもよくわかんないアクセスが来たら嫌な予感しかしない.

クローラー+α

泳ぎます,Web の中で.

この記事について

仕事で Web をランダムウォーク(ランダムクロール?)をしていたので,自力でクローラーを作りたくなった.Web から取得したページを解析*1したいから,スクレイピンングすることも必要だ*2.あと,データを貯めるためにはデータベースも必要.
とりあえず,どんな言語で,何があって,どんな情報があるのか,まで調べた.日本語の問題はダイジョブだろう.


著作権の問題あるよね(´・ω・`)

ちょっと前まではその通り.平成 21 年の著作権法改正により,利用目的が「電子計算機による情報解析」であれば大丈夫,問題ない.著作権法 47 条の 7 には,

著作物は、電子計算機による情報解析(多数の著作物その他の大量の情報から、当該情報を構成する言語、音、影像その他の要素に係る情報を抽出し、比較、分類その他の統計的な解析を行うことをいう。以下この条において同じ。)を行うことを目的とする場合には、必要と認められる限度において、記録媒体への記録又は翻案(これにより創作した二次的著作物の記録を含む。)を行うことができる。ただし、情報解析を行う者の用に供するために作成されたデータベースの著作物については、この限りでない。

とある.とりあえず,詳しいことは「平成 21 年著作権法改正のポイント」とかいうキーワードで調べれば参考になる pdf でも出てくるんじゃないのかな〜(*゚∀゚)

ご存知の方も多いと思うけど,著作権というのは,著作物{「思想又は感情を創作的に表現したものであつて、文芸、学術、美術又は音楽の範囲に属するもの」(著作権法第二条)}に対する著作者の権利を指しているので,電子計算機による情報解析の結果を公表するのは,(著作物を表示したりプライバシーの問題に引っかかったりする,というのを除けば)OK だと思う.

今思ったけど,情報を解析した結果を元に未来を「予測」することは「その他の統計的な解析」に該当するのかがわからない,多分大丈夫だと思う.教えて詳しい人←.

で,肝心のクローラーはどうなのよ

総合評価*3

てきとーに手動で Web スクレイプした結果をまとめるとこんな感じ.すごく……主観評価です.

言語 ライブラリの機能(クローラー ライブラリの機能(スクレイパー とっつきやすさ
Java
Python
Ruby

Java

Apache Nutch をはじめ,けっこー洗練されたものが多いという印象.ただ,(2010 年時点で)英語の資料もままならない状態らしい.

参考;
クローラー開発、まとめリンク | Webアプリの開発諸々
Web scraping with nutch solr
Large scale crawling with Apache Nutch

Python

Scrapy が非常に高機能らしい.ただ,Scrapy のスクレイピング機能が使いづらいかつアーキテクチャが微妙らしく,他のライブラリ(beutifulsoup,pyquery,lxml etc)を使ってもいいかもしれないし使えないかもしれない(丸投げ).日本語の情報も豊富でとっつきやすいみたいです.

参考;
PythonによるWebスクレイピング入門
asyncioを用いたpythonの高速なスクレイピング | POSTD

Ruby

いろんなライブラリがあって,Ruby のほうがクローラー開発が活発のよう*4スクレイピングに関しては,Nokogiri がデファクトスタンダードになっているらしい.生 HTML データを MongoDB に突っ込むのもの,いろいろライブラリ使ってほほーんとできそうで,日本語の情報も豊富で,書籍も出ているよう.

参考;
Rubyで作るクローラー Ruby crawler
Rubyとか使ってクローリングやスクレイピングするノウハウを公開してみる! - 病みつきエンジニアブログ
RubyのNokogiriを使ってサイトをスクレイピングする - Think Big Act Local

結論

そうだ,Rubyクローラーつくろう.

*1:食べログで言うならば,どの部分にユーザーの点数が書かれているか,とか

*2:パーサーとかインデクサーとかいった用語もあるけど,まだ調べてない

*3:PHP もあるが,PHP は触ったことないので除外←

*4:Google 検索で”Ruby クローラー”だと 77k 件,"Python クローラー" だと 20k 件ヒット

時系列データの因果性分析?

最近,時系列データから「異常」を見つけよう,という文脈で Temporal Causal Model with Granger Causality *1という名前をよく聞くので調べものメモ.用途を簡単に説明すると,

  • ある銘柄の株価の変動が他の銘柄の株に影響を与えるかを調べたい
  • 天気に関するデータから「異常」発生(ハリケーンとか)を予測したい

といった目的で使われる事が多いらしい.ソース Temporal Causal Models for Massive Time-series Data Mining: Climate Change Attribution and other Applications

んで,「異常」を予測するのなら,過去のデータには異常発生時刻があると便利そうと思う.てか普通使うだろ,と.でも Temporal Causal Model の学習するときには異常と正常を識別せずにぶん回すらしい.

どういうことかというと,この文脈では異常を全データの中ですごく稀な状態なこと(ex: 1ヶ月に 1 時間)だと定義している.だから,正常な時系列のパターンのみを「自然に」*2学習できて,正常状態を予測し続けることで,予測が外れたときに異常が検知できるといったロジックになっている,

うーん,なんだこの微妙な感じ.

*1:名前についてはそこまで調べてないので,定着した名前があるかもしれない

*2:レアケースの異常な状態は,正常状態の数の暴力により影響が無くなりやすい

複数 Ruby on Rails アプリを nginx/passenger で動かす

っていう,ググるとありきたりなタイトルですが,これが全然正常に動いてくれない.

症状

HTML,javascript は正常に認識される.でも CSS だけ,パスの設定も正しく URL を直接叩くと CSS ファイルも表示されるのに,認識されない

解決策

nginx 側の設定ファイルに

rails_env production;

を追加するだけで解決.どうやら,production 環境だと認識されていなかったっぽい.それだけ・・・?

l2tp のインストール書き忘れ

raspberry pi さんが雷にやられていろいろ設定しなおしているんだけど,IPsec の最初の認証でうまく行かない問題がまたきた.
そういや openswan のバージョンダウングレードしてたなー,と思い出してググったら,やっぱり最新バージョンにはバグがあらしい.

参考: http://www.raspberrypi.org/forums/viewtopic.php?f=36&t=31541&start=25

wget http://snapshot.raspbian.org/201403301125/raspbian/pool/main/o/openswan/openswan_2.6.37-3_armhf.deb
sudo dpkg -i openswan_2.6.37-3_armhf.deb

これで解決.

ブルートフォースアタック対策

SSH でたまーに攻撃がくる.6/27 のブルートフォースアタックの件数はだいたい 1500 件ぐらい.

# grep "Jun 27" /var/log/auth.log | grep [fF]ailed | wc -l
1519

3 回失敗したらしばらくアクセス禁止,というのを fail2ban 入れて設定してみた.すると 7/1 のログには,ほぼ 1/10 だけになった.

# grep "Jul  1" /var/log/auth.log | grep [fF]ailed | wc -l
163

たぶん,そんなにオープンにする必要がないのなら,中国とかロシアとか韓国からのアクセスを拒否してもいいかなー,と思いつつ ipset を導入.iptables だとリストが膨れ上がりすぎて raspberry pi に負荷が掛かって,raspberry pi がリストをロード中にアタックされる,ということもあるよう.ということで,http://www.plustar.jp/lab/blog/?p=1922 をみて設定.

Rails サーバをリバースプロキシ経由で

Nginx を触ってみたかった & Rails のサーバーを直接外にだすのは何かコレジャナイ感があったので,Raspberry pi に Nginx いれて,リバースプロキシで OSXRails に port3000 でアクセスするように設定.

 

それにしても,Nginx 設定自体は簡単.ただ MD5 でダイジェスト認証をするアドオンを使っている.MD5 は攻撃方法が知られているのと,Nginx のバージョンが古くてアレなので,そこら辺はいつかなんとかする.Rails 側でも一応認証あるし,