2006年03月17日

仮想ディスクファイルの圧縮時に圧縮率を高めるためのファイルの削除方法について

VMware 仮想マシンを持ち運ぶために zip ファイル化したり、ホスト側のディスク領域を節約するために NTFS 等の圧縮機能を利用したりすることがあると思います。

通常のファイル圧縮の場合、必要なファイルだけを圧縮することができるため、圧縮されたファイルのサイズを小さくすることができます。
しかし、仮想ディスクファイルを圧縮する場合、その中に含まれる全てのデータを圧縮する必要があります。仮想ディスクファイル内の消去されたデータまで圧縮を行うことになり、消去されたデータの内容によっては全く圧縮が効きません。

しかし、逆に言えば、消去されたデータの内容を圧縮が効きやすいものに書き換えてやれば、消去されたデータが最初から存在しなかった場合と同じくらいの圧縮効果を期待できます。

以下は、約3GBの ISO イメージファイルを VMware 環境内からダウンロードして、ホスト側に移動後、そのファイルを削除した後のディスクの使用量です。 NTFS の圧縮機能で圧縮していますが、あまり小さくなっていません。

before-zeroclear.png

以下は、そのディスクの空き領域を全てゼロクリア(実際にはスパースファイル化されると困るので 0xFF でクリア)してみた結果です。

after-zeroclear.png

最初からディスク領域を割り当てずに必要に応じて拡大していく方式を利用しているので、未使用の領域までゼロクリアしたことで圧縮前のディスク使用量も若干増えてしまっていますが、圧縮後のディスク使用量は ISO イメージファイルのサイズと同じくらい減少していることがわかります。 (ファイルの内容が含まれている領域だけゼロクリアできれば、未使用の領域までゼロクリアしないで済むので、圧縮前のディスク使用量の増加も避けられます。)

/bin/rm や /bin/unlink にファイルの内容をゼロクリアしてから削除するようなオプションがあると嬉しいですね。

posted by 熊猫さくら at 19:56| Comment(0) | TrackBack(0) | Linux

2006年03月13日

お遊び:テンポラリファイルで使われるパス名を見つけようとしたら・・・

テンポラリファイルを作成する場合、パス名の末尾を XXXXXX としてテンポラリファイルを作成する関数を呼び出すようになっています。そのため、 XXXXXX で終わる文字列は、テンポラリファイルとして使われるパス名である可能性が高いわけです。そこで、 strings を使ってそのような文字列の抽出を試みたのですが、予想外の結果が出てきました。

find / -type f -perm +100 -print0 | xargs -0 strings -f -- | grep -F XXXXXX

を実行すると、インストールされているパッケージによっては面白いものが表示されます。

strings に渡す -f オプションは、ファイル名を表示するためのものです。最初は -f を指定せずに実行したため、一瞬「ウィルスに感染したのか?」と疑ってしまいました。(笑)

大量にヒットするので、スクロール機能が無いコンソールから実行すると一瞬で消えてしまいます。スクロールバッファを1000行以上に設定してお試しください。

ちなみに、ウィルスに感染したのかと疑ってしまうような表示をしていたのは、 /usr/bin/xboard でした。

posted by 熊猫さくら at 20:08| Comment(0) | TrackBack(0) | Linux

2006年03月11日

scp の罠

ssh を使ってコピーを行う scp には、ちょっと困った問題点があるようです。

問題1

例えば、

scp -p 'remotehost: ; touch /tmp/testfile' .

と実行すると、 remotehost で touch /tmp/testfile というコマンドを実行できてしまいます。

これは、接続元の scp が remotehost のログインシェルを「-c 'scp -p -f "接続元で実行された scp に渡された引数から最初の : までを取り除いたもの"'」という形式で起動するため、 remotehost のログインシェルは「scp -p -f "接続元で実行された scp に渡された引数から最初の : までを取り除いたもの"」つまり「scp -p -f ; touch /tmp/testfile」というコマンドを展開して実行してしまうためです。

もしも、

scp -p 'root@remotehost: ; rm -fR /*' .

などというパラメータを渡された場合には、全ファイルが削除されてしまうことでしょう。

このように ; を使って余計なコマンドを実行されないようにするには、 rssh を使う必要があります。

問題2

しかし、 rssh を使っても、 remotehost で scp の実行を禁止できるわけではない点に注意が必要です。 scp は remotehost 上でも scp を起動することで動作するように設計されているためです。

scp は、 -f オプションが指定されておらず、ファイル名に : が含まれている場合には、そのファイルがリモートホスト上にあると判断して ssh を起動してしまいます。つまり、 remotehost1 で rssh が使われていても、

ssh remotehost1 'scp -p remotehost2:/etc/passwd .'

というコマンドを実行することは可能なわけです。そのため、自動的に remotehost1 から remotehost2 へ接続できるような設定になっている(例えば remotehost2 の ~/.ssh/authorized_keys に remotehost1 の公開鍵が登録されている)場合、

ssh remotehost1 'scp -p -i ~/.ssh/id_rsa remotehost2:/etc/passwd .'
scp -p remotehost1:passwd .

とすることで、 remotehost1 にログインできる任意のホストから remotehost2 の /etc/passwd が取得できてしまいます。

問題3

また、ファイル名に : が含まれている場合、ホスト名を指定する区切り文字だと解釈されてしまい誤動作の原因になります。例えば、

