ClamAV kasutamine
Sissejuhatus
ClamAV töötab tasuta internetis jagatava viiruste andmebaasiga kusjuures lisaks kasutatakse ka C4S aadressil http://c4s.pikker.ee/ olevaid reegleid. Põhimõtteliselt sobib kasutada süsteemi, milles on üks clamd protsess, aga praktiliselt võivad sellisel juhul SMTP kasutajad vahel saada veateateid. Sellepärast kirjeldataks käesolevas tekstis koormusjaotatud clamd pidamist.
Lisaks käesolevale tekstile kirjeldatakse muudes tekstides spetsiifilisi kasutusjuhtumeid
Tööpõhimõte
Kuna ClamAV töötamisele on iseloomulik, et viiruste andmebaasi mällu lugemise ajal teenus hästi ei tööta, siis lahenduseks on kasutada mitut clamd deemoni eksemplari ja nad loavad oma andmestikku mällu erineval ajal. Ning clamd teenuse kasutamine on moel või teisel nö koormusjaotatud (nt clamav-milter oskab seda)
Mitme clamd eksemplari kasutamiseks on üldiselt sellised võimalused
- sama operatsioonisüsteemi sees käivitada mitu clamd protsessi, mis kasutavad erinevaid käivitusskripte, pid faile, viiruste andmestikku sisald avaid katalooge jne - tundub, et seda ei olegi teha nii lihtne kuna suhteliselt tugevalt on hard-codetud, et andmestik asub /var/lib/clamav kataloogis
- sama operatsioonisüsteemi sees käivitada chroot keskkondadest erinevad clamd protsessid - tundub, et nt schroot abil ei ole see nii mugav kuna käivitusskript tapab ära kõik töötavad clamd nimelised protsessid
- kasutatakse mitut operatsioonisüstteemi, igas oma clamd protsess - kohmakas, aga toimib
internet internet | | __|__ __|__ | | postfix + clamav-milter | | väljuv posti smtp relee |_____| |_____| | | | | ---|-------------|----------------|--------------|------------|---- | | | __|__ __|__ __|__ | | | | | | |_____| |_____| |_____| clamav-1 clamav-2 dovecot port 3310/tcp port 3310/tcp
kus
- postfix + clamav-milter arvuti võtab internetist saabuvad kirjad vastu
- clamav-milter on seadistatud kasutama clamav-1 ja clamav-2 arvutitest töötavad clamd protsesse, kasutab seda, mis parasjagu töötab (sh annab vastuse enne timeout aega)
- dovecot on postkasti arvuti kohalikule epostile
- kui väljuva eposti jaoks peetakse vajalikuks pidada omaette releed, siis nii on
Tarkvara paigaldamine
Tarkvara paigaldamiseks sobib öelda
# apt-get install clamav-daemon
Paigaldamise tulemusena tekivad failisüsteemi
- /etc/init.d/clamav-daemon - deemoni käivitusskript
- /etc/init.d/clamav-freshclam - viiruste andmebaasi uuenduste kopeerimise deemoni käivitusskript
- /etc/clamav/clamd.conf - deemoni seadistusfail
- /etc/clamav/freshclam.conf - viiruste andmebaasi uuenduste deemoni seadistusfail
- /usr/sbin/clamd - deemon
- clamdscan, clamdtop, clamconf - utiliidid
Viiruste andmebaasi uuendamine
ClamAV sisaldab deemonit freshclam, mille ülesandeks on kopeerida võrgust viiruste andmebaasi uuendusi, freshclam seadistusfail on /etc/clamav/freshclam.conf. Antud juhtumil ei kasutata freshclam deemon režiimis, vaid käivitatakse käsitsi st cron tööna. Seejuures tuleb jälgida, et erinevatest clamd serverites toimuks see erineval ajal. Deemoni väljalülitamiseks on otsekohene kustutada vastavad init skriptid jms
systemd liidesega
# systemctl stop clamav-freshclam # systemctl disable clamav-freshclam
sysv liidesega
# service clamav-freshclam stop # update-rc.d -f clamav-freshclam remove
clamav-freshclam tööd juhib seadistusfail /etc/clamav/freshclam.conf, sobib default. Selleks, et viiruste andmebaas saaks uueneda, peab saama postimasin pöörduda avaliku võrku, vajadusel saab seadistusfailis näidata http proxy asukoha
HTTPProxyServer 192.168.9.39 HTTPProxyPort 3128
ClamAV andmebaasi uuendamise käsitsi käivitamine paistab sedasi (--config-file=/etc/clamav/freshclam.conf --datadir=/var/lib/clamav argumente võib, aga ei ole vajalik kasutada)
# freshclam ClamAV update process started at Mon Jul 20 13:11:01 2015 Connecting via 10.0.9.39 Downloading main.cvd [100%] main.cvd updated (version: 55, sigs: 2424225, f-level: 60, builder: neo) Connecting via 10.0.9.39 Downloading daily.cvd [100%] daily.cvd updated (version: 20702, sigs: 1479223, f-level: 63, builder: anvilleg) Connecting via 10.0.9.39 Downloading bytecode.cvd [100%] bytecode.cvd updated (version: 265, sigs: 47, f-level: 63, builder: neo) Database updated (3903495 signatures) from db.local.clamav.net
Viiruste andmebaas asub kataloogis /var/lib/clamav
# find /var/lib/clamav -ls 639308 4 drwxr-xr-x 2 clamav clamav 4096 May 22 16:16 /var/lib/clamav 221185 460 -rw-r--r-- 1 clamav clamav 464384 Apr 13 17:27 /var/lib/clamav/bytecode.cld 221188 4 -rw------- 1 clamav clamav 2340 May 22 16:16 /var/lib/clamav/mirrors.dat 221187 63960 -rw-r--r-- 1 clamav clamav 65422336 Nov 14 2010 /var/lib/clamav/main.cld 679949 7468 -rw-r--r-- 1 clamav clamav 7631360 May 22 05:52 /var/lib/clamav/daily.cld
Logi tekib faili
/var/log/clamav/freshclam.log
Cron tööga uuendamine võiks olla nt selline
# cat /etc/cron.d/freshclam 15 04 * * * root /usr/bin/freshclam 1>>/var/log/freshclam-cron.log 2>&1
Viiruste uuenduste olemasolu tehakse kindlaks nimepäringuga
$ dig +short current.cvd.clamav.net txt "0.97:53:13101:1306068884:1:60:29568:143"
Lisaks nö ametlikele ClamAV signatuuride andmebaasidele peavad aktiivsed kasutajad samuti andmebaase, nt addressil http://c4s.pikker.ee/public.strings.txt.
clamd deemoni seadistamine
clamav-daemon tööd juhib seadistusfail /etc/clamav/clamd.conf, tõenäoliselt sobib vaikimisi sisu, antud juhul on oluline kirjeldada teenuse interneti soket, nt
SelfCheck 86400 TCPSocket 3310
systemd keskkonnas esineb tõenäoliselt selline viga clamd.log failis
Mon Jul 26 10:28:01 2015 -> TCP: No tcp AF_INET SOCK_STREAM socket received from systemd.
ja sobib teha sellised muudatused, https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=771911
# cat /etc/systemd/system/clamav-daemon.socket.d/extend.conf [Socket] ListenStream=10.0.6.26:3310
ja muudatuste kehtestamiseks kehtestadada systemd enda seadistuste muudatus
# systemctl daemon-reload
ning kehtestada clamav-daemon jaoks muudatused (tegelikult piisab ainult .socket restartist)
# systemctl restart clamav-daemon.socket # systemctl restart clamav-daemon.service
clamd deemoni logi asub failis
/var/log/clamav/clamav.log
C4S reeglite kasutamine
2015 aasta kevadel leivitatakse aadressil http://c4s.pikker.ee/ kahte komplekti reegleid
- 3RDP (http://c4s.pikker.ee/3rdp.database.list.txt) - partnerite poolt tehtud analüüsi põhjal koostatud ja C4S projekti poolt vahendatud andmestik
- C4S (http://c4s.pikker.ee/c4s.database.list.txt) - C4S projekti tehtud analüüsi põhjal koostatud andmestik
C4S http://c4s.pikker.ee/ reeglite kasutamiseks tuleb paigaldada kolm utiliiti
- curl - kopeerib reeglite nimekirjad
- gpg - kontrollib signatuurid
- pixz - paralleelet tööd tegev pakkimise tarkvara
Paigaldamiseks sobub Debian v. 8 Jessie keskkonnas öelda
# apt-get install curl gnupg pixz
Debian v. 7 Wheezy keskkonnas tuleb pixz kompileerida või kasutada pixz asemel tavalist versiooni
# apt-get install xz-utils
Tööd teeb üks shell skript http://c4s.pikker.ee/c4s.updater.sh, mille alguses on kasutamisõpetus. Skript sobib paigutada kataloogi
# mkdir -p /opt/c4s/bin # cd /opt/c4s/bin # wget http://c4s.pikker.ee/c4s.updater.sh
Seejärel üle vaadata selliste muutujate väärtused, nt kasutada selliseid
# cat /etc/C4S.cfg # kommenteerida valja http proxy kasutamiseks # export http_proxy="http://192.168.1.241:3128" C4S_DB_IGNORE_LIST="c4s.0days|c4s.adult.0days|c4s.junk.0days" MY_3RDP_DB_IGNORE_LIST="3rdp.doppelstern|3rdp.something.else"
kus
- C4 ja 3RDP ignore listid
Lisada root kasutaja võtmehoidjasse teenusega soetud gpg võti
# gpg --keyserver keyserver.ubuntu.com --recv-keys DAD341E9 gpg: directory `/root/.gnupg' created gpg: new configuration file `/root/.gnupg/gpg.conf' created gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run gpg: keyring `/root/.gnupg/secring.gpg' created gpg: keyring `/root/.gnupg/pubring.gpg' created gpg: requesting key DAD341E9 from hkp server keyserver.ubuntu.com gpg: /root/.gnupg/trustdb.gpg: trustdb created gpg: key DAD341E9: public key "Heiki Pikker <heiki.pikker@pikker.ee>" imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)
Kui serverist on suvaline internetti pääsemine piiratud, siis saab võtme paigaldada ajutise ssh tunneli kaudu
tookohaarvuti-kust-saab-piiramatult-internetti$ ssh imre@10.0.6.186 -R 11371:keyserver.ubuntu.com:11371 server# gpg --keyserver 127.0.0.1 --recv-keys DAD341E9
Käivitada esmakordselt
# chmod 0755 /opt/c4s/bin/c4s.updater.sh # /opt/c4s/bin/c4s.updater.sh
Skripti töö tulemusena tekib olemasolevasse kataloogi /var/lib/clamav juurde hulka selliseid faile
/var/lib/clamav/c4s*
Uute signatuuride kasutuselevõtmiseks sobib öelda (kuigi clamd deemoni protsess avastab ise ka peagi muudatused)
# /etc/init.d/clamav-daemon reload
Logisse kirjutatakse midagi sellist
# tail -f /var/log/clamav/clamav.log .. Thu Jan 8 13:48:20 2015 -> Reading databases from /var/lib/clamav Thu Jan 8 13:50:01 2015 -> Database correctly reloaded (4406737 signatures)
Selleks, et C4S nimekiri uueneks edaspidi automaatselt, sobib kasutada nt sellist cron tööd
# cat /etc/cron.d/c4s-updater 45 04 * * * root /opt/c4s/bin/c4s.updater.sh 1>>/var/log/c4s.updater.log 2>&1
Märkused
- C4S sisaldab palju sissekandeid, ilmselt clamd protsess käivitub mitu minutit, sel ajal on tore vaadata strace abil kuidas andmed liiguvad
# strace -p 1426 Process 1426 attached read(5, "746d:48\nC4S.MALWARE.URL.AUTOGEN."..., 4096) = 4096 read(5, "d2f6c2f75732d7368617265686f6c646"..., 4096) = 4096 read(5, "33561396237386466623037642663723"..., 4096) = 4096 read(5, "383938653762343361666436:48\nC4S."..., 4096) = 4096 read(5, "72e6f7264696e65636f7374616e74696"..., 4096) = 4096 read(5, ".AUTOGEN.6176800:4:*:(B)7777772e"..., 4096) = 4096 read(5, "6f6e74656e743d313632353833383726"..., 4096) = 4096 read(5, "L.AUTOGEN.6176851:4:*:(B)7777772"..., 4096) = 4096 ...
- Kui updater skript ei moodusta puhtasse kataloogi sisu ära, sel juhul tuleb kopeerid alla mingi varaseme versiooni seis ning käivitada uuem updater
clamav-milter kasutamine clamd koormusjaoturina
NB! Tundub, et 2015 suvel töötab paremini HAProxy koormusjaoturina kasutamine.
ClamAV klastri kasutamine
Üks ClamAV deemoni clamd kasutaja võiks olla clamav-milter, mida omakorda kasutab Postfix, sellist juhtumit on kirjeldatud aadressil http://www.auul.pri.ee/wiki/Postfix,_Postscreen_ja_before-queue_kontrollide_kasutamine#clamav-milter.
Klastrilisus seisneb clamd seisukohast selles, et arvutites tuleks viirustate andmestiku uuendamine panna toimuma erinevatel aegadel, nt selliselt ühes arvutis
clamav-1 # cat /etc/cron.d/freshclam 15 04 * * * root /usr/bin/freshclam 1>>/var/log/freshclam-cron.log 2>&1
clamav-1# cat /etc/cron.d/c4s-updater 45 04 * * * root /opt/c4s/bin/c4s.updater.sh 1>>/var/log/c4s.updater.log 2>&1
ja selliselt teises arvutis
clamav-2 # cat /etc/cron.d/freshclam 15 05 * * * root /usr/bin/freshclam 1>>/var/log/freshclam-cron.log 2>&1
clamav-2 # cat /etc/cron.d/c4s-updater 45 05 * * * root /opt/c4s/bin/c4s.updater.sh 1>>/var/log/c4s.updater.log 2>&1
Clamav-milter seadistamine
Selleks, et clamav-milter kasutaks üle võrgu clamd klastrit tuleb kasutada seadistusfailis /etc/clamav/clamav-milter.conf sellist sektsiooni
# ClamdSocket unix:/var/run/clamd/clamd.socket ClamdSocket tcp:10.0.6.26:3310 ClamdSocket tcp:10.0.6.27:3310
kus
- unix soket on välja kommenteeritud (tingimata ei pea)
- clamdsocket parameetrit võib kasutada mitu korda ja näidatakse kõik clamd teenuse node'id
HAProxy kasutamine clamd koormusjaoturina
Esmalt maksab üle korrata, et üldiselt
- kui kasutusel on load balancer ja ta kasutab backend korrasoleku kontrollimiseks monitori, siis on paratamatu, et vahel võib lõppkasutaja jõuda kasutama konkreetsest parasjagu täieliselt mitte töötavast backendist teenust enne kui load balancer on jõudnud ta välja pool'ist lülitada (sellise juhtumi realiseerib HAProxy ja see sobib mitte-planeeritud backend tõrgetega toime tulemiseks)
- selleks, et load balancer ei ühendaks kasutajat konkreetse backendiga seal toimuva planeeritud hooldustöö ajal, peab backend ise sellest balancerile piisava ajavaruga teada andma (sellise juhtumi realiseerib cron tööde juures Apache protsessi seiskamine ja käivitamine)
Tundub, et 2015 aasta suvel clamav-milter sisemine koormusjaotur ei toimi selles mõttes hästi, et kui clamav õlg on clamd andmestiku mällu lugemisega väga tegevuses, siis kuigi tcp ühendus õnnestub vms, ometi reaalselt viiruste analüüs mitte. Alternatiiv oleks sisulisema kontrolli korraldamine HAProxy, clamdscan ja Apache abil.
__|__ | | postfix + clamav-milter -> 127.0.0.1:3310 |_____| haproxy - 127.0.0.1:3310 | | ---|------------|------------|----- | | __|__ __|__ | | | | |_____| |_____| clamav-1 - 3310/tcp clamav-2 - 3310/tcp apache - 80/tcp apache - 80/tcp clamdscan clamdscan
kus
- HAProxy vahendab clamav-milter jaoks üle võrgu kahes arvutis töötavat clamd teenust
- clamav-milter kasutab clamd teenust aadressilt 127.0.0.1:3310
- clamav-1 ja clamav-2 pakuvad ise teenuse haproxy jaoks oma võrguliidesel port 3310/tcp
Sisulisema monitori saab tekitada nt selliselt, tulemusena ei püüa HAProxy kasutada katkist node'i üle 25 sekundi
- paigaldada HAProxy tarkvara - HAProxy kasutamine
- clamav-1, 2 arvutites on käivitatud cron tööna skript /opt/clamav-daemon-check/bin/clamav-daemon-check.sh, nt 10 korda minutis
# cat clamav-daemon-check.sh #!/bin/bash value=$( timeout 4 clamdscan /etc/fstab 1>/dev/null 2>&1; echo $? ) if test $value -eq 0; then touch /var/www/html/clamav-daemon-on-ok else rm /var/www/html/clamav-daemon-on-ok fi
anda skriptile käivitusõigus
# chmod 0755 /opt/clamav-daemon-check/bin/clamav-daemon-check.sh
ja (for kordusega saab korraldada tihedamini kui kord minutis programmi käivitamist)
# cat /etc/cron.d/clamav-daemon-check * * * * * root for i in 0 1 2 3 4 5 6 7 8; do /opt/clamav-daemon-check/bin/clamav-daemon-check.sh & sleep 6; done; \ /opt/clamav-daemon-check/bin/clamav-daemon-check.sh
clamdscan kontroll on iseenesest lokaalne kuna clamdscan ei oska üle võrgu clamd teenust kasutada.
- apache serveerib ühe http /var/www/html dokumentjuurikat
- haproxy seadistusfail võiks olla nt selline, kõige olulisem on listen sektsioon
# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults log global mode tcp option tcplog # option dontlognull timeout connect 5000 timeout client 5000 timeout server 5000 listen clamd 127.0.0.1:3310 mode tcp balance roundrobin option tcp-check option tcplog tcp-check send GET\ /clamav-daemon-on-ok\ HTTP/1.1\r\n tcp-check send Host:\ localhost\r\n tcp-check send User-Agent:\ HAProxy\ tcpcheck\r\n tcp-check send \r\n tcp-check expect rstring HTTP/1\..\ (2..|3..) server clamd-1 10.0.6.26:3310 check inter 2000 port 80 server clamd-2 10.0.6.27:3310 check inter 2000 port 80 option log-health-checks listen stats :1936 mode http stats enable stats hide-version stats realm Haproxy\ Statistics stats uri / stats auth kasutajanimi:parool
kus
- global sektsioon määratleb üldised haproxy protsessi töötamist kontrollivad parameetrid
- default sektsioon määratleb kõigi nn proxy-tüüpi sektsioonide jaoks toodud parameetrite vaikeväärtused
- listen clamd kirjeldab clamav teenuse frontendi ja backendi otsad
- clamd ise on 'mode tcp', kuid health checkina kasutatakse http päringut; selleks tuleb tcp-check sees kasutada send ja expect directiive
- listen stats sektsioon määratleb statistika liidese
Statistika liides paistab selline
TCP koormusjaoturi logi sh backendide loksumine paistab logis selline
Aug 17 19:08:07 post-fend haproxy[535]: 127.0.0.1:35652 [17/Aug/2015:19:08:07.637] clamd clamd/clamd-2 1/0/10 11 -- 0/0/0/0/0 0/0 Aug 17 19:08:21 post-fend haproxy[535]: Health check for server clamd/clamd-1 succeeded, reason: Layer7 check passed, code: 0, info: "(tcp-check)", check duration: 0ms, status: 1/2 DOWN. Aug 17 19:08:23 post-fend haproxy[535]: Health check for server clamd/clamd-1 succeeded, reason: Layer7 check passed, code: 0, info: "(tcp-check)", check duration: 0ms, status: 3/3 UP. Aug 17 19:08:23 post-fend haproxy[535]: Server clamd/clamd-1 is UP. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue. Aug 17 19:08:25 post-fend haproxy[535]: 127.0.0.1:35672 [17/Aug/2015:19:08:25.345] clamd clamd/clamd-1 1/0/10 11 -- 0/0/0/0/0 0/0 Aug 17 19:08:27 post-fend haproxy[535]: 127.0.0.1:35675 [17/Aug/2015:19:08:27.066] clamd clamd/clamd-1 1/0/10 11 -- 0/0/0/0/0 0/0 Aug 17 19:08:38 post-fend haproxy[535]: 127.0.0.1:35689 [17/Aug/2015:19:08:38.950] clamd clamd/clamd-1 1/0/11 11 -- 0/0/0/0/0 0/0 Aug 17 19:08:40 post-fend haproxy[535]: 127.0.0.1:35693 [17/Aug/2015:19:08:40.626] clamd clamd/clamd-2 1/0/10 11 -- 0/0/0/0/0 0/0
Selleks, et clamav-milter jaoks toimis clamd teenus katkestuseta peab viiruste andmebaaside uuendamine peab toimuma node'ides erinevatel aegadel, nt nii ühes arvutis
clamav-1 # cat /etc/cron.d/freshclam 10 04 * * * root systemctl stop apache2 15 04 * * * root /usr/bin/freshclam 1>>/var/log/freshclam-cron.log 2>&1
clamav-1 # cat /etc/cron.d/c4s-updater 20 04 * * * root /opt/c4s/bin/c4s.updater.sh 1>>/var/log/c4s.updater.log 2>&1 05 05 * * * root systemctl start apache2
ja selliselt teises arvutis
clamav-2 # cat /etc/cron.d/freshclam 10 05 * * * root systemctl stop apache2 15 05 * * * root /usr/bin/freshclam 1>>/var/log/freshclam-cron.log 2>&1
clamav-2 # cat /etc/cron.d/c4s-updater 20 05 * * * root /opt/c4s/bin/c4s.updater.sh 1>>/var/log/c4s.updater.log 2>&1 05 06 * * * root systemctl start apache2
Kasulikud lisamaterjalid
Alternatiivne tööpõhimõte
Ülaltoodud skeemil on protsessid jaotatud kahe operatioonisüsteemi eksemplari (nt füüsilise arvuti) vahel selliselt, et ühele poole jääb Postfix ja clamav-milter, teisele poole jääb clamd. Alternatiiv on jaotada protsessid nii, et ühele poole jääb Postfix ning teisele poole clamav-milter koos clamd'ga. Põhimõttelisellt jääb kõigi komponentide seadisus samas v.a.
- seadistusfailis clamav-milter.conf kasutada rida
MilterSocket inet:3309@10.0.6.190
- Postfix juures tuleb milter väljakutse
smtpd_milters = unix:/clamav/clamav-milter.ctl
asendada
smtpd_milters = inet:10.0.6.190:3309
ClamAV Docker lahendus
Tööpõhimõte
Väited
- konteineris töötavad kolm protsessi: clamd, clamav-milter ja freshclam
Ettevalmistamine
ClamAV Docker lahenduse eelduseks on nö tavalise Dockerhost arvuti kasutamine, vt nt https://docs.docker.com/engine/install/debian/
Docker - käsurealt
TODO
root@dh-ttp:~# cat 20240722/run-docker.sh docker run -it \ --name "cn_clamav" \ --mount type=bind,source=/srv/clamav/volume/var/lib/clamav,target=/var/lib/clamav \ --mount type=bind,source=/srv/clamav/volume/etc/clamav/clamav-milter.conf,target=/etc/clamav/clamav-milter.conf \ --mount type=bind,source=/srv/clamav/volume/etc/clamav/clamd.conf,target=/etc/clamav/clamd.conf \ --mount type=bind,source=/srv/clamav/volume/etc/clamav/clamav-milter-whitelist.txt,target=/etc/clamav/clamav-milter-whitelist.txt \ --publish 3310:3310 \ --publish 7357:7357 \ clamav/clamav:latest_base # --env 'CLAMAV_NO_MILTERD=false'
Seadistusfailid
/etc/clamav/clamav-milter.conf
TODO
/etc/clamav/clamd.conf
TODO
clamav-milter-whitelist.txt
TODO
Docker - docker compose
TODO
Kasutamine Postfix juurest
TODO
Testimine
TODO