Unbootstrap - 自分(Linux)の足(ファイルシステム)を自分(稼働したまま)で撃つ(破壊する)ためのシェルスクリプト - Linux / Shell Script Advent Calendar 2017 - ダメ出し Blog

2017-12-24(Sun) [linux][unix][sh][shell] [更新履歴]

Linux Advent Calendar 2017Shell Script Advent Calendar 2017 兼用の 24日目の記事です。メリークリスマス! イブ!! 明日が誕生日です。今年も無事におひとりさまですよ。おいしいケーキたべたい。

今回は Linux 環境を生きたままケア^H^H殺すためのシェルスクリプト、Unbootstrap を紹介します。

Unbootstrap を使えば、リモートの Linux 環境に SSH 経由でログインした状態で ファイルシステム等のデータ破壊とマシン電源オフを安全(?)・確実(?)に行なうことができます。 「生きたまま殺す」「自分の脚を自分で撃つ」とはその喩えです、念の為。 コンソールログインなどの物理アクセスや、別 OS 環境のブートも不要です。

開発の経緯

私は 日本 Samba ユーザー会 (Samba-JP) のスタッフとしてユーザー会の各種サービスを稼働させているホストを維持・ 管理しているのですが、ある時あるホストマシンを引退させることになりました。 モノはリモートにある物理マシンです。OS は Debian だったかな? Ubuntu だったかな?

マシンの設置場所はユーザー会のスタッフ (当時。現在は故人)の前職場である (株)ファム の某ビル内にあり、ファムの方で電源断、 ストレージ (SATA HDD) のデータ破壊、マシンの破棄まで作業してくださるとのことでした。 その節はお世話になりました!

お言葉に甘えてそのまますべてお任せでもよかったのですが、 「リモートにあるコンソールにアクセスできないマシン上の Linux 環境のストレージを破壊する簡単な方法がないものか?」と思い立ち、 作ってみたのが Unbootstrap です。

稼働中のシステムのファイルシステム/スワップを破壊するとどうなる?

今回、マシンを引退するにあたり実現したいことは以下でした。

  1. 一時的なデータの破壊
    • メモリなどが該当します。
    • マシンの電源オフで破壊できます。
  2. 一時的ではあるが残されるデータの破壊
    • スワップファイル/デバイスが該当します。
    • dd(1) や shred(1) などで破壊できます。
  3. 恒久的なデータの破壊
    • ファイルシステムなどが該当します。
    • dd(1) や shred(1) などで破壊できます。

メモリは電源オフで簡単に消せますが、スワップファイル/デバイスやファイルシステムはどうでしょうか? 稼働中の Linux にログインして以下のコマンドラインを実行したとき、 どのようなことが起きるか想像してみてください。

$ lsblk --noheadings --list --scsi --output name \
  |sed 's|!|/|g' \
  |while read dev; do echo sudo dd status=progress if=/dev/urandom of=/dev/$dev; done

これを実行すると (上記例は echo を挟んでいるので実際は何も起きませんが、echo を外して実行すると) ファイルシステムやスワップ(を含むブロックデバイス)をランダムデータで上書きして破壊します。

使用中のファイルシステム/スワップデータが壊れると何が起きるでしょうか?

いずれにしても、システムを稼働したままファイルシステムなどを破壊すると、 途中で停止しまう恐れがあると考えられます。

Unboostrap は何をするのか

こんなことができます。

  1. メモリ上に tmpfs(5) のファイルシステムを作り、その中に Unbootstrap 環境を作る。データ破壊に必要な各種コマンドやデバイスファイルがコピーする。

  2. スワップファイル/デバイスをすべて無効化する。

  3. Unbootstrap 環境に chroot(2) してヘルパーシェルスクリプトを起動する。

  4. ヘルパーシェルスクリプトは以下の機能を提供する:

    • Unbootstrap 環境のプロセスを除くすべてのプロセスを停止する。 (SIGSTOP シグナル送信)
    • Unbootstrap 環境内でシェルを起動する。
    • マシンの電源を強制的にオフする。(poweroff --force)

現在のところ、ファイルシステムやスワップを自動的に検出・破壊する機能は 実装してありません。シェル内で lsblk(8), dd(1), shred(1) などを利用して手動で破壊する必要があります。

なお、init(1) プロセスはカーネルがシグナルをブロックするので停止できませんが、 調べた限りでは通常のファイルシステム上のファイルはオープンしていないので、 止めなくても問題なさそうです。ptrace(2) で一度アタッチするとシグナルがブロック されなくなるようなので、どうしても止めたい場合は事前に strace(1) などでアタッチしてみてください。

Unboostrap の使い方

