Linux Advent Calendar 2017、 Shell Script Advent Calendar 2017 兼用の 24日目の記事です。メリークリスマス! イブ!! 明日が誕生日です。今年も無事におひとりさまですよ。おいしいケーキたべたい。
今回は Linux 環境を生きたままケア^H^H殺すためのシェルスクリプト、Unbootstrap を紹介します。
- Unbootstrap Shred files in a remote running OS (Shoot yourself in the foot)
Unbootstrap を使えば、リモートの Linux 環境に SSH 経由でログインした状態で ファイルシステム等のデータ破壊とマシン電源オフを安全(?)・確実(?)に行なうことができます。 「生きたまま殺す」「自分の脚を自分で撃つ」とはその喩えです、念の為。 コンソールログインなどの物理アクセスや、別 OS 環境のブートも不要です。
開発の経緯
私は 日本 Samba ユーザー会 (Samba-JP) のスタッフとしてユーザー会の各種サービスを稼働させているホストを維持・ 管理しているのですが、ある時あるホストマシンを引退させることになりました。 モノはリモートにある物理マシンです。OS は Debian だったかな? Ubuntu だったかな?
マシンの設置場所はユーザー会のスタッフ (当時。現在は故人)の前職場である (株)ファム の某ビル内にあり、ファムの方で電源断、 ストレージ (SATA HDD) のデータ破壊、マシンの破棄まで作業してくださるとのことでした。 その節はお世話になりました!
お言葉に甘えてそのまますべてお任せでもよかったのですが、 「リモートにあるコンソールにアクセスできないマシン上の Linux 環境のストレージを破壊する簡単な方法がないものか?」と思い立ち、 作ってみたのが Unbootstrap です。
稼働中のシステムのファイルシステム/スワップを破壊するとどうなる?
今回、マシンを引退するにあたり実現したいことは以下でした。
- 一時的なデータの破壊
- メモリなどが該当します。
- マシンの電源オフで破壊できます。
- 一時的ではあるが残されるデータの破壊
- スワップファイル/デバイスが該当します。
dd
(1) やshred
(1) などで破壊できます。
- 恒久的なデータの破壊
- ファイルシステムなどが該当します。
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
を外して実行すると)
ファイルシステムやスワップ(を含むブロックデバイス)をランダムデータで上書きして破壊します。
使用中のファイルシステム/スワップデータが壊れると何が起きるでしょうか?
- ファイルシステム/スワップへのアクセス不正でカーネルが停止 (カーネルパニック)、あるいは暴走する?
- 古い Linux は脆弱でパニックやハングアップする可能性が高そうですが、 最近のバージョンなら堅牢で該当ファイルシステムを停止するだけで済みそう。
- スワップファイル/デバイスのデータが破壊されたときは無理そう?
- カーネルが壊れたファイルシステムを停止することで何かしらのプロセスが暴走する?
- ファイルシステムフルになると暴走する実装を過去にいくつか見た記憶があるし、 ファイルの読み書き失敗を契機に何か不具合が発動するかもしれません。
- サービスの機能不全を検知してウォッチドッグがマシンを強制リブートする?
- ソフトウェア実装やハードウェア実装があるようですが、使ったこともないのでわかりません。
- そのほか?
- 何かありますか?
いずれにしても、システムを稼働したままファイルシステムなどを破壊すると、 途中で停止しまう恐れがあると考えられます。
Unboostrap は何をするのか
こんなことができます。
-
メモリ上に
tmpfs
(5) のファイルシステムを作り、その中に Unbootstrap 環境を作る。データ破壊に必要な各種コマンドやデバイスファイルがコピーする。 -
スワップファイル/デバイスをすべて無効化する。
-
Unbootstrap 環境に
chroot
(2) してヘルパーシェルスクリプトを起動する。 -
ヘルパーシェルスクリプトは以下の機能を提供する:
- Unbootstrap 環境のプロセスを除くすべてのプロセスを停止する。 (
SIGSTOP
シグナル送信) - Unbootstrap 環境内でシェルを起動する。
- マシンの電源を強制的にオフする。(
poweroff --force
)
- Unbootstrap 環境のプロセスを除くすべてのプロセスを停止する。 (
現在のところ、ファイルシステムやスワップを自動的に検出・破壊する機能は
実装してありません。シェル内で 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 もどうぞ。
- Ansible Advent Calendar 2023
- シェル芸 Advent Calendar 2023
- 闇の魔術に対する防衛術 Advent Calendar 2023
- Ansible Advent Calendar 2023
- Ansible Advent Calendar 2020
- DNS温泉 Advent Calendar 2019
- OSSTech Advent Calendar 2019
- Ansible Advent Calendar 2018
- OSSTech Advent Calendar 2018
- Debian/Ubuntu Advent Calendar 2017
- Linux Advent Calendar 2017
- Shell Script Advent Calendar 2017
- Shell Script Advent Calendar 2016
- OpenLDAP と仲間たち Advent Calendar 2015
- Postfix Advent Calendar 2014
- 拡張 POSIX シェルスクリプト Advent Calendar 2013