Nextcloud eta segurtasuna: Geolokalizazioa

10 irakurketa minutu

Aurrez azaldu izan dudan moduan, nire etxeko router-aren alboan bizi den raspberrypi-an jarrita dut gure etxeko Nextcloud zerbitzari txikia. Zerbitzari honetan gure hodei zerbitzu pribatua dugu, eta gure datuak guk kudeatzen ditugunez, gure datu pertsonalak ez daude denok ezagutzen ditugun atzerriko monopolioen eskuetan.

Gaur egun Internet sarean konektatuta dauden beste zerbitzu guztiak bezala, gure raspberriak erasoak jasatzen ditu. Mundu osotik, bot automatizatuak gure zerbitzari txikian sartzen saiatzen dira, beraz oso garrantzitsua da gure zerbitzaria babestea. Gure zerbitzua denez, gure ardura izango da segurtasuna bermatzea.

Hau egiteko ez dago soluzio bakarra. Hoberena kipularen estrategia jarraitzea da: teknika ezberdinak erabiliz hainbat segurtasun-geruza eraikiko ditugu, denen artean soluzio eraginkor bat osatzeko.

Artikulu honetan Geolokalizazioa erabiliz, Apache web zerbitzaria konfiguratuko dugu gu bizi garen herrialdeko IP publikoetatik datozen eskaerak bakarrik onartu ditzan. Gure Nextcloud zerbitzaria etxekoek bakarrik erabiltzen dugu, eta gu ez gera bizi ez Txinan, ez Errusian, ez Vietnamen, eta ezta ere AEBtan, beraz trafiko guzti hori ez dugu onartuko, eta onartuko ez dugunez, ez diegu aukerarik emango gure zerbitzarian atzitzeko.

Hego Euskal Herrian bizi garenez, Espainiako estatuko IP publikoen trafikoa bakarrik onartuko dugu. Munduko beste edozein lekutatik gure Nextcloud zerbitzarira atzitzeko saiakera guztiak debekatuko ditugu.

Maxmind.com-en erabiltzailea sortu eta datubasea deskargatu

Laister konfiguratu dugun apache moduluak GeoLite2-Country.mmdb datubasea erabiltzen du. Datubase hau lortzeko, Maxmind gunean kontu bat zabaldu beharko dugu, eta horrela Geolite2 datubasea doan deskartzeko aukera izango dugu.

Behin kontua sortuta, gure erabiltzaile izenarekin Maxmid gunean sartu eta My License Key atalean key edo gako berri bat sortuko dugu. Demagun sortu dugun gakoa NireSuperGakoa dela.

Raspberrypi-an datubasea deskargatu eta eguneratzeko, zuzeneko deskarga bidez egin beharko dugu. Deskargarako helbidea hau izango da:

https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=YOUR_LICENSE_KEY&suffix=tar.gz

Kontutan izan URLan YOUR_LICENSE_KEY dagoen lekuan, adibide honetan NireSuperGakoa jarri beharko dugula, beraz honela geratuko da:

https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=NireSuperGakoa&suffix=tar.gz

tar.gz fitxategia deskargatu ondoren, deskonprimatu egin beharko degu

tar -zxvf GeoLite2-Country_20201208.tar.gz

Orain datubasea utziko dugun karpeta sortu eta deskonprimatu dugun datubasea bere lekuan kopiatuko dugu

mkdir -p /usr/local/share/GeoIP

cp GeoLite2-Country_20201208/GeoLite2-Country.mmdb /usr/local/share/GeoIP/

Apache modulua deskargatu eta instalatu

MaxMind DB Apache Module erabiliko dugu lan honetarako. Azken bertsioa deskargatu (artikulu hau idazterakoan, azken bertsioa 1.2.0 da) eta deskonprimatuko degu. Instalazioa nola egin behar den hemen azaltzen da.

root@raspberrypi4:~# wget -c https://github.com/maxmind/mod_maxminddb/releases/download/1.2.0/mod_maxminddb-1.2.0.tar.gz

root@raspberrypi4:~# tar -zxvf mod_maxminddb-1.2.0.tar.gz 

Orain sortu den karpetara mugitu eta instalatuko degu

root@raspberrypi4:~# cd mod_maxminddb-1.2.0/

