Git周り、SparkleShareやEclipseのEGitをPuTTYがインストールされたWindowsで使う話

件名が長すぎて件名に内容が収まってしまうのではないかというぐらい内容ないのだけれども。

SparkleShareとかEclipseのEGitとか、最近だとWindowsでGitを使う機会も多い。

で、Gitを利用するにあたって、リモートリポジトリへの接続にsshを使うこともよくある。鍵ならすごく安全だし、設定の手間がなんだかんだ最小限で済む。

で、Windowsでそれをやると随分とあほらしい理由でひっかかったりするようだ。

Git系のアプリケーションが利用すると思われる環境変数でGIT_SSHというのもがあり、ここに何かが入っているとssh接続にはこれを使うらしい。これが厄介で、どうも鍵認証が必要となると鍵はpagentから持ってこようとするらしい。即ち、PuTTYの鍵エージェントで鍵を読み込んだ状態じゃないと認証ができない状態になる。これは不便だ。

解決策は、GIT_SSHとかいう環境変数があったら削除することらしい。システムのプロパティ(マイコンピューターを右クリックしてプロパティで出るやつ)から削除することができる。これ、どういうタイミングで設定されてしまうかは確認していないが、gitに絡む何らかのアプリケーションをインストールと思われる。

とりあえずこれぐらいのことを思ったので一旦メモ。

ミクシィ「Scrap challenge for security」に参加した。

株式会社ミクシィが主催する「Scrap challenge for security」なるイベントに参加してきた。Twitterやブログなどに書いておいてほしいという風に言われていることもあり、アンケートへの回答を兼ねて普段書くこともなくて更新していないブログかどうかよくわからないこのページに参加した記録でも書いておこうと思う。

このイベントでは、先ほどのリンク先が示す通り「なんらかのプログラミング経験があり、1人でアプリケーションを作成する実力をお持ちの方」を対象とした、Webセキュリティに関するレクチャーを受けた上で実際に(仮想環境上に設けられた)某SNS(スライドから原文ママ)に似ているSNSを攻撃するというもの。

鴨ネギ男(6チームに対して3人、各2チームからの攻撃を受けてくれる)に対して脆弱性をつくようなリンク(サイト内)を送りつけるというのが基本的なタスクで、問題が前半6問、後半4問(後半は前半の問題にも引き続き回答可能)。脆弱性をついて、問題に指定された通りの挙動を鴨ネギ男の使用するウェブブラウザ上で出させることに成功すれば得点(一部鴨ネギ男のブラウザ以外で実行するものもある)。徐々にヒントが出るがヒントが出た後の回答は点数が下がるというシステム。問題にもよるが、途中からネタバレに近いヒントが出るものもあった。

1人でアプリケーションを作成する程度の能力を求められるとはいえ、主にWebを扱っているわけではない人も対象に含まれていることもあり、XSSなどの基本的な攻撃手法を用いる問題が主であったが、攻撃手法そのものがよく知られたものでも制限に合わせて工夫しなければ達成されないものもあったり、いくつかの攻撃手法を組み合わせないといけないものもあった。

攻撃する側として考えて実際にやってみる機会はなかなかないため、よい機会として楽しめた。防御する側としても「このような入力でエラーが出るならSQLインジェクション/XSSを疑ったほうがよい」的なものは重要であり、どのあたりに、というのはある程度検討がつくものの、実際に攻撃を成功させるとなると容易ではなかった。また、普段JavaScriptをあまり書かずに生活しているが、JavaScriptの知識も要求された。もちろんGoogle検索にも頼ったが、特に同じチームのK氏がJavaScriptを普段扱っており、必要となる機能を口走るとそれに必要な関数の名前を口走ってくれたりある程度要点を絞った程度の発言にJSで実装する方針を口走ってくれたりしたし、彼自身HTMLとCSSでごりごり書くような課題とかややこしそうな課題を色々やってくれたりしたので心強く、またS氏も問題を解いて提出してくれたりしたため、最後30秒前ぐらいでヒントが出るまで放置していた問題を漸く提出して全問正解、チームとして優勝することができた。問題の核心部分には触れられないので、具体的な内容としてはこのぐらいに留めておく。

