Bacula 改ざん検知機能の検証

Baculaは統合バックアップツールですが、公式HPを見ると改ざん検知機能もあるので、今回はその検証を行います。
公式HPの機能説明ページ

機能としては、取得済みのカタログデータとジョブ稼働時のカタログデータを比較することで差分を検出しています。
差分・増分バックアップの判定に必須の機能なので、以前からあった機能を人間が見て分かるように手を加えて出力しているわけです。

改ざん検知に必要なBaculaコンポーネントはバックアップに使用する場合と同じです。
本研究所のBacula導入記事をご確認ください。

公式説明に従って監視設定をしていきます。
既にバックアップ用の初期設定を完了している場合、変更が必要なのはマスターサーバの/etc/bacula/bacula-dir.confのみです。

念のため作業前にバックアップを取得して監視ジョブを設定していきます。

# cp -p /etc/bacula/bacula-dir.conf /etc/bacula/bacula-dir.conf.yyyymmdd

# vi /etc/bacula/bacula-dir.conf

Schedule {
  Name = "VerifyCheck"
  Run = Level=Catalog sun-sat at 12:00 ←改ざんチェックジョブの稼働タイミングを指定します
  Run = Level=Catalog sun-sat at 13:00
}

Job {
  Name = "VerifyServer" ←ジョブ名を指定します
  Type = Verify
  Level = Catalog
  Client=test-server
  FileSet = "VerifySet"
  Messages = Standard
  Storage = File1
  Pool = Default
  Schedule = "VerifyCheck"
}

FileSet {
  Name = "VerifySet"
  Include {
    Options {
      verify= pins1 ←pinを指定します
      signature = SHA1 ←ハッシュ関数を指定します
    }
    File = /var/www/html ←監視対象ディレクトリを指定
  }
  Exclude {  ←監視除外ディレクトリを指定
  }
}

Client {
  Name = test-server
  Address = 192.168.153.129
  FDPort = 9102
  Catalog = MyCatalog
  Password = "BaculaPW#2"
  File Retention = 60 days
  Job Retention = 6 months
  AutoPrune = yes
}

Storage {
  Name = File1
  Address = 192.168.153.130
  SDPort = 9103
  Password = "BaculaPW#3"
  Device = FileChgr1
  Media Type = File1
  Maximum Concurrent Jobs = 10
}

Pool {
  Name = Default
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Maximum Volume Bytes = 50G
}

Messages {
  Name = Standard
  mailcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: %t %e of %c %l\" %r"
  operatorcommand = "/usr/sbin/bsmtp -h localhost -f \"\(Bacula\) \<%r\>\" -s \"Bacula: Intervention needed for %j\" %r"
  mail = root@localhost = all, !skipped
  operator = root@localhost = mount
  console = all, !skipped, !saved
  append = "/var/log/bacula/bacula.log" = all, !skipped
  catalog = all
}

Catalog {
  Name = MyCatalog
  dbname = "bacula"; dbuser = "bacula"; dbpassword = "<strong>p@ssw0rd</strong>"
}

 

作成したジョブを稼働させる前に、カタログデータの初期化を行う必要があります。

# bconsole

* run

Connecting to Director 192.168.153.129:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
*run
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
A job name must be specified.
The defined Job resources are:
1: WEBWeeklyBackup
2: APWeeklyBackup
3: DBWeeklyBackup
4: BackupCatalog
5: WEBRestore
6: APRestore
7: DBRestore
8: VerifyServer
Select Job resource (1-8): 8 ←作成した監視ジョブ番号を入力
Run Verify Job
JobName: VerifyServer
Level: Catalog
Client: test-server
FileSet: VerifySet
Pool: File (From Job resource)
Storage: File1 (From Job resource)
Verify Job: 
Verify List: /var/spool/bacula/%c.bsr
When: 2017-01-25 16:17:28
Priority: 10
OK to run? (yes/mod/no): mod ←変更が必要なのでmodを入力
Parameters to modify:
1: Level
2: Storage
3: Job
4: FileSet
5: Client
6: When
7: Priority
8: Pool
9: Verify Job
Select parameter to modify (1-9): 1 ←1を入力
Levels:
1: Initialize Catalog
2: Verify Catalog
3: Verify Volume to Catalog
4: Verify Disk to Catalog
5: Verify Volume Data
Select level (1-5): 1 ←1を入力
Run Verify Job
JobName: VerifyServer
Level: Catalog
Client: test-server
FileSet: VerifySet
Pool: File (From Job resource)
Storage: File1 (From Job resource)
Verify Job: 
Verify List: /var/spool/bacula/%c.bsr
When: 2017-01-25 16:17:28
Priority: 10
OK to run? (yes/mod/no): yes ←yesを入力
Job queued. JobId=109
You have messages.

しばらく待ってからジョブステータスを確認します。

* status dir

bacula-dir Version: 7.4.4 (20 September 2016) x86_64-redhat-linux-gnu redhat 
Daemon started 25-Jan-17 15:59, conf reloaded 25-Jan-2017 15:59:37
Jobs: run=1, running=1 mode=0
Heap: heap=278,528 smbytes=84,576 max_bytes=84,576 bufs=336 max_bufs=337

