2023. február 2., csütörtök

Gyorskeresés

SeaFile - avagy self-hosted privát tárhely

Írta: |

[ ÚJ BEJEGYZÉS ]

Bizonyára sokakban felmerült már a kérdés, miért is használna 3rd-party felhőtárhelyet (Google Drive, iCloud, OneDrive, stb.), ha egy otthonról kiszolgált megoldás is bőven kielégítené az igényeit.

Az alábbiakban egy viszonylag könnyen konfigurálható, a nagyokhoz hasonló tulajdonságokkal, megosztási lehetőségekkel rendelkező megoldást nézünk meg - ez pedig a SeaFile.

A leírás alapvetően haladó felhasználóknak szól, afféle gondolatébresztő, javaslat egy szépen kivitelezett megoldásra.
Ennek megfelelően a részletekbe nem megyek bele túlzottan.

SeaFile telepítése és futtatása Docker-ben

Személy szerint a hasonló projektek kezelésére a Docker-t preferálom, hiszen nem kell az adott szoftver egyes függőségeivel OS szinten foglalkoznom, egyszerűen kézben tudom tartani a telepítési - futtatási - frissítési - törlési folyamatot, könnyen el tudom különíteni a szerveremen futó projekteket egymástól.
A Docker Compose erre az alapra épül fel, a segítségével egy közös egységbe - stack-be - lehet összefogni az egymáshoz tartozó komponenseket.

Lássuk mik is ezek a komponensek a SeaFile esetében:
- seafile-server, ez lesz majd a rendszerünk belépési pontja
- mysql (avagy mariadb), ez lesz az adatbázis
- memcached - ő egy általános célú, memóriarezidens gyorsítótár. A gyakran felkeresett adatokat ide tárazza be a rendszer, ezzel elkerülve a rendszermemóriától jóval lassabb adatbázis eléréseket.

Hogyan is érdemes a fenti stack-et felhúznunk Docker Compose-zal?

A lenti YAML leírófájlban három dologra legyünk figyelmesek.

1. A stack által használt köteteket bind-mount megadásával oldom meg.
Mit is jelent ez? A szerveremen elérhető lokális könyvtárakat csatolom be az egyes komponensek alá.
Ezáltal a SeaFile adatbázisáról, és a tárolt adatstruktúrájáról bármikor tudok külső backup-ot készíteni.

2. A seafile konténer esetében a komponens által használt 80-as HTTP portot a hoszt 810-es portján teszem elérhetővé. Ezt azért használom így, mert a stack később egy NGINX reverz proxy-n keresztül lesz elérhető, ami központilag kezeli nálam az összes webes szolgáltatást, közös SSL és egyéb konfigurációkkal.

3. SEAFILE_SERVER_HOSTNAME
Alapvetően kedvelem a letisztult, biztonságos megoldásokat. Ennek elérése érdekében a CloudFlare-en keresztül engedem csak a szolgáltatásaim elérését, nagyjából $8 éves díj ellenében náluk vásároltam a domain-t is.
Ezt nem kötelező így csinálni, bármilyen ingyenes domain szolgáltató is megfelel a célra, én sokáig a DuckDNS-t használtam. Akkor viszont szükséged lesz letsencrypt-re és certbot-ra, továbbá az NGINX konfigurációd is kicsit másképp fog kinézni.

version: '2.0'
services:
db:
image: mariadb:10.5
container_name: seafile-mysql
environment:
- MYSQL_ROOT_PASSWORD=db_dev # Requested, set the root's password of MySQL service.
- MYSQL_LOG_CONSOLE=true
volumes:
- /opt/seafile-mysql/db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- seafile-net

memcached:
image: memcached:1.6.14-alpine
container_name: seafile-memcached
entrypoint: memcached -m 256
networks:
- seafile-net

seafile:
image: seafileltd/seafile-mc:latest
container_name: seafile
ports:
- "810:80"
volumes:
- /mnt/wdred2tb/home/seafile:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=db_dev # Requested, the value shuold be root's password of MySQL service.
- TIME_ZONE=Etc/UTC # Optional, default is UTC. Should be uncomment and set to your local time zone.
# - SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'.
- SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not.
- SEAFILE_SERVER_HOSTNAME=seafile.example.com # Specifies your host name if https is enabled.
depends_on:
- db
- memcached
networks:
- seafile-net

networks:
seafile-net:

CloudFlare

A CloudFlare alapvetően egy proxy szolgáltatás, extrákkal.
Amikor egy látogató a CF által kezelt domain-en elérhető webes szolgáltatást meglátogat, nem közvetlenül a te szervereddel beszélget, hanem teszi ezt a CF rendszerén keresztül.
Ez több okból is hasznos.
Egyrészt a látogatók nem tudják felderíteni a szervered IP címét, hiszen a DNS lookup a CF valamelyik proxy szerverének címét adja vissza.
Másrészt alapvető DDoS és egyéb fenyegetések kivédését is elvégzi helyetted.
SSL tanúsítványt biztosít számodra, amiben megbíznak a böngészők, továbbá az általad szolgáltatott tartalmakat gyorsítótárazza is.

