2012年4月29日日曜日

セキュリティについて:DEP, ASLR

コンピュータへのHackingに対抗するための技術としてDEP(Data Execution Prevention:データ実行防止)、ASLR( Address space layout randomization:アドレス空間配置のランダム化)というのをあるのを知りました。結構昔からある技術でした。wikipediaでも調べればのってますが、概要をメモしときます。昔からよく行われるHackingの手法に「バッファオーバーフロー攻撃」というのがありますが、どちらもそれに対抗するものです。

・DEP
「バッファオーバーフロー攻撃」はデータをバッファのサイズ以上に書き込んで、その時意図的に自分の実行したいプログラムをそのデータ列にいれて、そこを実行させようとします。そこでメモリ管理テーブルにNXビットというのを設けて、データエリアとプログラムエリアを判別できるようにしてやろうということです。バッファオーバーフローではデータエリアにデータが書き込まれるはずなので、そこを実行しようとしたらOS側で検知して、中止します。windows XP SP2以降のwindowsに実装さrているそうです。(Linuxにはなし)
ただこれをすり抜ける技術としてReturn-to-libc攻撃というのが考えられて、さらによりセキュリティをあげるため、以下のASLRが考えられたようです。

・ASLR
バッファオーバーフロー攻撃を成功させるためにはスタック領域やヒープ領域のアドレスがわかっていないとできません。(更にいうとReturn-to-libc攻撃を成功させるためにはlibcのアドレスも必要です)そこで、これらのアドレスを実行時にランダムに配置してやれば攻撃できない(正確には難易度があがる)ということになります。Return-to-libc攻撃がかなり困難になります。windowsはVista以降、Linuxはカーネル2.6.12から、Mac OSXは10.5から一部のライブラリに実装したそうです。
ただこれはOSが32bitの場合、16bitでしかランダム化できないため、力技で攻撃すれば総当りで、最近のCPUなら分単位で突破できる可能性があります。(64bitのOSだと、成功の確率が飛躍的に下がるため、非常にセキュアになるそうです)

2012年4月26日木曜日

Android開発環境が更新

久しぶりにwindows上のAndroid開発環境を更新しようと思い立ちました。ところがeclipseを起動できなくて異常終了してしまいます。ログを見てもよくわからず、諦めて"eclipse -clean"でコマンドプロンプトから直接起動。(知らないうちにJavaの何かが更新されたかな?)これで起動できるといきなりADTがver17以降にあげろと文句言われてしまいました。SDK Managerで更新しようとすると、なぜかplatform-toolsのmvがうまくいかないと言われて、更新ができません。
でもよく考えたらSDK Managerってplatform-tools以下にあるんじゃなかったっけ?それじゃ更新できんだろうと思い、色々調べてみると、eclipseのHelp>Software check(日本語化してしまってるんで、ちょっとうろ覚えです)から更新するといいとありましたが、やっぱり怒られます。試しにplatform-toolsは更新しないようにチェックを外してからやると、先のダイアログで勝手に含まれてしまうようなメッセージがでましたが、無事できたようです。それにしてもeclipseの更新は時間がかかります。なんでこうなのか・・・

ちなみにMacだと特に問題は起こりませんでした。windows特有の問題なんだろうな〜(googleさん、ほとんどLinuxで開発してるみたいで、windowsへのポーティングにはよく問題がおきます)

2012年4月6日金曜日

enghelperをインストール

ここのところruby環境をubuntu11.10で整えるのに頑張っていましたが、それもenghelperを動かしてみたかったからです。これは英次郎のデータをもとに加工して、辞書ツールや、英文をいれると「適度に」日本語のルビをふってくれるものです。(この「適度」というのがポイントです。パラメータで自分の実力にあわせてチューニングできます)
ただ先にも書きましたが、ubuntu等のディストリビューションではruby-1.8が主流で、まだまだ1.9は入っていません。しかたなくrvm(Ruby Version Manager)をインストールしてruby-1.9.2をインストールしようとしましたが、従来のrubyと環境がうまく整合させるのに苦労しました。(これもenghelperがruby-1.9を前提に作ってあったためです)さらにenghelperは動作に、nokogiriとengtaggerをrubyのライブラリとして要求しており、これのインストールにも苦労しました。通常、gemを使えばそのままライブラリをインストールできるはずでした。まずgemを使うのに苦労しました。最初、どうもバージョンが古いと言われたので、以下を実行しました。

$ sudo gem update --system

しかしこれやろうとするとubuntuのシステムとぶつかる恐れがあるので推奨しない、apt-getを使えと言われました。しかたなく 以下を実行。

  sudo apt-get install rubygems