Aurrez apache2-dev eta libmaxminddb0 paketeak instalatu behar dira

root@raspberrypi4:~/mod_maxminddb-1.2.0# apt-get install apache2-dev
root@raspberrypi4:~/mod_maxminddb-1.2.0# apt-get install libmaxminddb0 libmaxminddb-dev

Orain konpilatu eta instalatu

root@raspberrypi4:~/mod_maxminddb-1.2.0# ./configure
root@raspberrypi4:~/mod_maxminddb-1.2.0# make install

Honekin apache modulua instalatu eta gaitu du, apacheko mods-enabled karpetan ikus dezakegun moduan

root@raspberrypi4:~/mod_maxminddb-1.2.0# ls -l /etc/apache2/mods-enabled/ | grep maxminddb.load
lrwxrwxrwx 1 root root 32 abe 11 21:17 maxminddb.load -> ../mods-available/maxminddb.load

Apache berrabiaraziko dugu modulua kargatu dadin

root@raspberrypi4:~/mod_maxminddb-1.2.0# systemctl restart apache2

Orain gure nextcloud zerbitzariaren konfigurazioa editutatuko dugu: nano /etc/apache2/sites-enabled/nextcloud-le-ssl.conf

<Directory /var/www/html/nextcloud/>

MaxMindDBEnable On
MaxMindDBFile COUNTRY_DB /usr/local/share/GeoIP/GeoLite2-Country.mmdb
MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code

SetEnvIf MM_COUNTRY_CODE ^(ES) AllowCountry # Adibidean, Espainiako IP publikoak baimentzen ditugu
Deny from all # Lehenik eta behin, dena debekatu
Allow from env=AllowCountry # AllowCountry aldagaian definitutako estatuen IPak daude, hauek baimentzen ditugu

Allow from 192.168.1.0/24 # Etxeko sare lokala ere baimentzen dugu

Options +FollowSymlinks
AllowOverride All

<IfModule mod_dav.c>
Dav off
</IfModule>

SetEnv HOME /var/www/html/nextcloud
SetEnv HTTP_HOME /var/www/html/nextcloud

</Directory>

Azkenik Apache berrabiaraziko dugu

/etc/init.d/apache2 restart

Apacheko log fitxategian (/var/log/apache2/error.log), laster hasiko dira honelako lerroak agertzen

[Sat Jan 02 11:22:23.652220 2021] [access_compat:error] [pid 6215] [client 107.181.180.165:8903] AH01797: client denied by server configuration: /var/www/html/nextcloud/

Adibidean, ikus dezakegu 107.181.180.165 IPa zuen bezeroaren eskaera atzera bota duela. IP hau nongoa den ikusteko, https://geoip.com/ zerbitzua erabili ondoren, esaten du Amsterdam-ekoa dela, beraz funtzionatzen du !!

Maxmind datubasearen eguneraketak

Maxmind datubasea noizbehinka eguneratzea gomendagarria da. Hau eskuz egin daiteke, instalazioan ikusi ditugun komandoak erabiliz, edo noizbehinka (astean behin nahikoa litzateke) exekutatuko den script baten bitartez automatizatu daiteke.

Nik /root/scripts karpetan sortu det deskargatu-geolite2.sh izeneko scripta, eta hau da bere edukia:

#!/bin/bash

cd /root/scripts

#Aurreko bertsioa ezabatu

rm -Rf ./GeoLite2_Azkena
rm -Rf ./GeoLite2.tar.gz

#Bertsio eguneratua deskargatu. Gogoan izan NireSuperGakoa testua zure gakoarekin ordeztu behar dezula

curl --output GeoLite2.tar.gz "https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-Country&license_key=NireSuperGakoa&suffix=tar.gz" 

#Datubasea deskonprimatu

tar -zxvf GeoLite2.tar.gz

#Karpetaren izen zehatza ez dakigunez, izena normalizatu

mv GeoLite2-Country_* GeoLite2_Azkena

#Orain arte lanean izan dugun DBa beste izen batekin gordeku dugu badezpada ere

GAUR=$(date +%Y%m%d)
mv /usr/local/share/GeoIP/GeoLite2-Country.mmdb /usr/local/share/GeoIP/GeoLite2-Country.mmdb.$GAUR