最初のレクチャーで出た質問で「XSS」は何がcross-siteなのか、といったものが出ていたが、確かにわかりづらい、一方で確かに今後XSSなどの概念を説明するときに抜けてはならない視点だなと思ったりした。実際に仮想サーバーをもう一台ぐらい用意してcross-siteの攻撃をやってみるとかはやってみたかった気もする。というか、問題の趣旨を無視して自宅サーバーへのリンクを送りつけてWrong Answerくらっててへぺろしても良かった気もする。最後の時間のぎりぎりさを考えると、たとえ2分ぐらいで終わる(自宅サーバーサイドはApacheのアクセスログを見ればスクリプト不要ってのも極論可能)としてもそんなことをしていては間に合わなかっただろうが。

また、懇親会でミクシィの社員の方とお話しできた。昔からのシステムを維持するのは手間が掛かるよな、という話もあったが、新しい手法も色々取り入れているのだとか、あとは色々なところからこのイベントに来ているよな、とか、そういう話もあったりした。会社についての元から抱いていた印象と違うな、と思うようなことはなかったが、そういう話を聞くと親近感が湧いたりする。

なお今回、接続には普通の会社のゲスト用無線LANを利用していたが、このようなイベントにかぎらずパソコンでサーバーに繋がせるタイプのイベントでの配線ってどのようにするべきなのだろう、とか思ったりはする。無線LANは相性が悪い機械があったり、ユーザーが増えると遅くなったりすることを考えられるので、3Gを使わない場合は有線LANを併設したりするとよいと思ったりした。また、インターネット接続は今回必要だったが、サーバーはVPSだった。イベントで何に繋がせて何かをさせる場合、接続先のサーバーは室内LAN内に置いたほうが安定するだけではなく何かと自由が効くのではないかと思ったりした。最近ノートパソコンにVMware入れるだけでも結構性能が出たりするので。

あとは、やらなかったけど個人的にやっておけばよかったなと思う極めてどうでもいいこと。まず、問題に書かれておらず害のない派手な攻撃、具体的には鴨ネギ男ブラウザでmp3やYouTubeなどを勝手に再生する(鴨ネギ男は同室にいるため部屋に響き渡る)脆弱性を別な回答と一緒に送りつけること。それと、仮想環境に対するポートスキャン(だから何かができるわけでもないが)。もしここを見ている人で今後(おそらく来年度以降)このイベントに参加する人がいれば、この発想にとらわれず何かやらかしてほしい。

UbuntuでのRAIDハードディスクの交換

(追記)GPTパーティションを使用する場合、先頭に1MB程度以上のbios reservedなパーティションを用意する必要があります!さもないとその時は問題なくとも再起動できなくて、トラブルが発生して挙句にパーティションの再編成に時間を費やすことになるでしょう!(体験談)
(詳細はよく知らないしちゃんと調べるのは保留するので具体的な容量は自分で調べてください。どうせMB単位なので不安なら多めに確保しても気にするものではないと思います。)

うちのファイルサーバーはLinuxでよく使われる普通のソフトウェアRAID(mdadm)を用いて構成していたが、今回これをサーバーの電源を落とさず交換し、最後に容量を大きくしたのでその手順を書いておく。

もう二年ぐらい使っているサーバーで、ヒューレット・パッカード社のML115という安さに定評のあるサーバーをベースに、メインメモリ、CPU(買うのが遅くて中古で買った)、ハードディスクを交換していて運用していた。ML115は格安ながらハードディスクのオンラインスワップに対応しているため、サーバーを止めることなくディスクを交換することができる。

もともと1TBのハードディスク2台で冗長構成で容量1TBとして使用していたが、今回新たに3TBのハードディスク二台を購入、これらに置き換えて元のHDDはバックアップ用にでも使うことに。