これで最新のバージョンになり、gem installができるようになりました。(それでも最新のgemよりは古いんだろうな)これでnokogiriとengtaggerがインストールできるようになりました。
nokogiriのインストール

sudo apt-get isntall libopenssl-ruby
 sudo apt-get install libopenssl-ruby
 sudo apt-get install libxslt-dev
 sudo apt-get install libxml2-dev
 sudo gem install nokogiri
nokogiri本体は、gem installでOK。動作に必要なライブラリがいくつかあり、足りないものを事前にインストールしておく。

engtaggerのインストール

sudo gem install engtagger

ところでenghelperですが、どうもDLした内容と説明があっていません。説明に書いてあるスクリプトが見つかりません。しばらく悩んでいましたが、どうも3月末から4月にかけて更新が2,3回行われたようです。現時点で最新のenghelper-0.5.7をDLしてきて内容が説明と同じものなのを確認できました。
これで辞書ツールを動かすことができました。
さすがに元のデータが用語数多い英次郎です。例題が大量にでてきます。(ただその内容については、賛否両論あるので自己責任で)
次に肝心のルビ振りツールですがうまく動きません。apacheのerror.logを見ると、engtaggerのロード(require)でロードできないとエラーがでています。engtagger, nokogiriともどうもrequire(Rubyの文法でライブラリのロードです)でエラーがでます。
> require 'engtagger'
LoadError: no such file to load -- engtagger
from /usr/share/ruby-rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'

gemできちんとインストールしたはずだが、場所を確認する。
$ gem which engtagger
エラーがでる?入ってないのか?
$ sudo gem which engtagger
/var/lib/gems/1.8/gems/engtagger-0.1.1/lib/engtagger.rb
よくわかりませんが、通常ユーザとrootで環境が違うようです。ただこの場所はどうみてもrvmが入っている/usr/share/ruby-rvm以下ではないのでまずい感じです。(rubygemsがubuntu標準なのでこの位置に入れられてしまうか?)

さらにnokogiriも調べてみます。こっちはgem which でどうしても見つかりませんが、偶然以下で見つけました。
/var/lib/gems/1.9.1/gems/nokogiri-1.5.2
どうみても場所がばらばらです。

しかたなく手作業で以下の場所にコピーしてしまいます。(irbで $LOAD_PATHを表示させてどこからライブラリを読んでいるかを調べておきました)
/usr/share/ruby-rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1

結局コピーしたのは以下のものです。

-rw-r--r-- 1 root root 25037 2012-04-06 18:41 engtagger.rb
-rw-r--r-- 1 root root  3877 2012-04-06 18:45 nokogiri.rb
drwxr-xr-x 2 root root  4096 2012-04-06 18:42 engtagger
drwxr-xr-x 7 root root  4096 2012-04-06 18:46 nokogiri
drwxr-xr-x 3 root root  4096 2012-04-06 18:46 xsd

よくわかりませんが、.rbがディレクトリ以下のものもrequireしていたんで一緒にコピーしておきました。これで無事enghelperが動作してくれました。

きちんとルビをふってくれてます。(^^)v


2012年3月28日水曜日

ubuntuにruby-1.9をインストール

ちょっと入れてみたいOSSがあり、それがデータ作成にruby-1.9を使ってました。最初、ubuntu11.10にもrubyが入っていたのでいいと思ったら、どうもエラーがでます。よく見たら、force_encodingという関数が見つからない様子。調べてみたら、ruby-1.9から追加された関数らしい。
ubuntuのサーバにはruby-1.8までしかなく(調べてみると、大抵のディストリビューションがまだ1.8系らしい)、かといって既存のものをいきなり外して新しいのを入れるのもどうかと・・・(ruby使ってるツールがありそうで、最初に外したところでエラーでとまっちゃいそうな気がして) 調べてみたらrvmというコマンドがあるらしい。(ruby version managerというらしく、複数バージョンを使い分けられるらしい)ただデフォルトではrvmが入っていません。Ubuntuのサーバにはありました。

$ sudo apt-get install rvm

これでrvmが使えるようになりました。

$ sudo rvm install 1.9.2

こうすると/usr/share/ruby-rvm以下にソースをgetしてきて、展開しビルドしてくれます。とここまではいいんですが、どうもSSL2のところでエラーがでます。色々調べてたら、英語のページで同様の現象とその対策がありました。

/usr/share/ruby-rvm/src/ruby-1.9.2-p180/ext/openssl/ossl_ssl.c


// OSSL_SSL_METHOD_ENTRY(SSLv2),
// OSSL_SSL_METHOD_ENTRY(SSLv2_server),
// OSSL_SSL_METHOD_ENTRY(SSLv2_client),

