Friday, March 21, 2014

Perl 을 이용한 file의 무결성 확인




 자신의 PC에서 어떠한 중요한 화일이 있다면 이 화일이 누군가에 의해서 변경되는것을
원치 않을 것이다. 혹은 의도하지 않은 어떤 변경으로 인해 이 화일이 변경되었는지
점검을 하고 싶을 수도 있고, 해킹이 되었는지 확인 하고 싶을것이다.

또는 소프트웨어 업그레이드가 어떠한 부분들을 건드리는지 궁금하다면 아래의
Perl Script를 사용하면 도움이 될것이다.

디렉토리 트리를 검색하기 위해 File::Find 모듈을 사용한다.

======================================
use strict;
use warnings;
use File::Find;
use Digest::MD5;
use Storable qw(nstore retrieve);

# 변경정보를 담는 화일을 생성
my $info_file_name = ".change.info";

#지정한 디렉토리내의 각 화일의 메시지 다이제스트 값을 생성 저장
sub md5($){
my $cur_file = shift;

open(FILE, $cur_file) or return ("");
binmode(FILE);
my $result = Digest::MD5->new->addfile(*FILE)->hexdigest;
close (FILE);
return ($result);
}

#최초 혹은 마지막으로 실행했을때의 화일의 md5값(비교대상)
my $file_info;

#현재 화일의 md5 hash값
my %real_info;

my @dir_list = @ARGV;

#화일이 있다면 정보를 읽어 들인다.
if (-f $info_file_name) {
$file_info = retrieve($info_file_name);
}

if ($#dir_list < 0){
print "Nothing to look at\n";
exit (0);
}

find( sub{
-f && ($real_info{$File::Find::name} = md5($_));
},@dir_list
);


#예전 화일의 md hash값과 현재의 md hash 값을 비교하여
# 새로 생성되었는지, 변경되었는지, 삭제 되었는지 확인.
foreach my $file (sort keys %real_info) {
if (not defined($file_info->{$file})){
print "New file: $file\n";
} else {
if ($real_info{$file} ne $file_info->{$file}){
print "Changed: $file\n";
}
delete $file_info->{$file};
}
}

foreach my $file (sort keys %$file_info){
print "Deleted: $file\n";
}

nstore \%real_info, $info_file_name;
========================================

한가지 단점은 실행할때마다 $file_info->{} 해시값이 %real_info 해시값으로
대체가 된다는 점이다. 즉 실행할 때 마다 현재의 값을 저장함으로 이전값과의
비교는 안된다는 점이다.
비교를 위해 실행한 후에는 그 결과값을 잘 저장을 해둬야 한다는 말씀!

무결성이 중요한 문서의 경우 이런 방법으로 문서의 위,변조를 확인 할 수 있다.













No comments:

Post a Comment