2008年1月31日木曜日

ローレベルフォーマット

ローレベルフォーマットには hp-ux では mediainit(1)
   
   残留磁気のことまで考えると、これ1回では心配かもしれませんが、これを行ったディスクからデータを復旧させるのは相当な技術力と設備が必要です。cube さんがどの程度までを求められるかにもよりますけれど、一番簡単でそこそこ安心な方法かと思います。
   
   例)
   # mediainit /dev/rdsk/cXtYdZ
   
   あとは、dd(1) コマンドで適当なパターンで上書きすることですね。
   
   例)bs は default の 1024 だと時間がかかります。
   # dd if=/dev/zero of=/dev/rdsk/cXtYdZ bs=1024k
 
Windowsでは。

C:\>cipher /w:d:
できるだけ多くのデータを削除するために、CIPHER /W の実行中
はほかのアプリケーションをすべて終了してください。
0x00 に書き込み中 ……※1
........................... (中略) .............……※2
0xFF に書き込み中
........................... (中略) .............
乱数 に書き込み中
........................... (中略) .............
C:\>

※1 英語モードではこれらのメッセージは「Writing 0x00」となっているので、正しくは「0x00 を書き込み中」と訳されるべきだろう。単純なミスであるので、特に気にしなくてもよい。
※2 作業の進行中は、このように「.(ピリオド)」が少しずつ表示されるので、動作していることが確認できる。


Linuxだと。。
  • shredで消去する

shredはファイルを上書きするためのプログラムです。GNU fileutilsに含まれ
ているため、多くのLinuxにも含まれています。デフォルトでは乱数で25回
の上書きを行います。shredの詳細についてはオンラインマニュアルを参照し
てください。なおshredやLinuxが古いと消去サイズを指定する必要があったり
2GBの制限に引っかかったりする場合がありますので、shredが入っていれば何
でもいいというわけではありません。

KNOPPIX 日本語版のCD-ROMでbootして /dev/hda を消去する例を以下に示しま
す。機能限定のレスキュー用Linuxではないのでシェルなども使いやすいです。
DMAにも対応していますし日本語106キーボードにも対応しています。
もちろんHDDの消去程度でしたら英語版KNOPPIXでも不自由しないと思います。

(1) KNOPPIXのCD-ROMからbootします。(Runlevel 2, Textmode only)
HDD消去にGUIは不要なのでbootプロンプトでは knoppix dma 2 とします。
# dmaというブートオプションがないKNOPPIXでは knoppix 2 で構いません。
なおPCの構成によっては素直にTextmodeで起動できない場合もあります。
重要なのは消したいHDDをswapとして使わない事とrootである事の二点です。

(2) shred -n 2 -v -z /dev/hda
この例では 乱数 → 乱数 → 0x00 という3回の上書きが行われます。-v を
指定すると処理の進み具合がわかり便利です。なお私は乱数の品質については
調査していません。
  • badblocksで消去する

badblocksはデバイス上に不良ブロックがあるかを検査するプログラムです。
多くのlinuxのレスキューディスク(またはインストールディスクのレスキュー
モード)で使用できます。デフォルトではread-onlyで検査しますが、-w を指
定すると 0xaa → 0x55 → 0xff → 0x00 と4回の書き込みを行います。
badblocksの詳細についてはオンラインマニュアルを参照してください。なお
元々検査用のコマンドであるため4回の書き込みに対して毎回読み出しを行っ
てしまいます。このためshredにくらべ無駄に時間がかかります。また物によっ
てはコマンドラインオプションで block count を指定しなければならないタ
イプのbadblocksもあります。

Red Hat Linux 7.2のDisc1でbootして /dev/hda を消去する例を以下に示しま
す。恐らく7.3以降でも簡単だと思います。

(1) Disc1というCD-ROMからbootします。
ブートの種類を選ぶ所では linux rescue を選択します。
言語は英語を選択します。
キーボードの種類を選択します。
ContinueとSkipでContinueを選択します。
以上でレスキューモードのシェルが起動します。


(2) badblocks -vw -c 1024 /dev/hda

  • ddで消去する

広く知られている通り、ddでもHDDを消去できます。

dd if=/dev/zero of=/dev/hda

を実行すると /dev/hda 全域を 0x00 で1回上書きします。大きなブロックサ
イズを指定する事により時間短縮できる場合があります。厳密には 0x00 の全
面書き込み1回だけでは不十分と言われる事もあるので、必要に応じて色々と
工夫してみた方がよいかも知れません。

