nextcloudhublogo

Nextcloud & Talk palvelimen turvallinen asennus

Nextcloud & Talk asennus tietoturvallisesti

Tämä opas on suunnattu jotka haluavat rakentaa yritystason Nextcloud-ympäristön puhtaalle Debian 13 -palvelimelle täysin ilman Dockeria.

Tässä arkkitehtuurissa hyödynnämme natiiveja binäärejä, edistynyttä PHP 8.3 -resurssienhallintaa, Redis-välimuistia ja NATS-viestinvälitystä. Lopputuloksena on järjestelmä, joka kestää raskasta mediasiirtoa ja kymmenien käyttäjien samanaikaisia videopuheluita maksimaalisella tietoturvalla.

Vaihe 1: Palvelimen Tietoturvan Perusta

Ennen ohjelmistojen asennusta käyttöjärjestelmä on suojattava ulkopuolisilta uhkilta. Suljemme tarpeettomat portit ja asennamme järjestelmän, joka estää automaattisesti toistuvat murtoyritykset.

1. Palomuurin (UFW) käyttöönotto: Sallimme vain välttämättömän verkkoliikenteen ja SSH-hallinnan. mikäli tämän haluaa.

sudo apt update && sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp  # SSH
sudo ufw allow 80/tcp  # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable

2. Kirjautumisyritysten estäminen (Fail2Ban)

Fail2Ban tarkkailee Nextcloudin lokeja ja estää hyökkääjien IP-osoitteet.

sudo apt install -y fail2ban
sudo nano /etc/fail2ban/jail.local

Lisää tiedostoon seuraava:

