AFICKをインストールする方法をまとめました。
AFICKを使用するには以下が必要です。
- Perl(パール)
- AFICK(アフィック)
AFICKとは
AFICKはHIDSの一つで、ファイルの改ざん検知を行います。
Perlをインストールする
AFICKはPerlで動作するため、まずはAFICKを動作させたい環境にPerlをインストールします。
WindowsにPerlをインストールする
Windowsで使えるPerlは以下です。
- ActiveState Perl
- Strawberry Perl(ActivePerl)
ActiveState Perl
Strawberry Perl
LinuxにAFICKをインストールする
以下のコマンドを実行してPerlをインストールします。
yum install perl
以下のコマンドを実行してPerlがインストールされたことを確認します。
perl -v
AFICKをインストールする
AFICKをインストールします。
WindowsにAFICKをインストールする
AFICKはPerlで書かれたプログラムです。
LinuxにAFICKをインストールする
sourceforge.netにあるパッケージからLinuxにAFICKをインストールします。以下のコマンドはこの記事を作成している段階での最新版、3.8.1をインストールするコマンドです。
yum install http://jaist.dl.sourceforge.net/project/afick/afick/3.8.1/afick-3.8.1-1.noarch.rpm
.rpmファイルを直接ダウンロードするには以下のリンクから行います。
インストール出来ていることを以下のコマンドで確認します。
afick --version
AFICKのベースラインとなるAFICKのデータベースを作成する
AFICKをインストールしたら、ファイルの改ざん等を検知するためにAFICKのデータベースを作成します。
afick --init
もしくは以下のコマンドでも可能です。
afick -i
Windowsでは以下のコマンドで実施します。
cd C:\Program Files (x86)\afick
afick.pl --init
以下でも実行可能です。
afick.pl -i
afick.pl -c windows.conf -i
Linuxの場合以下でも実行可能です。
afick -c afick.conf -i
afick -c afick.conf --init
以下Linuxでの実行例です。
[root@localhost ~]# afick -i
# Afick (3.8.1) init at 2024/11/02 15:44:29 with options (/etc/afick.conf):
# archive:=/var/lib/afick/archive
# database:=/var/lib/afick/afick
# exclude_prefix:=__pycache__
# exclude_suffix:=log LOG html htm HTM txt TXT xml hlp pod chm tmp old bak fon ttf TTF bmp BMP jpg JPG gif png ico wav WAV mp3 avi pyc
# history:=/var/lib/afick/history
# max_checksum_size:=10000000
# running_files:=1
# timing:=1
# dbm:=Storable
# #################################################################
# MD5 hash of /var/lib/afick/afick => DrmylBa4SRo2YMtmlQPWnQ
# Hash database created successfully. 26495 files entered.
# user time : 10.94; system time : 5.27; real time : 37
このコマンドで作成したデータベースは、今のファイルの状態からデータベースを作成したものになります。このデータベース内に保存されているデータから差分が出た際に、AFICKのログにその結果が出力されます。
作成したデータベースは以下に保存されます。
Windowsの場合
C:\Program Files (x86)\afick\database
Linuxの場合
/var/lib/afick/afick.db
C:\Program Files (x86)\afick\windows.conf(Windowsの場合)、/etc/afick.conf(Linuxの場合)の以下のパラメータを編集することでデータベースの保存先を変更可能です。
database:=/var/lib/afick/afick
実際に検知するか動作確認
以下のコマンドを実行して、先ほど「afick -i」コマンドで作成したデータベースから差分があるかを以下のコマンドで確認します。
afick -k
Windowsの場合は以下のコマンドを実行します。
cd C:\Program Files (x86)\afick
afick.pl --compare
以下のコマンドでも問題ありません。
afick --compare
afick -c afick.conf --compare
afick -c afick.conf -k
ここで実行した実行結果はインストール時のデフォルトで以下のフォルダに格納されます。
/var/lib/afick/archive
Windowsの場合は以下に格納されます。
C:\Program Files (x86)\afick\archive
AFICKのデータベースをアップデートする
AFICKのデータベースは以下のコマンドでアップデートすることができます。
afick -u
Windowsの場合は以下のコマンドで行います。
cd C:\Program Files (x86)\afick
afick.pl --update
以下のコマンドでも問題ありません。
afick --update
afick -c afick.conf --update
AFICKを運用する
AFICKをインストールすると、以下のファイルが作られ、毎日3時頃に定期的にAFICKが起動してファイルスキャンを実施します。
/etc/cron.daily/afick_cron
インストール時のデフォルトでは、毎日データベースがアップデートされるため、以下の記載を-uを-kに変えることで毎日データベースが更新されない状態になります。
# the default action is "update" (-u), you can also use "compare" (-k)
ACTION="-u"
Windowsで定期的にAFICKを起動するにはタスクスケジューラに以下のファイルを登録します。
C:\Program Files (x86)\afick\afick_scan.cmd
以下のファイルにWindowsのAFICKスキャン実施時のコードが記載されています。
C:\Program Files (x86)\afick\afick_planning.pl
–updateにデフォルトでなっているので、–compareに書き換えることでAFICKスキャンを実施してもデータベースがアップデートされなくなります。
AFICKのデータベースをアップデートする
先述の通り、以下のコマンドでAFICKのデータベースはアップデートができます。定期的にデータベースをアップデートしてAFICKのデータベースを更新します。
afick -u
AFICKの定義ファイル
/etc/afick.confにAFICKの定義を記載します。ここでは、検知対象から除外するディレクトリを指定することなどができます。
[root@localhost ~]# cat /etc/afick.conf
# afick config sample file
# $Id$
# see afick.conf documentation for more informations
####################
# directives section
####################
# binary values can be : yes/1/true or no/0/false
# database : name with full path to database file
database:=/var/lib/afick/afick
# history : full path to history file
history := /var/lib/afick/history
# archive : full path to directory for archived results
archive := /var/lib/afick/archive
# report_url : where to send the result : stdout/stderr/null
report_url := stdout
# report_syslog : send output to syslog ?
report_syslog := no
# mask_sysupdate : report packages update
mask_sysupdate := no
# verbose : (obsolete) boolean value for debugging messages
# use debug parameter below
verbose := no
# debug : set a level of debugging messages, from 0 (none) to 4 (full)
debug := 0
# warn_dead_symlinks : boolean : if set, warn about dead symlinks
warn_dead_symlinks := no
# follow_symlinks : boolean : if set, do checksum on target file (else on target file name)
follow_symlinks := no
# allow_overload : boolean : if set, allow to overload rules (the last rule wins), else put a warning
allow_overload := yes
# report_context : boolean : if set, display all changed attributes, not just those selected by rules
report_context := no
# report_full_newdel : boolean : if set, report all changes, if not set, report only a summary on top directories
report_full_newdel := no
# report_summary : boolean ; if set, report the summary section
report_summary := yes
# warn_missing_file : boolean : is set, warn about selected files (in this config), which does not exist
warn_missing_file := no
# running_files : boolean : if set, warn about files changed during a program run
running_files := yes
# timing : boolean : if set, print timing statistics about the job
timing := yes
# ignore_case : boolean : if set, ignore case on file name
ignore_case := no
# max_checksum_size : numeric : only compute checksum on first max_checksum_size bytes ( 0 means unlimited)
max_checksum_size := 10000000
# allow_relativepath : boolean : if set, afick files, config and databases are stored as relative path
allow_relativepath := 0
# utc_time : boolean; if set display date in utc time, else in local time
utc_time := 0
# only_suffix : list of suffix to scan (and just this ones) : is empty (disabled) by default
# not very usefull on unix, but is ok on windows
# this will speed up the scan, but with a lesser security
# only_suffix :=
# the 3 next directives : exclude_suffix exclude_prefix exclude_re
# can be written on several lines
# exclude_suffix : list of suffixes to ignore
# text files
exclude_suffix := log LOG html htm HTM txt TXT xml
# help files
exclude_suffix := hlp pod chm
# old files
exclude_suffix := tmp old bak
# fonts
exclude_suffix := fon ttf TTF
# images
exclude_suffix := bmp BMP jpg JPG gif png ico
# audio
exclude_suffix := wav WAV mp3 avi
# python
exclude_suffix := pyc
# exclude_prefix : list of prefixes to ignore
exclude_prefix := __pycache__
# exclude_re : a file pattern (using regex syntax) to ignore (apply on full path)
# one pattern by line
#exclude_re :=
#################
# macros section
#################
# used by cron job (afick_cron)
# define the mail adress to send cron job result
@@define MAILTO root@localhost
# truncate the result sended by mail to the number of lines (avoid too long mails)
@@define LINES 1000
# REPORT = 1 to enable mail reports, =0 to disable report
@@define REPORT 1
# VERBOSE = 1 to have one mail by run, =0 to have a mail only if changes are detected
@@define VERBOSE 0
# define the nice value : from 0 to 19 (priority of the job)
@@define NICE 18
# = 1 to allow cron job, = 0 to suppress cron job
@@define BATCH 1
# (optionnal, for unix) specify a file system to mount before the scan
# it must be defined in /etc/fstab
#@@define MOUNT /mnt/dist
# if set to 0, keep all archives, else define the number of days to keep
# with the syntaxe nS , n for a number, S for the scale
# (d for day, w for week, m for month, y for year)
# ex : for 5 months : 5m
@@define ARCHIVE_RETENTION 0
# send nagios messages by NSCA (= 1 to allow, = 0 to block)
@@define NAGIOS 0
# address of the nagios server to send messages to
@@define NAGIOS_SERVER my.nagios.server.org
# NSCA configuration file
# @@define NAGIOS_CONFIG /etc/send_nsca.cfg
# name used for nagios passive check on the nagios server side
@@define NAGIOS_CHECK_NAME Another File Integrity Checker
# number c of the changes that are considered critical => nagios state CRITICAL
# (0 changes => nagios state OK; 0> and <c changes => nagios state WARNING)
@@define NAGIOS_CRITICAL_CHANGES 2
# path to nsca binary
# @@define NAGIOS_NSCA /usr/sbin/send_nsca
###############
# alias section
###############
# action : a list of item to check :
# md5 : md5 checksum
# sha1 : sha-1 checksum
# sha256 : sha-256 checksum
# sha512 : sha-512 checksum
# d : device
# i : inode
# p : permissions
# n : number of links
# u : user
# g : group
# s : size
# b : number of blocks
# m : mtime
# c : ctime
# a : atime
# acl : acl
#all: p+d+i+n+u+g+s+b+m+c+md5+acl
#R: p+d+i+n+u+g+s+m+c+md5
#L: p+d+i+n+u+g
#P: p+n+u+g+s+md5
#E: ''
# action alias may be configured with
# your_alias = another_alias|item[+item][-item]
# all is a pre-defined alias for all items except "a"
DIR = p+i+n+u+g
ETC = p+d+u+g+s+md5
Logs = p+n+u+g
MyRule = p+d+n+u+g+s+b+md5
##############
# file section
##############
# 3 syntaxe are available :
# file action
# to scan a file/directory with "action" parameters
# ! file
# to remove file from scan
# = directory action
# to scan the directory but not sub-directories
# file with blank character have to be quoted
#
# action is the list of attribute used to detect a change
= / DIR
/bin MyRule
/boot MyRule
# ! /boot/map
# ! /boot/System.map
/dev p+n
# ! /dev/.udev/db
# ! /dev/.udev/failed
# ! /dev/.udev/names
# ! /dev/.udev/watch
! /dev/bsg
! /dev/bus
! /dev/pts
! /dev/shm
# to avoid problems with pending usb
# = /dev/scsi p+n
/etc ETC
/etc/mtab ETC - md5 - s
/etc/adjtime ETC - md5 -s
# /etc/aliases.db ETC - md5 -s
# /etc/mail/statistics ETC - md5 -s
/etc/motd ETC
# /etc/ntp/drift ETC - md5 -s
# /etc/urpmi/urpmi.cfg Logs
# /etc/urpmi/proxy.cfg Logs
# /etc/prelink.cache ETC - md5 - s
! /etc/cups
# ! /etc/map
# ! /etc/postfix/prng_exch
# ! /etc/samba/secrets.tdb
# ! /etc/webmin/sysstats/modules/
# ! /etc/webmin/package-updates/
# ! /etc/webmin/system-status/
/lib MyRule
/lib64 MyRule
/lib/modules MyRule
# /lib/dev-state MyRule -u
/root MyRule
# ! /root/.viminfo
! /root/.bash_history
# ! /root/.mc
# ! /root/tmp
! /root/.cache
/sbin MyRule
/usr/bin MyRule
/usr/sbin MyRule
/usr/lib MyRule
! /usr/lib/.build-id/
! /usr/lib/fontconfig/cache/
/usr/lib64 MyRule
/usr/local/bin MyRule
/usr/local/sbin MyRule
/usr/local/lib MyRule
/var/ftp MyRule
/var/log Logs
# ! /var/log/journal
= /var/log/afick Logs
# ! /var/log/ksymoops
# /var/www MyRule
# ! /var/www/html/snortsnarf
############################################
# to allow easier upgrade, my advice is too separate
# the default configuration file (above) from your
# local configuration (below).
# default configuration will be upgraded
# local configuration will be kept
########## put your local config below ####################