RAID 1で構成しているので、一台が故障してももう一台で動き続ける構成になっている。つまり、二台とも故障していない状態であれば、一台を停止しても動き続けるし、もう一台をさしてそちらとの同期が完了すればまた二台で動き始める。基本的にはこれを二回繰り返す。

ここで、

  • 一台目のHDD: /dev/sda
  • 二台目のHDD: /dev/sdb
  • /dev/sda1, /dev/sdb1 が /dev/md0
  • /dev/sda2, /dev/sdb2がswap
  • /dev/sda3, /dev/sdb3が/dev/md1
  • swap以外のパーティションは全て/dev/md*になっている
  • /dev/md1を拡大する
  • 新しいHDDの容量は2TiB以上(もちろん2TiB未満でも構わない)

とする。必要に応じて読み替えて作業を進めること。

当然だが、作業前にバックアップを怠ってはいけない。この手順に誤りがあったり作業ミスがあったりしてデータが飛んでも誰も責任は負えない。
まず、/dev/sdaから交換していこう。/dev/sdaにあるパーティションを全部使わないようにする。

$ sudo mdadm --fail /dev/md0 /dev/sda1
$ sudo mdadm --remove /dev/md0 sda1
$ sudo mdadm --fail /dev/md1 /dev/sda3
$ sudo mdadm --remove /dev/md1 sda3
$ sudo swapoff /dev/sda2

mdadm –failでディスクを故障と認識させて同期を停止させ、mdadm –removeでRAID構成から取り除く。また、スワップの利用も外す。

外したら、もうsdaが使われていないことを確認する。

$ cat /proc/mdstat
$ cat /proc/swaps

ここにsdaのパーティションが現れないことを確認したら、sdaを取り外す。sdaがどのディスクであるか確認するために、sdaのシリアル番号を確認する。

$ sudo smartctl -a /dev/sda

シリアル番号などをよく確認して、sdaを本体から取り外す(※マザーボードがオンラインスワップに対応していない時は、サーバーの電源を落とす必要がある。)。サーバーの蓋を開けた今もサーバーは動いているので余計なところに触らぬよう注意する。
また、この時取り外したディスクはこの瞬間のバックアップディスクとしてあとから復元が一応できるようなので(当然突然シャットダウンした時のような状態にはなるが)、安定運用が確認できるまでは手っ取り早いバックアップファイルとして丁重に扱うこと。(–failのフラッグをつけたときに使用不能にする操作などないか若干不安だったが、実際にこの時のディスクを別のパソコンにつないでVMwareで起動してみたところ正常に起動され、ファイルも読み込めた。)

続いて、新しいディスクをとりつける。とりつけたら、まずパーティションを作成する。

パーティションの作成はfdiskでも作成することができるが、fdiskは2TiB以上のディスクに対応することができない。2TiB以上のディスクに対応するためにはGPTというタイプのパーティションを作成する必要があるので、partedを使ってパーティションを組む。

$ sudo parted /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted)

さて、まずはディスク全体をGPTとしてラベル付する。なおこの作業で、sdaに既存のパーティションテーブルがあった場合それはまっさらになる。

(parted) mklabel gpt

partedのコマンドリストはhelpと入力すると出てくる。なお、unitコマンドは

(parted) unit KiB

とかする。また、色々なコマンドで場所を指定する時はunitコマンドで指定した単位がデフォルトで、KiBなどをつけるとそれに合わせられる。
ということでパーティションを作る。新しくRAID構成にするパーティションは既存のパーティションと同じまたはそれ以上の容量にすること。容量拡大を狙っているパーティションは拡大後の予定サイズにする。また、パーティションの位置や順番は既存のものと異なっても構わないし、これまで同じディスクにあったものを違うディスクに配置することもできる(必要な数のディスクがある場合)

(parted) mkpart primary 1024KiB 50GiB
(parted) mkpart primary 50GiB 54GiB
(parted) mkpart primary 54GiB -1
(parted) set 1 bios_grub on

