- 1 shredコマンドとは?
- 2 検証環境
- 3 オプション一覧
- 4 オプションなしで実行する方法
- 5 ランダムデータのサイズを指定する方法(-s)
- 6 進捗状況を表示する方法(-v)
- 7 ファイルを削除する方法(-u)
- 8 ランダムデータの書き込み回数を指定する方法(-n)
- 9 ランダムデータで上書きをしたあと0で上書きする方法(-z)
- Y 参考図書
- Z 参考情報
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)...
Y 参考図書
TECHNICAL MASTER はじめてのAlmaLinux 9 & Rocky Linux 9 Linuxサーバエンジニア入門編
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