CentOS 7 建立 Clamav 本地更新來源

心得:

clamav 算是 Linux 普遍常用的防毒軟體

偶爾用來掃一些未知文件是蠻不錯的話

如果讓所有主機都對外去進行更新,會是相當浪費頻寬的

因此建立一台本地的更新網站,只透過一台出去同步

其他則是內網同步更新,這樣的作法有點像是建立本地的 yum server 或是 WSUS

不過在 Linux 上面,權限的設定會比防毒更有安全性的幫助

如果對於權限比較陌生。只要先記得千萬不要出現 777 這種權限

針對系統安全性,也可以參考一下 HIDS 的相關介紹

CentOS 7 安裝 Ossec Server (HIDS) (2019/07/24 更新內容)

CentOS 7 設定 Ossec Agent (2019/07/26 更新內容)

設定:

安裝套件庫 EPEL (Extra Packages for Enterprise Linux)

# yum install epel-release

安裝防毒軟體,或者到官網下載 source 檔案進行安裝也可以

# yum install clamav

編輯設定檔,註解或刪除裡面的 Example 字串

# vim /etc/freshclam.conf

設定更新來源(紅字請依照實際環境修改)

DatabaseMirror clamdb.kenwu.local

本地資料庫:

建立 perl

# vim clamdownloader.pl
#!/usr/bin/env perl
#
# File name: clamdownloader.pl
# Author: Frederic Vanden Poel
#
#############################################################################
#
use strict;
use warnings;

use Net::DNS;
my $clamdb="/tmp/clam";
# mirror where files such as daily-12133.cdiff exist
my $mirror="http://database.clamav.net";

# get the TXT record for current.cvd.clamav.net
my $txt = getTXT("current.cvd.clamav.net");

exit unless $txt;

chdir($clamdb) || die ("Can't chdir to $clamdb : $!\n");

# dump the record in a file
print "TXT from DNS: $txt\n";
open D, ">dns.txt";
print D "$txt";
close D;

# temp dir for wget updates
mkdir("$clamdb/temp");

# get what we need
my ( $clamv, $mainv , $dailyv, $x, $y, $z, $safebrowsingv, $bytecodev ) = split /:/, $txt ;

print "FIELDS main=$mainv daily=$dailyv bytecode=$bytecodev\n";

updateFile('main',$mainv);
updateFile('daily',$dailyv);
updateFile('bytecode',$bytecodev);

sub getTXT {
use Net::DNS;
my $domain = shift @_;
my $rr;
my $res = Net::DNS::Resolver->new;
my $txt_query = $res->query($domain,"TXT");
if ($txt_query) {
return ($txt_query->answer)[0]->txtdata;
} else {
warn "Unable to get TXT Record : ", $res->errorstring, "\n";
return 0;
}
}

sub getLocalVersion {
my $file=shift @_;
my $cmd="sigtool -i $clamdb/$file.cvd";
open P, "$cmd |" || die("Can't run $cmd : $!");
while (

) { next unless /Version: (\d+)/; return $1; } return -1; } sub updateFile { my $file=shift @_; my $currentversion=shift @_; my $old=0; if ( ! -e "$file.cvd" ) { warn "file $file.cvd does not exists, skipping\n"; } if ( ! -z "$file.cvd" ) { $old = getLocalVersion($file); if ( $old > 0 ) { print "$file old: $old current: $currentversion\n"; # mirror all the diffs for (my $count = $old + 1 ; $count &1`; } } else { warn "file $file.cvd version unknown, skipping cdiffs\n"; } } else { warn "file $file.cvd is zero, skipping cdiffs\n"; } return if ( $currentversion == $old ); # update the full file using a copy, then move back print `cp -v -a $file.cvd temp/$file.cvd 2>&1`; print `cd temp && wget -nH -nd -N -nv $mirror/$file.cvd 2>&1`; if ( -e "temp/$file.cvd" && ! -z "temp/$file.cvd" ) { if ( (stat("temp/$file.cvd"))[9] > (stat("$file.cvd"))[9] ) { print "file temp/$file.cvd is newer than $file.cvd\n"; print `mv -v temp/$file.cvd $file.cvd 2>&1`; } else { print "file temp/$file.cvd not touched by wget\n"; print `rm -v temp/$file.cvd`; } } else { warn "temp/$file.cvd is not valid, not copying back !\n"; unlink "temp/$file.cvd"; } } __END__

安裝 perl 套件與 nginx:

# yum install perl-Net-DNS nginx

修改 nginx 設定檔 (紅字請依照實際環境修改):

# vim /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name clamdb.kenwu.local;
location / {
access_log off;
error_log off;
root /usr/share/nginx/html/clamdb;
index index.html index.htm;
autoindex on;
}
}

啟動 nginx:

# systemctl start nginx

設定防火牆 80 port:

# firewall-cmd --zone=public --add-port=80/tcp --permanent && firewall-cmd --reload

接著更新病毒庫看看

# freshclam

如果成功如下圖

CentOS 7 建立 Clamav 本地更新來源-01.png

參考來源:

https://www.clamav.net/documents/private-local-mirrors

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s