treeコマンドで定期的なファイルのチェックをする

セキュリティ

今回は少しだけ技術的な話題について記事にしてきます。

個人的な見解ですが、自社や自分の管理するWebアプリケーションの管理する方法として中々良いものではないかと考えていますので、興味がある方は読んで行って貰えると嬉しいです。

treeコマンドとは?

フォルダ内のサブフォルダやファイルをツリー表示で出力できるようになります!以上!

これだけのコマンドです。ちなみにWindowsでもLinuxでもどちらでも使用することが可能です。

windowsのコマンドプロンプトを立ち上げて「tree」と入力すれば出力されると思います。(私のwindows10では出てきました。)

今回はLinux(Ubuntu18)で使用していきたいと思います。

環境準備としては、このブログを始めたことに記事にした以下を参照していただければと思います。

基本的な検証環境を作ろう!Ubuntu 18でLAMP環境を作るよ!①

なお、今回は検証用のCMSとしてWordPressを動作させています。なぜCMSを動かしているかは後にわかると思います。(記事の題名を見ればわかりますね・・・)

まずは、Ubunts18では初期状態でtreeコマンドを使用できないのでインストールします。

$ sudo apt install tree
#treeコマンドのインストール
$tree --help
#ヘルプの表示
usage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-H baseHREF] [-T title ]
        [-L level [-R]] [-P pattern] [-I pattern] [-o filename] [--version]
        [--help] [--inodes] [--device] [--noreport] [--nolinks] [--dirsfirst]
        [--charset charset] [--filelimit[=]#] [--si] [--timefmt[=]]
        [--sort[=]] [--matchdirs] [--ignore-case] [--] []
  ------- Listing options -------
  -a            All files are listed.
  -d            List directories only.
  -l            Follow symbolic links like directories.
  -f            Print the full path prefix for each file.
  -x            Stay on current filesystem only.
  -L level      Descend only level directories deep.
  -R            Rerun tree when max dir level reached.
  -P pattern    List only those files that match the pattern given.
  -I pattern    Do not list files that match the given pattern.
  --ignore-case Ignore case when pattern matching.
  --matchdirs   Include directory names in -P pattern matching.
  --noreport    Turn off file/directory count at end of tree listing.
  --charset X   Use charset X for terminal/HTML and indentation line output.
  --filelimit # Do not descend dirs with more than # files in them.
  --timefmt  Print and format time according to the format .
  -o filename   Output to file instead of stdout.
  -------- File options ---------
  -q            Print non-printable characters as '?'.
  -N            Print non-printable characters as is.
  -Q            Quote filenames with double quotes.
  -p            Print the protections for each file.
  -u            Displays file owner or UID number.
  -g            Displays file group owner or GID number.
  -s            Print the size in bytes of each file.
  -h            Print the size in a more human readable way.
  --si          Like -h, but use in SI units (powers of 1000).
  -D            Print the date of last modification or (-c) status change.
  -F            Appends '/', '=', '*', '@', '|' or '>' as per ls -F.
  --inodes      Print inode number of each file.
  --device      Print device ID number to which each file belongs.
  ------- Sorting options -------
  -v            Sort files alphanumerically by version.
  -t            Sort files by last modification time.
  -c            Sort files by last status change time.
  -U            Leave files unsorted.
  -r            Reverse the order of the sort.
  --dirsfirst   List directories before files (-U disables).
  --sort X      Select sort: name,version,size,mtime,ctime.
  ------- Graphics options ------
  -i            Don't print indentation lines.
  -A            Print ANSI lines graphic indentation lines.
  -S            Print with CP437 (console) graphics indentation lines.
  -n            Turn colorization off always (-C overrides).
  -C            Turn colorization on always.
  ------- XML/HTML/JSON options -------
  -X            Prints out an XML representation of the tree.
  -J            Prints out an JSON representation of the tree.
  -H baseHREF   Prints out HTML format with baseHREF as top directory.
  -T string     Replace the default HTML title and H1 header with string.
  --nolinks     Turn off hyperlinks in HTML output.
  ---- Miscellaneous options ----
  --version     Print version and exit.
  --help        Print usage and this help message and exit.
  --            Options processing terminator.

これでLinux(Ubuntu)でもtreeコマンドが使用できるようになりました。

ディレクトリ構造そのものの比較を行う

これが非常に良いなと考えているのは、ディレクトリ構造をツリーで取得できることです。

例えば、CMSを構築したとします。昨今ではバックドアによる情報漏洩も多数発生しています。以下は少し前に問題になった事件ですね。

GMO-PGの情報流出、「脆弱性対応やリスク管理に問題あり」と報告書で指摘

これについては定期的に公開ディレクトリのチェックをしていれば防げたという見解もあるかと思います。(個人的な感想です)

例えば公開領域のtreeを取得しておいて定期的にチェックすることで、不正なファイルが置かれた場合(バックドアを設置された場合)に対応がすぐにできる可能性があります。

例えば・・・

構築した当初のディレクトリ構造を以下のように取得したとします。

$ tree -f /var/www/html/wordpress/ -o test1.txt
#ワードプレスで構築した当初の構造を取得しtest1.txtで保存

それからしばらくたった後に再度同じようにディレクトリ構造を取得します。

$ tree -f /var/www/html/wordpress/ -o test2.txt
#運用後しばらく経過後の構造を取得しtest2.txtで保存

上記で取得した「test1.1txt」と「test2.txt」を今度はdiffコマンド(ファイルの差分を出力)で比較すると以下のようになります。(なお、検証のためわざと適当なディレクトの下にphpファイルを置いてあります。)

$ diff test1.txt test2.txt
#test1.txtとtest2.txtの差分を出力する以下が結果
1892a1893
> x?? tqq /var/www/html/wordpress/wp-includes/vul.php
1926c1927
< 180 directories, 1743 files
---
> 180 directories, 1744 files

上記のように「/var/www/html/wordpress/wp-includes/」配下に「vul.php」ができていることが分かります。(私が作成したファイルですが・・・)

最後に

今回の話題では、わざわざ「tree」コマンドを使用しなくても「find」コマンドでできるという意見もあると思います。

また、画像ファイル等が置かれるサイト等では爆発的にファイルも増えていくのでチェックも難しいという意見も出てくるかもしれません(こちらの場合はオプションでなんとかもなりそうですが・・・)

ただ、今後は情報漏洩などの対応を何かしらの方法で実施していくことが大規模サイト、小規模サイトに関わらず必要になっていきます。

皆様の運用の何かしらの参考になればと思います。

不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。

コメント