{"id":1060,"date":"2021-07-06T17:49:29","date_gmt":"2021-07-06T15:49:29","guid":{"rendered":"https:\/\/torstenzimmermann.de\/wordpress\/?p=1060"},"modified":"2022-10-23T07:45:46","modified_gmt":"2022-10-23T05:45:46","slug":"bitwarden-mit-synology-im-docker-einrichten","status":"publish","type":"post","link":"https:\/\/torstenzimmermann.de\/wordpress\/bitwarden-mit-synology-im-docker-einrichten\/","title":{"rendered":"Im Synology-NAS unter Docker Bitwarden\/Vaultwarden einrichten"},"content":{"rendered":"\n<p>Welt seid mir gegr\u00fc\u00dft.<br>Stellt euch folgendes vor: Ihr habt mehrere Ger\u00e4te und w\u00fcrdet gern eure Passw\u00f6rter synchronisieren.<br>Eure Kennw\u00f6rter wollt ihr aber ungern auf einer Cloud bei einen externen Anbieter anvertrauen.<br>Die L\u00f6sung liegt nahe: man sollte die Kennw\u00f6rter also selber hosten.<br>Eine Keepass-Datenbank hin und her zu synchronisieren erweist sich als unpraktisch. Etwas zentraleres muss her.<br>Meine L\u00f6sung dazu: Bitwarden (bzw jetzt Neu: Vaultwarden, das selbe in Gr\u00fcn)<\/p>\n\n\n\n<p>Bitwarden\/Vaultwarden kann f\u00fcr Privatanwender for free genutzt werden. Man kann auch deren Cloud L\u00f6sung nehmen, aber wozu gibt es NAS und Raspberry Pis die f\u00fcr sowas gut geeignet sind.<br>Ich hab meine Passw\u00f6rter gern so wenig in einer externen Cloud wie m\u00f6glich.<br>Der folgende Guide bezieht sich prim\u00e4r auf Synology DSM 7. F\u00fcr Raspberry Pi wird ein eigener Beitrag folgen.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Docker<\/p>\n\n\n\n<p>Zuerst einmal laden wir im Docker das folgende Paket: vaultwarden\/server:latest<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"194\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-1024x194.png\" alt=\"\" class=\"wp-image-1061\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-1024x194.png 1024w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-300x57.png 300w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-768x145.png 768w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik.png 1072w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>und starten den Container und legen folgende Einstellungen fest:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"522\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-1.png\" alt=\"\" class=\"wp-image-1062\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-1.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-1-300x259.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>(Name kann nat\u00fcrlich ge\u00e4ndert werden)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"506\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-2.png\" alt=\"\" class=\"wp-image-1063\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-2.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-2-300x251.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>Wir brauchen ein data Ordner damit die anfallenden Daten auch gespeichert bleiben.<br>Der Mount-Pfad kann nach belieben ge\u00e4ndert werden. Er muss aber auf jedenfall aber manuell  (z.b. in der Filestation) erstellt werden.<br>Das Logfile werden wir sp\u00e4ter noch brauchen f\u00fcr fail2ban, aber auch so kann es interessant sein das lesen zu wollen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"518\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-3.png\" alt=\"\" class=\"wp-image-1064\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-3.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-3-300x257.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>Eure lokalen Ports sind nat\u00fcrlich je nach gusto auch anpassbar.<br>Der 3012er Port wird f\u00fcr den Websocket ben\u00f6tigt, damit \u00c4nderungen sofort gesynct werden.<br>Will man das nicht und es reicht einen das Bitwarden das beim Start nur synct ist dieser optional.<br>Der 80er Port ist, ihr habt es erraten, das Webinterface. Das bekommt gleich via Reverse Proxy auch ein Zertifikat.<br>Dazu gleich mehr. Auch hier k\u00f6nnt ihr einen Port nehmen den Ihr f\u00fcr richtig erachtet.<\/p>\n\n\n\n<p>Last but not least die Umgebungsvariablen f\u00fcr den Docker:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"508\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-5.png\" alt=\"\" class=\"wp-image-1066\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-5.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-5-300x252.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p>Sie erkl\u00e4ren sich eigentlich von selbst. <br>Signups_allowed k\u00f6nnen wir sp\u00e4ter auf false setzen nachdem wir uns erfolgreich angemeldet haben.<\/p>\n\n\n\n<p>Soviel erstmal zum Docker zeug. Auf zum notwendigen Reverse Proxy (notwendig f\u00fcrs Internet), den findet ihr hier:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\">!!! Anmerkung !!! Ich wurde von einigen Leuten hingewiesen, das sie gar kein Zugang aus dem Internet wollen. LAN \/ VPN reicht ihnen v\u00f6llig. In diesenfall seit ihr hier schon Fertig und geht dann immer via HTTP(S):\/\/IPoderDNSnameDESnas:35555 in den Vault.<br><\/p>\n\n\n\n<p>Okay weiter im Text:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-large-font-size\">Der Reverse Proxy<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"554\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-6-1024x554.png\" alt=\"\" class=\"wp-image-1067\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-6-1024x554.png 1024w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-6-300x162.png 300w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-6-768x416.png 768w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-6.png 1049w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"583\" height=\"361\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-7.png\" alt=\"\" class=\"wp-image-1068\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-7.png 583w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-7-300x186.png 300w\" sizes=\"auto, (max-width: 583px) 100vw, 583px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"601\" height=\"557\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-8.png\" alt=\"\" class=\"wp-image-1069\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-8.png 601w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-8-300x278.png 300w\" sizes=\"auto, (max-width: 601px) 100vw, 601px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"603\" height=\"503\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-9.png\" alt=\"\" class=\"wp-image-1070\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-9.png 603w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-9-300x250.png 300w\" sizes=\"auto, (max-width: 603px) 100vw, 603px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-large-font-size\">Optional: DDNS mit Zertifikat erstellen (falls notwendig)<\/p>\n\n\n\n<p>Ihr habt keine domain\/ddns f\u00fcr eure Synology ? Ist nicht wild, Synology bringt alles mit was wir brauchen.<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-10-1024x682.png\" alt=\"\" class=\"wp-image-1071\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-10-1024x682.png 1024w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-10-300x200.png 300w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-10-768x511.png 768w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-10.png 1026w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption><br><\/figcaption><\/figure>\n\n\n\n<p>Synology selbst bietet ein DDNS an den ihr nutzen k\u00f6nnt. Klickt euch durchs men\u00fc und erstellt ggfs. ein DDNS.<br>Ihr solltet euch zur der DDNS auch noch ein Zertifikat ausstellen lassen:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"783\" height=\"401\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-15.png\" alt=\"\" class=\"wp-image-1076\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-15.png 783w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-15-300x154.png 300w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-15-768x393.png 768w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"519\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-16.png\" alt=\"\" class=\"wp-image-1077\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-16.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-16-300x257.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"515\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-17.png\" alt=\"\" class=\"wp-image-1078\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-17.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-17-300x255.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"515\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-18.png\" alt=\"\" class=\"wp-image-1079\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-18.png 605w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-18-300x255.png 300w\" sizes=\"auto, (max-width: 605px) 100vw, 605px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-large-font-size\">Router Freigaben:<\/p>\n\n\n\n<p>Okay, wir haben den Docker, wir haben den Reverse Proxy und sogar ein Zertifikat. Was jetzt ?<br><br>Der Port muss noch freigegeben werden in der Fritz.Box (oder \u00e4hnliches).<br><\/p>\n\n\n\n<p>Wir melden uns also an der Fritz.Box an und gehen auf &#8222;Freigaben&#8220;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"259\" height=\"365\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-11.png\" alt=\"\" class=\"wp-image-1072\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-11.png 259w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-11-213x300.png 213w\" sizes=\"auto, (max-width: 259px) 100vw, 259px\" \/><\/figure>\n\n\n\n<p>sowie &#8222;Ger\u00e4t f\u00fcr Freigaben hinzuf\u00fcgen&#8220; und geben jetzt den \u00f6ffentlichen Port des Reverse Proxy sowie den Websocket an.<br>Soweit so gut. Testen wir das ganze und rufen eure DDNS auf mit dem entsprechenden Port der auf den Reverse Proxy zeigt:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"550\" height=\"536\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-13.png\" alt=\"\" class=\"wp-image-1074\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-13.png 550w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-13-300x292.png 300w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/figure>\n\n\n\n<p>Den aufmerksamen unter uns wird aufgefallen sein, das ganze Verbindung ist durch das Synology Zertifikat gesch\u00fctzt:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"360\" height=\"97\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-14.png\" alt=\"\" class=\"wp-image-1075\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-14.png 360w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-14-300x81.png 300w\" sizes=\"auto, (max-width: 360px) 100vw, 360px\" \/><\/figure>\n\n\n\n<p>Konto erstellen und fast Fertig.<br>Grunds\u00e4tzlich kann man schon das Webinterface komplett nutzen.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p class=\"has-large-font-size\">Browser Plugin<\/p>\n\n\n\n<p>Wir wollen aber noch die Browser Plugins und\/oder den Mobiltelefon client installieren.<br>Das erm\u00f6glicht uns im Browser die neue Kennw\u00f6rter direkt in den Tresor abzulegen, sowie gespeicherte Daten bequem abzurufen.<br>Am beispiel von Firefox sieht das so aus:<\/p>\n\n\n\n<p>Wir installieren das folgende Browser Plugin:<br><a href=\"https:\/\/addons.mozilla.org\/de\/firefox\/addon\/bitwarden-password-manager\/?utm_source=addons.mozilla.org&amp;utm_medium=referral&amp;utm_content=search\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/addons.mozilla.org\/de\/firefox\/addon\/bitwarden-password-manager\/?utm_source=addons.mozilla.org&amp;utm_medium=referral&amp;utm_content=search<\/a><\/p>\n\n\n\n<p>und das sieht dann so aus:<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"416\" height=\"645\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-19.png\" alt=\"\" class=\"wp-image-1080\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-19.png 416w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-19-193x300.png 193w\" sizes=\"auto, (max-width: 416px) 100vw, 416px\" \/><\/figure>\n\n\n\n<p>Bevor wir uns anmelden gehen wir zum zahnrad und geben als URL das Webinterface von oben ein.<\/p>\n\n\n\n<p>Analog funktioniert das nat\u00fcrlich auch f\u00fcr Android\/IOS. Einfach den Bitwarden Client installieren und als URL beim Zahnrad das Webinterface eingeben.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Der Websocket<\/p>\n\n\n\n<p>Okay, soweit so gut. was jetzt ? Der Websocket funktioniert noch nicht so ganz. <br>Was ist das ? Wozu brauch ich das ? Nun \u00e4hnlich wie beim Handy es &#8222;Push Nachrichten&#8220; gibt die einem sofort anzeigen das man z.B. eine mail hat geht das auch mit Webanwendungen. Die Nutzen websockets um sich zu benachrichtigen &#8222;Hier gibts eine \u00c4nderung, mach mal was. In unseren Fall: ein neuen Sync anstossen, sodass wir bei \u00c4nderungen immer SOFORT \u00fcberall unsere neuen Passw\u00f6rter haben und nicht erst nach dem n\u00e4chsten Sync Intervall &#8222;<\/p>\n\n\n\n<p><br>Aber das fixen wir schnell<br>Dazu hatte ich das hier gefunden:<br><a rel=\"noreferrer noopener\" href=\"https:\/\/gist.github.com\/nstanke\/3949ae1c4706854d8f166d1fb3dadc81\" target=\"_blank\">https:\/\/gist.github.com\/nstanke\/3949ae1c4706854d8f166d1fb3dadc81<\/a><br>genauer gesagt das hier:<br><a rel=\"noreferrer noopener\" href=\"https:\/\/gist.github.com\/nstanke\/3949ae1c4706854d8f166d1fb3dadc81#gistcomment-3795730\" target=\"_blank\"><s>https:\/\/gist.github.com\/nstanke\/3949ae1c4706854d8f166d1fb3dadc81#gistcomment-3795730<\/s><\/a><a href=\"https:\/\/gist.github.com\/nstanke\/3949ae1c4706854d8f166d1fb3dadc81#gistcomment-4342602\">Synology Bitwarden_rs Websocket setup without SSH \u00b7 GitHub<\/a><\/p>\n\n\n\n<p>Ich habe mir die Freiheit genommen hier einige Anpassungen vorzunehmen. Die eigentliche Idee dazu kam aber von meinem Arbeitskollegen Torsten: Die Admin Page sollte nur aus dem vertrauensw\u00fcrdigen VPN und Heimnetz erreichbar sein. Mit einer groben Vorstellung von Torsten wie es gehen m\u00fcsste habe ich das ganze ausgebaut und am ende das Script erweitert.<br>In meinem Fall habe ich ein Heimnetz und ein VPN Netz. Habt ihr kein VPN Netz tragt ihr hier bitte auch das Heimnetz ein. (Zeile 47-50)<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<pre class=\"wp-block-code has-vivid-green-cyan-color has-black-background-color has-text-color has-background\"><code>#!\/bin\/bash\n##==============================================================================================\n##                                                                                            ##\n##                       Script vaultwarden__Enable_Websocket-DSM_7.sh                        ##\n##                                                                                            ##\n##          Source : https:\/\/gist.github.com\/nstanke\/3949ae1c4706854d8f166d1fb3dadc81         ##\n##                                                                                            ##\n##==============================================================================================\n##                                                                                            ##\n##   This script allows you to route what cannot be done with the reverse-proxy               ##\n##   from DSM (Synology) to make Websocket notifications work                                 ##\n##   Doc. vaultwarden :                                                                       ##\n##        Route the \/notifications\/hub endpoint to the WebSocket server, by default           ##\n##        at port 3012, making sure to pass the Connection and Upgrade headers.               ##\n##        (Note the port can be changed with WEBSOCKET_PORT variable)                         ##\n##        https:\/\/github.com\/dani-garcia\/vaultwarden\/wiki\/Enabling-WebSocket-notifications    ##\n##                                                                                            ##\n##==============================================================================================\n##                                                                                            ##\n##                            Principle of Task schedule to create                            ##\n##                                                                                            ##\n## It is necessary to run the script regularly because all changes made in the interface      ##\n## DSM Reverse-Proxy graph will modify the configuration file. The same applies to            ##\n## even when the NAS reboots.                                                                 ##\n##                                                                                            ##\n##==============================================================================================\n##                                                                                            ##\n##        \/!\\      The online IP address 47 must be changed to the NAS IP     \/!\\             ##\n##                                                                                            ##\n##==============================================================================================\n##                                                                                            ##\n## Script launch parameters :                                                                 ##\n## bash \/volume1\/docker\/bitwarden\/enable_ws.sh vault.example.com 5555 5556                    ##\n##                                                                                            ##\n## -- vault.example.com = Vaultwarden domain name (that of DSM's Reverse Proxy)               ##\n## -- 5555 = Port exposed ROCKET_PORT by Docker (Same as DSM Reverse Proxy)                   ##\n## -- 5556 = Port exposed WEBSOCKET_PORT by Docker                                            ##\n##                                                                                            ##\n##==============================================================================================\n\nLOC_DIR=\"\/etc\/nginx\"\npart1=0\npart2=0\nMY_DOMAIN=$1\nPORT_ACCES=$2\nPORT_CONT=$3\nIP_NAS=\"192.168.178.254\"\n## Folgende Netzwerkbereiche d\u00fcrfen auf \/admin zugreifen\nIP_LAN=\"192.168.178.0\/24\"\nIP_VPN=\"192.168.177.0\/24\"\n\necho -e \"\\n$(date \"+%R:%S - \") Script vaultwarden__Enable_Websocket.sh to enable Websockets Notifications\"\n\nf_affiche_parametre() {\n  echo \"          bash \/volume1\/docker\/_Scripts-DOCKER\/vaultwarden__Enable_Websocket.sh vault.example.com 5555 5556 \"\n  echo \"                           -- vault.example.com = Vaultwarden domain name (that of DSM's Reverse Proxy) \"\n  echo \"                           -- 5555 = Port exposed ROCKET_PORT by Docker (Same as DSM Reverse Proxy)\"\n  echo \"                           -- 5556 = Port exposed WEBSOCKET_PORT by Docker\"\n}\n\nif &#91; ! $# -eq 3 ]; then\n  if &#91; $# -eq 0 ]; then\n    # No parameters were provided. We will display the list of what can be used.\n    echo \"$(date \"+%R:%S - \") No parameters provided! Review the script call :\"\n    f_affiche_parametre\n  else\n    echo \"$(date \"+%R:%S - \") The number of parameters provided is not correct! Review the script call :\"\n    f_affiche_parametre\n  fi\n  echo -e \"$(date \"+%R:%S - \") Failed to launch !!!!!!!!! script\\n\"\n  exit 1\nfi\n\necho \"$(date \"+%R:%S - \") Executing commands...\"\n\n\n#############################################################################################################\n## Start of file creation\/editing part\n##\nif &#91; -f $LOC_DIR\/websocket.locations.vaultwarden ]; then\n  rm $LOC_DIR\/websocket.locations.vaultwarden\n  part1=1\nfi\necho \"\"\"\nlocation \/notifications\/hub\/negotiate {\n    proxy_http_version 1.1;\n    proxy_set_header \\\"Connection\\\" \\\"\\\";\n    \n    proxy_set_header Host \\$host;\n    proxy_set_header X-Real-IP \\$remote_addr;\n    proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto \\$scheme;\n    proxy_pass http:\/\/$IP_NAS:$PORT_ACCES;\n}\n\nlocation \/notifications\/hub {\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade \\$http_upgrade;\n    proxy_set_header Connection \\\"upgrade\\\";\n\n    proxy_set_header Host \\$host;\n    proxy_set_header X-Real-IP \\$remote_addr;\n    proxy_set_header Forwarded \\$remote_addr;\n    proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto \\$scheme;\n    proxy_pass http:\/\/$IP_NAS:$PORT_CONT;\n}\n\nlocation \/admin {\n    # See: https:\/\/docs.nginx.com\/nginx\/admin-guide\/security-controls\/configuring-http-basic-authentication\/\n    # auth_basic Private;\n    # auth_basic_user_file \/path\/to\/htpasswd_file;\n\n    # Restrict access to only some IP (LAN IP &amp; VPN)\n    allow $IP_LAN;\n    allow $IP_VPN;\n    allow $IP_NAS;\n    deny all;\n\n    proxy_http_version 1.1;\n    proxy_set_header \\\"Connection\\\" \\\"\\\";\n    \n    proxy_set_header Host \\$host;\n    proxy_set_header X-Real-IP \\$remote_addr;\n    proxy_set_header X-Forwarded-For \\$proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto \\$scheme;\n    proxy_pass http:\/\/$IP_NAS:$PORT_ACCES\/admin;\n}\n\n\n\n\"\"\" >>$LOC_DIR\/websocket.locations.vaultwarden\n\n\n# Note : with DSM7, the path of the server file. ReverseProxy.conf has changed \n#         DSM6.2  = \/etc\/nginx\/app.d\/server.ReverseProxy.conf\n#         DSM7    = \/etc\/nginx\/sites-enabled\/server.ReverseProxy.conf\nif ! grep -q \"websocket.locations.vaultwarden\" \/etc\/nginx\/sites-enabled\/server.ReverseProxy.conf; then\n\n  # Functional commands with DSM6.2.x, but no longer with DSM 7.0 (RC)\n  #sed -i \"\/$1;\/ a\\ include $LOC_DIR\/websocket.locations.vaultwarden;\" \/etc\/nginx\/app.d\/server.ReverseProxy.conf\n  #if nginx -t 2>\/dev\/null; then synoservicecfg --reload nginx; else exit 1; fi\n\n  # Functional commands with DSM 7 (RC)\n  sed -r \"s#^(&#91;&#91;:blank:]]*server_name&#91;&#91;:blank:]]*${MY_DOMAIN}&#91;&#91;:blank:]]*;&#91;&#91;:blank:]]*)\\$#\\1\\n\\n\\tinclude ${LOC_DIR}\/websocket.locations.vaultwarden;#\" \/etc\/nginx\/sites-enabled\/server.ReverseProxy.conf > \/etc\/nginx\/sites-enabled\/server.ReverseProxy.conf.new\n  mv \/etc\/nginx\/sites-enabled\/server.ReverseProxy.conf.new \/etc\/nginx\/sites-enabled\/server.ReverseProxy.conf\n\n  if nginx -t 2>\/dev\/null; then synosystemctl reload nginx; else exit 1; fi\n\n  part2=1 # Variable to indicate that this part has been executed\n\nfi\n##\n## End of file creation\/editing part\n#############################################################################################################\n\nif &#91; $part1 -eq 1 ]; then\n  echo \"$(date \"+%R:%S - \")    -- The file $LOC_DIR\/websocket.locations.vaultwarden already existed, it was deleted and then recreated.\"\nelse\n  echo \"$(date \"+%R:%S - \")    -- The file $LOC_DIR\/websocket.locations.vaultwarden did not exist, it was created.\"\nfi\nif &#91; $part2 -eq 1 ]; then\n  echo \"$(date \"+%R:%S - \")    -- !!!!!! --->  The change in the \/etc\/nginx\/sites-enabled\/server file. ReverseProxy.conf did not exist. It was written.\"\n  echo \"$(date \"+%R:%S - \")    -- !!!!!! --->  The \/etc\/nginx\/sites-enabled\/server file. ReverseProxy.conf had to be reset after a reboot or when changing the reverse-proxy in DSM.\"\nelse\n  echo \"$(date \"+%R:%S - \")    -- Editing the \/etc\/nginx\/sites-enabled\/server file. ReverseProxy.conf was already performed during a previous run. No changes are therefore necessary.\"\nfi\n\necho \"$(date \"+%R:%S - \") Script vaultwarden__Enable_Websocket.sh Finished\"\n\nexit\n<\/code><\/pre>\n<\/div><\/div>\n\n\n\n<p><br>Hier muss im Script die IP ge\u00e4ndert werden, dann legen wir es im bitwarden docker verzeichnis ab. Dummerweise \u00fcberschreibt sich bei \u00c4nderungen seitens DSM die Anpassung. Wir sollten das Script also einmal am tag in den &#8222;Geplante Aufgaben&#8220; legen. <br>Kann so aussehen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"520\" height=\"463\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2022\/02\/grafik-1.png\" alt=\"\" class=\"wp-image-1146\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2022\/02\/grafik-1.png 520w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2022\/02\/grafik-1-300x267.png 300w\" sizes=\"auto, (max-width: 520px) 100vw, 520px\" \/><\/figure>\n\n\n\n<p><br><strong>bash \/volume1\/docker\/vaultwardenvaultwarden__enable_websocket.sh euredomain.de  35554 35556<\/strong><br>Ihr m\u00fcsst die Ports die ihr ganz oben definiert habt als parameter mitangeben.<\/p>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\">Vieleicht noch eine kleine Warnung: Skripte mit &#8222;root&#8220; durchlaufen zu lassen und am Webserver zu spielen k\u00f6nnte theoretisch daf\u00fcr sorgen das euer Webserver an der Diskstation nicht mehr funktioniert. Ist unwahrscheinlich und funkionierte bisher immer sehr gut bei mir, ich wollte jedoch auf die theoretische Gefahr hinweisen die vor allem bei gr\u00f6\u00dferen Updates der DSM bestehen k\u00f6nnten.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Absichern mit Fail2Ban<\/p>\n\n\n\n<p>Gut. An sich haben wir hier eigentlich alles fertig, jetzt kommt der versprochende &#8222;Fail2Ban&#8220;.<br>Was ist das und wozu brauch ich es:<br><br>Fail2Ban liest die log files zyklisch vom bitwarden und schaut ob es fehlerhafte loginversuche gab.<br>Und wenn man es zuoft versucht wird man f\u00fcr eine Zeit X gesperrt.<\/p>\n\n\n\n<p>Der Schritt ist optional, ich empfehle es aber.<\/p>\n\n\n\n<p>Was brauchen wir? Zuersteinmal das Docker image:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"795\" height=\"63\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-20.png\" alt=\"\" class=\"wp-image-1082\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-20.png 795w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-20-300x24.png 300w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-20-768x61.png 768w\" sizes=\"auto, (max-width: 795px) 100vw, 795px\" \/><\/figure>\n\n\n\n<p>und wir brauchen folgende Mount-Pfade (ggfs. anpassen falls andere Pfade als oben gew\u00e4hlt wurden)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"629\" height=\"254\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-21.png\" alt=\"\" class=\"wp-image-1083\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-21.png 629w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-21-300x121.png 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/figure>\n\n\n\n<p>Sowie folgende Umgebungsvariablen:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"643\" height=\"546\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-23.png\" alt=\"\" class=\"wp-image-1085\" srcset=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-23.png 643w, https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/uploads\/2021\/07\/grafik-23-300x255.png 300w\" sizes=\"auto, (max-width: 643px) 100vw, 643px\" \/><\/figure>\n\n\n\n<p>Im \/docker\/fail2ban\/filter.d\/ legen wir eine &#8222;vaultwarden.local&#8220; an mit folgenden Inhalt:<br><br><\/p>\n\n\n\n<p>[INCLUDES]<br>before = common.conf<\/p>\n\n\n\n<p>[Definition]<br>failregex = ^.<em>Username or password is incorrect. Try again. IP: . Username:.<\/em>$<br>ignoreregex =<\/p>\n\n\n\n<p>und im \/docker\/fail2ban\/jail.d\/ legen wir auch eine &#8222;vaultwarden.local&#8220; an mit folgenden Inhalt:<\/p>\n\n\n\n<p>[vaultwarden]<br>enabled = true<br>port = 80,443,8081,35554,35555<br>filter = vaultwarden<br>action = iptables-allports[name=vaultwarden]<br>logpath = \/vaultwarden\/bitwarden_log.log<br>maxretry = 3<br>bantime = 1 days<br>findtime = 10m<br>ignoreip = 127.0.0.1 192.168.178.0\/24 8.8.8.8<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Docker durchstarten und das ist es auch schon. Der Bitwarden schreibt seine logs wie ganz oben angegeben in \/docker\/vaultwarden\/bitwarden_log.log und fail2ban liest besagte log file und sperrt ggfs die IP bei mehr als 3 Fehlversuchen binnen 10 Minuten f\u00fcr 1 Tag. F\u00fchlt euch frei die Werte nach euren gusto anzupassen.<\/p>\n<div class=\"thanks_button_div\" \n                  style=\"float: left; margin-right: 10px;\"><div id=\"thanksButtonDiv_1060_1\" style=\"background-image:url(https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/plugins\/thanks-you-counter-button\/images\/thanks_large_blue.png); background-repeat:no-repeat; float: left; display: inline;\"\n                onmouseover=\"javascript:thankYouChangeButtonImage('thanksButtonDiv_1060_1', true);\" \n                onmouseout=\"javascript:thankYouChangeButtonImage('thanksButtonDiv_1060_1', false);\"\n                onclick=\"javascript:thankYouChangeButtonImage('thanksButtonDiv_1060_1', false);\" >\n                <input type=\"button\" onclick=\"thankYouButtonClick(1060, 'You left &ldquo;Thanks&rdquo; already for this post')\" value=\"Thank You 213\"\n                  class=\"thanks_button thanks_large thanks_blue\"\n                  style=\"  font-family: Verdana, Arial, Sans-Serif; font-size: 14px; font-weight: normal;; color:#ffffff;\"\n                  id=\"thanksButton_1060_1\" title=\"Click to leave &ldquo;Thanks&rdquo; for this post\"\/>\n             <\/div><div id=\"ajax_loader_1060_1\" style=\"display:inline;visibility: hidden;\"><img decoding=\"async\" alt=\"ajax loader\" src=\"https:\/\/torstenzimmermann.de\/wordpress\/wp-content\/plugins\/thanks-you-counter-button\/images\/ajax-loader.gif\" \/><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Welt seid mir gegr\u00fc\u00dft.Stellt euch folgendes vor: Ihr habt mehrere Ger\u00e4te und w\u00fcrdet gern eure Passw\u00f6rter synchronisieren.Eure Kennw\u00f6rter wollt ihr aber ungern auf einer Cloud bei einen externen Anbieter anvertrauen.Die L\u00f6sung liegt nahe: man sollte die Kennw\u00f6rter also selber hosten.Eine Keepass-Datenbank hin und her zu synchronisieren erweist sich als unpraktisch. Etwas zentraleres muss her.Meine L\u00f6sung [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[46,45],"tags":[],"class_list":["post-1060","post","type-post","status-publish","format-standard","hentry","category-docker","category-synonlogy-nas"],"_links":{"self":[{"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/posts\/1060","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/comments?post=1060"}],"version-history":[{"count":14,"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/posts\/1060\/revisions"}],"predecessor-version":[{"id":1216,"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/posts\/1060\/revisions\/1216"}],"wp:attachment":[{"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/media?parent=1060"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/categories?post=1060"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/torstenzimmermann.de\/wordpress\/wp-json\/wp\/v2\/tags?post=1060"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}