ランサムウェアと「システムの復元」

ASCII.jpに、やや気になる記事がありました。

ウイルス対策ソフトで有名なMcAfeeが連載しているコーナー「せきゅラボ」の、2017/12/22の記事です。

Windows がランサムウェアに感染してしまった場合の復旧(できるかもしれない)手段として、「システムの復元」が紹介されているのですが、やや説明不足に思えます。

 

続きを読む

” システムで予約済み ” パーティション <2>

OS インストール時に勝手に作られるこの「システムで予約済み」パーティションですが、実は作らずに OS をインストールすることも可能です。

そうした場合、Bootフォルダなどが自動的にCドライブ内に作成されます。つまり、Windows Server 2008 やWindows Vistaと同じスタイルになるというわけです。

 

 

以下に、私が実際に行った手順を紹介します。

※Windows Server 2012 の Hyper-V 上の仮想サーバーにて、Windows Server 2008 R2 SP1  を用いました。

1. サーバーをOSインストールメディアから起動します。

2. 最初の画面で言語やキーボードを選択した後、そのままストレートにOSをインストールするのではなく、まずは「コンピューターを修復する」を選択して「システム回復オプション」を起動します。

3. ラジオボタンの選択は既定(上下二つのうち、上側にチェックが入っていると思います。)のまま「次へ」ボタンを押し、次の画面からコマンドプロンプトを起動します。

4. コマンドプロンプトにて"diskpart" を実行し、下記 -a) 〜 -h) のコマンドにより、OSをインストールするCドライブを作成します。

-a) list disk

現在接続されているHDDの一覧を表示します。

-b) select disk X

OSをインストールしたいHDDを選択します。

X には、a) にて確認したそのHDDのナンバーを入れます。

-c) clean

現在そのHDD内にあるパーティションやデータを一掃します。

-d) create partition primary

そのHDDに新しいプライマリパーティションを作成します。

特にサイズを指定していないので、そのHDDを余すところなく目一杯使います。

-e) list vol

HDDにボリュームが作成されたことを確認します。

-f) select vol Y

作成されたボリュームを選択します。

Y には、e) にて確認したそのボリュームのナンバーを入れます。

-g) assign letter=C

ボリュームにドライブ文字「C」を割り当てます。

-h) list vol

ボリュームにドライブ文字「C」が割り当てられた事を確認します。

5. ウィンドウ右上の[×]でコマンドプロンプトを閉じ、同様にシステム回復オプションも閉じ、「Windows のインストール」画面に戻ります。

6. ここから先は通常のOSインストール手順と基本的に同じです。インストール場所を選択する画面では、先ほどdiskpartコマンドにより作成したCドライブを選択します。

7. OS インストール完了後、ログオンして「ディスクの管理」画面を開き、「システムで予約済み」パーティションが無い事を確認します。

 

 

さて、「システムで予約済み」パーティションが無い状態というのは、通常と比べて何がちがうのでしょうか?

試した限りでは、「Windows Server バックアップ」にて、「ベアメタル回復」オプションを選択せずにCドライブ単体をバックアップした場合にも、そのバックアップデータから新品HDDへのベアメタル回復が可能であることを確認しました。(通常はできないことです。)

※可能だとは言っても、このような回復は正式にサポートされる方法ではないはずなので、万が一回復に失敗しても自己責任となります。

" システムで予約済み " パーティション <1>

まっさらなハードディスクにWindows OSをインストールすると、通常はCドライブが作成され、そこにOSが入ります。インストールのウィザードにおいて特段何もしなければ、Cドライブとは別にデータ用の領域が作成されるということはありません。

ところがWindows Server 2008 R2 やWindows 7 の場合、Cドライブと一緒に、それもHDDの一番先頭に「システムで予約済み」というパーティションが作成されます。容量は100MBしかありません。

このパーティションにはドライブ文字が割り当てられていないため、OSインストール後に[スタート]メニューから[コンピューター]を開いても、Cドライブしか見えません。しかし、「ディスクの管理」画面を開くと、Cドライブより左(先頭)側にこのパーティションが在ることとが分かります。あるいは、"diskpart"コマンドで"list volume"を実行することでも表示されます。

いったいこのパーティションは何なのでしょうか? 無いとどうなるのでしょうか?

 

 

まずは中身を見てみましょう。「ディスクの管理」画面で右クリックしてやればドライブ文字を割り当てることが出来るので、適当に何か割り当ててやればエクスプローラーで開くことができます。一応ここではFドライブとします。