Solarisです。

Solaris 上でディスクのデータを完全に消去する方法

最近「セキュリティー」というキーワードが、以前よりかなり熱くなっている気がしますが、 セキュリティーを確保するために「ディスクのデータを完全に消去する」というのは 重要かと思います。

私も 5 年前は「/dev/zero で上書きしておけば問題ない」と思いこんでいたのですが、 調べてみれば、ディスク内の磁気情報を利用した解析修復ツールであれば、書き込む直前の 状態、例えば 0 の上に書かれた 0 なのか、1 の上に書かれた 0 なのかを区別できて しまいます。なので /dev/zero での上書きだと完全では無いですね。。。 そこで RANDOM にいろいろ書き込んで以前のデータが修復出来ない状態にしないと いけないのですが、どうすれば良いでしょう?

一度に大量のデータ消去作業を伴う場合は、何らかの有償サービスを受けるのが手間が掛からなくて良いと思いますが、 自分の Workstation のみディスクを捨てたいような場合は、自分で行った方が簡単ですね。 そこで Solaris の format コマンドを使用することにより、ディスクのデータを 完全に消去することも可能です。

以下の手順です。

 1. format -> defect -> primary -> quit
 2. analyze -> purge -> quit
 3. defect -> both -> quit -> analyze -> purge -> quit -> quit

結構?かなり?時間がかかりますが、これで完全に消去できます。

以下の URL に技術的な詳細が書かれていますので勉強になります。 "The format command overwrites the available disk sectors with patterns that comply with the Department of Defense declassification regulations for data remanence. " とのこと。ざっくり訳すと「format コマンドは米国国防総省機密解除規則に従うパターンで 利用可能なディスクセクターを上書きします。」となります。 Trusted Solaris の資料ですが、一番下の部分に Solaris でも同じとの記述があるので Solaris でも同様の手順です。


Trusted Solaris Operating System - Technical FAQs
>> How do I remove sensitive information from a disk?
>> http://www.sun.com/software/solaris/trustedsolaris/ts_tech_faq/faqs/purge.xml



特定のポートをオープンしているプロセスを調査する。

特定のポートをオープンしているプロセスを調査する。
(日 1月 06 11:38:29) root@R60e:~: lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 6514 root 3u IPv6 25503 TCP *:ssh (LISTEN)
(日 1月 06 11:39:15) root@R60e:~:
(日 1月 06 11:39:15) root@R60e:~: lsof -i:8899
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tst020 6311 indou 3u IPv4 22535 TCP *:8899 (LISTEN)
(日 1月 06 11:40:34) root@R60e:~:

2008年1月17日木曜日

lsnrctl

■[リスナーのログ出力を動的に停止する方法]
% lsnrctl
LSNRCTL> set current_listener <リスナー名> <= オプション(リスナー名が
LISTENER ではない場合)
LSNRCTL> set log_status OFF <= 出力停止
LSNRCTL> set log_status ON <= 出力開始

 ※上記手順の場合は、出力停止中の間にリスナーログをmv,rm,compress 等を
  実施します。
  set log_status ON を実行してログ出力を再開する際に、該当リスナーが指定
  する名称のログファイルが存在しない場合は、set log_status ON のタイミング
  で新規ファイルが自動生成されます。
  (新規ファイル自動生成時は、「DD-MON-YY HH24:MI:SS * log_status * 0」
   というような出力が1行目に出力されて作成されます。)
■リスナーを停止せず listener.log を連続性を保ったまま新しく出力させる方法


[対処]
lsnrctl ユーティリティの set log_file コマンドを使用することで可能です。
以下の手順例をご参考下さい。

例)
現在のファイル名を listener.log とします。

1. 以下のコマンドを使用し、新たに listener1.log を出力させるようにします。

% lsnrctl
LSNRCTL> set log_file listener1.log

# この時点で、listener.log があるディレクトリに
# 新たに listener1.log というファイルが作成され、
# 今後はこのファイル上にロギングが行なわれます。

2. 現在の listener.log をリネームします。

% mv listener.log listener.log.20030507

3. 再度、現在のファイル名 listener1.log を
以下のコマンドを使用し、listener.log と元の名前で
出力させるようにします。

% lsnrctl
LSNRCTL> set log_file listener.log