Scheduled Jobs: 
Level Type Pri Scheduled Job Name Volume
===================================================================================
Incremental Backup 10 26-Jan-17 06:00 WEBWeeklyBackup Vol-0002
Incremental Backup 10 26-Jan-17 06:00 DBWeeklyBackup Vol-0002
Incremental Backup 10 26-Jan-17 06:30 APWeeklyBackup Vol-0002
Full Backup 11 26-Jan-17 07:00 BackupCatalog Vol-0002
Catalog Verify 10 26-Jan-17 16:00 VerifyServer
====

Running Jobs: Console connected at 25-Jan-17 16:16 JobId Type Level Files Bytes Name Status
======================================================================
109 Veri Init 1,031 0 VerifyDpServer is running
====

Terminated Jobs:
 JobId Level Files Bytes Status Finished Name
====================================================================
101 Incr 2 0 OK 24-Jan-17 06:01 WEBWeeklyBackup
102 Incr 268 2.828 M OK 24-Jan-17 06:01 DBWeeklyBackup
103 Incr 2 2.995 M OK 24-Jan-17 06:31 APWeeklyBackup
104 Full 1 10.33 M OK 24-Jan-17 07:01 BackupCatalog
105 Incr 23 178.4 K OK 25-Jan-17 06:01 WEBWeeklyBackup
106 Incr 0 0 OK 25-Jan-17 06:01 DBWeeklyBackup
107 Incr 2 3.062 M OK 25-Jan-17 06:31 APWeeklyBackup
108 Full 1 10.34 M OK 25-Jan-17 07:01 BackupCatalog
109 Init 3,249 26.21 M OK 25-Jan-17 16:19 VerifyServer ←カタログ初期化ジョブが成功していることを確認
====

これでbaculaの方は準備が整いました。

検知テストのため、クライアントの監視ディレクトリ配下に以下のファイル・操作を用意しておきます。
・ファイルの新規作成
・既存ファイルの変更
・既存ファイルの削除

準備がすべて整ったので、監視ジョブを稼働させます。
# bconsole
* run

Connecting to Director 192.168.153.129:9101
1000 OK: 102 bacula-dir Version: 7.4.4 (20 September 2016)
Enter a period to cancel a command.
*run
Automatically selected Catalog: MyCatalog
Using Catalog "MyCatalog"
A job name must be specified.
The defined Job resources are:
1: WEBWeeklyBackup
2: APWeeklyBackup
3: DBWeeklyBackup
4: BackupCatalog
5: WEBRestore
6: APRestore
7: DBRestore
8: VerifyServer
Select Job resource (1-8): 8 ←監視ジョブ番号を入力
Run Verify Job
JobName: VerifyServer
Level: Catalog
Client: test-server
FileSet: VerifySet
Pool: File (From Job resource)
Storage: File1 (From Job resource)
Verify Job: 
Verify List: /var/spool/bacula/%c.bsr
When: 2017-01-25 16:17:28
Priority: 10
OK to run? (yes/mod/no): yes ←yesを入力

ジョブ結果ログを確認します。

# tail -f /var/log/bacula/bacula.log

または

# bconsole
* messages

25-Jan 18:50 bacula-dir JobId 123: New file: /var/www/html/test2
25-Jan 18:50 bacula-dir JobId 123: File: /var/www/html/README.txt.org
25-Jan 18:50 bacula-dir JobId 123: st_ino differ. Cat: 134868071 File: 134868090
25-Jan 18:50 bacula-dir JobId 123: st_size differ. Cat: 5382 File: 5386
25-Jan 18:50 bacula-dir JobId 123: SHA1 digest differs. File=jLDXZLHvAPCa3Yujg+Jcn45wJ0Q Cat=NnMnqVO7lzrp2KxJEZ2BSgRj7og
25-Jan 18:50 bacula-dir JobId 123: Warning: The following files are in the Catalog but not on disk:
25-Jan 18:50 bacula-dir JobId 123: /var/www/html/test
25-Jan 18:50 bacula-dir JobId 123: Bacula bacula-dir 7.4.4 (202Sep16):
Build: x86_64-redhat-linux-gnu redhat 
JobId: 123
Job: VerifyTestServer.2017-01-25_18.50.00_06
FileSet: VerifySet
Verify Level: Catalog
Client: test-server
Verify JobId: 120
Verify Job: 
Start time: 25-Jan-2017 18:50:02
End time: 25-Jan-2017 18:50:13
Files Examined: 3,254
Non-fatal FD errors: 0
FD termination status: OK
Termination: Verify Differences

新規作成、変更、削除をすべて検知成功しています。

定期的にチェックするのであれば、/etc/bacula/bacula-dir.confにジョブの稼働タイミングを入力してメッセージの転送設定をすればOKです。

変更内容の確認後には、忘れずにカタログの初期化を行いましょう。

初期化しないと、ジョブ稼働毎に同じ検知内容を含むアラートメッセージが出ます。

 

まとめ

・Baculaはバックアップ、改ざん検知どちらもできる、専用のスクリプトを組めば改ざん検知⇒バックアップから復旧まで全自動でできそうです。

・改ざん検知を定期運用するのであれば、カタログ初期化のスクリプトもあると便利そうです。

 

今回の検証はここまで。