ファイル/デバイス完全消去には(g)shred


あるファイルを完全に消去するにはshredコマンドを使う。
ファイルの他にデバイスに対しても実行可能。
特にオプションが指定されなければ、shredは指定されたファイル、デバイスファイルに対して、ランダムなパターンで三回、上書きをする。


普通のLinuxにはデフォルトでついてくる。
FreeBSDでは、sysutils/coreutilsからインストールする。
これはつまりGNU coreutilsなので(だからLinuxには最初からある)、shredだけではなく、山のようにコマンドが付いてくる。
しかもそのほとんどがFreeBSDのベースシステムにもある超基本コマンドである。
両者を区別するために、coreutilsでインストールされたコマンドにはすべて頭にgが付く。
shredはgshred。
同様に、gdate, gexpr, gtest, gcat, gchgrpなどなど。


使い方は簡単で、ファイルを指定するだけ。
デフォルトでは上書きをするだけでファイルを消さない。
なぜかと言えば、デバイスファイルに対しても使われることを想定しているから。
(デバイスファイル消したらエライことになる)


オプションで--remove あるいは -u を与えてあげれば、上書きした後に消してくれる。


実行例

(試しにログを持ってきて、それに対してshredを実行してみる)
$ tail ./messages 
Jan 17 06:35:40 sylph sudo:      harukiya : TTY=pts/0 ; PWD=/usr/ports/sysutils/coreutils ; USER=root ; COMMAND=/usr/bin/make
Jan 17 06:39:37 sylph sudo:      harukiya : TTY=pts/0 ; PWD=/usr/ports/sysutils/coreutils ; USER=root ; COMMAND=/usr/bin/make install
Jan 17 06:40:40 sylph sudo:      harukiya : TTY=pts/0 ; PWD=/usr/ports/sysutils/coreutils ; USER=root ; COMMAND=/usr/bin/make clean

(-vがないとあっさりしすぎなので付けておくといいでしょう)
$ gshred -v ./messages 
gshred: ./messages: 経過 1/3 (random)...
gshred: ./messages: 経過 2/3 (random)...
gshred: ./messages: 経過 3/3 (random)...

$ !tail
tail ./messages 
(無意味な文字列が表示される)

(-uを付けると消してくれる。名前を変更しまくる念の入れよう)
$ gshred -uv ./messages 
gshred: ./messages: 経過 1/3 (random)...
gshred: ./messages: 経過 2/3 (random)...
gshred: ./messages: 経過 3/3 (random)...
gshred: ./messages: 削除しています
gshred: ./messages: ./00000000 に名前が変更されました
gshred: ./00000000: ./0000000 に名前が変更されました
gshred: ./0000000: ./000000 に名前が変更されました
gshred: ./000000: ./00000 に名前が変更されました
gshred: ./00000: ./0000 に名前が変更されました
gshred: ./0000: ./000 に名前が変更されました
gshred: ./000: ./00 に名前が変更されました
gshred: ./00: ./0 に名前が変更されました
gshred: ./messages: 削除しました