普通に見ても空っぽなのですが、エクスプローラーの「フォルダー オプション」で「保護されたオペレーティング システム ファイルを表示しない(推奨)」を無効化することで中身が表示されます。するとなにやらOSのブートに関するフォルダやファイルがあります。というか、それしかありません。

Fドライブ直下にあったのは、

・Boot  (フォルダ)

・System Volume Infomation  (フォルダ)

・bootmgr  (ファイル)

・BOOTSECT.BAK  (ファイル)

の4つだけでした。("dir F: /s /A”コマンドを使えば、Bootフォルダの中身まで表示されます。)

このBootフォルダの直下に在るBCDというファイル(ブート構成データ)は、OSをブートする為に非常に重要です。これが壊れるとブート出来なくなるそうです。

こちら↓のサイトでいろいろ興味深い実験をしています。

◆ win7 システムの修復

(http://ftlabo.sakura.ne.jp/win/w7-system-repair/w7-system-repair.shtml)

 

その他、マイクロソフトのサイトにも解説が載っています。

◆ ブート構成データ エディタに関してよく寄せられる質問

(http://technet.microsoft.com/ja-jp/library/cc721886(v=ws.10).aspx)

この↑サイトを見ると分かりますが、BCDによるブートの制御自体は、Windows Server 2008 やWindows Vistaの段階ですでに採用されています。しかし、それらのOSではCドライブ内に存在しました。ではどうして、Windows Server 2008 R2 やWindows 7 では独立したパーティションが作られるようになったのでしょうか?

 

 

手がかりとなりそうな情報が、同じくマイクロソフトのサイトにありました。

◆ ヒント: 不可解な小さなパーティションを理解して削除する

(http://technet.microsoft.com/ja-JP/windows/Win7_Tips65)

◆ ハード ディスクを BitLocker ドライブ暗号化用にセットアップする

(http://windows.microsoft.com/ja-jp/windows-vista/set-up-your-hard-disk-for-bitlocker-drive-encryption)

 

 

どうやら、「BitLocker」という暗号化機能のためのようです。BitLocker機能自体はWindows Server 2008 やWindows Vistaの段階ですでにあったのですが、OSが存在するCドライブ自体を暗号化したい場合には、「OS起動用の領域」を手動で切り分ける必要がありました。なぜなら、BIOSは暗号化されたCドライブを直接認識出来ないからです。

それを最初から独立させておいたのが、Windows Server 2008 R2 やWindows 7における「システムで予約済み」というパーティションなのです。

 

つづく

Windows Server バックアップを、PowerShell でやってみる。<変数編 2 >

前回は、一行目のコマンドレット “$policy=new-wbpolicy” の意味を解説しました。新たな変数名「policy」 を定義し、”new-wbpolicy” コマンドレットによって作成されるバックアップ実行時のポリシー情報をその内容として格納するというものです。

 

 

では、二行目の ”add-wbbaremetalrecovery $policy” は何をしているのでしょうか。二行目を実行した後に、「$policy」を実行するとその意味が分かります。変数名の頭に「$」を付けて実行する事でその内容が表示されるわけですが、一行目の実行直後と二行目の実行直後とでは、その内容が変わっているのです。

一行目の実行直後だと、ただ単に “new-wbpolicy” を実行した場合と同じ「空のポリシー」が表示されるだけなのですが、二行目の実行直後では、「BMR」の項目が「: False」から「: True」に変化しています。このことから、「ベアメタル回復を実行する」というポリシーが設定されたことが分かります。

 

 

三行目の "$backuptargetvolume=new-wbbackuptarget -volume G:" では二つ目の変数が登場しますが、やっている事の本質は一行目と同じです。「backuptargetvolume」という変数名を定義し、その中に、「バックアップ先としてGドライブを指定する」という意味の「new-wbbackuptarget -volume G:」を格納しています。

 

 

なお、パラーメーターとして「-volume」を用いても成功しない場合は、「-volumepath」を用いてみてください。私の使っている環境では、先月の <実践編> 執筆時には前者で成功していたはずなのですが、今現在は後者でないとエラーしてしまいます。

英語版 Technet の「New-WBBackupTarget」を見る限りではどちらのパラメーターも存在するのですが、微妙に意味が異なるのか、環境や条件によって使い分ける必要があるようです。

(不思議な事に、打ち間違えて "-volumepat G:" で実行した場合にも成功しました。試しに "-volumepa G:" を実行したところ、これでも成功しました。PowerShell は妙な省略機能が充実しています・・・)

三行目の実行後に「$backuptargetvolume」を実行すると、指定したドライブが表示されます。

 

 

四行目 "add-wbbackuptarget -policy $policy -target $backuptargetvolume" が、最後のポリシー設定となります。三行目で変数「$backuptargetvolume」として設定したバックアップ先ドライブの情報を、さらに変数「$policy」の内容として格納します。(変数の設定を2段階で行うというのは、正直面倒ですね・・・)

四行目の実行後に「$policy」を実行すると、空欄だった「BackupTargets」の項目が「: {指定したドライブ名}」に変化していることが分かります。

 

 

ちなみに、「-policy」と「-target」は省略可能です。二つの変数名だけ記述し、"add-wbbackuptarget $policy $backuptargetvolume" で実行した場合にも、同様の結果となる事を確認しています。

(実は二行目でも、「-policy」を入れて "add-wbbaremetalrecovery -Policy $policy" と書くのが正式な書き方のようです。少なくとも、Technet の「ステップ バイ ステップ ガイド - Windows Server 2008 R2 の Windows Server バックアップ」ではそうなっています。)

 

 

こういった必須パラーメーターを一切記述せず、たとえば  "add-wbbackuptarget" だけを実行したらどうなるかというと、結局「Policy」と「Target」の入力を求められます。ところが、その際にそれぞれ「$policy」と「$backuptargetvolume」を入力しても、エラーしてしまいます。どうやら、コマンドレット上で記述する場合と対話的に入力する場合とで、違う書き方をしなくてはいけないようです。詳しいことはまだよく分かりません。

 

 

最後の五行目 "start-wbbackup -policy $policy" で、変数「$policy」内に格納された各種設定を用いてバックアップを実行します。もちろんここでも、「-policy」を省略可能です。

バックアップ先ドライブがバックアップ元ドライブと物理的に同一ディスク上にある場合には、警告メッセージが出て " y " の入力が必要であると<実践編>に書きましたが、”-force” というオプションを用いることでスキップ可能です。すぐにバックアップが開始されることを確認しました。

 

以上で、「Windows Server バックアップを、PowerShell でやってみる。」シリーズは終了です。

正直言って、まだまだ PowerShell を理解しきれていはいません。変数の扱いや、パラメーターの入力方法など、「なぜこうしなければいけないのだろう?」と疑問に思いながら進めている箇所がいくつもあります。それらは今後、別のシリーズとしてこのブログで取り上げていきたいと思います。

 

Windows Server バックアップを、PowerShell でやってみる。<変数編 1 >

Windows Server バックアップを、PowerShell でやってみる。<実践編> を書いてから、すでに一ヶ月以上経っています・・・

Windows Server バックアップのために書いた 5 行のコマンドレットの意味を、時間があるときにじっくり調べようと思っているうちにゴールデンウィークも終わってしまいました。いつでも出来ると思っていると、なかなか手をつけないものです。私が無精なだけかもしれませんが。

これはいかんと思い、この土日でアレコレ調べたところ、ボチボチ理解出来てきました。

 

 

さて、詳細は過去の記事を参照していただくとして、さっそく1行目から見ていきましょう。

$policy=new-wbpolicy

いきなり「ドル記号」から始まっています。これが今回のテーマである「変数」です。

 

 

コマンドプロンプトでは、前後をパーセント記号で挟む環境変数というものがありました。

%date% や %computername% のようにデフォルトで設定されている環境変数以外でも、"set <環境変数名>=<値>"  というコマンドを実行することで任意の値を任意の環境変数として登録出来、"echo %<環境変数名>%" を実行することでその<値>を表示させることが出来ました。

 

 

"$policy=new-wbpolicy" は、それと似たことをしています。「policy」 という、デフォルトでは存在しない変数を定義しているのです。

※PowerShell においては「変数」と「環境変数」は別々の概念であって、「$×××=○○○」という形式で任意に登録出来るのは「変数」の方です。両者の違いについては後述します。

 

 

「policy」という変数の中に格納した値を表示するには、"$policy" を実行します。

なお、格納した値である「new-wbpolicy」自体もコマンドレットであり、新規のバックアップポリシーを作成するものです。もし "new-wbpolicy" コマンドレットだけを実行した場合には、作成されたバックアップポリシーが下記のように表示されます。

---------------------------------

Schedule                    :

BackupTargets         :

VolumeToBackup    :

FileSpecsToBackup :

FileSpecToExclude  :

BMR                             : False

SystemState                : False

VssBackupOptions   : VssCopyBackup

---------------------------------

このバックアップポリシーは作成されたばかりなので、中身はほぼ空っぽと言ってよい状態です。それを変数「policy」に格納するというのが、1 行目の意味です。

( 1 行目を実行した直後に "$policy" を実行すると、当然ですが同じ結果が表示されます。)

 

 

2〜3 行目は、この空っぽのバックアップポリシーに具体的な設定を施すためのコマンドレットです。

そして、最後の 5 行目でいよいよバックアップを実行する際、変数として格納しておいたバックアップポリシーを呼び出して利用するわけです。

 

 

続く。

Windows Server バックアップを、PowerShell でやってみる。<おまけ>

導入編でも書きましたが、Windows Sewrver 2008 R2 SP1 で Windows Server バックアップ機能を利用するためには、事前にサーバーマネージャーにて「機能の追加」をしておく必要があります。

せっかくなので、それも PowerShell でやってみようと思います。方法は、Technet の記事「サーバーの役割と機能を追加する」を参考にしました。

 

 

機能の追加は "add-windowsfeature" というコマンドレットで出来るのですが、Windows Sewrver 2008 R2 SP1 に標準搭載されている PowerShell 2.0 では、最初はこのコマンドレットを使用出来ません。

先に、”import-module servermanager” というコマンドレットを実行しておく必要があります。こうして 「servermanager モジュール」を読み込んでおかないと、"add-windowsfeature" 等のサーバーマネージャー関連のコマンドレットは使えないようです。

※PowerShell を終了してしまうと、次に起動した際には読み込まれていない状態に戻ります。

※Windows Server 2012 に標準搭載されているPowerShell 3.0 では、インポートの手間は不要です。"add-windowsfeature" を実行した時点で、必要な「servermanager モジュール」が自動的に読み込まれます。

 

 

モジュールの読み込みが出来たところで、"get-windowsfeature" というコマンドレットを実行してみます。これにより、現時点での役割や機能を確認出来ます。

一覧の中で Windows Server バックアップ の箇所を見てみると、

[   ]  Windows Server バックアップ            Backup-Features

       [   ]  Windows Server バックアップ      Backup

       [   ]  コマンドライン ツール                     Backup-Tools

となっています。左端の [   ] が空なので、現時点では追加されていないことが分かります。真ん中が「Display Name」で、右端が「Name」です。コマンドレット実行時には「Name」を使います。

 

 

では実際にこれらの機能を追加してみましょう。 "add-windowsfeature backup-features" を実行します。進捗状況が画面上部に表示され、完了後に表示されるメッセージから再起動の必要があるかどうかも分かります。

完了後、あらためて "get-windowsfeature" をしてみると、以下のようになっています。

[ X ]  Windows Server バックアップ            Backup-Features

         [ X ]  Windows Server バックアップ      Backup

         [     ]  コマンドライン ツール                     Backup-Tools

この状態では、PowerShell を用いたバックアップは行えませんので、"add-windowsfeature backup-tools" を実行することで

[ X ]  Windows Server バックアップ            Backup-Features

          [ X ]  Windows Server バックアップ      Backup

          [ X ]  コマンドライン ツール                     Backup-Tools

とします。

この状態でなら、”add-pssnapin windows.serverbackup“ が実行可能になります。

 

 

なお、最初からコマンドラインツールも含めて追加するためには、下記のようなコマンドレットを実行します。

例 1.  "add-windowsfeature backup-features -includeallsubfeature"

例 2.  "add-windowsfeature backup-features , backup-tools"

また、add の代わりに remove を用いることで、役割や機能を削除することが可能です。

 

Windows Server バックアップを、PowerShell でやってみる。<実践編>

前回、PowerShell のスナップインに"windows.serverbackup"を追加したので、今回はいよいよ"wbbackup"コマンドレットを打ってみます。

 

 

まずは手始めに、"get-help wbbackup"でヘルプを呼び出してみたのですが、正直よく分かりませんでした。仕方がないのでググったところ、役に立ちそうなサイトを2つ見つけました。

 

◆ステップ バイ ステップ ガイド - Windows Server 2008 R2 の Windows Server バックアップ

(http://technet.microsoft.com/ja-jp/library/ee849849%28v=ws.10%29.aspx)

このサイトの、「バックアップ用に Windows PowerShell オブジェクトを作成および構成するには」および「Windows PowerShell を使用して 1 回限りのバックアップを実行するには」という二つの項が参考になると思います。

 

◆PowerShell での Active Directory ディレクトリ サービスのバックアップ

(http://adtan.wordpress.com/2012/01/14/powershell-%E3%81%A7%E3%81%AE-active-directory-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83/)

私がやりたいことと、かなり近いことを実践されてます。

 

 

これらのサイトを参考にし、実際に私が打ってみたコマンドレットは下記の通りです。コマンドプロンプトのように1行で済ませる方法は見つからず、5行になっています。

-----------------------------------------------------------

$policy=new-wbpolicy

add-wbbaremetalrecovery $policy

$backuptargetvolume=new-wbbackuptarget -volume G:

add-wbbackuptarget -policy $policy -target $backuptargetvolume

start-wbbackup -policy $policy

-----------------------------------------------------------

※Gドライブが、Cドライブと物理的に同じディスク上に在る場合、5行目の実行後、リスクを説明するメッセージが表示されます。ここで"y"(イエス)を打ち込まないと、バックアップは開始されません。

 

 

上記5行のコマンドレットにより、(少なくとも私が見る限り、)コマンドプロンプトで”Wbadmin start backup -backuptarget:G: -allcritical”を実行した場合と同じバックアップが取れました。新品のHDDへOS自体を回復することも可能です。もちろんCドライブ内の各種データも一緒に回復されます。

コマンドプロンプトでは"wbadmin get versions"、PowerShellでは"get-wbbackupset"を実行することで「過去のバックアップ履歴とその内容」を確認出来るのですが、これらの結果も、”Wbadmin start backup -backuptarget:G: -allcritical”を実行した場合と同一でした。

 

 

一応、目標は達成できました。しかしながら、まだ私はこの5行のコマンドレットの意味を半分も理解していません。これからそれをじっくり調べていきたいと思います。

 

 

まだ続きます。

Windows Server バックアップを、PowerShell でやってみる。<導入編>

Windows Server 2008 以降、標準のバックアップ機能は「Windows Server バックアップ」といいます。(Windows Server 2003以前は「ntbackup」といいます。)

標準の機能と言っても、OSインストール直後には存在せず、サーバーマネージャーの「機能の追加」で追加してやる必要があります。(私が知る限り、追加後に再起動を要求されたことはありません。)

追加する前にも、[スタート]メニューの[管理ツール]の中には「Windows Server バックアップ」が存在するのですが、起動しても機能しません。「追加してください」という内容の文言が表示されるだけです。

追加後はこれがGUIツールになのですが、コマンドプロンプトで"wbadmin"を実行することでもバックアップをとることが出来ます。

 

 

今回は、これをPowerShellの”wbbackup“コマンドレットを用いて行ってみようと思います。

コマンドプロンプトで、”Wbadmin start backup -backuptarget:G: -allcritical”というコマンドを実行した場合と、同じ結果になることを目指します。

上記コマンドは、OSもユーザープロファイルも、バックアップしたい全情報がCドライブに入っているものとして、それらを「新品のHDDへ、OS自体の回復が可能」な状態でGドライブへバックアップする、という意味です。(これをベアメタル回復といいます。)

オプションとして"-allcritical"を付けることで、OS自体の回復に必要な情報を含むドライブが自動的にバックアップ対象となるため、コマンド内で明示的にCドライブを指名する必要はありません。

逆に、"-allcritical"を付けない場合、たとえコマンド内で明示的にCドライブを指名(-include:C:)してバックアップしたとしても、そのバックアップデータからOS自体の回復は出来ません。Cドライブ内のデータのみ回復可能です。

 

 

なお、今回実際に使ったのは Windows Server 2008 R2 SP1です。Windows Server バックアップの機能が Windows Server 2008よりも強化されており、PowerShell も最初から搭載されています。(Windows Server 2008では、PowerShellもサーバーマネージャーの「機能の追加」で追加する必要があります。)

 

 

さて、「PowerShell」と「Windows Server バックアップ」が両方揃っている環境でも、PowerShellでWindows Server バックアップが出来るとは限りません。

まず最初に、サーバーマネージャーの「機能の追加」で、「Windows Server バックアップの機能」の配下で「「Windows Server バックアップ」の隣にある「コマンドライン ツール」を追加してやる必要があります。

この機能を追加後、PowerShell にて"add-pssnapin windows.serverbackup" というコマンドレットを実行してスナップインを追加することで、やっと"wbbackup"コマンドレットが使えるようになります。

ちゃんとこのスナップインが追加されたかどうかは、"get-pssnapin" で全スナップインの一覧を表示すれば確認出来ます。あるいは、"get-help wbbackup"でヘルプを表示出来るかどうかでも確認出来ます。

(スナップインって何?と聞かれても上手く説明出来ないので聞かないでください。)

なお、サーバーを再起動した後は、またこのスナップインを追加し直す必要があります。なんで消えちゃうんでしょうね・・・  不便です。

 

 

続きます。