%% LyX 1.3 created this file. For more info, see http://www.lyx.org/. %% Do not edit unless you really know what you are doing. \documentclass[english]{article} \usepackage{times} \usepackage[T1]{fontenc} \usepackage[latin1]{inputenc} \setcounter{secnumdepth}{4} \setcounter{tocdepth}{4} \usepackage{setspace} \onehalfspacing \makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands. \usepackage[official]{eurosym} \usepackage{listings} \usepackage{color} \lstset{ commentstyle=\color{blue}, keywordstyle=\color{red}, frame=single, breaklines, showstringspaces=false, tabsize=2, numbers=left, numberstyle=\tiny, stepnumber=5, numbersep=5pt, basicstyle=\normalfont\footnotesize\tt, language={[]Perl} } \usepackage{babel} \makeatother \begin{document} \title{Mirroring the Virus Database} \author{Luca Gibelli} \maketitle Some guidelines for people interested in contributing to the distribution of ClamAV virus database. \section{Introduction} \subsection{This doc} The latest version of this document is always available at http://www.clamav.net/doc/mirrors/. Before going any further, please check that you are reading the latest version. Japanese sysadmins can find a translated version of this doc at http://www.orange.co.jp/\textasciitilde{}masaki/clamav/mirror-howto-jp.html (not necessarily up to date). \subsection{Who is responsible for the virus database} The virusdb team take care of reviewing virus signatures, checking for new viruses in the wild and committing changes to the virus database file. The updates are released quite often (usually no less than three times a week). If you want to be notified whenever the virus database is updated subscribe to clamav-virusdb \emph{at} lists.clamav.net . Every time the virusdb team updates the database, the ChangeLog will be posted to the mailing-list. Visit for the list description and archives. If you need to contact the virusdb team please write to: virus-team \emph{at} clamav.net \subsection{Virus submission} Whenever you find a new virus which is not detected by ClamAV you should send it to the virusdb team by filling the form at http://www.clamav.net/sendvirus.html. They will review your submission and update the database so that the whole ClamAV user community can take benefit from it. \textbf{Never} send virus samples to ClamAV mailing-lists or developers addresses. \subsection{Getting a copy of the latest virus database} The most important factor for an antivirus's efficiency is to be up to date. ClamAV comes with a tool to update the virus database automatically: its name is \emph{freshclam}. freshclam looks up the TXT record associated with \textit{current.cvd.clamav.net} and extracts the latest database version available from the string returned. If the local database is outdated, freshclam tries to connect to the hostnames listed in freshclam.conf (DatabaseMirror directive). If the first server in the list fails or the latest database is not available on that mirror (e.g. in case there has been a problem sync'ing the mirror), freshclam will sleep for 10 secs and then try again with the next one, and so on. After freshclam downloads the new database, it sends a notify to clamd (if active) to reload the database. It is important for the machine running ClamAV to be able to make DNS lookups and to connect to port 80 of external hosts on Internet either directly or through a proxy. There are known problems with some transparent proxies caching what they shouldn't cache. If you should run into this kind of problem, please check your proxy configuration before reporting a bug. \section{Mirroring the database} \subsection{The need for mirrors} To prevent the spread of worms it is essential to check for updates frequently. ClamAV users often configure freshclam with a check interval of 30 minutes. With an exponentially growing number of ClamAV users, the servers hosting the virus database files get easily overloaded. Without mirrors, the traffic on our main site was 100GB/month (May 2003). On Feb 2004 the traffic on each mirror (11 in total) reached 120GB/month. \\ Thanks to some improvements in freshclam and the increasing number of mirrors (currently 60), the traffic on each mirror was lowered to 40GB/month (Aug 2004). That makes about 2.5TByte/month of global traffic. Our users are encouraged to add the following directives to their freshclam.conf : DatabaseMirror db.XY.clamav.net DatabaseMirror db.local.clamav.net where XY stands for the country the server lives in % \footnote{a full list is available at http://www.iana.org/cctld/cctld-whois.htm% } Each db.XY.clamav.net record points to the mirrors available in that country% \footnote{For a complete list of the mirrors available in each country visit http://www.clamav.net/mirrors.html% } or, in case there are none, the continent. If freshclam can't connect to db.XY.clamav.net, it will fail back on db.local.clamav.net, which \textbf{attempts} to redirect the user to the closest pool of mirrors by looking up its ip source address in GeoIP database (http://www.maxmind.com/app/geoip\_country).% \footnote{See: http://www.iana.org/assignments/ipv4-address-space http://ip-to-country.webhosting.info/ http://ftp.apnic.net/stats/apnic/ http://www.ripe.net/db/erx/erx-ip/ Some of the information were contributed by Walter Hop (from transip.nl).% } We are aware that looking up the ip source address is not an accurate method to find the user location from a network topology point of view. We accept the risk. \subsection{Requirements to become a mirror} We need fast reliable mirrors. Servers eligible for becoming mirrors have to provide: \begin{itemize} \item At least a 10Mbit/s link to the Internet% \footnote{Traffic is bursty, that's why we request such a large pipe% } \item Unlimited traffic \item At least 50MB of web space \item Support for our \emph{push-mirroring} system \item The mirror has to be available to all ClamAV users. We DO NOT support private mirrors. \item ssh 2 (read on) \end{itemize} We also appreciate (but do not require) having shell access to the server hosting the mirror. FTP access is no longer accepted. \\ The virusdb team will use the account \emph{only} to update the virus database. \subsection{How to become a mirror} Before setting up a mirror contact \emph{luca -at- clamav.net}! You have to follow these steps: \begin{enumerate} \item Set up a virtual host for \\ http://database.clamav.net, http://db.{*}.clamav.net and http://clamav.your-domain.tld\\ Note there is an asterisk in the second hostname. A literal asterisk.\\ Do not replace it with your country code. \\ If you are using name based virtual hosts% \footnote{You can check whether the mirror setup is correct or not, simply by adding a line like this: your-server-ip database.clamav.net to the /etc/hosts on your client machine. Then visit http://database.clamav.net and see if you can download files from your mirror's directory.% } see \\ http://httpd.apache.org/docs/mod/core.html\#serveralias for more information. \\ Here is an example for a typical setup:\\ \\ \emph{ }\\ \emph{ServerAdmin john@clamav.foo.com }\\ \emph{DocumentRoot /home/users/clamavdb/public\_html }\\ \emph{ServerName database.clamav.net}\\ \emph{ServerAlias db.{*}.clamav.net}\\ \emph{ServerAlias clamav.foo.com}\\ \emph{}\\ If you are not using Apache and you cannot create wildcard vhosts, you must use IP based virtual hosts!\\ Please note that an http redirect (e.g. RedirectPermanent) is not enough! freshclam can't handle redirects yet. \emph{}\\ If you are running Apache 2.x, please use the following directive for proper logging:\\ \emph{LogFormat \char`\"{}\%h \%l \%u \%t \textbackslash{}\char`\"{}\%r\textbackslash{}\char`\"{} \%>s \%O \textbackslash{}\char`\"{}\%\{Referer\}i\textbackslash{}\char`\"{} \textbackslash{}\char`\"{}\%\{User-Agent\}i\textbackslash{}\char`\"{}\char`\"{} combinedrealsize }\\ \emph{CustomLog /path/to/clamav-access.log combinedrealsize }\\ See the {}``Statistics'' paragraph for more info. \item Create an account with login {}``clamavdb'' and give it write access to the virtual host's DocumentRoot. \\ You may want to disable password authentication for this account and change the password to something obscure.\\ The {}``clamavdb'' user's shell must be /bin/sh or /bin/bash . Otherwise the user won't be able to run the command associated with the ssh public key% \footnote{Take a look at the content of \emph{{}``authorized\_keys\_noshell''}: the only command which can be executed by the owner of the corresponding ssh private key is \textasciitilde{}/bin/clam-clientsync. We will only be able to trigger the execution of that script and nothing else! However, shell access is really appreciated. If you are willingly to give us shell access, use \emph{authorized\_key}s\emph{\_shell} instead which contains Luca Gibelli and Tomasz Papszun ssh public keys too.% }. \item Download the following files:\\ clam-clientsync.conf\\ clam-clientsync\\ authorized\_keys\_shell\\ authorized\_keys\_noshell\\ authorized\_keys\_shell.sig\\ authorized\_keys\_noshell.sig\\ from http://www.clamav.net/doc/mirrors/ \item Verify the signature using:\\ \$ gpg --verify authorized\_keys\_noshell.sig authorized\_keys\_noshell\\ \$ gpg --verify authorized\_keys\_shell.sig authorized\_keys\_shell\\ My PGP public key is available on most keyservers and on ClamAV web site. It can eventually be verified by telephone. Contact me by email first. \item If you don't want to give us shell access, copy \emph{authorized\_keys\_noshell} to \emph{\textasciitilde{}clamavdb/.ssh/authorized\_keys}:\\ \$ cp authorized\_keys\_noshell \textasciitilde{}/.ssh/authorized\_keys\\ If you want to give us shell access, use \emph{authorized\_keys\_shell} instead:\\ \$ cp authorized\_keys\_shell \textasciitilde{}clamavdb/.ssh/authorized\_keys\\ \$ chmod go-w \textasciitilde{}clamavdb\\ \$ chmod 700 \textasciitilde{}clamavdb/.ssh\\ \$ chmod 600 \textasciitilde{}clamavdb/.ssh/authorized\_keys \item Copy clam-clientsync to \textasciitilde{}clamavdb/bin/\\ Copy clam-clientsync.conf to \textasciitilde{}clamavdb/etc/\\ chmod 600 \textasciitilde{}clamavdb/etc/clam-clientsync.conf\\ chmod 755 \textasciitilde{}clamavdb/bin/clam-clientsync\\ Everything must be owned by user clamavdb.\\ The clam-clientsync requires the {}``lockfile'' program, which is part of the \emph{procmail} package. Before going any further, please check that {}``lockfile'' is available. \item Send the server's details (ip address, country, virtual host aliases, available bandwidth and sysadmin's full name and email address) to \emph{luca} \emph{at} \emph{clamav.net} . \item Edit \textasciitilde{}clamavdb/etc/clam-clientsync.conf . If your DocumentRoot (see paragraph 1) is \emph{/home/users/clamavdb/public\_html} , your login is \emph{foo} and your password \emph{guessme}, then your clam-clientsync.conf will look like this: \\ TO=/home/users/clamavdb/public\_html\\ RSYNC\_USER=foo\\ RSYNC\_PASSWORD=guessme\\ EXCLUDE=\char`\"{}--exclude local\_{*}\char`\"{} \item Reconfigure your packet filter to allow incoming connections on port 22/tcp and outgoing connections to ports 873/tcp and 873/udp.\\ You can furtherly restrict access to these ports by only allowing connections from/to the following IP addresses: \\ 194.109.142.194, 64.18.103.6, 194.242.226.43 .\\ rsync.clamav.net is a round robin record which points to our master mirror servers. Any changes to this record will be announced on the clamav-mirrors mailing-list. \item You are welcome to put your company logo on the mirror home page. Just copy it to the DocumentRoot and rename it to {}``local\_logo.png''. The index.html is unique for every mirror. Please note that any file in the DocumentRoot whose name doesn't match {}``local\_{*}'' will be deleted at every mirror sync. \item Subscribe to clamav-mirrors \emph{at} lists.clamav.net: see \\ http://lists.clamav.net/mailman/listinfo/clamav-mirrors for more info. \\ Subscribe requests have to be approved. We will approve your subscription request only \emph{after} reviewing your server's info. \end{enumerate} When everything is done, your server's IP address will be added either to your country's dns record (db.XY.clamav.net) or one of the round robin record (db..clamav.net) and your company will be listed on our mirrors list page. \subsection{Statistics} Although it's not required, we really appreciate if you can make access statistics of your mirror available to us. They should be available at http://your-mirror-host-name/local\_stats/ and they \textbf{must} be protected with login and password. You should use the same login and password you are using in your \textasciitilde{}clamavdb/etc/clam-clientsync.conf file. If possible, please tell your statistics generator to ignore requests made by the {}``ClamAV-MirrorCheck'' agent. If you are using Webalizer, you can add the following directive to your conf. file: HideAgent ClamAV-MirrorCheck If you are using AWStats, you can add this one instead: SkipUserAgents=\char`\"{}ClamAV-MirrorCheck'' Refer to your stats generator's manual for more info. \textbf{Important note} for Apache2 users: As stated in the Apache documentation from http://httpd.apache.org/docs/2.0/mod/mod\_log\_config.html: \textit{Note that in httpd 2.0, unlike 1.3, the \%b and \%B format strings do not represent the number of bytes sent to the client, but simply the size in bytes of the HTTP response (which will differ, for instance, if the connection is aborted, or if SSL is used). The \%O format provided by mod\_logio will log the actual number of bytes sent over the network.} \subsection{Admin's duty} \begin{itemize} \item Scheduled downtimes should be announced on the clamav-mirrors mailing-list in advance. \item IP address changes should be notified in advance too. \item Changes in the ssh host public key of the mirror host should be announced on the clamav-mirrors mailing-list. \item It is essential to be able to contact the sysadmin responsible for the mirror server and get a quick response. Whenever a problem with a mirror occurs we need to immediately find out its cause and act consequently. \end{itemize} \section{Notes for sigmakers} New sigmakers should send their ssh2 public key to \emph{luca at clamav.net} . Their public key will be added to rsyncX.clamav.net authorized\_keys (after being verified). Sigmakers can upload a new database to either rsync1.clamav.net or rsync2.clamav.net using a (scp|sftp|rsync)-only account. The new database won't be available to other people immediately. First, sigmakers have to notify the rsyncX.clamav.net server that a new database is available. Here is the step-by-step procedure to release a new database version and propagate it around the world: \begin{enumerate} \item Assume your ssh private key is \textasciitilde{}/.ssh/id\_rsa and you've just built a new daily.cvd. Assume you want to use rsync1.clamav.net \item In order to upload the new database, you have to run:\\ \$ rsync -tcz --stats --progress -e 'ssh -i \textasciitilde{}/.ssh/id\_rsa' daily.cvd clamupload@rsync1.clamav.net:public\_html/ \item Next, you need to notify rsync1.clamav.net that a new database is available:\\ \$ ssh rsync1.clamav.net -i \textasciitilde{}/.ssh/id\_rsa -l clamavdb sleep 1 \item rsync1.clamav.net will verify the digital signature of the newly uploaded database using \emph{sigtool -i}. If it finds an error, it will refuse to distribute the database to other mirrors. \item rsync1.clamav.net will copy the previously uploaded database to its rsync shared directory. \item rsync1.clamav.net will notify every mirror that a new database is available \item Every mirror will rsync its copy of the database from \emph{rsync1.clamav.net::clamavdb} (only mirrors can access the rsync server at rsync1.clamav.net, it's password protected) \end{enumerate} As a fallback, every three hours, either rsync1.clamav.net or rsync2.clamav.net force an update on every mirror. If rsync1 can't reach rsync2 or viceversa, the automatic update doesn't take place. This is done to avoid propagating an old database. To avoid conflicts, sigmakers should use rsync1 by default and if it fails, switch to rsync2. Whenever a sigmaker uses rsync2, he should announce it on the clamav-team mailing-list so that every other sigmaker uses rsync2 too, until the issues with rsync1 are over. \section{Mirror status} Every mirror is continously monitored to ensure that every ClamAV user gets the latest virus database. Every three hours we upload a file called \emph{timestamp} on every mirror. Every hour we choose a random mirror and check that \emph{timestamp} is fresh. If the file is one day old or unavailable, the mirror if marked as {}``old'' and the ClamAV team receive a warning. If the situation persists for two days, the mirror is temporarily removed from the list. You can view the current status of every ClamAV database mirror at http://www.clamav.net/mirrors.html . Please note that this page doesn't reflect how \emph{often} the database is propagated to mirrors. It just shows the trend of mirrors availability. \end{document}