#Orain datubasearen azken bertsioa produkzioan jartzen dugu

cp GeoLite2_Azkena/GeoLite2-Country.mmdb /usr/local/share/GeoIP/

#Aurreko azken 4 bertsioak bakarrik mantenduko ditugu, zaharragoak ezabatuz.

#Deskargatu dugun azken bertsioarekin arazoren bat nabaritzen badugu, beti izango dugu eskura zaharragoren bat.

cd /usr/local/share/GeoIP/
ls -t | tail -n +4 | xargs rm --

scriptari exekuzio baimenak emango dizkiogu

chmod +x /root/scripts/deskargatu-geolite2.sh

eta crontab-ean gehituko dugu: crontab -e

0 6 * * 1 /root/scripts/deskargatu-geolite2.sh

Eta listo, honekin bukatu da. Konfigurazio honi esker, zure zerbitzariaren segurtasuna apurtu eta bere kontrola hartzeko hainbat saiakera (ez denak) ekidin dituzu.

Letsencryp ziurtagirien eguneraketak

Nextcloud zerbitzaria Letsencrypt ziurtagiriarekin konfiguratuta daukat. Ziurtagiria hiru hilean behin berritu beharra dago, baina hortaz letsencrypt instalatzerakoan sortzen det cron scripta arduratzen da.

Kontua da, hau egin ahal izateko, Internetetik HTTP eta HTTPS baimenduta egon behar direla, eta letsencrypt zerbitzariak atzerrian daudenez, hemen egin dugunarekin gure ziurtagiriak ez lirateke berrituko.

Hau konpontzeko trikimailua hau litzateke: ziurtagiria berritzeko saiakeraren aurretik geolokalizazioa desgaitu, eta berritu ondoren berriro ere gaitzea. Ikus dezagun nola egin daitekeen.

Lehenik eta behin, Apache konfigurazio karpetara joan eta Nextcloud konfigurazioaren bi kopia egingo ditugu:

cd /etc/apache2/sites-available/
cp nextcloud-le-ssl.conf nextcloud-le-ssl.conf.geoip-gaituta 
cp nextcloud-le-ssl.conf nextcloud-le-ssl.conf.geoip-gaitugabe 

Orain nextcloud-le-ssl.conf.geoip-gaitugabe izenekoa editatu eta bloke hau ezabatuko dugu (geolokalizazioa desgaituz)

  MaxMindDBEnable On
  MaxMindDBFile COUNTRY_DB  /usr/local/share/GeoIP/GeoLite2-Country.mmdb
  MaxMindDBEnv MM_COUNTRY_CODE COUNTRY_DB/country/iso_code

  SetEnvIf MM_COUNTRY_CODE ^(ES) AllowCountry
  Deny from all
  Allow from env=AllowCountry
  Allow from 192.168.1.0/24

Orain /root/scripts karpetan bi script berri hauek sortuko ditugu:

nano geolokalizazioa-desgaitu.sh

#!/bin/bash

cd /etc/apache2/sites-available/
cp nextcloud-le-ssl.conf.geoip-gaitugabe nextcloud-le-ssl.conf
/etc/init.d/apache2 reload

nano geolokalizazioa-gaitu.sh

#!/bin/bash

cd /etc/apache2/sites-available/
cp nextcloud-le-ssl.conf.geoip-gaituta nextcloud-le-ssl.conf
/etc/init.d/apache2 reload

Biei exekuzio baimena eman

chmod +x geolokalizazioa-gaitu.sh geolokalizazioa-desgaitu.sh

Ondoren, letsencrypt ziurtagiria berritzeko programazioa aldatuko dugu /etc/cron.d/certbot fitxategia editatuz. –pre-hook eta –post-hook parametroak erabiliz, esango diogu ziurtagiria berritu beharra dagoenean, hasi aurretik geolokalizazioa desgaitzeko, eta bukatu ondoren berriro gaitzeko.

Lerroaren kopia bat egingo dugu, eta jatorrizkoa komentatuta utziko dugu.

#0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew --pre-hook /root/scripts/geolokalizazioa-desgaitu.sh --post-hook /root/scripts/geolokalizazioa-gaitu.sh

Artikulu honi buruzko zalantzak, galderak eta iruzkinak

Hemen idatzi zure iruzkina