100行目くらいにある上記の3行をコメントアウトしてしまいます。(いいんかい!という気もしますが、まあとりあえず外部接続に使う気はないんで)その後、ビルドできました。
ただ、バージョンがどうにもうまく切り替えれません。rvmをインストールすると、${HOME}/.rvmというディレクトリが作られ、その下に展開されるらしいんですが当該ディレクトリができていません。もう少し格闘しないといけなさそうです。

PS
ようやくわかりました。どうも/etc/profile.d/rvm.shを実行しないといけないようです。${HOME}/.rvm以下にスクリプトを展開するというものもあるようですが、ubuntuの現状だと/usr/share/ruby-rvm以下に展開されてしまい、そういう場合はrvm.shを実行しないといけないようです。rootになるとhomeに.bashrcがないので/etc/bash.bashrcが実行され、そこからrvm.shが実行されるんですが、通常ユーザーの場合は~/.bashrcがあるので、そこの最後に以下の行を追加しました。

source /etc/profile.d/rvm.sh

これでrvm関係の環境変数がセットされ、バージョンが切り替わるようになりました。というこで、やっと目的のOSSのインストールにかかれます。、

2012年3月21日水曜日

hadoop お試し

(何か操作を失敗したのか内容が消えてしまっていたので、記憶の限り簡単にメモしなおし)
最近話題の「ビッグデータ」のさわりを簡単に試してみたくなりました。

1.VMwareのイメージで試す
これが一番お手軽です。Yahoo! Cloud Virtual Machine Applianceここにubuntu8上に設定したhadoop-0.20があり、VMplayerを用意すれば簡単に試せます。ただシングルマシンの環境なのにセキュリティがばっちり入っていて、毎回kinitしないといけないのがめんどくさいですが。

2.Cloudera社のHP上からパッケージを落とす
Ubuntuなんか使ってる方だと簡単に環境を構築できます。リポジトリリストにCloudera社のものが入ってしまうので、通常の更新確認で若干遅くなったり、たまに反応がこなくなったりするのが玉にきずですが。(自分は結局外してしまいました)

どちらも同じサンプルプログラムが入っていて、MapReduceを実体験できます。(どうみても同じものにしか見えんw YahooでHadoop作った人が独立してCloudera立ち上げたせいなのかもしれません)当然、複数nodeの動作状態をモニタする機能もあります。(ブラウザで見ることができます)

(1)HDFSの状況を確認
HDFS上にできているファイルの確認用画面です。http://localhost:50070で見れます。(もちろんほかのマシンからでもOKです)

(2)MapReduceの動作状況の確認
今度はサンプルのPIを計算しているときの動作状況をモニタしてみます。http://localhost:50030で見れます。

最下段にRunしているジョブが表示されています。そこをクリックするとより詳細なMapReduceの状態がモニタできます。
これは見ていて非常に面白いです。ブラウザの表示を更新すると計算状況の進捗状態が直接わかります。

2012年3月18日日曜日

ubuntuの環境メンテナンス

しばらく電源を入れてなかったubuntuのマシンもメンテナンスしないと。
ちょっと久しぶりにnoSQL関係の性能を見てみたくなり(google leveldbです)、そうなるとboostいれないと、となります。素手でインストールしてもいいんですが、更新の手間やらC++のライブラリでほとんど採用されそうな状況でどうしようかとおもいましたが、Canonicalのパッケージにしときます。(現状、48ですがCanonicalは46でした。まあ、ちょっと遅れてますが、そのあたりはあきらめて。)
さて、この連休中にちょっとleveldbの性能をみてますか。(ちょっと、従来テキストベースでデータを読み込んでいたプログラムが、最近読み込むデータがGBクラスになってきて、こりゃnoSQL(KVS)の採用を考えないといけないなと・・・)
仕様を考えるセクションはComputer Scienceに詳しいわけではなく、使ってる状況を見てこちらから提案しないと互いにHappyにはなれません。

2012年3月17日土曜日

計算機のメンテナンス

最近、windows等で脆弱性に対する更新がまた多くなっています。新しい計算機が欲しいなあ~と考えてたら、家中のPCの更新すませとかないと(ウイルススキャンもやらないと、電源もしばらく入れてないのがあるし)と思いたち、休日の土曜日の午前中にマシンのメンテナンス。いや~、時間かかりますね。(ついでにいくつかはハードディスクの最適化もしとかないと)これで更にマシン増やしたら、面倒みきれないぞと考えてしまいました。(Macやlinuxのマシンもあるので大変です)