hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

shredコマンドの使い方



1 shredコマンドとは?

shredコマンドは、データの復旧を困難にするためにファイルにランダムデータ(特別なパターン)を繰り返し書き込むコマンドです。通常、rmコマンドでファイルを削除すると、ファイルの内容は見かけ上は表示できなくなりますが、実際にはそのデータがディスク上に残ります。しかし、shredコマンドを使用すると、ディスク上のデータを繰り返しランダムデータで上書きすることでデータの回復ができなくなります。そのため、セキュリティを向上させることができます。

2 検証環境

AlmaLinux版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
AlmaLinux release 9.2 (Turquoise Kodkod)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
5.14.0-284.11.1.el9_2.x86_64

shredコマンドの版数は以下のとおりです。

[root@server ~]# shred --version
shred (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

作者 Colin Plumb。

3 オプション一覧

shredコマンドのオプションは以下のとおりです。

[root@server ~]# shred --help
使用法: shred [OPTION]... FILE...
Overwrite the specified FILE(s) repeatedly, in order to make it harder
for even very expensive hardware probing to recover the data.

If FILE is -, shred standard output.

Mandatory arguments to long options are mandatory for short options too.
  -f, --force    書き込みができるように必要に応じてアクセス権限を変更する
  -n, --iterations=N  N 回上書きを繰り返す (デフォルト: 3 回)
      --random-source=FILE  ランダムバイトのソースを FILE にする
  -s, --size=N   N で指定したバイト数 shred を行う (接尾辞として K, M, G など
                 が使用可能)
  -u             deallocate and remove file after overwriting
      --remove[=HOW]  like -u but give control on HOW to delete;  See below
  -v, --verbose  show progress
  -x, --exact    do not round file sizes up to the next full block;
                   this is the default for non-regular files
  -z, --zero     add a final overwrite with zeros to hide shredding
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

4 オプションなしで実行する方法

オプションなしでshredコマンドを実行すると、4096バイトのランダムデータを3回ファイルに上書きします。

テスト用ファイルを作成します。

[root@server ~]# echo "12345" > /tmp/test.txt

作成したテスト用ファイルを確認します。

[root@server ~]# cat /tmp/test.txt
12345

オプションを付けずにshredコマンドを実行します。

[root@server ~]# shred /tmp/test.txt

shredコマンドを実行すると。ファイルは残ったままですが、ファイルサイズが4096byteになっていることがわかります。ファイルの中身を確認すると、ランダムデータで書き換えられていることがわかります。

[root@server ~]# ls -l /tmp/test.txt
-rw-r--r--. 1 root root 4096  9月 28 19:42 /tmp/test.txt

shredコマンド実行時の様子をstraceコマンドで確認すると、/tmp/test.txtをオープンした後、4096バイトのランダムデータを/tmp/test.txtに3回書き込んでいることが確認できます。straceコマンドの使い方は、straceコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# strace -ttT -f -e trace=openat,write shred /tmp/test.txt
-snip
19:57:58.315029 openat(AT_FDCWD, "/tmp/test.txt", O_WRONLY|O_NOCTTY) = 3 <0.000460>
19:57:58.317684 write(3, "\313r\234\10\330\2669\r]\36/\252\25\254V:w\235\3245\3712\270u\26\343\216\276Y\2623P"..., 4096) = 4096 <0.000195>
19:57:58.319256 write(3, "\214W\337H\253,J\22A\227\260\7L\317\301O`;\21Q[\30\5{\301t\32\226\270&\1\332"..., 4096) = 4096 <0.000191>
19:57:58.321464 write(3, "\35\204*O\372\315Z\366\302\26\300L \337\200\247\275\274U\222Rl\343A\320}!\217\301\361S\272"..., 4096) = 4096 <0.000867>
19:57:58.325854 +++ exited with 0 +++

5 ランダムデータのサイズを指定する方法(-s)

-sオプションは、ファイルに書き込むランダムデータのサイズを指定するオプションです。デフォルトでは、ランダムデータのサイズは4096バイトです。

テスト用ファイルを作成します。

[root@server ~]# echo "12345" > /tmp/test.txt

作成したテスト用ファイルを確認します。

[root@server ~]# cat /tmp/test.txt
12345

8192バイトのランダムデータをファイルに書き込んでみました。この操作をstraceコマンドで確認すると、writeシステムコールの戻り値が8192であることから、8192バイトのランダムデータがファイルに書き込まれていることが分かります。

[root@server ~]# strace -ttT -f -e trace=openat,write shred -s 8192 /tmp/test.txt
-snip-
20:07:06.514961 openat(AT_FDCWD, "/tmp/test.txt", O_WRONLY|O_NOCTTY) = 3 <0.000048>
20:07:06.515322 write(3, "\36\10\\2aA", 6) = 6 <0.000096>
20:07:06.517121 write(3, "W\241\346\225\362\322", 6) = 6 <0.000042>
20:07:06.518447 write(3, ".\3414\201\301h", 6) = 6 <0.000036>
20:07:06.521435 write(3, "n\317\371\303}\217\22\277.z\33\354\244K\373\234\325T=\340\234n\262W\263t\274\301\4?\5\35"..., 8192) = 8192 <0.000078>
20:07:06.522752 write(3, "N%\265\3331:Mkj\345f\34V/\20\20\325\205\340\322U\376o\321\365\270Nt\250\3778\f"..., 8192) = 8192 <0.000051>
20:07:06.523538 write(3, "\301\206\240\313f\254\226aV\216\267h\307/E\215\22\375`.o\363urf\350\360\t\212\216\354S"..., 8192) = 8192 <0.000041>
20:07:06.524505 +++ exited with 0 +++

6 進捗状況を表示する方法(-v)

-vオプションは、shredコマンドの進捗状況を表示するオプションです。

テスト用ファイルを作成します。

[root@server ~]# echo "12345" > /tmp/test.txt

作成したテスト用ファイルを確認します。

[root@server ~]# cat /tmp/test.txt
12345

ファイルにランダムデータを3回書き込んでいることが分かります。

[root@server ~]# shred -v /tmp/test.txt
shred: /tmp/test.txt: 経過 1/3 (random)...
shred: /tmp/test.txt: 経過 2/3 (random)...
shred: /tmp/test.txt: 経過 3/3 (random)...

7 ファイルを削除する方法(-u)

-uオプションは、ファイルにランダムにデータを書き込んだ後、ファイルを削除するオプションです。

テスト用ファイルを作成します。

[root@server ~]# echo "12345" > /tmp/test.txt

作成したテスト用ファイルを確認します。

[root@server ~]# cat /tmp/test.txt
12345

-uオプションを指定してshredコマンドを実行します。

[root@server ~]# shred -v -u /tmp/test.txt
shred: /tmp/test.txt: 経過 1/3 (random)...
shred: /tmp/test.txt: 経過 2/3 (random)...
shred: /tmp/test.txt: 経過 3/3 (random)...
shred: /tmp/test.txt: 削除しています
shred: /tmp/test.txt: /tmp/00000000 に名前が変更されました
shred: /tmp/00000000: /tmp/0000000 に名前が変更されました
shred: /tmp/0000000: /tmp/000000 に名前が変更されました
shred: /tmp/000000: /tmp/00000 に名前が変更されました
shred: /tmp/00000: /tmp/0000 に名前が変更されました
shred: /tmp/0000: /tmp/000 に名前が変更されました
shred: /tmp/000: /tmp/00 に名前が変更されました
shred: /tmp/00: /tmp/0 に名前が変更されました
shred: /tmp/test.txt: 削除しました

テスト用に作成したファイルを確認すると、ファイルが削除されたことがわかります。

[root@server ~]# ls -l /tmp/test.txt
ls: '/tmp/test.txt' にアクセスできません: そのようなファイルやディレクトリはありません

8 ランダムデータの書き込み回数を指定する方法(-n)

-nオプションは、ランダムデータをファイルに書き込む回数を指定するオプションです。オプションを指定しないとランダムデータを3回ファイルに書き込みます。

テスト用ファイルを作成します。

[root@server ~]# echo "12345" > /tmp/test.txt

作成したテスト用ファイルを確認します。

[root@server ~]# cat /tmp/test.txt
12345

straceコマンドを使用して、ランダムデータをファイルに書き込む回数を確認してみました。テスト用ファイルをオープンした後、テスト用ファイルと同じサイズ(6バイト)のランダムデータを5回書き込んだ後、4096バイトのランダムデータを5回書き込んでいることが分かります。

[root@server ~]# strace -ttT -f -e trace=openat,write shred -n 5 /tmp/test.txt
-snip-
10:30:12.169526 openat(AT_FDCWD, "/tmp/test.txt", O_WRONLY|O_NOCTTY) = 3 <0.000160>
10:30:12.170725 write(3, "\317;\236\216\"-", 6) = 6 <0.000230>
10:30:12.172615 write(3, "\0\0\0\0\0\0", 6) = 6 <0.000339>
10:30:12.174522 write(3, "~\263J\277\214\360", 6) = 6 <0.000169>
10:30:12.176208 write(3, "\377\377\377\377\377\377", 6) = 6 <0.000202>
10:30:12.178187 write(3, "\265\300-\330kB", 6) = 6 <0.000238>
10:30:12.180110 write(3, "0\274\344\337\225*\221\225\10\320\360\200\273\10@\341tc\251\"`\26\30\326\3z\233elTB1"..., 4096) = 4096 <0.000167>
10:30:12.182488 write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 <0.000234>
10:30:12.184468 write(3, "\226\v\320\26\20\314\232B\371\345\233r:\217~D\37\206\30r\225h\334\241\351\340j\210\252\36\32\310"..., 4096) = 4096 <0.000183>
10:30:12.187589 write(3, "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377"..., 4096) = 4096 <0.000182>
10:30:12.189164 write(3, ".)\260^ U\30[+h!\263\206\3655\377\304\222\335j\4+@)\16Ij\273\210\n8\263"..., 4096) = 4096 <0.000357>
10:30:12.192114 +++ exited with 0 +++

9 ランダムデータで上書きをしたあと0で上書きする方法(-z)

-zオプションは、ランダムデータをファイルに書き込んだ後、最後にゼロをファイルに書き込むオプションです。

テスト用ファイルを作成します。

[root@server ~]# echo "12345" > /tmp/test.txt

作成したテスト用ファイルを確認します。

[root@server ~]# cat /tmp/test.txt
12345

-zオプションを指定してshredコマンドを実行します。このとき、-vオプションも使用してみます。ランダムデータをファイルに3回書き込んだ後、最後にゼロを書き込んでいることが分かります。

[root@server ~]# shred -v -z /tmp/test.txt
shred: /tmp/test.txt: 経過 1/4 (random)...
shred: /tmp/test.txt: 経過 2/4 (random)...
shred: /tmp/test.txt: 経過 3/4 (random)...
shred: /tmp/test.txt: 経過 4/4 (000000)...

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