mkpart PART-TYPE START ENDとしてパーティションを作成するが、ENDを-1にすると最後までとなる。なお、sudo parted /dev/sdbしてprintするとすでにあるパーティションの構成を見られるので、既存のパーティションと同じにしたい部分はunit KiBした上でprintして出てきたSTART ENDをコピペするとよい。
また、GRUBをインストールできるよう、従来型のBootフラッグをオンにする。
パーティションを作成したら、partedを終了する。

(parted) quit

パーティションの作成が完了したら、sdaをRAIDやSWAPに組み入れる。
まず

$ sudo partprobe /dev/sda

としてパーティションの情報の再読み込みを行い、

$ sudo mdadm --add /dev/md0 /dev/sda1
$ sudo mdadm --add /dev/md1 /dev/sda3
$ sudo swapon /dev/sda2

こうすると同期が始まる。同期の状況は

$ cat /proc/mdstat

すると見られる。再同期はまあ、ディスク全部を同期するので予想どおりの時間がかかる。
あと、GRUBのインストールを忘れない。

sudo grub-install /dev/sda --recheck

同期が完了したら、もう一台のディスクも同様に交換する。なお、実際にやってみたところ、sda, sdbの二台構成でsdbを交換すると、sdaは交換後もsdaだったがsdbを交換すると新しいディスクはsdcになった。

二台とも交換が終わったら、現在古い容量のままになっているパーティションを新しい容量に合わせる。現在、パーティションそのものの大きさはpartedで新たに指定したものとなっているが、その中に入っているRAIDの大きさ(すなわち/dev/md1の大きさ)や、そのRAIDの中に入っているファイルシステムの大きさは古いままとなっている。これを外側から大きくしていく。

まず、RAIDの大きさをパーティションの大きさに合わせる。これは、

$ sudo mdadm --grow /dev/md1 --size=max

とかしてやる。なお今回はmaxだから関係ないが、この–sizeは「一台あたりの」大きさである。サイズを大きくしたパーティションの数だけこれを行う。なお、これは現在追加されているディスク全てが同期されている状態でないとできないので注意。
続いて、ext3/4の場合はオンラインでのファイルサイズ拡大ができるので、

$ sudo resize2fs /dev/md1

とかしてやると、ファイルシステムのサイズが望む大きさになる。なお、resize2fsは非常に時間がかかるので注意。この方法で容量を増やすと、徐々に容量が増えるらしく、Muninのディスク利用率のログが
diskusage
こんな風になっていた。
その他のファイルシステムは各自「ファイルシステムの」拡大の方法を調べて行う必要がある。

パーティションを縮小することを考えている場合は、ディスクを交換するまえにファイルシステムを縮小、続いてmdadmでRAIDの大きさを縮小してから作業することになるが、執筆時点ではext3/4はオンラインリサイズは拡大のみで、縮小する場合は一度アンマウントする必要がある。

JSP(tomcat)をUbuntuにインストールする。

tomcatをインストールしてJSPプログラムを走らせる手順、PHPとかよりは手間が掛かる。とりあえずメモ。

インストール

sudo apt-get install tomcat7

で勝手に入る。

が、MySQLぐらいは使いたいので

aptitude install libmysql-java libcommons-lang-java

cp /usr/share/java/mysql* /usr/share/tomcat7/lib/
cp /usr/share/java/commons-lang.jar /usr/share/tomcat7/lib/

とかしておく。

設定

/etc/tomcat7/server.xml の、Engineの下の項目に、

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="/var/lib/tomcat7/webapps/app_name" reloadable="True">
            <Resource name="refname" auth="Container"
            type="javax.sql.DataSource"
            username="" password=""
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost/dbname?useUnicode=true&amp;characterEncoding=utf-8"
            maxActive="100" maxIdle="100" />
            </Context>

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />

      </Host>

とか書く。他のHost要素は要らないので削除する。

SQLへの接続もここで設定する。ユーザー名やデータベース名などを上の項目に追加する。ちなみに、

                        Context initCtx=new InitialContext();
                        Context envCtx=(Context) initCtx.lookup("java:comp/env");
                        DataSource ds=(DataSource)envCtx.lookup("refname");
                        Connection conn=ds.getConnection();

