Le DS415+ est un NAS orienté TPE/PME (malgré la garantie de seulement 2 ans !). C'est un upgrade de son grand frère le DS412+, doté de plus de mémoire et d'un processeur plus puissant (atom 4 cœurs 2.4 Ghz) qui permet le chiffrement matériel.
CPU : Atom Quad-Core C2538(4C/4T) @2.4 GHz (Avoton 64-bits/gravure 22nm/2MB cache/TDP 15W/VT-x et EPT/AES-NI pour le chiffrement matériel AES 256 bits) Mémoire : 2 GB DDR3 (extensible à 8 GB officieusement et en perdant la garantie) Emplacements : 4x baies 3.5" hot-swappable ; max 24 TB (4 disques de 6 TB, connexion interne SATA II), tiroirs screwless (sans vis) Type de RAID : JBOD, RAID {0, 1, 5, 6, 10, SHR (Synology Hybrid RAID)} Stockage : ext4 pour les disques internes, ext3-4, FAT, NTFS ou HFS+ pour les disques externes Ventilation : 2x 92 mm en extraction Bruit : 20.2 dB(A) Alimentation : 100 W Consommation : 46.2W (Access), 17.3W (HDD Hibernation) Taille (hauteur-largeur-profondeur) : 165 x 203 x 233.2 mm Poids : 2,05 kg Garantie : 2 ans Connectique : 2x Gigabit (compatible link aggregation), WoL 1x USB2 (façade), 2x USB 3 1x eSATA
Le NAS, qui doit être connecté sur le même réseau que votre ordinateur, est détecté automatiquement et vous présente l'assistant d'installation. Ce dernier vous demande le mot de passe admin, et vous propose de télécharger seul la dernière version de DSM. 10 minutes après, DSM est lancé et accessible via votre navigateur. La durée de construction du raid (4x 4 To WD red, en une grappe de SHR (Synology Hybrid RAID)) est d'environ 1j, 5h :
ds415> cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] md2 : active raid5 sdd5[3] sdc5[2] sdb5[1] sda5[0] 11706850944 blocks super 1.2 level 5, 64k chunk, algorithm 2 [4/4] [UUUU] [==================>..] resync = 93.7% (3657132392/3902283648) finish=145.4min speed=28092K/sec
Compter ensuite la durée d'installation et de configuration des différents modules (centre de paquets) et services (création des utilisateurs, partages, notifications, …), puis de migration des données et vous avez un NAS pleinement fonctionnel.
+ excellentes performances mono-tâche, les meilleures pour des données chiffrées + petite taille (mais costaud.. ) + bon rapport qualité/prix + insertion des disques simples + l'OS DSM bien fini et extensible via les extensions - il arrive que les disques fassent vibrer le boitier, ce qui génère du bruit - performances multi-tâches limitées
Cette partie traite de la sécurisation (hardening) d'un NAS Synology. Parce qu'il arrive qu'il contienne des données sensibles et qu'il soit connecté à Internet, il faut prendre quelques précautions.
Sources:
Control Panel > Update & Restore > DSM Update > Update Settings : cocher Newest DSM and all updates et Check and download update regularly
Control Panel > Update & Restore > Configuration Backup : Back up configuration
Voici un aide-mémoire des OIDs intéressants à pooler en SNMP pour métrologiser le NAS.
// synoSystem systemStatus .1.3.6.1.4.1.6574.1.1.0 = INTEGER: 1 -> Normal(1), Failed(2) systemTemperature .1.3.6.1.4.1.6574.1.2.0 = INTEGER: 32 powerStatus .1.3.6.1.4.1.6574.1.3.0 = INTEGER: 1 systemFanStatus .1.3.6.1.4.1.6574.1.4.1.0 = INTEGER: 1 cpuFanStatus .1.3.6.1.4.1.6574.1.4.2.0 = INTEGER: 1 modelName .1.3.6.1.4.1.6574.1.5.1.0 = STRING: "DS415+" serialNumber .1.3.6.1.4.1.6574.1.5.2.0 = STRING: "xxxxxxxxxx" version .1.3.6.1.4.1.6574.1.5.3.0 = STRING: "DSM 5.1-5022" upgradeAvailable .1.3.6.1.4.1.6574.1.5.4.0 = INTEGER: 2 -> Available(1), Unavailable(2), Connecting(3), Disconnected(4), Others(5) // synoDisk diskIndex .1.3.6.1.4.1.6574.2.1.1.2.0 = STRING: "Disk 1" diskID ? diskModel .1.3.6.1.4.1.6574.2.1.1.3.0 = STRING: "WD40EFRX-68WT0N0 " diskType .1.3.6.1.4.1.6574.2.1.1.4.0 = STRING: "SATA" diskStatus .1.3.6.1.4.1.6574.2.1.1.5.0 = INTEGER: 1 -> Normal(1), Initialized(2), NotInitialized(3), SystemPartitionFailed(4), Crashed(5) diskTemperature .1.3.6.1.4.1.6574.2.1.1.6.0 = INTEGER: 29 // synoRaid raidIndex ? raidName .1.3.6.1.4.1.6574.3.1.1.2.0 = STRING: "Volume 1" raidStatus .1.3.6.1.4.1.6574.3.1.1.3.0 = INTEGER: 1 -> Normal(1), Repairing(2), Migrating(3), Expanding(4), Deleting(5), Creating(6), RaidSyncing(7), RaidParityChecking(8), RaidAssembling(9), Canceling(10), Degrade(11), Crashed(12) // synoUPS : .1.3.6.1.4.1.6574.4 pas intéressant // autres OIDs Load .1.3.6.1.4.1.2021.10.1.2.1 = STRING: "Load-1" .1.3.6.1.4.1.2021.10.1.2.2 = STRING: "Load-5" .1.3.6.1.4.1.2021.10.1.2.3 = STRING: "Load-15" .1.3.6.1.4.1.2021.10.1.3.1 = STRING: "1.96" .1.3.6.1.4.1.2021.10.1.3.2 = STRING: "2.02" .1.3.6.1.4.1.2021.10.1.3.3 = STRING: "2.04" Usage CPU User .1.3.6.1.4.1.2021.11.9.0 = INTEGER: 1 System .1.3.6.1.4.1.2021.11.10.0 = INTEGER: 0 Idle .1.3.6.1.4.1.2021.11.11.0 = INTEGER: 98 Mémoire memTotalSwap .1.3.6.1.4.1.2021.4.3.0 = INTEGER: 3317676 memAvailSwap .1.3.6.1.4.1.2021.4.4.0 = INTEGER: 3311992 memTotalReal .1.3.6.1.4.1.2021.4.5.0 = INTEGER: 2035652 memAvailReal .1.3.6.1.4.1.2021.4.6.0 = INTEGER: 114792 memTotalFree .1.3.6.1.4.1.2021.4.11.0 = INTEGER: 3426784 ? .1.3.6.1.4.1.2021.4.12.0 = INTEGER: 16000 memShared .1.3.6.1.4.1.2021.4.13.0 = INTEGER: 0 memBuffer .1.3.6.1.4.1.2021.4.14.0 = INTEGER: 37300 memCached .1.3.6.1.4.1.2021.4.15.0 = INTEGER: 1585848 Reseau ifName .1.3.6.1.2.1.31.1.1.1.1 ifHCInOctets .1.3.6.1.2.1.31.1.1.1.6 ifHCOutOctets .1.3.6.1.2.1.31.1.1.1.10
Pour ajouter des fonctionnalités supplémentaires sur le NAS, on peut installer des logiciels. Comme sur les distribs Linux, on les installe depuis des dépôts, que l'on peut personnaliser dans l'interface de l'outil idoine : le Package Center. On dispose par défaut des paquets dans le dépôt officiel Synology, mais on peut en rajouter d'autres dans Settings/Package Sources, par exemple :
Certains outils de base des distributions Linux sont installables en CLI avec la commande synogear
:
# installation, en root (sudo) synogear install download DiagnosisTool 3.0.1-3008 successfully # lister les composants installés synogear list
On retrouvera par exemple iperf, dig, iostat, tcpdump, tracepath, tmux etc…
C'est un client RSS ; il dépend du paquet MariaDB (dont le mdp root est vide par défaut).
Depuis la version DSM 6, TT RSS ne se lance plus (avec l'erreur : “incorrect MySQL root password”) ; pour corriger le problème il faut se connecter en SSH (avec un compte ayant les droits d'admin) et saisir :
sudo mkdir -p /usr/syno/mysql/bin sudo ln -s /usr/bin/mysql /usr/syno/mysql/bin/mysql
Toujours en DSM 6, les flux ne se mettent pas à jour. En remplaçant le chemin vers l'exécutable PHP dans la conf du paquet tt-rss, ça fonctionne :
vi /var/services/web/tt-rss/config.php //define('PHP_EXECUTABLE', '/usr/bin/php'); define('PHP_EXECUTABLE', '/usr/local/bin/php56');
Puis redémarrer le paquet tt-rss via l'interface web (dans le “Package center, Tiny tiny RSS, Action: Stop” puis Start).
Audio station permet d'écouter dans un navigateur la musique stockée sur le NAS ; pour cela elle se base sur les dossiers indexés contenant de la musique (par défaut /Music). Pour changer ce répertoire par défaut ou ajouter d'autres dossiers contenant de la musique :
Pour qu'un utilisateur puisse utiliser Audio Station, aller dans le Panneau de configuration/Utilisateur ; cliquer sur l'utilisateur puis sur l'onglet Applications, et vérifier les droits.
Logiciel de catalogue et lecteur multimédia en mode web. Dockerisable, Jellyfin existe en paquet SynoCommunity plus simple à installer (à accompagner avec le paquet ffmpeg, qui est proposé par l'assistant).
Avec DSM 7 il faut octroyer les droits d'accès au répertoire multimédia à l'utilisateur interne sc-jellyfin : pour cela aller dans le panneau de configuration> Dossier partagé ; clic droit sur le dossier> Modifier. Dans la fenêtre, choisir l'onglet Permissions, choisir dans la selectbox “Utilisateur du système interne” et donner les droits en Lecture seule l'utilisateur sc-jellyfin.
A l'heure ou j'écris ces lignes la virtualisation est en version bêta, et non supportée sur les DS415+. Et de toute façon ils n'ont pas suffisamment de RAM (2 Go), comme indiqué dans les prérequis officiels.
En pratique on peut quand même tester le Virtual Machine Manager fraîchement pondu par Synology, moyennant :
De base le boitier dispose de 2 Go de mémoire vive, ce qui est suffisant pour la grande majorité des utilisations. Cependant si l'on souhaite goûter à la joie de la virtualisation, il faut passer à 8 Go (maximum supporté sur le seul emplacement so-dimm de la carte mère). J'ai personnellement utilisé la barrette suivante : Crucial 8GB Single DDR3/DDR3L 1600 MT/S (PC3-12800) Unbuffered SODIMM 204-Pin Memory - CT102464BF160B, qui est celle la plus recommandée ça et là.
L'augmentation de la capacité mémoire n'est pas supportée par Synology sur ce modèle ; de ce fait on perd la garantie constructeur quand on ouvre le boitier. Ce dernier n'est pas conçu pour être ouvert facilement, mais c'est quand même largement accessible même par Mme Michu : il suffit de se munir d'un tournevis cruciforme.
insérer des images ici
Pour l'ouverture du boitier j'ai suivi ce modop de Charles Hooper.
Une fois la mémoire ajoutée, on pourra vérifier sa bonne prise en compte dans le Centre d'info :
Normalement comme tous les paquets en bêta, Virtual Machine Manager n'apparait qu'en ayant coché la case “Oui je veux voir les versions bêta” dans les paramètres du Centre de Paquets. Mais pour les DS415+ il n'y est pas car pas officiellement supporté. Il faut donc installer le fichier .spk en téléchargeant la dernière version ici : https://usdl.synology.com/download/Package/spk/Virtualization/ ; puis cliquer sur “Installation manuelle”, et enfin sélectionner le fichier téléchargé.
Pour installer Docker, aller dans Centre de paquets > Docker > Installer
Une fois Docker, installer, le lancer ;
Pour la configuration, procéder comme suit :
/etc
:#Fichier/Dossier Chemin d'accès docker/pihole/dnsmasq.d /etc/dnsmasq.d docker/pihole/pihole /etc/pihole
# mot de passe de l'interface web WEBPASSWORD=MDP4cc3sInterfaceWeb # Spécifie au pihole de répondre à tous les clients qui lui demande # Si on n'est pas sûr de ce que l'on veut faire, il vaut mieux préciser "local" # que "all", c'est plus sécure. DNSMASQ_LISTENING=all # port d'écoute de l'interface web du pihole WEB_PORT=8080 # bind le serveur web sur toutes les adresses locales du NAS #ServerIP=0.0.0.0 # si vous avez configuré un DNS pour votre Syno, vous pouvez le préciser ici VIRTUAL_HOST=pihole.local.perso # dans mon cas j'ai déjà un résolveur DNS, donc je le spécifie ici. Sinon, ne pas ajouter cette ligne PIHOLE_DNS_=192.168.1.65 # on peut préciser plusieurs forwarders séparés par un ";", et spécifier le port d'écoute avec #<PORT> PIHOLE_DNS_=192.168.1.65#5353;80.67.169.12;80.67.169.40
On clique sur Action > Démarrer et c'est parti, on peut logiquement accéder à l'interface web du pihole à partir sur http://IP_DU_SYNO:8080
A noter que si on choisit de changer des variables d'environnement après un premier lancement du conteneur, ça risque de planter car il semble qu'elles soient enregistrées dans une base du pihole ; dans mon cas par exemple j'ai voulu ajouter VIRTUAL_HOST à postériori, le conteneur n'a jamais voulu redémarrer en ma crachant le log :
::: Testing lighttpd config: Error: duplicate array-key: VIRTUAL_HOST. Please get rid of the duplicate entry.
Pour contourner cela, sélectionner le conteneur puis : “Paramètres > Paramètre en double”. Cela permettra de modifier les variables d'environnement tout en conservant les données partagées sur les volumes.
Globalement la procédure consiste à arrêter le conteneur, le supprimer, supprimer l'image locale, puis à télécharger la dernière image “latest”, et enfin recréer le conteneur. Pour automatiser la re-création du conteneur, on peut créer le user-script suivant dans le planificateur de tâche du syno (à lancer en root, et en désactivant la répétition pour ne le lancer que manuellement) :
docker run -d --name=pihole-new \ -e WEB_PORT=3443 \ -e WEBPASSWORD=MDP4cc3sInterfaceWeb \ -e DNSMASQ_LISTENING=local \ -e VIRTUAL_HOST=pihole.local.perso \ -e PIHOLE_DNS_=127.0.0.1#1053;192.168.1.65 \ -e TZ=FR \ -v docker/pihole/dnsmasq.d:/etc/dnsmasq.d \ -v docker/pihole/pihole:/etc/pihole \ --net=host \ --restart=unless-stopped \ pihole/pihole
Ressources :
Mise en place d'une sauvegarde Hyperbackup sur un NAS Synology vers un serveur rsync “compatible” (pas Synology) via SSH (en l'occurence un NAS OpenMediaVault v5).
Sur le serveur OMV distant : * créer un nouveau partage “bck-syno” dans Access Right Manager> Shared Folder * activer le SSHd et créer un utilisateur “usr-hbkp” ; l'ajouter dans le groupe SSH * activer le service rsyncd : dans Services> Rsync
Sur le NAS Syno source, installer puis lancer “Hyper Backup” ; puis créer une nouvelle sauvegarde : Serveur de fichier/Rsync :
Lancer la sauvegarde. Les fichiers rsyncd.conf et rsyncd.secrets seront créés dans le dossier distant.
Vu ici : https://forum.openmediavault.org/index.php?thread/5549-omv-extras-org-plugin/
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash
Pour se connecter en SSH au NAS, il faut activer le service dans le Panneau de configuration > System : Terminal & SNMP. Puis on s'y connecte soit avec le login “admin”, soit “root”. Le mot de passe est toujours celui du compte admin donc choisissez-le judicieusement.
NB : Depuis DSM 6, on ne peut plus se connecter avec le login root, il faut se connecter avec un compte utilisateur ayant les droits d'admin. Puis utiliser sudo
.
Pour renouveler son certificat let's encrypt (qui n'est valide que 3 mois) :
sudo /usr/syno/sbin/syno-letsencrypt renew-all [ -v[v] ]
; ex :sudo /usr/syno/sbin/syno-letsencrypt renew-all -v DEBUG: Issuer name of certificate. [Let''s Encrypt]->[/usr/syno/etc/certificate/_archive/JjujoD/cert.pem] DEBUG: Issuer name of certificate. [Synology Inc.]->[/usr/syno/etc/certificate/_archive/lx0mfJ/cert.pem] DEBUG: certificate is not issued by Let''s encrypt. [/usr/syno/etc/certificate/_archive/lx0mfJ/cert.pem] DEBUG: start to renew [/usr/syno/etc/certificate/_archive/JjujoD]. DEBUG: setup acme url https://acme-v02.api.letsencrypt.org/directory DEBUG: GET Request: https://acme-v02.api.letsencrypt.org/directory DEBUG: GET Request: https://acme-v02.api.letsencrypt.org/acme/new-nonce DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/new-order DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/new-order DEBUG: Failed to port map router detect. [1] DEBUG: failed to open port 80. DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/authz-v3/41127559850 DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/authz-v3/41127559850 DEBUG: dns-01 is not support for toto.fr DEBUG: Setup challenge for toto.fr with type http-01 DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/chall-v3/41127559850/iipDBw DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/chall-v3/41127559850/iipDBw DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/authz-v3/41127559850 DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/authz-v3/41127559850 DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/authz-v3/41127559850 DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/authz-v3/41127559850 DEBUG: ==> start new-cert. DEBUG: generate csr & private key DEBUG: get new-cert DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/finalize/68533444/32870294000 DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/finalize/68533444/32870294000 DEBUG: Post JWS Request: https://acme-v02.api.letsencrypt.org/acme/cert/038012c726f8b4e7d4fa059921e49ffb6546 DEBUG: Post Request: https://acme-v02.api.letsencrypt.org/acme/cert/038012c726f8b4e7d4fa059921e49ffb6546 DEBUG: get issuer-cert DEBUG: save to files DEBUG: renew success. [/usr/syno/etc/certificate/_archive/JjujoD].
(PS : le sudo -i
marche aussi)
Et si KO : penser à ouvrir bien grand (permit any any) le firewall Syno, cf anecdote qui suit.
TL;DR : Le problème vient d'un filtrage géographique dans le firewall du Syno. Malgré que celui-ci soit désactivé, il bloque quand même les serveurs de letsencrypt. En créant une règle permissive (genre permit any en HTTP) on fait tomber le script en marche !
Je suis récemment tombé sur un os lors du renouvellement de mon certificat letsencrypt : alors que la redirection tcp/80 était bien en place sur mon routeur, le script se vautre en renvoyant l'erreur suivante :
sudo /usr/syno/sbin/syno-letsencrypt renew-all -v [..] DEBUG: DNS challenge failed, reason: {"error":108,"file":"challenge.cpp","msg":"Not synology DDNS."} DEBUG: Normal challenge failed, reason: {"error":200,"file":"client.cpp","msg":"new_authz: unexpect httpcode."}
Sympa l'erreur : “unexpect httpcode”. Bon.
On passe en mode Columbo : on désactive le firewall du Syno et on relance le script avec l'option debug de la dernière chance (syno-letsencrypt -vv
) ; on voit que notre Syno génère un fichier de “challenge” et le mettre à disposition des serveurs letsencrypt :
# morceaux choisis du debug : "error": { "type": "urn:acme:error:connection", "detail": "Fetching http://mydomain.com/.well-known/acme-challenge/YuOX1zXw-\ lD20Th6mHJzDNhBDkURHo1ZFBHxh5F-A-0: Timeout during connect (likely firewall problem)", "status": 400 }
Ce challenge permet de valider que :
Ce fichier est mis à disposition en HTTP par le serveur nginx du Syno :
grep -Ri -A3 "acme-challenge" /etc/nginx/* /etc/nginx/nginx.conf- location ^~ /.well-known/acme-challenge { /etc/nginx/nginx.conf: root /var/lib/letsencrypt; /etc/nginx/nginx.conf- default_type text/plain; /etc/nginx/nginx.conf- }
C'est bourrin mais ça paie : le dossier est bien configuré dans nginx, et il est situé “en vrai” dans /var/lib/letsencrypt/.well-known/acme-challenge/ !
Le dossier existe bel et bien et dispose des bons droits, mais en fouinant dans les logs d'erreur du serveur nginx du Syno, je trouve ceci :
2018/11/02 15:35:20 [error] 6972#6972: *51124 access forbidden by rule, client: 64.78.149.164, server: _, request: \ "GET /.well-known/acme-challenge/56f1J6p6Wf3o-g219MmcZS7tCNufwA1Dj1Dm-ddGy1Y HTTP/1.1", host: "mydomain.com"
J'aime les erreurs “access forbidden by rule”, ça m'aide beaucoup : je n'ai jamais défini de règle de filtrage dans nginx et il n'y en a pas sur ce dossier…
Les fichiers de challenge sont temporaires et supprimés à la fin du script ; aussi on va faire le test avec un autre fichier :
echo "TEST" > /var/lib/letsencrypt/.well-known/acme-challenge/test
Puis, j'appelle le fichier depuis mon navigateur ou un wget :
wget -d http://mydomain.com/.well-known/acme-challenge/test [..] 2018-11-02 16:21:06 (121 KB/s) — « test » sauvegardé [5/5]
Et là ça passe !
C'est donc un filtrage en fonction de l'IP source ; n'ayant rien à perdre, je réactive le pare-feu de mon Syno et supprime le filtrage géographique (le champ “emplacement” dans la conf du firewall) : en mode “permit any any”. Je relance le script…
/usr/syno/sbin/syno-letsencrypt renew-all -v [..] DEBUG: renew success. [/usr/syno/etc/certificate/_archive/OufCaMarche].
… et BIM ça marche !
Aussi saugrenu que ça paraisse^W soit, chez Synology quand on décoche la case “Activer le pare-feu”, ben ça vaut pas dire que ça le désactive (même après reboot du NAS) ! Par ailleurs vu que c'est de l'iptables, c'est étonnant que cela puisse arriver dans les logs nginx…
Mais ma curiosité s'arrête là ; à dans 3 mois !
Description du problème : un script utilisant l'outil find
, et qui se lance sans problème en CLI, ne s'exécute pas normalement lorsqu'il est lancé en tant que tâche planifiée (pourtant sous le même utilisateur) ; le message d'erreur est :
find: cannot get current directory: Permission denied
D'après ce thread sur stackoverflow, cela viendrait de l'implémentation du find sur ce système ; quoiqu'il en soit l'astuce indiquée du cd /tmp
juste avant l'appel à find
fonctionne à merveille pour moi.