touch /tmp/file1 /tmp/somehost:file2
cd /tmp/
scp -p file1 somehost:file2 remotehost:/tmp/

と実行しても、 /tmp/somehost:file2 を remotehost にコピーすることができません。 ただし、ファイル名に : が含まれる場合でも、 : より前に / が出現すれば問題ないようですので、

touch /tmp/file1 /tmp/somehost:file2
cd /tmp/
scp -p file1 ./somehost:file2 remotehost:/tmp/

のようにすれば回避できます。

問題4

また、

scp -p -f file1 remotehost:/tmp/

のように、 -f オプションが指定されてしまうと入力待ち状態になってしまいます。もしも、

touch /tmp/-f
cd /tmp/
scp -p * remotehost:/tmp/

と実行した場合、 * の展開結果として -f が先頭に来てしまい、

scp -p -f * remotehost:/tmp/

と同様の結果になりかねません。これを回避するには、

touch /tmp/-f
cd /tmp/
scp -p ./* remotehost:/tmp/

のように ./ を指定するのが良いと思います。もし、

scp -p -- * remotehost:/tmp/

のように -- を指定しても、 * を展開した結果 somehost:file2 のようなファイルが含まれてしまう可能性があり、問題3が発生してしまいます。

posted by 熊猫さくら at 15:13| Comment(2) | TrackBack(0) | Linux

2006年02月13日

メモ: apt-get による emacs のインストール

Debian Sarge で emacs をインストールしようとしてはまりました。

「apt-get install emacs」と指定してもインストールできないので不思議に思っていたら、 「apt-get install emacs21」と指定すれば良いことが判りました。(笑)

posted by 熊猫さくら at 20:44| Comment(0) | TrackBack(0) | Linux

2006年01月23日

帳票入力アプリケーションの見直しについて

世間には、ブラウザ上で動作する帳票入力アプリケーションがたくさんあります。
でも、私にはブラウザを使う(http/https)よりもログインして操作する(ssh)ほうが安全・確実・簡単・便利・省エネ・低コストだと思える場合があります。

ブラウザを使ったアプリケーションを開発したがる理由としては、以下のようなものがあると私は思います。

不正に ssh ログインされるのが怖い。
サーバにログインさせると不要な操作をされるので、ログインさせたくない。
アプリケーションの配布が面倒くさい。

でも、ブラウザを使うといろいろな問題が発生します。

セッション管理が必要になる。
Cookie を受け付けるためにブラウザのセキュリティ設定を下げなければいけない。
ActiveX を受け付けるためにブラウザのセキュリティ設定を下げなければいけない。
JavaScript を有効にするためにブラウザのセキュリティ設定を下げなければいけない。
HTML を使う必要があるので通信トラフィックが増大する。
HTML を使う必要があるのでクロスサイトスクリプティング等に注意しなければいけない。
10セキュリティパッチを適用するとブラウザの挙動に影響を受ける場合がある。

帳票入力アプリケーションを http/https を使う設計から ssh を使う設計に変更すれば、これらの問題を簡単に回避できるのです。

複数回の認証により不正な ssh ログインを確実に排除できる。
ログイン後の操作を一挙手一投足まで制限できる。
アプリケーションの更新はサーバ側で行なうだけで済む。
セッションは ssh が管理してくれる。
Cookie を使う必要が無いのでブラウザのセキュリティ設定を下げる必要が無い。
ActiveX を使う必要が無いのでブラウザのセキュリティ設定を下げる必要が無い。
JavaScript を使う必要が無いのでブラウザのセキュリティ設定を下げる必要が無い。
HTML を使う必要が無いので通信トラフィックが激減する。
HTML ではないのでクロスサイトスクリプティング等が発生しない。
10セキュリティパッチを適用しても ssh クライアントの挙動には影響を与えない。

この内、1番と2番が TOMOYO Linux を導入することで得られるメリットです。その他は TOMOYO Linux を導入しないでも得られるメリットです。デメリットは ssh クライアントソフトを配布する必要がある点と、ユーザインタフェースのデザインが面倒である点でしょう。

元々ブラウザとは閲覧するためのものなのですから、閲覧操作だけでなく更新操作も必要な帳票入力アプリケーションにブラウザは不向きだと私は思います。昔は CUI で帳票入力アプリケーションを実現していたのですから、現在でも ssh のターミナルで実現できるでしょう。セキュリティが重要視されている今日、UIデザインの簡単さの為にブラウザを使うことでこれほど多くのセキュリティリスクを背負うのは如何なものかと私は思っています。

posted by 熊猫さくら at 21:01| Comment(2) | TrackBack(0) | Linux

Re: CentOSの認証プロキシ経由でのyumアップデート

http://ld616ge281.seesaa.net/article/9428448.html の記事に対するトラックバックです。トラックバックのテストも兼ねてます。ちゃんと張れるかな?(^^;

−−−−−

 こんにちは。
CentOS は使ったことが無いのですが、

 user_pass = base64.encodestring('%s:%s' % (unquote(user), unquote(password)))
 user_pass = user_pass.rstrip('\n')
 req.add_header('Proxy-authorization', 'Basic ' + user_pass)

(行頭のインデントはタブではなくスペースにする)
のようにしても駄目でしたか?
ファイルが壊れたというのが気になった(多分、インデントの問題で実行時にコンパイルエラーメッセージが表示されたのだと思います)のでコメントさせていただきました。

posted by 熊猫さくら at 20:03| Comment(6) | TrackBack(1) | Linux