注意! 以下のケースではホントに消えたか保証はせんよ、とのこと。
 journalが有効の場合
 snapshotを取っている場合
 キャッシュを持っている場合(NFS
 圧縮ファイルシステム上にある場合

パスワードハッシュにmd5を使うのは小学生までだよねー


おおよそのUNIX-likeシステムでは、パスワードファイルはMD5でハッシュされるのが一般的だ(った)。

しかし、MD5は1996年に脆弱性が見つかって以来、あまり推奨される方式ではなくなっている。
Wikipediaで調べてみても「パソコンレベルで、数10分程度で、同一ハッシュ値の非ユニークなデータ列を生成できる実装が広まっている」などと恐ろしい事が書かれている。
つまり暗号化されていてもMD5ハッシュだと総あたりで易々と破られてしまうということになる。

こういった情勢のもと、多くのシステムでは、パスワードファイルのハッシュ方法を変えたり、または自由に変えられるようになっているので、もしお前らがUNIX-likeシステムを管理しているなら、いますぐ確認しろ。


じゃあ何に変えたらいいの→SHA-2かBlowfishおすすめ。


代替のハッシュ方法としては、Blowfish, SHA-2などが挙げられ、強度としてはBlowfishの方が高いようだが、そのアルゴリズムがNIST(アメリカ国立標準技術研究所)の承認をまだ受けてない事から、SHA-2を選択するケースが多い。

そのシステムがどのハッシュを採っているかは、ハッシュ文字列先頭から判断できる。

$1$: MD5
$2?$: Blowfish. ?はaかyかx.
$5$: SHA-2(SHA-256)
$6$: SHA-2(SHA-512)


FreeBSD 9.1-RELEASEはsha512(SHA-2)がデフォルト。手元にLinuxがないので確認できないのだが、UbuntuはまだMD5のよう。


しかしFreeBSDCVSを見ると2012年の7/15に変わっている。9系列で言えば9.1-RELEASEからデフォルトが変更されているようだ。

なお、9.1-RELEASEだから安心と思ったあなた。もしあなたが9.0以前から使い続けているなら注意が必要だ。これについては後述。



FreeBSDでハッシュ方法を変えるには


FreeBSDでは/etc/login.confで制御する。

以下の行を書き換えればOK。

        :passwd_format=sha512:\


md5ならmd5, SHA-2ならsha512, Blowfishならblfである。
書き換えた後、以下のコマンドでlogin.conf.dbを作り直すこと。

cap_mkdb /etc/login.conf

パスワードを再設定しないと新ハッシュになりません!


注意。上記設定をしたあと、もう一回パスワード設定しないと反映されません。

なんと不親切な、と思ったけど、よく考えたらそらそうだ。
もし自動的に変更しようとしたら、たとえばmd5でハッシュされた文字列を、いったん元に戻す必要がある。
元に戻させないようにわざわざハッシュしているんだから、自動でできるわけがない。


だから面倒でも、passwordコマンドを叩いて再設定すること。
同じパスワードであっても構わないが、まあ今回の作業の性質を考えると、このタイミングでパスワード変えた方がいいと思う。



9.0以前から使い続けていた人は注意

ということで、もしあなたのFreeBSDが9.1で、デフォルトのハッシュがSHA-2になっていたとしても、9.0以前にパスワード設定してそのままなら、ハッシュはmd5のままである。

実際に俺のマシンは9.0で新規インストールし、ついこの間9.1にアップグレードした。

$ uname -a
FreeBSD sylph 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64
$ grep passwd /etc/login.conf|grep -v "^#"
	:passwd_format=sha512:\


とまあこの通り、SHA-2になっている。しかし以下のログで示すように、先頭が$1$になっておりMD5ハッシュであることを示している。
cap_mkdbしても同じ。(なおハッシュの核心部分はさすがにマスクしている)

$ sudo grep harukiya /etc/master.passwd 
パスワード:
harukiya:$1$xxxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash
$ sudo cap_mkdb /etc/login.conf
$ sudo grep doe /etc/master.passwd 
harukiya:$1$xxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash


で、passwdコマンドでパスワードを設定してやると、めでたく先頭が$6$に変化した。
(なおここではマスクしているが、実際にやってみるとハッシュがmd5に比べて長くなっていることが分かる)

$ passwd
Changing local password for harukiya
Old Password:
New Password:
Retype New Password:
$ sudo grep harukiya /etc/master.passwd 
harukiya:$6$xxxxxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash


このままでもいいけど、せっかくだからblowfishに変更。/etc/login.confでsha512をblfへ。

        :passwd_format=blf:\


めでたくハッシュ先頭が$2a$に。

$ sudo cap_mkdb /etc/login.conf
$ passwd
Changing local password for harukiya
Old Password:
New Password:
Retype New Password:
$ sudo grep harukiya /etc/master.passwd 
harukiya:$2a$xxxxxxxxxx:1001:1001::0:0::/home/harukiya:/usr/local/bin/bash


もちろん、このあとrootのパスワードも設定しました。

FreeBSD 9.1-RELEASE! ただしpackageがそろっていないので注意!

遅れに遅れた9.1-RELEASEがついに。
もともとの進捗が悪いうえに、freebsd.orgに不正アクセスのあったことも遅れをさらに助長した。
加えて後者の要因は、遅れまくった9.1のリリースにあたってもpackageをほとんど揃えられない事態を引き起こしていて、ああやっと出たと思った俺含む一部のユーザを困惑させた訳である。


というのも。
FreeBSDは、apacheやらMySQLやらから、Perlなどの言語系までの、ベースシステムに含まれないソフトウェアを別途インストールする必要がある。
それにはpackage、つまりコンパイル済みバイナリを使うか、portsから自前コンパイルするかのおおよそ二通り。


で、OSメジャーバージョン更新などのイベントでは全ソフトウェアも更新が必要だ。
こういうときにPackageがあるととっても楽なわけだ。
すべて自前コンパイルするとえらく時間がかかるから。
そこで今回の件のように、ごくごく一部のpackageしかありません。欲しけりゃDVDイメージ落としてくださいねと言われるととっても困るわけ。


ただまあ、俺の場合9.0からのアップグレードなので、全更新は必須ではないのだけど、長く使っているうちにぐちゃぐちゃになるportsの依存関係(名前が変わったとか場所が変わったとか)をスッキリさせたいので自発的にやってる。


で、公式ページにある通り、packageのリリース目処は立っていないようなのであきらめて全コンパイルする。
(と思ったけど、一部9-stableのpackageを使った)

以下はそのログ。
公式ページの指示に従って作業。

準備

インストール済みpackageを「更新」するといろいろと面倒な事が起こるので、いったん全削除して再インストールする。
そのためにインストール済みpackageリストを作っておき、全削除。
(全削除するとsudoも使えなくなるから、suしてから)

$ pkg_info > pkg.list.txt
$ su
Password:
# pkg_info | cut -f1 -d" " | xargs -n1 pkg_delete -f


手順1. ファイルダウンロード

必要なファイルをダウンロードする。

# freebsd-update -r 9.1-RELEASE upgrade
Looking up update3.freebsd.org mirrors... none found.
Fetching metadata signature for 9.0-RELEASE from update3.freebsd.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/generic src/src world/base world/games world/lib32

The following components of FreeBSD do not seem to be installed:
world/doc

Does this look reasonable (y/n)?y

yと答える。

Fetching metadata signature for 9.1-RELEASE from update3.freebsd.org... done.
Fetching metadata index... done.
Fetching 1 metadata patches. done.
Applying metadata patches... done.
Fetching 1 metadata files... done.
Inspecting system... done.
Fetching files from 9.0-RELEASE for merging... done.
Preparing to download files... done.
Fetching 37716 patches.....10....20....30....40....50....60....70....80....90....100....110....120....130....140....150....160....170....180....190....200....210....220....230....240....250....260....270....280....290....300....310....320....330....340....350....360....370....380....390....400....410....420....430....440....450....460....470....480....490....500....510....520....530....540....550....560....570....580....590....600....610....620....630....640....650....660....670....680....690....700....710...
<snip>
.37560....37570....37580....37590....37600....37610....37620....37630....37640....37650....37660....37670....37680....37690....37700....37710... done.
Applying patches...Fetching 1758 files... done.
Attempting to automatically merge changes in files... done.

The following changes, which occurred between FreeBSD 9.0-RELEASE and
FreeBSD 9.1-RELEASE have been merged into /etc/defaults/periodic.conf:

/var/yp/Makefile.dist
To install the downloaded upgrades, run "/usr/sbin/freebsd-update install".


手順2. Kernel差し替えと再起動


インストール。
一回目はカーネルの差し替え。ここから緊張するところ。
これがうまく行ったら、次はユーザランドの更新だが、まずは。

# freebsd-update install
Installing updates...
Kernel updates have been installed.  Please reboot and run
"/usr/sbin/freebsd-update install" again to finish installing updates.


再起動前。

# shutdown -r now

手順3. ユーザランド更新と再起動

# freebsd-update install
Installing updates...
# shutdown -r now


手順4. unameの確認と...

# uname -a
FreeBSD sylph 9.1-RELEASE FreeBSD 9.1-RELEASE #0 r243825: Tue Dec  4 09:23:10 UTC 2012     root@farrell.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

で、ここからpackageの再インストール...

pkg_add -r ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9-stable/shells/bash-4.2.37.tbz
pkg_add -r ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9-stable/security/sudo-1.8.6.p3_1.tbz
pkg_add -r ftp://ftp2.jp.freebsd.org/pub/FreeBSD/ports/amd64/packages-9-stable/All/perl-5.12.4_4.tbz

以降はガチコンパイル

ZFS scrubを過信してはいけません。


ZFS運用を始めてはや数か月。なんの問題もなく使っておりますが、
 「scrubって定期的にやるといいらしいよ」
 「なんかね、fsckみたいなこと、やってくれるらしいよ」
などという話を聞いた。
全くそんなことやってないので、慌てて調べてみた。
結論として、やっといた方がいいけど、なんか「fsckみたいな」と表現するのはおかしいよな、との理解に至った次第。


ZFSのおさらい

ZFSのキモのひとつは、セルフヒーリングにある。
格納されているデータに対して、強力なチェックサムを持っていて、不整合があっても勝手に修復する。
勝手に、というのはどういうことかというと、不整合を見つけ「次第」、つまりアクセスしたファイルに不整合があったらその場で修復してしまう、というところ。

だから、http://docs.oracle.com/cd/E19253-01/819-6260/gbbxi/index.html のとおり

データの不一致が ZFS 構成内のディスク上で発生するとすれば、それはハードウェア障害が発生した場合か、ZFS ソフトウェアにバグが存在する場合だけ

なので、ZFSソフトウェアバグはさておき、論理的なデータ不一致の発生リスクについてはとくに手だて不要というわけだ。
ハードウェア障害ならもうそこは物理的なディスクの冗長でなんとかせい、ということになる。
言い換えると、ZFS上のファイルにアクセスできない場合には、もうこれは尋常ではない障害が起こっているということであり、あなたはヘビーな状況下にいるということである。(その場合はこちら。)
http://docs.oracle.com/cd/E19253-01/819-6260/gbctt/index.html


じゃあscrubってなによ

そういった仕組みを踏まえてscrubというツール。
これは、上述の「不整合があったら修復する」というのを全データに対して行うだけ。

…ということは。
scrubをすれば全データのチェックはする。するけれども、そもそもscrubしてようがしてまいが、そんなことはお構いなしに、個々のファイルにアクセスしたらそのときに不整合チェックはされる。
カブってるじゃないか。
むしろscrub頻繁にやったらディスクに無用な負荷かけないか?
となるとscrubのメリットは何か。


http://docs.oracle.com/cd/E19253-01/819-6260/gbbyd/index.html

ZFS では、すべての不一致を定期的にチェックする機構が用意されています。この 機能は「スクラブ」と呼ばれ、メモリーやほかのシステム内で、ハードウェアまたはソフトウェア障害が発生する前にエラーを検出および回避する手段として一 般的に使用されます。

定期的にスクラブを実行すると、システム上のすべてのディスクへの継続的な入出力が保証されます。

スクラブを行なっているときまたは必要なファイルにアクセスしているときにエラーが発生した場合には、そのエラーが内部でログに記録されるので、そのプールで認識されているすべてのエラーの概要をすぐに確認できます。

とのこと。

「scrubすれば不整合があっても修復される」というのは、まあ間違ってはいないけど、むしろscrubの主目的はそこよりも、障害の予兆をつかむことにあると理解している。

たとえば。
scrubの定期的な実行をしないとする。
するとデータ不整合チェックは、個々のファイルアクセス契機で行われる。
不整合があればその都度、解消されるだろうし、解消されない場合には、ヘビーな状況だとして障害復旧を行うだろう。
しかし、滅多にアクセスしないファイルで致命的な、おそらく物理的な障害が発生し、影響が徐々に広がっていくような場合、このスタイルでは検知が遅れる可能性がある。

それを防ぐには、定期的にscrubで全ファイルをチェックし、「そのプールで認識されているすべてのエラーの概要」も定期的にチェックすればよい。
結果、「ハードウェアまたはソフトウェア障害が発生する前にエラーを検出および回避」できる可能性が高くなる、と。


scrubの使い方

というわけで使ってみた。まあコマンド例はいくらでもあるから淡々と。

$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vault  2.27T  1.30T   990G    57%  1.00x  ONLINE  -

このpoolに対して実行。

$ sudo zpool scrub vault
$  

(すぐプロンプトが返ってくる)

$ sudo zpool status -v 
  pool: vault
 state: ONLINE
 scan: scrub in progress since Tue Dec 18 22:53:46 2012
    154M scanned out of 1.30T at 5.70M/s, 66h19m to go
    0 repaired, 0.01% done
config:

        NAME        STATE     READ WRITE CKSUM
        vault       ONLINE       0     0     0
          ada1      ONLINE       0     0     0

errors: No known data errors

えっ66時間かかるの?
(いまだに冗長化してないのが恥ずかしい。今回scrub調べてほんとに危ないのでディスク買わねばと思った)


$ sudo zpool status -v
パスワード:
  pool: vault
 state: ONLINE
 scan: scrub in progress since Tue Dec 18 22:53:46 2012
    239G scanned out of 1.30T at 81.4M/s, 3h48m to go
    0 repaired, 17.95% done
config:

        NAME        STATE     READ WRITE CKSUM
        vault       ONLINE       0     0     0
          ada1      ONLINE       0     0     0

errors: No known data errors

OKOK。
なお、エラーが発生すれば、このstatusのほかに、syslogに表示されるし、たとえばFreeBSDならroot宛のメールにZFS poolsの状態も記載される。こんな感じに;

Checking status of zfs pools:
all pools are healthy


vaultに対するログにもきっちりと(こういうとこZFSって素敵だ)

$ sudo zpool history vault
History for 'vault':
2012-03-05.22:41:40 zpool create vault ada1
2012-03-05.22:54:14 zfs create vault/chamber
2012-03-05.22:56:44 zfs set mountpoint=/chamber vault/chamber
2012-03-18.00:37:52 zfs create vault/test
2012-03-18.00:43:27 zfs set dedup=on vault/test
2012-03-18.00:46:48 zfs destroy vault/test
2012-12-18.22:53:55 zpool scrub vault

なお、scrubの停止は-sコマンドで。

wireshark portableの設定のしかた

http://www.wireshark.org/download/automated/win32/

上記からwiresharkportable-x.x.x-SVN-xxxxxx.paf.exeなどをダウンロードする。
「paf」がポータブルパッケージ。

ダブルクリックするとインストーラのようなものが立ち上がるが、これは単に展開先を選んでいるだけ。
レジストリを汚される心配なない。
あとはwiresharkportable.exeを実行すればOK.なのだが。

起動のたびにWinPcapのインストールを訪ねてくる。
わざわざポータブルにしたのに、WinPcapをインストールされては困る。
もちろん、そのマシンでパケットキャプチャをする場合にはWinPcapは必要だが、ポータブルにしたのはログを見るだけのためなので。


WiresharkPortable.exeと同じディレクトリにwiresharkportable.iniを作成すると起動時の振る舞いを制御することができる。

下記のようにしておけばよい。

[WiresharkPortable]
WiresharkDirectory=App/Wireshark
WiresharkExecutable=wireshark.exe
AdditionalParameters=
DisableWinPcapInstall=true
WinPcapInstaller=

詳細はこちら。
http://wiki.wireshark.org/WiresharkPortable

pkgのデータベースが壊れたでござる(pkg_info: corrupted record (pkgdep line without argument))

pkg_info: corrupted record (pkgdep line without argument), ignoringが出たときの対処法。

まずこのコマンドを叩く。

$ grep -A1 "^@pkgdep $" /var/db/pkg/*/+CONTENTS

例えばこういう応答が返る。

/var/db/pkg/php5-xmlwriter-5.3.10/+CONTENTS:@pkgdep
/var/db/pkg/php5-xmlwriter-5.3.10/+CONTENTS-@comment DEPORIGIN:lang/php5

2行目に表示されているlang/php5をインストールすればOK。

ネタ元。
http://forums.freebsd.org/showpost.php?p=39092&postcount=37