Kopírování aktuálních dat mezi několika zařízeními je důležitým současným požadavkem. Často se dostaneme do situace, kdy na svém chytrém telefonu chceme zpřístupnit něco, co máme uloženo na stolním počítači nebo notebooku, či naopak. Jednou takovou možností je využití běžného sdílení souborů, kde zdrojové zařízení ze kterého data zpřístupňujeme musí být spuštěn a dostupný, a druhou pak synchronizace. V případě synchronizace jsou datové soubory po jejich změně automaticky překopírovány na předem vybraná zařízení. Tyto soubory jsou tedy dostupné i při odpojeném datovém připojení (tzv. offline režim). Jako synchronizační službu můžeme použít např. OneDrive, Google Drive, DropBox, iCloud, Syncthing, BTsync, ownCloud a jiné.
O Syncthing jsem už několik řádek napsal. Ve většině případů je spouštěn pod specifickým uživatelským kontem. Veškeré synchronizované adresáře a soubory musí mít tedy správně nastavená oprávnění a vlastníka.
V následujícím příkladu bude popsáno nastavení synchronizace a sdílení dat na globální úrovni, kde je využit speciální systémový uživatelský účet, který je vlastníkem veškerých dat. Lépe si to lze představit tak, že vlastníme malý linuxový domácí server, který je zdrojem multimediálního obsahu pro všechna zařízení v síti. Nejjednodušší je samozřejmě nastavení anonymního sdílení, my ale požadujeme také synchronizaci tohoto obsahu pro mobilní zařízení.
Veškeré datové soubory a adresáře může na serveru vlastnit účet superuživatele, ale z bezpečnostních důvodů vytvoříme jiného uživatele. Tento uživatel se bude jmenovat d-share. Samozřejmě můžeme zvolit jiné jméno. Domovským adresářem bude /data/share/.home/
, nicméně datové soubory/obsah budou v adresáři /data/share/
. Důvod je prostý, synchronizační nástroje potřebují uložit databázi metadat, a pro tento účel se používá právě domovský adresář. Adresář .home/
bude tedy obsahovat tuto databázi a další nastavení. Oba adresáře, datový/obsah a adresář pro metadata a nastavení, mohou být umístěny rozděleně, ale takto máme vše pohromadě a přehledné. Adresář /data/share/
ale nikdy nebudeme sdílet celý.
Vytvoření uživatele
Nejprve vytvoříme systémové konto d-share. Během této operace je také automaticky vytvořena stejnojmenná skupina. Tu můžeme později použít pro další uživatele v systému.
1 2 |
[root@linux ~]# mkdir -p /data/share [root@linux ~]# useradd --home-dir /data/share/.home --create-home --shell /bin/nologin --system d-share |
Instalace balíčků syncthing
Instalace balíčků probíhá standardním způsobem, za použití nástroje pacman
.
Kromě balíčku syncthing můžeme nainstalovat také syncthing-inotify. Syncthing-inotify hlídá změny v adresářích a souborech, které jsou synchronizovány syncthing. K tomu využívá API inotify – monitoring událostí na souborovém systému. Syncthing-inotify se řídí konfigurací syncthing. Syncthing-inotify ale instalovat nemusíme. Při jeho absenci je souborový systém kontrolován v závislosti na nastavení parametru rescanIntervalS (interval opakování skenování) jednotlivých adresářů.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@linux ~]# pacman -S syncthing syncthing-inotify řeší se závislosti.. kontrola konfliktních balíčků... Balíčky (2) syncthing-0.12.20-1 syncthing-inotify-0.6.8-1 Celková velikost ke stažení: 4,32 MiB Celková velikost po instalaci: 15,20 MiB :: Pokračovat v instalaci? [A/n] :: Stahují se balíčky... syncthing-0.12.20-1-armv6h 3278,5 KiB 1943K/s 00:01 [#################################] 100% syncthing-inotify-0.6.8-1-armv6h 1120,0 KiB 1965K/s 00:01 [#################################] 100% (2/2) kontrola klíčů v klíčence [###########################################################] 100% (2/2) kontrola integrity balíčků [###########################################################] 100% (2/2) načítání balíčku [###########################################################] 100% (2/2) kontrola konfliktů souborů [###########################################################] 100% (2/2) kontrola volného místa na disku [###########################################################] 100% :: Zpracovávání změn balíčku... (1/2) instalace syncthing [###########################################################] 100% (2/2) instalace syncthing-inotify [###########################################################] 100% |
Start systémových služeb a nastavení syncthing
Nyní je ten vhodný čas pro první spuštění služeb. V tomto kroku je automaticky vytvořena prvotní konfigurace a vygenerována dvojice SSL certifikátů. Ty se uplatňují při komunikaci syncthing s okolní infrastrukturou.
Při práci se službou je důležité uvést jméno uživatele, který bude příslušné procesy v operačním systému vlastnit. K tomu slouží oddělovač „@“, za než zapíšeme jméno uživatele – v našem případě d-share. Takto musíme službu identifikovat při jakékoli práci v rámci systemd.
1 |
[root@linux ~]# systemctl start syncthing@d-share.service |
Nově vytvořená konfigurace spolu s SSL certifikáty je umístěna v adresáři /data/share/.home/.config/syncthing
.
V tomto adresáři nás bude zajímat zejména textový soubor config.xml obsahující vlastní nastavení syncthing, kterým se řídí také syncthing-inotify.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<configuration version="12"> <folder id="default" path="/data/share/.home/Sync/" ro="false" rescanIntervalS="60" ignorePerms="false" autoNormalize="true"> <device id="DFN7CCL-DZ7XUEU-AE6TZVC-DP44GGR-GVAWFRU-HCDQ7XK-YZMFH36-TF3BEQH"></device> <minDiskFreePct>1</minDiskFreePct> <versioning></versioning> <copiers>0</copiers> <pullers>0</pullers> <hashers>0</hashers> <order>random</order> <ignoreDelete>false</ignoreDelete> <scanProgressIntervalS>0</scanProgressIntervalS> <pullerSleepS>0</pullerSleepS> <pullerPauseS>0</pullerPauseS> <maxConflicts>-1</maxConflicts> <disableSparseFiles>false</disableSparseFiles> </folder> <device id="DFN7CCL-DZ7XUEU-AE6TZVC-DP44GGR-GVAWFRU-HCDQ7XK-YZMFH36-TF3BEQH" name="linux" compression="metadata" introducer="false"> <address>dynamic</address> </device> <gui enabled="true" tls="false"> <address>127.0.0.1:8384</address> <apikey>-irK3EqXNUFKGwaFPrTijjEDFxfd0ARd</apikey> <theme>default</theme> </gui> <options> <listenAddress>tcp://0.0.0.0:22000</listenAddress> <globalAnnounceServer>default</globalAnnounceServer> <globalAnnounceEnabled>true</globalAnnounceEnabled> <localAnnounceEnabled>true</localAnnounceEnabled> <localAnnouncePort>21027</localAnnouncePort> <localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr> <relayServer>dynamic+https://relays.syncthing.net/endpoint</relayServer> <maxSendKbps>0</maxSendKbps> <maxRecvKbps>0</maxRecvKbps> <reconnectionIntervalS>60</reconnectionIntervalS> <relaysEnabled>true</relaysEnabled> <relayReconnectIntervalM>10</relayReconnectIntervalM> <startBrowser>true</startBrowser> <upnpEnabled>true</upnpEnabled> <upnpLeaseMinutes>60</upnpLeaseMinutes> <upnpRenewalMinutes>30</upnpRenewalMinutes> <upnpTimeoutSeconds>10</upnpTimeoutSeconds> <urAccepted>0</urAccepted> <urUniqueID></urUniqueID> <urURL>https://data.syncthing.net/newdata</urURL> <urPostInsecurely>false</urPostInsecurely> <urInitialDelayS>1800</urInitialDelayS> <restartOnWakeup>true</restartOnWakeup> <autoUpgradeIntervalH>12</autoUpgradeIntervalH> <keepTemporariesH>24</keepTemporariesH> <cacheIgnoredFiles>true</cacheIgnoredFiles> <progressUpdateIntervalS>5</progressUpdateIntervalS> <symlinksEnabled>true</symlinksEnabled> <limitBandwidthInLan>false</limitBandwidthInLan> <minHomeDiskFreePct>1</minHomeDiskFreePct> <releasesURL>https://api.github.com/repos/syncthing/syncthing/releases?per_page=30</releasesURL> </options> </configuration> |
Povšimněme si, že byl automaticky vytvořen výchozí adresář /data/share/.home/Sync/
určený pro synchronizaci. Je na nás, zda jej ponecháme nebo vymažeme.
Pokud nás zajímá, na kterých síťových komunikačních portech syncthing naslouchá, máme k dispozici nástroj netstat
.
1 2 3 4 5 6 7 |
[root@linux ~]# netstat -lutpn | grep syncthing tcp 0 0 127.0.0.1:8384 0.0.0.0:* LISTEN 3721/syncthing tcp6 0 0 :::22000 :::* LISTEN 3721/syncthing udp 0 0 0.0.0.0:21027 0.0.0.0:* 3721/syncthing udp 0 0 0.0.0.0:59799 0.0.0.0:* 3721/syncthing udp6 0 0 :::21027 :::* 3721/syncthing udp6 0 0 :::41555 :::* 3721/syncthing |
Z výpisu jsou nejdůležitější porty 8384/tcp (ovládání přes GUI a API – zde se syncthing komunikuje i syncthing-inotify), 22000/tcp (listenAddress – datová komunikace z okolní infrastruktury) a 21027/udp (localAnnouncePort – datová komunikace pouze z místní sítě/rozsahu – broadcast/multicast). Tyto síťové porty je možné změnit v souboru config.xml a jejich znalost je důležitá pro případné nastavení firewallu.
Události ze startu můžeme zobrazit ze systémového žurnálu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[root@linux ~]# journalctl -u syncthing@d-share [monitor] 10:50:05 INFO: Starting syncthing [start] 10:50:05 INFO: Generating ECDSA key and certificate for syncthing... [DFN7C] 10:50:06 INFO: syncthing v0.12.20 "Beryllium Bedbug" (go1.6 linux-arm) builduser@leming 2016-03-06 10:59:03 UTC [DFN7C] 10:50:06 INFO: My ID: DFN7CCL-DZ7XUEU-AE6TZVC-DP44GGR-GVAWFRU-HCDQ7XK-YZMFH36-TF3BEQH [DFN7C] 10:50:06 INFO: Single thread hash performance is ~53.2 MB/s [DFN7C] 10:50:06 INFO: Error loading config file; using defaults for now [DFN7C] 10:50:06 INFO: Default folder created and/or linked to new config [DFN7C] 10:50:07 INFO: Defaults saved. Edit /data/share/.home/.config/syncthing/config.xml to taste or use the GUI [DFN7C] 10:50:07 OK: Ready to synchronize default (read-write) [DFN7C] 10:50:07 INFO: Using discovery server https://discovery-v4-1.syncthing.net/?id=SR7AARM-TCBUZ5O-VFAXY4D-CECGSDE-3Q6IZ4G-XG7AH75-OBIXJQV-QJ6NLQA [DFN7C] 10:50:07 INFO: Using discovery server https://discovery-v4-2.syncthing.net/?id=DVU36WY-H3LVZHW-E6LLFRE-YAFN5EL-HILWRYP-OC2M47J-Z4PE62Y-ADIBDQC [DFN7C] 10:50:07 INFO: Using discovery server https://discovery-v4-3.syncthing.net/?id=VK6HNJ3-VVMM66S-HRVWSCR-IXEHL2H-U4AQ4MW-UCPQBWX-J2L2UBK-NVZRDQZ [DFN7C] 10:50:07 INFO: Using discovery server https://discovery-v6-1.syncthing.net/?id=SR7AARM-TCBUZ5O-VFAXY4D-CECGSDE-3Q6IZ4G-XG7AH75-OBIXJQV-QJ6NLQA [DFN7C] 10:50:07 INFO: Using discovery server https://discovery-v6-2.syncthing.net/?id=DVU36WY-H3LVZHW-E6LLFRE-YAFN5EL-HILWRYP-OC2M47J-Z4PE62Y-ADIBDQC [DFN7C] 10:50:07 INFO: Using discovery server https://discovery-v6-3.syncthing.net/?id=VK6HNJ3-VVMM66S-HRVWSCR-IXEHL2H-U4AQ4MW-UCPQBWX-J2L2UBK-NVZRDQZ [DFN7C] 10:50:07 INFO: Completed initial scan (rw) of folder default [DFN7C] 10:50:07 INFO: Loading HTTPS certificate: open /data/share/.home/.config/syncthing/https-cert.pem: no such file or directory [DFN7C] 10:50:07 INFO: Creating new HTTPS certificate [DFN7C] 10:50:17 INFO: No UPnP device detected [DFN7C] 10:50:25 INFO: Device DFN7CCL-DZ7XUEU-AE6TZVC-DP44GGR-GVAWFRU-HCDQ7XK-YZMFH36-TF3BEQH is "linux" at [dynamic] [DFN7C] 10:50:25 INFO: API listening on [::]:8384 [DFN7C] 10:50:25 INFO: GUI URL is http://127.0.0.1:8384/ |
Povolíme spouštění služby po startu operačního systému:
1 2 |
[root@linux ~]# systemctl enable syncthing@d-share.service Created symlink from /etc/systemd/system/multi-user.target.wants/syncthing@d-share.service to /usr/lib/systemd/system/syncthing@.service. |
Stejným způsobem nastartujeme a povolíme syncthing-inotify
1 2 3 |
[root@linux ~]# systemctl start syncthing-inotify@d-share.service [root@linux ~]# systemctl enable syncthing-inotify@d-share.service Created symlink from /etc/systemd/system/multi-user.target.wants/syncthing-inotify@d-share.service to /usr/lib/systemd/system/syncthing-inotify@.service. |
GUI rozhraní syncthing
V tuto chvíli máme službu syncthing spuštěnu. Její nastavení můžeme provést změnou souboru config.xml, případně ve vlastním GUI. Toto rozhraní je přístupné přes protokol HTTP/HTTPS, tedy běžný internetový prohlížeč. Standardně služba naslouchá na síťovém portu 8384/tcp počítače, kde je služba spuštěna (ve výpisu netstat
řádek obsahující 127.0.0.1:8384).
Pokud bychom chtěli přistupovat vzdáleně, upravíme patřičnou část konfiguračního souboru:
1 2 3 4 5 |
<gui enabled="true" tls="false"> <address>127.0.0.1:8384</address> <apikey>-irK3EqXNUFKGwaFPrTijjEDFxfd0ARd</apikey> <theme>default</theme> </gui> |
Řádek <address>127.0.0.1:8384</address>
zaměníme za <address>0.0.0.0:8384</address>
. Adresa 0.0.0.0 značí, že se bude možné připojit ze všech počítačů v síti Internet. Nejlepším způsobem pro omezení přístupu je správné nastavení adresního rozsahu a nasazení firewallu – pokud je náš systém z internetu dostupný. Po změně nastavení službu restartujeme.
V každém případě doporučuji v GUI ihned nastavit přihlašovací jméno/heslo a použít HTTPS pro grafické rozhraní.
Certifikáty
Certifikáty, které jsou vygenerovány při prvním spuštění syncthing jsou tzv. self signed.
V adresáři obsahujícím nastavení syncthing nalezněme čtveřici souborů:
cert.pem
https-cert.pem
https-key.pem
key.pem
V každém případě můžeme tyto certifikáty zaměnit za vlastní. Pokud používáme certifikační autoritu Let’s Encrypt, zaměníme soubory cert.pem a https-cert.pem za fullchain.pem a soubory https-key.pem a key.pem za privkey.pem. Samozřejmě je možné nastavit symbolické linky.
Při opětovném startu služby dojde k jejich načtení.
V systému máme možnost si o použitých certifikátech zjistit podrobnější informace:
1 2 3 4 |
[root@linux ~]# openssl s_client -connect localhost:8384 ... [root@linux ~]# openssl s_client -connect localhost:22000 ... |
Omezení syncthing
Syncthing s sebou nese řadu koncepčních a technických omezení, která jsou dána návrhem služby a jejím cílem.
Jelikož je syncthing koncipován jako multiplatformní, není zahrnuta podpora přenesení detailnějších práv mezi jednotlivými uzly. Musíme se tedy obejít bez ACL, XATTR a jiných vlastností souborových systémů. Tzn., pokud se v synchronizovaném adresáři nachází adresáře nebo soubory, které jsou vlastněny více než jedním uživatelem. V takovém případě budou synchronizovaná data na okolních systémech vlastněna vždy uživatelem, pod kterým je spuštěna konkrétní instance/služba syncthing.
Toto a jiná omezení se nás nebudou dotýkat v domácím prostředí nebo jednouživatelském režimu. V případě, kdy budeme chtít službu nasadit ve víceuživatelském prostředí, typicky firma, není pro nás tento produkt vhodný.
Sdílení dat přes SMB (samba) – Windows
V domácím prostředí můžeme data jednotlivých synchronizovaných adresářů jednoduchým způsobem sdílet. Musíme si však dát pozor na správné nastavení příslušných vlastníků. V našem případě jsou všechna data vlastněna uživatelem d-share. I v případě samby musíme tento stav respektovat.
Následující příklad uvádí nastavení sdílené složky /data/share/public
, která je vlastněna uživatelem d-share. Příslušná část souboru /etc/samba/smb.conf
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#============================ Share Definitions ============================== [Verejne] comment = Verejna sdilena data path = /data/share/public available = yes browsable = yes public = yes read only = no guest ok = Yes force user = d-share force group = d-share create mask = 0644 force create mode = 0644 directory mask = 0755 force directory mode = 0755 |
Za povšimnutí stojí výchozí nastavení módu pro vytváření nových souborů a adresářů.
Tento adresář musíme samozřejmě nastavit i pro synchronizaci službou syncthing.
Sdílení dat přes NFS – UNIX/Linux
Podobným způsobem jako v případě SMB můžeme sdílet soubory přes NFS. Důležité je si v tomto případě uvědomit, že nelze zadat jméno uživatele d-share, ale musíme zadat jeho číslo (UID) a číslo skupiny (GID).
Tyto hodnoty zjistíme následujícím způsobem:
1 2 |
[root@linux ~]# id d-share uid=993(d-share) gid=993(d-share) skupiny=993(d-share) |
Nyní vytvoříme/změníme soubor /etc/exports.d/nfs.exports
a vložíme definici sdíleného adresáře:
1 |
/data/share/public 0.0.0.0(rw,no_subtree_check,nohide,all_squash,anonuid=993,anongid=993) |
Opět je důležité poznamenat, že tento adresář bude dostupný z celé sítě pro zápis.
Nastavení NFS nebudu stejně jako v případě SMB detailně popisovat.
Notifikace sdílení službou avahi/zeroconf
V prostředí UNIX/Linux/Mac OSX můžeme pro informování zařízení v místní síti použít službu avahi
/zeroconf
. O notifikaci se v případě SMB starat nemusíme, tato funkce je automatická. Pro NFS použijeme soubor /etc/avahi/services/nfs_dvr.service
:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" standalone='no'?> <!DOCTYPE service-group SYSTEM "avahi-service.dtd"> <service-group> <name replace-wildcards="yes">Verejna sdilena data na %h (NFS)</name> <service> <type>_nfs._tcp</type> <port>2049</port> <txt-record>path=/data/share/public</txt-record> </service> </service-group> |
Závěr
Ať již svá data synchronizujeme či sdílíme, vždy si musíme uvědomit, že naše infrastruktura je tak bezpečná, jak bezpečný je její nejslabší prvek. To platí zejména v případě mobilních zařízení.
Pokud je to možné, snažíme se minimalizovat rizika úniků dat pomocí šifrování a nasazením firewallu.
Jednotlivé složky by měly být dostupné pouze ze zařízení, ze kterých je takový přístup bezpodmínečně nutný. Kromě úniku nám také hrozí i nechtěné vymazání. V takovém případě nejsou většinou vlastnosti systému jakým je např. koš dostupné.