[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /mnt/ncdata/nextcloud.log

Käynnistä palvelu uudelleen: sudo systemctl restart fail2ban

Vaihe 2: Ympäristön Asennus

Asennamme palvelimelle seuraavat: PHP 8.3:n, Nginx-verkkopalvelimen, MariaDB-tietokannan ja Redis-välimuistin. Muista aina valita uusin PHP-versio!

# Perustyökalut
sudo apt install -y curl wget gnupg2 ca-certificates lsb-release apt-transport-https unzip default-mysql-server nginx redis-server

# Lisää Ondřej Surýn virallinen PHP-lähde
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list
sudo apt update

# Asenna PHP 8.3 ja vaaditut moduulit
sudo apt install -y php8.3-fpm php8.3-cli php8.3-common php8.3-mysql php8.3-zip php8.3-gd php8.3-mbstring php8.3-curl php8.3-xml php8.3-bcmath php8.3-intl php8.3-gmp php8.3-redis php8.3-apcu php8.3-imagick
#Version tarkistus
sudo php -v

Vaihe 3: Suorituskyvyn Optimointi

Perusasetuksilla PHP ja tietokanta tukehtuvat suuren kuorman alla. Skaalaamme resurssit vastaamaan nykyaikaisen laitteiston tehoa. Tämä riippuu suuresti minkälainen kokoonpano sinulla on!

1. PHP 8.3 JIT & OPcache:

Avaa /etc/php/8.3/fpm/php.ini ja viritä muistirajat isojen tiedostojen siirtoa varten:

memory_limit = 1024M
upload_max_filesize = 16G
post_max_size = 16G
max_execution_time = 3600

[opcache]
opcache.enable = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 32
opcache.max_accelerated_files = 10000
opcache.jit = tracing
opcache.jit_buffer_size = 128M

2. PHP-FPM -säikeiden skaalaus:

Säädä työntekijäprosessit tiedostosta /etc/php/8.3/fpm/pool.d/www.conf:

pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18

Käynnistä uudelleen: sudo systemctl restart php8.3-fpm

3. Tietokannan (MariaDB) puskuri:

Pakota tietokanta pitämään tiedot RAM-muistissa levyhakujen sijaan muokkaamalla /etc/mysql/mariadb.conf.d/50-server.cnf:

[mysqld]
innodb_buffer_pool_size = 4G  # Suositus: n. 60% vapaasta RAM-muistista
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000

Käynnistä uudelleen: sudo systemctl restart mariadb

Vaihe 4: Nginx ja Tietoturvaotsakkeet

Nginx konfiguroidaan turvalliseksi taustapalvelimeksi (sopii erinomaisesti käytettäväksi käänteisen välityspalvelimen takana ”Reverse Proxy”). Suosittelen tätä suuresti jotta tietoturva on entistä isompi. Sivultani löytyy helppo ohje tämän toteuttamiseen! Tämän takia ohjeessani ei käytetä porttia 443 sekä SSL-Suojausta. Voit kuitenkin vapaasti valita haluamasi portin kunhan se ei ole jo varattuna.

Luo tiedosto /etc/nginx/sites-available/nextcloud:

server {
    listen 80;
    server_name pilvi.esimerkki.fi;
    root /var/www/nextcloud;
    index index.php index.html /index.php$request_uri;

    client_max_body_size 16G;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    # HTTP-tietoturvaotsakkeet
    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Robots-Tag "none" always;
    add_header X-Download-Options "noopen" always;
    add_header X-Permitted-Cross-Domain-Policies "none" always;
    add_header Referrer-Policy "no-referrer" always;

    location / {
        rewrite ^ /index.php;
    }

    location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
        deny all;
    }

    location ~ ^\/((?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/)) {
        fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
        set $path_info $fastcgi_path_info;
        try_files $fastcgi_script_name =404;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ \.(?:css|js|svg|gif|png|jpg|ico|wasm|tflite|map)$ {
        try_files $uri /index.php$request_uri;
        add_header Cache-Control "public, max-age=15778463";
        access_log off;
    }
}

Ota käyttöön: sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/ && sudo systemctl restart nginx

Vaihe 5: Nextcloudin Ydin ja Tiedostolukitus

Rediksen käyttö tiedostojen lukituksessa (File Locking) on kriittistä, jotta järjestelmä ei korruptoidu, kun useat käyttäjät siirtävät tiedostoja samanaikaisesti.

1. Lataa ja asenna Nextcloud:

cd /var/www/
sudo wget https://download.nextcloud.com/server/releases/latest.zip
sudo unzip latest.zip
sudo chown -R www-data:www-data /var/www/nextcloud

2. Pakota ydinasetukset välimuistille:

Avaa nyt selaimesi ja avaa palvelimen IP-Osoite. Kun olet suorittanut selaimen asennusnäkymän, muokkaa tiedostoa /var/www/nextcloud/config/config.php:

// Käänteisen välityspalvelimen (Reverse Proxy) reititys
  'trusted_proxies' => ['<VÄLITYSPALVELIMEN_IP>'], 
  'overwriteprotocol' => 'https',
  
  // APCu ja Redis -välimuisti
  'memcache.local' => '\\OC\\Memcache\\APCu',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'redis' => [
    'host' => 'localhost',
    'port' => 6379,
  ],
  
  // Lokituksen ja roskakorin hallinta
  'loglevel' => 2,
  'trashbin_retention_obligation' => 'auto, 30',
  'versions_retention_obligation' => 'auto, 30',

3. Ota käyttöön System Cron:

Vähennä selaimen latausaikoja siirtämällä taustatyöt käyttöjärjestelmän vastuulle.

sudo crontab -u www-data -e
# Lisää rivi: */5 * * * * php -f /var/www/nextcloud/cron.php

Vaihe 6: Nextcloud Talk HPB (High-Performance Backend)

Talk-sovellus vaatii tehokkaan signaalipalvelimen yli neljän hengen kokouksia varten. Asennamme NATS- ja Spreed-binäärit natiivisti. HUOM: Käy kuitenkin tarkistamassa uusimmat versiot ja lataa ne: https://github.com/nats-io/nats-server/releases ja https://github.com/strukturag/nextcloud-spreed-signaling/releases

1. NATS-palvelimen asennus:

wget https://github.com/nats-io/nats-server/releases/download/v2.10.16/nats-server-v2.10.16-linux-amd64.tar.gz
tar -xzf nats-server-*.tar.gz
sudo mv nats-server-*/nats-server /usr/local/bin/

2. Spreed-signaalipalvelimen asennus:

wget https://github.com/strukturag/nextcloud-spreed-signaling/releases/download/v1.2.3/signaling-linux-amd64
sudo mv signaling-linux-amd64 /usr/local/bin/signaling
sudo chmod +x /usr/local/bin/signaling
sudo mkdir /etc/signaling

3. HPB-konfiguraatio

(/etc/signaling/server.conf):

Luo kaksi satunnaista avainta (openssl rand -hex 16) ja sijoita ne hash- ja blockkey-kohtiin.

[server]
listen = 127.0.0.1:8080

[sessions]
hashkey = <GENEROITU_AVAIN_1>
blockkey = <GENEROITU_AVAIN_2>

[backend]
backends = nextcloud
allowall = false
timeout = 10
connectionsperhost = 8

[nextcloud]
backend = https://pilvi.esimerkki.fi
secret = <LUOTU_SALASANA_PALVELIMELLE>

[nats]
url = nats://localhost:4222

Tämän jälkeen luodaan Systemd-palvelut molemmille ja yhdistetään HPB Nextcloudin Talk-asetuksista secret avainta käyttäen.

Vaihe 7: Viimeistely (2FA ja Tietokannan Eheys)

Lopuksi viimeistelemme järjestelmän tietoturvan komentorivin kautta ja varmistamme tietokannan rakenteen.

Pakota kaksivaiheinen tunnistautuminen (TOTP) kaikille:

sudo -u www-data php /var/www/nextcloud/occ app:enable twofactor_totp
sudo -u www-data php /var/www/nextcloud/occ twofactorauth:enforce --on

Luo puuttuvat tietokantaindeksit asennuksen jäljiltä:

sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices

Olet nyt onnistuneesti rakentanut palvelimen, joka hyödyntää laitteistosi resursseja suoraan ja tehokkaasti.

Oikein konfiguroitu välimuistien ketju (APCu -> Redis -> MariaDB RAM Puskuri -> JIT) varmistaa, että järjestelmä pysyy salamannopeana myös silloin, kun tallennustilaan lisätään satoja gigatavuja dataa tai kun verkossa on kymmeniä samanaikaisia käyttäjiä. Palomuurit ja Fail2Ban-säännöt takaavat, että yritystason datasi pysyy turvassa verkkoon avattuna. Lisäturvallisuutta saat myös käyttämällä välityspalvelinta Internetin ja palvelimesi välillä.

geolocation

Nginx Proxy Manager GeoBlocking

GeoBlocking Nginx Proxy Managerilla

Geoblokki tarkoittaa tiettyjen maiden tai alueiden IP-osoitteiden estämistä pääsemästä palveluun. Sen tarkoituksena on parantaa tietoturvaa ja vähentää turhaa liikennettä esimerkiksi silloin, kun palvelua käytetään vain tietyssä maassa. Näin voidaan estää haitallisia kirjautumisyrityksiä ja pienentää palvelimen kuormitusta.

Dockerin asennus

Asennetaan Docker ensin kätevästi heidän valmiilla bash scriptillä.

curl -fsSL https://get.docker.com | sudo sh

Tehdään kansio Nginxille.

mkdir -p /docker/npm

cd /docker/npm

Luodaan Docker compose tiedosto johon kaikki konfiguraatiot tulevat.

nano compose.yaml

🐳
compose.yaml
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      # Mysql/Maria connection parameters:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - ./data/nginx/custom:/etc/nginx/conf.d/custom
    depends_on:
      - db

  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./mysql:/var/lib/mysql

  geoip-upd:
    container_name: geoip-upd
    image: maxmindinc/geoipupdate:latest
    restart: unless-stopped
    volumes:
      - ./data/geoip2:/usr/share/GeoIP
    environment:
      TZ: "Europe/Helsinki"
      GEOIPUPDATE_ACCOUNT_ID: 1234567
      GEOIPUPDATE_LICENSE_KEY: "keykeykeykeykeykeykeykey"
      GEOIPUPDATE_EDITION_IDS: "GeoLite2-City GeoLite2-Country GeoLite2-ASN"    #Databaset joita tarvimme
      GEOIPUPDATE_FREQUENCY: 12                #Kuinka usein database päivittyy
      GEOIPUPDATE_PRESERVE_FILE_TIMES: 1       #Todellinen aika tiedostolle

Seuraavaksi ladataan tarvittavat moduulit.

nano /docker/npm/data/nginx/custom/root_top.conf

root_top.conf
load_module /usr/lib/nginx/modules/ngx_http_geoip2_module.so;
load_module /usr/lib/nginx/modules/ngx_stream_geoip2_module.so;

Uudelleen käynnistetään containeri jotta muutokset tulevat voimaan.

docker exec -it docker-npm nginx -s reload

Tarkista kuitenkin oman containerin nimi seuraavalla komennolla.

docker ps

Tietokannan lataaminen

Mene osoitteeseen https://www.maxmind.com/en/geolite2/signup

Käytämme maxmindin tarjoavaa geoip datasettejä, ne päivittyvät yllättävän nopeasti. Luo uusi license key ja ota talteen account ID, License Key sekä nämä:

GeoLite2-ASN, GeoLite2-Country ja GeoLite2-City

Lisättyäsi tarvittavat tunnukset Docker Compose tiedostoon ja käynnistämällä Containerin näemme tiedostot.

docker compose up -d

ls -l /docker/npm/data/geoip2

Tietokannan konfigurointi Nginx Proxy Managerille

Luodaan uusi tiedosto joka käsittelee tietokannan sisällön ja parsii sieltä mm.country coden, nimen, cityn sekä regionin. Tässä ohjeessa päästämme vain Saksasta liikenteen.

nano /docker/npm/data/nginx/custom/http_top.conf

http_top.conf
charset utf-8;
geoip2 /data/geoip2/GeoLite2-City.mmdb {
        auto_reload 3h;
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code default=XX source=$remote_addr country iso_code;
        $geoip2_data_country_name default=- country names de;
        $geoip2_data_city_name default=- city names de;
        $geoip2_data_region_name default=- subdivisions 0 names de;
}
geo $allowed_ip {
        default no;             # Blockaa oletuksena
        10.10.1.0/24 yes;     # Whitelistaa locaali verkko
}

map $geoip2_data_country_code $allowed_country {
        default $allowed_ip;
        DE yes;                 # Vain Saksa voit lisätä lisää maita
}

#Formaatti logille, myöhemmin myös Grafanaa varten
log_format json_analytics escape=json '{'
       '"time_local": "$time_local", '
       '"remote_addr": "$remote_addr", '
       '"request_uri": "$request_uri", '
       '"status": "$status", '
       '"server_name": "$server_name", '
       '"request_time": "$request_time", '
       '"request_method": "$request_method", '
       '"bytes_sent": "$bytes_sent", '
       '"http_host": "$http_host", '
       '"http_x_forwarded_for": "$http_x_forwarded_for", '
       '"http_cookie": "$http_cookie", '
       '"server_protocol": "$server_protocol", '
       '"upstream_addr": "$upstream_addr", '
       '"upstream_response_time": "$upstream_response_time", '
       '"ssl_protocol": "$ssl_protocol", '
       '"ssl_cipher": "$ssl_cipher", '
       '"http_user_agent": "$http_user_agent", '
       '"remote_user": "$remote_user" '
   '}';

Login näet tällä komennolla.

tail -f /dockers/nginx-proxym/data/logs/proxy-host-%HOSTID%_access-geo.log

Lisätään vielä Proxy Manageriin.

Avaa Nginx Proxy manager WebUI ja paina Proxy Hosts, sen jälkeen Add proxy Host.

Kirjoita haluamasi domain, paikallinen osoite sekä portti. Lisää vielä asetukset Block Common Exploits sekä Websocket Support.

Seuraavaksi paina oikealta ylhäältä asetus kuvaketta ja lisää seuraava koodi.

if ($allowed_country = no) {
	return 444;
}

Nyt on kaikki valmista, että geoblokki on yksinkertainen mutta tehokas keino parantaa palvelun turvallisuutta ja hallittavuutta. Toteuttamalla sen Nginx Proxy Managerin avulla saamme helposti ylläpidettävän ratkaisun, jota voidaan tarvittaessa muokata nopeasti. Näin varmistamme, että palvelu pysyy suojattuna ja toimii optimaalisesti vain halutuille käyttäjille.

Linuxsecurity

Linux palvelimen perusturvallisuus

Linux palvelimen perusturvallisuuden takaaminen

LOGIEN TARKISTUS

#tarkistetaan kirjautumisyritykset palvelimelle reaaliaikaisesti
tail -f /var/log/auth.log

#LOGIEN VÄRITYS

apt install grc

grc tail -f /var/log/auth.log

(multitail myös useammalle logille kerralla)

FAIL2BAN

apt-get update
apt-get install fail2ban
systemctl status fail2ban
nano /etc/fail2ban/jail.conf

#ignoraa lokaalin koneen
ignoreip = 127.0.0.1/8

#määritellään bannin kesto
bantime = 600

#määritellään monta yritystä kirjautumisessa on
maxretry = 3

#tämä lähettää postia root käyttäjälle että joku on bannattu
destemail = root@localhost
sendername = Fail2Ban banned user!
mta = sendmail
action = %(action_mwl)s

#tällä saadaan postiin logitedot kätevästi
action_mw
#tällä kuitenkin saa eniten
action_mwl

#tällä komennolla pysäytetään fail2ban
systemctl fail2ban stop

#tällä aloitetaan
systemctl fail2ban start

#tällä tarkistetaan nykyinen tilanne
systemctl status fail2ban

# tarkistetaan jaili sekä estetyt ipt sekä niiden määrä
fail2ban-client status sshd

UFW PALOMUURI

apt install ufw
systemctl enable ufw
systemctl start ufw
systemctl status ufw

#avataan palomuuriin portti
ufw allow ”portti”

#avataan portti 80
ufw allow 80

OPENSSH

#Asennetaan ssh
apt install openssh-server

#Otetaan ssh käyttöön samalla myös koneen startuppiin
systemctl enable ssh

#Tarkistetaan nykyinen tilanne ssh
systemctl status sshd

#Pysäytetään ssh
systemctl stop sshd

nano /etc/ssh/sshd_config

#vaihdetaan oletus portti toiseen
#Port22

port222

#Kielletään roottina kirjautuminen
#PermitRootLogin
PermitRootLogin no

#Annetaan lassi käyttäjälle lupa kirjautua
AllowUsers lassi

#käynnistetään ssh uudestaan
systemctl restart sshd

netstat -tulpn

netstat -tulpn | grep 22

ufw allow ssh

ufw allow 22

SSH PARANTELU

#Asenntaan moduulit ja sovellukset jotka yhdistävät hyökkääjän ip-osoitteen maahan
apt-get install geoip-bin geoip-database

#Luodaan scripti joka hallitsee pääsyn
nano /usr/local/bin/ipfilter.sh

#!/bin/bash
ALLOW_COUNTRIES=”IN US”
LOGDENY_FACILITY=”authpriv.notice”

if [ $# -ne 1 ]; then
echo ”Usage: `basename $0` ” 1>&2
exit 0 # return true in case of config issue
fi

if [[ ”`echo $1 | grep ’:’`” != ”” ]] ; then
COUNTRY=`/usr/bin/geoiplookup6 ”$1” | awk -F ”: ” ’{ print $2 }’ | awk -F ”,” ’{ print $1 }’ | head -n 1`
else
COUNTRY=`/usr/bin/geoiplookup ”$1” | awk -F ”: ” ’{ print $2 }’ | awk -F ”,” ’{ print $1 }’ | head -n 1`
fi
[[ $COUNTRY = ”IP Address not found” || $ALLOW_COUNTRIES =~ $COUNTRY ]] && RESPONSE=”ALLOW” || RESPONSE=”DENY”

if [[ ”$RESPONSE” == ”ALLOW” ]] ; then
logger -p $LOGDENY_FACILITY ”$RESPONSE sshd connection from $1 ($COUNTRY)”
exit 0
else
logger -p $LOGDENY_FACILITY ”$RESPONSE sshd connection from $1 ($COUNTRY)”
exit 1
fi

#Tämä muutos pitää tehdä jos halutaan että scripti juoksee!
chmod +x /usr/local/bin/ipfilter.sh

#Lisätään ssh listalle omat muutokset jotta järjestelmää ohjaa tuo uusi scripti ja muut asennetut ohjelmat.
nano /etc/hosts.deny

sshd: ALL
vsftpd: ALL

#Määritellään vielä mistä scripti löytyy.
nano /etc/hosts.allow

sshd: ALL: spawn /usr/local/bin/ipfilter.sh %a
vsftp: ALL: spawn /usr/local/bin/ipfilter.sh %a

virus

Saastuneelta kovalevyltä virusten poisto Linuxilla

Virusten poisto Linuxilla

Virusten poisto saatttaa kuulostaa vaikealta, se on oikeastaan helppo toimenpide. Tässä esimerkissä käytän ClamAV ohjelmaa joka on erittäin helppokäyttöinen. Se skannaa valitulta kovalevyltä lukuiset haittaohjelmat. ClamAv tunnistaa Windowsiin, Linuxiin sekä Macos ympäristöihin kohdistuvat haittaohjelmat sekä pakatut haittaohjelmat kuten .tar tai .zip sisältävät.

Luodaan bootable

Luodaan ensin bootable live usb Linuxista, jakelulla ei ole väliä. Minulla on esimerkissä Debian 11. Tässä ohje live usb tekemiseen jos et ole sitä aikaisemmin tehnyt.

Clamav asennus

avataan terminaali ja päivitetään paketti repositoryt.

sudo -i

apt-get update

Nyt asennetaan itse ClamAV.

apt-get install clamav-daemon

apt-get install clamtk

mkdir /var/lib/clamav

freshclam

Kovalevyn mounttaaminen

Jotta kovalevyä voidaan käyttää linuxissa, se täytyy mountata kokoonpanoon. Esimerkiksi Windows tekee tämän automaattisesti.

lsblk (Muista valita oikea levy! Esimerkiksi minulla se on sda, sinulla se voi olla sdb tai sda1)

mkdir /root/mnt/

mount -t ntfs /dev/sda /mnt

Juostaa ClamAv töllö komennolla. Voit itse päättää parametrit, suosittelen kuitenkin tätä:

clamscan –infected –remove –recursive /root/mnt/

Skannaus kestää riippuen kovalevyn koosta. Nyt ei tarvitse muuta kuin odottaa että skannaus on valmi, ohjelma ilmoittaa automaattisesti jos haittaohjelmia löytyy sekä poistaa ne välittömästi parametrin -remove ansiosta. Tästä linkistä lisäätietoa komennoista ja käytöstä.