これにより、listener.log の再作成が行なわれたことになります。
また、listener.log.20030507, listener1.log そして現在の listener.log と、
その間の連続性は失われてはいません。

2008年1月11日金曜日

ディスクの消去

hp-ux、mediainit(1)
   
   例)
   # mediainit /dev/rdsk/cXtYdZ
   
   例)bs は default の 1024 だと時間がかかります。
   # dd if=/dev/zero of=/dev/rdsk/cXtYdZ bs=1024k
 

2008年1月7日月曜日

lsof

特定のポートをオープンしているプロセスを調査する。
(日 1月 06 11:38:29) root@R60e:~: lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 6514 root 3u IPv6 25503 TCP *:ssh (LISTEN)
(日 1月 06 11:39:15) root@R60e:~:
(日 1月 06 11:39:15) root@R60e:~: lsof -i:8899
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tst020 6311 indou 3u IPv4 22535 TCP *:8899 (LISTEN)
(日 1月 06 11:40:34) root@R60e:~:

デーモンプログラムの作成方法


デーモンプログラム

  1. fork()、その後親プロセス終了。
  2. プログラムを起動したシェルに制御が戻る。
  3. このfork()は新しいプロセスが プロセスグループリーダーにならないようにするため。 setsid()はプロセスグループリーダーだと失敗する。
  4. setsid()によりプロセスグループとセッショングループのリーダーとなる。制御端末はセッションに関連づけらている。この新しいセッショ ンは制御端末を持たない。そのためこのプロセスは制御端末を持たない。
  5. fork()して、親プロセス(セッショングループリーダー)は終了。デーモンが、セッショングループリーダーでないので、以後制御端末 を持つことがない。
  6. chdir("/")。ファイルシステムを アンマウント出来ないことを避ける。
  7. umask(0)として、書き出すあらゆるファイルのパーミッションを制御。 やらなくてもいいけど。
  8. ファイルディスクリプタ0、1、2をclose()。親プロセ スから引き継いだ標準入力、出力、エラー出力を解放する。これらのファ イルディスクリプタがどこかにリダイレクトされているかどうか分からな いため。制限値_SC_OPEN_MAXを知るために多くのデーモンが sysconf()を用いていることに注意してください。_SC_OPEN_MAXはプロセス 当たりの最大ファイルオープン数です。次にループに入り、全ての有り得 るファイルディスクリプタをクローズ。同時に使えるファイルディスクリプタの数 には限りがあるため、オープンされているファイルディスクリプタがあり 得るとなら、それらをクローズする。
  9. stdin、stdout、stderr用に新しいディスクリプタをオープン。例えば、stdoutか stderrとしてそれをオープンし、stdinには`/dev/null'オープン。または、`/dev/console'をstderrと/またはstdoutとし てオープンし、`/dev/null'をstdinとする。

デーモンがinetdから起動されるものの場合は、 これらの手順は不要。その場合、 stdin、stdout、stderrは既にどれもネットワーク接続を対象として 設定されていますし、 fork()やセッション操作はするべきではない (inetdを混乱させることを防ぐ)。 chdir()umask()のステップだけは必要。

親プロセスは forkし、そ こで wait し、子プロセスが死ぬのを待つ。子プロセスはさらに fork し、孫プロセスを作る。そこで子プロセスは直ちに終了し(すると親 は、その死の知らせを待っていたので、実行を続ける)、もともと子がやるは ずだった仕事を孫が行なう。親が死んでいるので、孫は init に継承され、 必要な wait などを行なってくれる。この方法は余分な fork を行なうので 非効率だが、移植性は完璧。

WebSiteから要約。

デーモンの作り方

上記サイトに詳しい解説がありますが、デーモンは、制御端末を持たず、独立したセッションで動くバックグラウンドプロセスです。

  1. fork() し、親プロセス(Webサーバに起動されたプロセス)はすぐに終了します。次のsetsid() の呼び出しを成功させるために必要です。
  2. 子プロセスで setsid() を呼び出します。新しいセッションが作られ、そこのセッションリーダ兼プロセスグループリーダになります。
  3. セッションリーダは後から制御端末を得ることができるため、もう一度 fork() し、親プロセスはすぐに終了します。
  4. chdir("/") します。プロセスが握っているディレクトリはunmountできないので、邪魔にならないようにします。
  5. umask(0) するか、しないか。
  6. stdin, stdout, stderr を close() します。