リポジトリ内にデモ用に Vagrant による仮想マシン環境を用意してあるので、 ダウンロードしてみてください。

$ git clone https://github.com/fumiyas/unbootstrap.git
Cloning into 'unbootstrap'...
$ cd unbootstrap

vagrant を直接起動してもいいですが、Makefile にルールを書いておいたので、 それを利用してもいいでしょう。

最初に仮想マシンを起動 (Vagrant Box イメージが手元になければダウンロードも) して unbootstrap スクリプトをインストールします。

$ make vagrant.up
vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'bento/debian-9.2' could not be found. Attempting to find and install...
...省略...
==> default: Running provisioner: file...
==> default: Running provisioner: shell...
    default: Running: inline script

仮想マシン内のシステム (Debian) に SSH ログインして root になります。

$ make vagrant.ssh
Linux debian-9 4.9.0-4-amd64 #1 SMP Debian 4.9.51-1 (2017-09-28) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
vagrant@debian-9:~$ sudo -i
root@debian-9:~# 

unbootstrap を起動すると Unbootstrap 環境が自動的に構築され、 メニューが表示されます。

root@debian-9:~# unbootstrap
Creating Unbootstrap directory /tmp/unbootstrap.1220.tmp ...
Copying some files in /etc to /tmp/unbootstrap.1220.tmp/etc ...
Copying device files in /dev to /tmp/unbootstrap.1220.tmp/dev ...
Copying commands to /tmp/unbootstrap.1220.tmp/bin ...
Copying required libraries to /tmp/unbootstrap.1220.tmp/lib ...
Creating busybox commands in /tmp/unbootstrap.1220.tmp/bin ...
Entering Unbootstrap directory /tmp/unbootstrap.1220.tmp ...
Mounting /proc ...
Mounting /sys ...

Unbootstrap Menu:

  1 : Suspend all processes except Unbootstrap processes
  2 : Start /bin/sh in Unbootstrap environment
  3 : Force to poweroff
  4 : Force to reboot
  5 : Resume all suspended processes
  6 : Exit from Unbootstrap environment

Enter a number to do:

1 で Unbootstrap 環境以外のプロセスを停止した後、 2 でシェルを起動してファイルシステムなどを破壊して終了 (exit) して メニューに戻り、最後に 3 で強制電源オフする、という流れになります。

Enter a number to do: 2

Unbootstrap@debian-9 # lsblk
NAME                     MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                        8:0    0   40G  0 disk
|-sda1                     8:1    0  243M  0 part
|-sda2                     8:2    0    1K  0 part
`-sda5                     8:5    0 39.8G  0 part
  |-debian--9--vg-root   254:0    0 38.8G  0 lvm
  `-debian--9--vg-swap_1 254:1    0    1G  0 lvm
Unbootstrap@debian-9 # dd status=progress if=/dev/urandom of=/dev/...省略...
...省略...
Unbootstrap@debian-9 # exit
...省略...
Enter a number to do: 3

Trying to force to poweroff... Running in chroot, ignoring request.
Retrying to force to poweroff outside of Unbootstrap environment... Powering off.
Connection to 127.0.0.1 closed by remote host.
Connection to 127.0.0.1 closed.
Makefile:19: recipe for target 'vagrant.ssh' failed
make: *** [vagrant.ssh] Error 255

謝辞

現在の Samba-JP の各種サービスは、数名の有志と、 さくらインターネット(株)さくらのVPSオープンソース・ソリューション・テクノロジKDDI Cloud Core VPS(株)ファム の提供でをお送りしております。

この度、マシンの老朽化のため、ファムに設置して頂いているホストマシン darwin.samba.gr.jp を退役させることになりました。長い間ありがとうございました。 ベアメタルの Intel Celeron (Coppermine) 566MHz、IDE HDE 20GB の古いマシンでした。


ところで、12月25日はクリスマスな上に、 OSS 界隈で地味に活躍されているふみやすさんの誕生日ですね!
http://www.amazon.co.jp/registry/wishlist/27M7TV8CEEF6G?sort=priority

逆に、あなたの書いた OSS や Blog や Advent Calendar が気に入ったら何か送りたく なってしまうかもしれないので、プロフィールや Web サイトに あなたの Amazon 欲しいものリストの URL を貼っておいてくださいね!


私が勤める OSSTech っていう某弊社で社員募集しているようです。 人材紹介会社を介さなければ、入社後に 20万円のボーナス! 「ふみやすっていう人に紹介された」と言ってもらえると私にもボーナス!! → https://www.osstech.co.jp/recruit/


よろしければ、これまで参加した/参加予定のほかの Advent Calendar もどうぞ。