概要
rm コマンドによる通常のファイル削除は、システム上の管理情報(リンク)を解除するだけで、ディスク上の実際のデータは残ったままになります。
shred コマンドは、ファイル領域に対してランダムなデータを複数回上書きすることで、磁気レベルでの復元を困難にし、機密情報を安全に破棄するために使用されます。
セキュリティ要件の高い環境で、認証キーや個人情報ファイルを廃棄する際に不可欠なツールです。
仕様(引数・オプション)
構文
shred [オプション] ファイル名
主な引数・オプション
| オプション | 説明 |
-f | 書き込み権限がない場合、権限を変更して強制的に実行します(force)。 |
-n <回数> | 上書きする回数を指定します(デフォルトは3回)。 |
-u | 上書き完了後に、ファイルを削除(unlink)します。 |
-z | 最後にゼロで上書きし、シュレッダー処理を行った痕跡を隠します。 |
-x | ファイルサイズを厳密に維持します(余分なパディングを行いません)。 |
-v | 処理の進行状況を表示します(verbose)。 |
-s <サイズ> | 指定したバイト数だけシュレッダー処理を行います。 |
--random-source=<ファイル> | ランダムデータのソースとして指定したファイル(/dev/urandom等)を使用します。 |
基本の使い方
ファイルをランダムデータで上書きし、中身を破壊します。この段階ではファイル自体は削除されず、ゴミデータが入った状態で残ります。
コマンド
# 機密設定ファイルの中身を破壊する
shred -v secret_config.yaml
実行結果
-v をつけると進捗が表示されます。デフォルトでは3回のランダム書き込みが行われます。
shred: secret_config.yaml: pass 1/3 (random)...
shred: secret_config.yaml: pass 2/3 (random)...
shred: secret_config.yaml: pass 3/3 (random)...
※この後 cat secret_config.yaml を実行しても、意味のない文字列が表示されるのみとなります。
実践コマンド
破壊した後にファイルを削除する
最も一般的に利用される形式です。データを上書きして復元不可能にした上で、ファイルシステムからも削除します。
# データベースのダンプファイルを安全に消去する
shred -uv database_dump.sql
shred: database_dump.sql: pass 1/3 (random)...
shred: database_dump.sql: pass 2/3 (random)...
shred: database_dump.sql: pass 3/3 (random)...
shred: database_dump.sql: removing
shred: database_dump.sql: renamed to 00000000000000000
shred: database_dump.sql: removed
ファイルサイズを変えずに中身だけ破壊する
-x オプションを使用すると、ファイルサイズを厳密に維持したまま内容を書き換えます。ログファイルなどの容量監視を行っている環境で、サイズ変動によるアラートを避けつつ内容を無効化したい場合に有効です。
# ログファイルのサイズをキープしたまま内容を破壊
shred -xv server_access.log
shred: server_access.log: pass 1/3 (random)...
shred: server_access.log: pass 2/3 (random)...
shred: server_access.log: pass 3/3 (random)...
回数を指定し、最後にゼロクリアする
デフォルトの3回ではなく回数を指定(-n)し、最後に全ビットを0で上書き(-z)します。これにより、ファイルの中身を見た際に「ランダムなゴミデータ」ではなく「空データ」のように見せかけることができます。
# 5回ランダム上書きした後、最後にゼロで埋める
shred -v -n 5 -z private_key.pem
shred: private_key.pem: pass 1/6 (random)...
shred: private_key.pem: pass 2/6 (random)...
shred: private_key.pem: pass 3/6 (random)...
shred: private_key.pem: pass 4/6 (random)...
shred: private_key.pem: pass 5/6 (random)...
shred: private_key.pem: pass 6/6 (000000)...
カスタムポイント
- 繰り返し回数(-n): 時間がかかりすぎる場合は回数を減らすか、より確実性を求める場合は増やします。現代のHDDであればデフォルトの3回で十分な場合が多いですが、ポリシーに合わせて変更してください。
- ゼロ埋め(-z): 削除まで行う(
-u)場合は必須ではありませんが、ファイルを残す場合や、ディスクイメージの圧縮効率を上げたい場合に有効です。 - 対象: ファイルだけでなく、
/dev/sdbなどのデバイスファイルを指定してパーティション全体を消去することも可能です(極めて危険なため注意が必要です)。
注意点
- SSDやフラッシュメモリでの無効性:SSD、USBメモリ、SDカードなどは、ウェアレベリング(書き込み分散)技術を用いているため、shred で特定ファイルを上書きしても、物理的に同じ場所が上書きされるとは限りません。これらのメディアでは shred による完全削除は保証されないため、ディスク全体の暗号化やSecure Erase機能の利用が必要です。
- ジャーナリングファイルシステム:Ext3/Ext4、XFS、JFSなどのジャーナリングファイルシステムでは、データ書き込み時に履歴(ジャーナル)が別の場所に保存されることがあり、オリジナルデータの一部が残留する可能性があります。
- 再帰的削除は不可:rm -r のようにディレクトリごと再帰的に処理するオプションはありません。ディレクトリ内の全ファイルを対象にする場合は find コマンドと組み合わせる必要があります。
- 復活不可:当然ながら、このコマンドで処理したファイルは復元ソフトを使っても復旧できません。重要なファイルを誤って指定しないよう細心の注意が必要です。
応用
findコマンドと組み合わせて一括処理する
特定のディレクトリ以下にある古いバックアップファイルを検索し、それらを安全に消去する応用例です。
# archiveディレクトリ内の拡張子.tar.gzを検索し、個別にshredを実行して削除
find ./archive -name "*.tar.gz" -exec shred -uv {} \;
shred: ./archive/backup_2023.tar.gz: pass 1/3 (random)...
shred: ./archive/backup_2023.tar.gz: removed
(以下、対象ファイルごとに実行される)
まとめ
shredコマンドは、標準の削除コマンドとは異なり、データを物理的に上書きすることで復元を阻止する強力なツールです。特に機密情報を扱うサーバー管理や、廃棄前のデータ消去において重要な役割を果たします。ただし、SSDなどの現代的なストレージや一部のファイルシステムでは効果が限定的である可能性があるため、ハードウェア特性を理解した上で、用途に応じて暗号化など他のセキュリティ対策と併用することが推奨されます。