A biztonságot tovább fokozva a Strict SSL megoldást is alkalmazom.
Ebben az esetben kétféle SSL tanúsítványt is használunk.
Az egyik az Origin Server Certificate, amit a szervered mutat a CloudFlare felé, ezáltal tudja a CF ellenőrizni, hogy egészen biztosan a te szerveredet proxy-zza.
A másik egy úgynevezett kliens tanúsítvány, amit a CloudFlare prezentál a szervered felé - ezzel te tudod validálni, hogy a látogatók valóban a CloudFlare felől érkeznek.
Ez tehát egy kétirányú ellenőrzés.

NGINX konfiguráció

Amit érdemes a lentiekben megfigyelni, az a CloudFlare által generált Origin Certificate kiszolgálása, a kliens tanúsítvány behivatkozása és ellenőrzése, valamint itt kap értelmet a seafile konténer alapértelmezett HTTP portjának kiengedése a hoszt 810-es portján.
Amint látható az NGINX fogja oda forwardolni a bejövő kommunikációt.

server {
listen 443 ssl;
listen [::]:443 ssl;

client_max_body_size 500M;
ssl_certificate /etc/nginx/ssl/fullchain.pem; # Origin Cert
ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Origin Cert Private Key
ssl_session_timeout 5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on;
ssl_client_certificate /etc/ssl/certs/cloudflare-client.crt; ssl_verify_client on;

root /var/www/html;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name seafile.example.com;

location / {
proxy_read_timeout 300;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Cookie $http_cookie;
proxy_pass http://127.0.0.1:810/;

}

}

További biztonsági megfontolások, tűzfal beállítás

Alapvetően nem szeretném, hogy a CloudFlare védett hálózatán kívülről bárki is hozzáférjen a szerveremen futó webes szolgáltatásokhoz.
Emiatt a nálam szolgálatot teljesítő Ubuntu Server 21.10 disztribúcióban elérhető UFW (Uncomplicated Firewall) segítségével lekorlátoztam a 443-as HTTPS porton keresztüli bejövő kommunikációt a CloudFlare által publikált saját IP címtartományokra.
Mivel az UFW alap beállítása a tiltás, így elég volt az alábbi kivételeket felvenni:

sudo ufw allow from 103.21.244.0/22 proto tcp to any port 443
sudo ufw allow from 103.22.200.0/22 proto tcp to any port 443
sudo ufw allow from 103.31.4.0/22 proto tcp to any port 443
sudo ufw allow from 141.101.64.0/18 proto tcp to any port 443
sudo ufw allow from 108.162.192.0/18 proto tcp to any port 443
sudo ufw allow from 190.93.240.0/20 proto tcp to any port 443
sudo ufw allow from 188.114.96.0/20 proto tcp to any port 443
sudo ufw allow from 197.234.240.0/22 proto tcp to any port 443
sudo ufw allow from 198.41.128.0/17 proto tcp to any port 443
sudo ufw allow from 162.158.0.0/15 proto tcp to any port 443
sudo ufw allow from 104.16.0.0/13 proto tcp to any port 443
sudo ufw allow from 104.24.0.0/14 proto tcp to any port 443
sudo ufw allow from 172.64.0.0/13 proto tcp to any port 443
sudo ufw allow from 131.0.72.0/22 proto tcp to any port 443

Végszó

Köszönöm, ha végigolvastad, remélem számodra is hasznos volt a cikk.

Hozzászólások

(#1) aujjobba


aujjobba
addikt

Véleményt - legyen az negatív vagy pozitív - ide várok.

(#2) BoB


BoB
veterán

Kínait? Biztos hogy nem.

You may corrupt the souls of men, but I am steel. I am doom.

(#3) aujjobba válasza BoB (#2) üzenetére


aujjobba
addikt

Melyik része kínai?

(#4) Viktor77 válasza aujjobba (#3) üzenetére


Viktor77
félisten

[link]

SAMCRO

(#5) Airedhyal


Airedhyal
aktív tag

A szervered címét kivehetted volna és teszem azt "ez.egy.példa.com" -l helyettesíteni.

(#6) aujjobba válasza Viktor77 (#4) üzenetére


aujjobba
addikt

Valóban, igazatok van.
Mindenesetre a cucc opensource, ha bármi olyan lenne benne, azt ki lehet szúrni, valószínűleg már kiderült volna.

(#5) Airedhyal
Ez is jogos, kivettem. Elsőre nem éreztem akkora problémának, de a fene tudja.

[ Szerkesztve ]

(#7) BoB válasza aujjobba (#6) üzenetére


BoB
veterán

És te a forrást töltöd le amit te fordítasz magadnak, vagy az ő oldalukról töltöd az előre elkészített binárist?

You may corrupt the souls of men, but I am steel. I am doom.

(#8) Savageboy válasza BoB (#2) üzenetére


Savageboy
aktív tag

Alternatívaként hasonló funkcionalitással ott a Nextcloud, az ha jól tudom német.

(#9) aujjobba válasza BoB (#7) üzenetére


aujjobba
addikt

Az image publikusan elérhető a dockerhub-on, ha bárkinek biztonsági aggályai lennének, össze tudja nézni a benne levő binárist a kódból fordítottal.
Továbbra sem gondolom, hogy épp egy ilyen cuccba érdemes kínai backdoor-t beépíteni, miközben milliók kezében forognak kínai gyártású mobil és egyéb eszközök, amiben bármikor könnyen elrejthető bármi.

(#10) nakos1212


nakos1212
senior tag

Miért nem mondja ki a rasszista csak simán azt hogy rasszista?

További hozzászólások megtekintése...
Copyright © 2000-2023 PROHARDVER Informatikai Kft.