とかやると接続できる。

また、/var/lib/tomcat7/webapps/ROOT ができるが、これは削除する。削除しないとjspを実行した時に正常に走らないことがあるようだ

サーブレットのコンパイル

サーブレットをコンパイルするときには、

javac ./WEB-INF/classes/path/to/your/file.java -cp /usr/share/java/tomcat-servlet-api-3.0.jar:./WEB-INF/classes/:/usr/share/java/commons-lang.jar:/usr/share/tomcat7/lib/*

的な感じで一杯CLASSPATHを指定してあげる。
環境構築はとりあえずこんな感じでできるはず。
jarを追加したい時は/usr/share/tomcat7/lib/以下においてあげる。
実際にプログラムを書くにあたっての云々はいずれ機会があったら書く。

Inkscape 0.4.8+TexText

InkscapeにTexTextをインストールすることで、Texの数式をInkscapeにさくっと貼り付けることができる。インストールするのに多少Tipsが必要だったのでメモ。

とりあえずWindows 7 64bitにInkscape 0.4.8がインストールされた状態で行った。

とりあえず、pLaTeXをインストール(この目的においてはpLaTeXじゃなくてもいいと思うが、普通に日本でLaTeXを使う場合はpLaTeXじゃないといけない)。まだ入っていない場合は、あべのり氏のページからインストーラーをダウンロードして実行する。確かPATHも通してくれるはずだが、通してくれないようなら通す。

続いて、pstoeditが必要らしいのでインストール。exeのやつでおk。64bitのOSなら64bit版で大丈夫。インストールしたらPATHを通す。

そして、TexTextの最新版をインストール。迷わずexeでおk。

この状態だとなんかDLLが足りないと言われる。入れなくても動くようだが面倒だし気持ち悪いので、ImageMagickを普通にインストール。

このままだとまだ動かないので、更にPythonのライブラリをInkscapeのディレクトリにインストールする。David Gleich氏のページからzipを直接ダウンロードして、そのページの指示にしたがって上書き。または、このページの下の方に書いてあるようにPytohn 2.6をインストールして pygtk, pyobject, pycairoをダウンロードしてインストール、C:\Python26\Lib\site-packagesから以下のファイルを回収してC:\Program Files (x86)\Inkscape\python\Lib\site-packagesに置く。
pycario-*.egg-info
pygtk.pth
pygtk.py
pygtk.pyc
pygtk.pyo
cairo\
gtk-2.0\

最後に、スクリプトを修正する。C:\Program Files (x86)\Inkscape\share\extensions\textext.pyの55行目に

import os, sys, tempfile, traceback, glob, re, md5, copy

とあるが、このmd5が古いと怒られるので、一応hashlibに変えてあげる。一時ファイルの置き場を修正するとしているサイトもあったが、それは問題ないようだ。

これで動くはず。Inkscapeを起動し、「エクステンション」→「Tex Text」で起動する。例えば

$a+b=c$ is an equation.

とか打ち込んでOKをおすと、美しい数式が*ページのどこかに*現れる。どこに現れたかは根気よく探す。

これで、美しい数式がInkscapeに貼り付けられるようになった。

MacにThinkPadキーボードを繋ぐ

MacにThinkPadキーボードを繋ぎたくなる時があると思うが、割とうまく使えるようだ。今回バイト先でつないで見たのだが、その時やったことを大雑把にメモ。

まず、Macはキーボードごとに装飾キーの割り当てを変更できるので、Capsを潰してCtrlにするなどの変更を行なっておく(そもそもThinkPadキーボードのCapsの位置にMacのCtrlがある)。

なんかTrackPointが遅い気がしたのでマウスの設定をいじって加速した。

あとは、MacのCommandはSuperキーなので、ThinkPadキーボードではWindowsキーがそれにあたる。コマンドラインでは、PgUpとかPgDnとかはShiftと一緒に押さないと期待通りの動作をしないことがあるらしい。

KeyRemap4MacBookをインストールして、設定をいじる。

  • General
    • Don’t remap an internal keyboard
  • Pointing Device
    • CursorMove to ScrollWheel
      • MiddleClick+CursorMove to ScrollWheel
      • CursorMove to ScrollWheel Option
        • Reverse Vertical scrolling
        • Reverse Horizontal scrolling
    • For Japanese
      • Change Backquote(`) Key
        • Backquote(`) to KANA/EISUU (toggle)

カスタムxmlを書けば色々できるっぽいので出来ればCtrl+Spaceを日本語英語切り替えにしたいのだが…… まあSpotlightとかぶるようだが。

ハイパーバイザー(VMware ESXi)のディスクにアクセスできなくなる

今日の午後、ESXi上の仮想マシン(Ubuntu)が正常に動作しなくなったので見てみたところ、ファイルへの書込に大して”Read-only filesystem”というエラーが返ってくるようになっていた。(うちでは仮想ハードディスクをファイルサーバーに保存し、NFSでマウントしている。また、ファイルサーバーとESXiはハブを経由するネットワークとは別に直接LANケーブルでつなぎ、NFSはそちらを用いていた。)

特に、Ubuntuは影響を受けていたが、Windowsはなぜかサスペンドされていた。

いまいちよくわからないのだけど、取り敢えずこういうことがあったというメモとしてここに書いておく。何か思いついたら追記するので、何か気がついた点があったらコメント欄に記入していただけると幸い。

対処

NFS接続自体は自動的に復活していたため、Read-onlyだと認識してしまった仮想マシンを再起動したら直った。

原因

ESXiのログを調べたところ、以下の様なログが残っていた。このことから、NFSのマウントに使っていたネットワークに何らかのエラーが発生し、そのためにNFSのマウントが維持できなくなったものと考えられる。

ファイルサーバー側

Jul 19 12:38:53 ml115 kernel: [3750691.624148] e1000e: eth1 NIC Link is Down
Jul 19 12:38:57 ml115 kernel: [3750694.940982] e1000e: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
Jul 19 15:24:38 ml115 kernel: [3760636.036149] e1000e: eth1 NIC Link is Down
Jul 19 15:25:02 ml115 kernel: [3760660.053011] e1000e: eth1 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
Jul 19 15:25:02 ml115 kernel: [3760660.053024] e1000e 0000:04:00.0: eth1: 10/100 speed: disabling TSO
Jul 19 15:25:32 ml115 kernel: [3760690.260149] e1000e: eth1 NIC Link is Down
Jul 19 15:25:59 ml115 kernel: [3760716.940979] e1000e: eth1 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
Jul 19 15:25:59 ml115 kernel: [3760716.940991] e1000e 0000:04:00.0: eth1: 10/100 speed: disabling TSO
Jul 19 16:11:54 ml115 kernel: [3763471.900149] e1000e: eth1 NIC Link is Down
Jul 19 16:12:13 ml115 kernel: [3763491.208983] e1000e: eth1 NIC Link is Up 100 Mbps Full Duplex, Flow Control: Rx/Tx
Jul 19 16:12:13 ml115 kernel: [3763491.208994] e1000e 0000:04:00.0: eth1: 10/100 speed: disabling TSO

ESXi側

こんなのが一杯

esxi_disk_error

対策

対策といっても原因がいまいちよくわからないのだけれども、LANケーブルはゆるみのないようにさす、といった点が不完全だったのが原因かもしれない。

WordPressのインストール

メモをとるための場所として、ブログという名のメモ帳を用意した。
Wordpressを解凍してパーミッションを適切に設定し、そのままApache 2のディレクトリに設置し、あとは接続する。Apacheはphpが利用可能な必要がある。
MySQL上にデータベースとユーザーを作成しておく。あとは、ウェブからアクセスすればウィザードが開いて自動でセットアップが完了した。
最低限、パーマリンクの設定だけは済ませておく。日本語圏だとタイトルをそのまま流用するスタイルが選択しづらいため悩ましい。Custom Permalinksなるプラグインを用いて記事ごとにパーマリンク用の文字列を選択できるようにするのがよさげ。