Go to english version of this post / Przejdź do angielskiej wersji tego wpisu
Silne hasła to niesamowicie istotna sprawa! Jest to jeden z fundamentów bezpieczeństwa w Internecie. Najlepszym rozwiązaniem jest posiadanie haseł składających się z przynajmniej 16 znaków, małych i dużych liter, a także cyfr i znaków specjalnych. Do tego dość najważniejsze jest, aby nie posiadać jednakowego hasła do każdego z serwisów, bo jak wycieknie on z jednego z nich to sprawdzenie w innych popularnych portalach to pierwsze działanie jakie wykonują oszuści/złodzieje/włamywacze. Patrząc na to wszystko nasuwa się pytanie – Jak spamiętać w głowie wszystkie te skomplikowane ciągi znaków?! Zapisanie ich w notatniku na komputerze nie jest zbyt bezpiecznym rozwiązaniem, a przepisywanie z fizycznego notesu chowanego w sejfie to droga przez mękę. W takiej sytuacji na białym rumaku wjeżdża menedżer haseł i to nie byle jaki, bo konkretnie Bitwarden, którego można hostować na własnym serwerze, co też uczynimy, bo przecież nie lubimy przekazywać swoich danych w posiadanie osobom trzecim, a w szczególności o ile chodzi tutaj o nasze hasła.
W tym wpisie podejdę do sprawy podobnie jak przy wpisie o Nextcloud, czyli pokażę dwa sposoby na uruchomienie swojej instancji Bitwardena (a konkretnie implementacji Vaultwarden):
- na serwerze z YunoHost,
- w oparciu o Dockera na dowolnym innym serwerze.
Uruchomienie w YunoHost
Instalacja będzie przebiegać podobnie do tej opisanej we wpisie o WriteFreely, jednakże w przypadku uruchamiania Vaultwardena nie potrzebujemy oddzielnej domeny (tak samo jak we wpisie o Nextcloud). Powiem więcej, w przypadku uruchamiania jedynie dla siebie choćby nie zalecane jest tworzenie specjalnej domeny, bo po pierwsze to tylko dodatkowy koszt, a po drugie lepiej nie odkrywać wszystkich swoich kart, a tym samym narażać swoich danych, poprzez korzystanie z subdomeny np. bitwarden.tomaszdunia.pl, co jednoznacznie oznaczałoby, iż pod tym adresem znajdują się wszystkie nasze hasła. Ja ogólnie jestem zwolennikiem trzymania tego typu usług w sieci lokalnej, do której dostęp ma się jedynie przez VPN np. WireGuard, ale o tym kiedy indziej w zupełnie innym wpisie.
Zaczynamy od zalogowania się do naszego panelu administratora YunoHost i od razu przechodzimy do Aplikacje. Następnie w prawym górnym rogu zielony przycisk + Instaluj, wyszukujemy aplikację Vaultwarden i wybieramy ją z listy. Zjeżdżamy niżej do sekcji Ustawienia instalacji i rozpoczynamy konfigurację:
- W pole tekstowe Etykieta dla Vaultwarden [1] wpisujemy to pod jaką nazwą chcemy widzieć tą aplikację na liście aplikacji w naszym YunoHost.
- Z rozwijanej listy poniżej [2] wybieramy na jakiej domenie ma zostać zainstalowany Vaultwarden. Jak widać ja wybrałem domenę główną, na której uruchomiony jest mój YunoHost. Możesz zrobić tak samo lub wybrać inną domenę z listy.
- W następnym polu tekstowym [3] definiujemy dokładną ścieżkę pod jaką ma zostać zainstalowany Vaultwarden. Podając tutaj wartość (jak domyślnie) /vaultwarden zostanie zainstalowany na przykładowa.domena.pl/vaultwarden, gdzie oczywiście przykładowa.domena.pl to wybrana przez Ciebie wyżej domena. o ile zdecydowałeś/aś się na podpięcie domeny dedykowanej tylko do Vaultwardena to w tym miejscu można podać jedynie / co będzie oznaczało instalację w katalogu nadrzędnym domeny.
- Dalej mamy pole decyzji [4] Czy ta aplikacja powinna być udostępniana anonimowym użytkownikom?. Tutaj proponuję wybrać Tak, gdyż w przeciwnym wypadku klienty Vaultwarden (mowa tutaj o oficjalnej aplikacji Bitwardena) nie będą działały, bo pojawi się dodatkowy krok uwierzytelnienia, konieczność zalogowania do YunoHost, którego nie przewiduje.
- Kolejna lista rozwijana [5] służy do wskazania, który z użytkowników YunoHost ma być administratorem dla tej aplikacji.
- Powyższe ustawienia zatwierdzamy przyciskiem Instaluj [6] i tym samym rozpoczynamy proces instalacji, który niestety do najkrótszych nie należy, więc trzeba się uzbroić w cierpliwość.
Po zakończeniu procesu instalacji łączymy się przez SSH do serwera, na którym uruchomiony jest YunoHost. Następnie przelogowujemy się na użytkownika root:
sudo suOtwieramy plik z ustawieniami aplikacji Vaultwarden:
nano /etc/yunohost/apps/vaultwarden/settings.ymlW tym pliku musimy odszukać następującą linijkę:
admin_token: [token]Kopiujemy wartość [token], która będzie nam potrzebna do zalogowania się do panelu administratora Vaultwarden. Na tym etapie połączenie SSH z serwerem nie będzie już nam potrzebne. Panel administratora dostępny jest pod adresem, którego początek to adres, który podczas instalacji wybraliśmy dla aplikacji Vaultwarden, a koniec to dopisek /admin. Podajemy tam skopiowany token i co pozwoli wejść do panelu admina, w którym od razu przechodzimy do zakładki Users [1].
Na dole znajduje się sekcja Invite User. W polu tekstowym [2] podajemy swój adres e-mail i potwierdzamy przyciskiem Invite [3].
Powyższe działanie poskutkuje tym, iż na liście pojawi się nowy użytkownik [4]
W międzyczasie na podany adres e-mail zostanie wysłane zaproszenie z linkiem aktywacyjnym. Naciskamy przycisk Join Organization Now [5].
Zostaniemy przeniesieni z powrotem do przeglądarki, gdzie zobaczymy komunikat mówiący o tym, iż zostaliśmy zaproszeni do organizacji i możemy z niego teraz skorzystać. Naciskamy przycisk Utwórz konto [6].
Zostaniemy przeniesieni do standardowego formularza rejestracji, w którym podajemy adres e-mail [7], nazwę użytkownika [8], hasło (dwa razy) [9] i opcjonalnie podpowiedź do hasła [10]. Na koniec możemy jeszcze zdecydować [11] czy chcemy, aby nasze hasło było wyszukane w znanych zbiorach haseł, które wyciekły. Ja jednak tego celu używam strony HaveIBeenPwned.com, więc zawsze odznaczam to pole. Wypełniony formularz potwierdzamy przyciskiem Utwórz konto [12].
Uruchomienie jako kontener Dockera
Nie masz serwera z YunoHost? Nic nie szkodzi! To samo da się zrobić przy użyciu Dockera! Polecam najpierw zapoznać się z moim wpisem Docker – jeden serwer wiele usług. Jako obraz wykorzystamy fork o nazwie Vaultwarden dostępny na Docker Hub.
Rozpoczynamy od stworzenia folderu dla tego kontenera:
mkdir -p /home/$USER/docker/vaultwardenNastępnie tworzymy plik konfiguracyjny dla tego kontenera:
nano /home/$USER/docker/vaultwarden/docker-compose.ymlProces konfiguracji Vaultwardena jako kontener jest stosunkowo prosty:
version: "3" services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest ports: - "80:80" environment: PUID: '1000' PGID: '1000' TZ: 'Europe/Warsaw' volumes: - '/home/$USER/docker/vaultwarden/volumes/data:/data' restart: unless-stoppedW powyższej konfiguracji należy skontrolować i ewentualnie dostosować do swojego zastosowania:
- port na jakim ma być uruchomiony ten kontener, ja dla przykładu wpisałem port 80,
- PUID i PGID, tak jak to było opisane we wpisie o kontenerze Nextcloud.
Na tym etapie pozostaje nam jeszcze utworzyć odpowiedni wolumen, który zadeklarowaliśmy jako miejsce do przechowywania danych kontenera:
mkdir -p /home/$USER/docker/vaultwarden/volumes/dataSprawdźmy jeszcze czy port do obsługi tego kontenera został otwarty w naszym firewall’u:
sudo ufw allow 80Na koniec pozostaje nam już tylko kompilacja i uruchomienie kontenera Vaultwarden:
docker-compose -f /home/$USER/docker/vaultwarden/docker-compose.yml up -dWchodzimy w przeglądarce na adres składający się z IP serwera oraz portu, na których uruchomiony został kontener (jeżeli jest to port 80 to nie ma potrzeby podawania go, bo jest to port domyślny) i sprawdzamy czy zostanie poprawnie załadowana strona Vaultwarden. Niestety w takiej formie będzie się wyświetlać, ale nie będzie prawidłowo działać, co można zaobserwować próbując utworzyć nowe konto użytkownika. Otrzymamy wtedy komunikat, iż jest potrzebny certyfikat HTTPS, bez którego nie możemy korzystać z naszego skarbca (po ang. vault). Więc na ten moment zatrzymajmy kontener:
docker stop vaultwardenA następnie usuńmy go:
docker rm vaultwardenMusimy utworzyć tak zwany self signed certificate, co można przetłumaczyć jako certyfikat z własnym podpisem. To wystarczy w przypadku, kiedy mówimy o Vaultwardenie działającym w sieci lokalnej. W przypadku, gdy chcesz udostępniać go osobom trzecim (poza sieć lokalną) to możesz skorzystać z Let’s Encrypt jednocześnie podpinając pod to domenę. Ja, na potrzeby tego wpisu, wybrałem znacznie bezpieczniejsze rozwiązanie i stawiam skarbiec w sieci lokalnej, do której mam dostęp przez VPN – Wireguard, więc zewnętrzny certyfikat nie jest mi potrzebny.
Najpierw musimy stworzyć Root Certificate Authority, zwany w uproszczeniu CA, czyli nasz prywatny urząd certyfikacyjny, który będzie podpisywał certyfikaty dla konkretnych domen.
Zaczynamy od utworzenia klucz CA:
Trzeba podać passphrase, który ma od 4 do 1024 znaków. Zapamiętaj go! W tym przypadku zagrożenie jest znikome, więc proponuję zastosować regułę KISS – z ang. Keep It Simple Stupid, co można przełożyć na Zrób to prosto idioto. Dążę do tego, iż passphrase nie musi być skomplikowane, bo jak ktoś dostanie dostęp do naszej sieci lokalnej i tym samym do menedżera haseł to możliwość poznania przez niego passphrase będzie naszym najmniejszym zmartwieniem. Efektem działania powyższego polecenia będzie utworzenie pliku private-ca.key.
Na podstawie utworzonego klucza generujemy certyfikat CA:
openssl req -x509 -new -nodes -sha256 -days 3650 -key private-ca.key -out self-signed-ca-cert.crtPo wywołaniu tego procesu musimy wpisać wcześniej podane passphrase i wypełnić krótką ankietę, w której w każdym polu można podać po prostu kropkę („.”) i zatwierdzić ENTERem. Jedyne co warto wypełnić to pole Common name, w którym należy podać nazwę naszego certyfikatu, ja podałem vaultwarden. Jak widać w poleceniu podaliśmy -days 3650 to oznacza, iż nasze CA będzie miało 10-letnią datę ważności.
Enter pass phrase for private-ca.key: [podaj passphrase] You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. Country Name (2 letter code) [AU]:. State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:. Organization Name (eg, company) [Internet Widgits Pty Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (e.g. server FQDN or YOUR name) []:vaultwarden Email Address []:.Rezultatem tego polecenia będzie utworzenie pliku self-signed-ca-cert.crt.
Teraz musimy utworzyć klucz dla certyfikatu Vaultwarden:
openssl genpkey -algorithm RSA -out vaultwarden.key -outform PEM -pkeyopt rsa_keygen_bits:2048Zostanie utworzony plik vaultwarden.key. Następnie musimy stworzyć certificate request file:
openssl req -new -key vaultwarden.key -out vaultwarden.csrTutaj znowu krótka ankieta, w której wszędzie wstawiamy kropki, poza polem Common name, w którym musimy podać adres naszego serwera, który może być adresem w sieci lokalnej (adresem IP serwera).
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. Country Name (2 letter code) [AU]:. State or Province Name (full name) [Some-State]:. Locality Name (eg, city) []:. Organization Name (eg, company) [Internet Widgits Pty Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (e.g. server FQDN or YOUR name) []:[adres ip serwera] Email Address []:. Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.Zostanie utworzony plik vaultwarden.csr. Ostatnim plikiem jaki musimy utworzyć jest:
nano vaultwarden.extDo którego wklejamy:
authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] IP.1 = [adres ip serwera]Jako parametr IP.1 podajemy ten sam adres co wcześniej, czyli adres IP serwera. Plik w takiej formie zapisujemy i wychodzimy z edytora.
Tak utworzony certyfikat musimy teraz podpisać przez wcześniej utworzone CA:
openssl x509 -req -in vaultwarden.csr -CA self-signed-ca-cert.crt -CAkey private-ca.key -CAcreateserial -out vaultwarden.crt -days 365 -sha256 -extfile vaultwarden.extEfektem końcowym będzie utworzenie pliku vaultwarden.crt. Warto zauważyć, iż ustawiliśmy ważność certyfikatu na 365 dni. Dlaczego nie podpisaliśmy go od razu na 10 lat tak jak to zrobiliśmy dla CA? Niestety niektóre podmioty uznają za prawidłowe jedynie certyfikaty, które są ważne do maksymalnie roku (plus/minus parę dni). W przypadku Apple jest to na przykład 398 dni. Z uwagi na to, co rok będziemy musieli wykonywać ten ostatni krok i przedłużać certyfikat Vaultwardena na kolejny okres.
Dalej przenieśmy utworzony i podpisany certyfikat Vaultwardena wraz z jego kluczem do folderu dla certyfikatów na naszym serwerze:
sudo mv vaultwarden.crt vaultwarden.key /etc/ssl/certsPozostałe pliki proponuję zachować w folderze /etc/ssl na przyszłość:
sudo mkdir /etc/ssl/CA sudo mv vaultwarden.csr vaultwarden.ext private-ca.key self-signed-ca-cert.crt self-signed-ca-cert.srl /etc/ssl/CAGdy już rozwiązaliśmy problem z certyfikatami, wchodzimy do pliku konfiguracyjnego kontenera Vaultwarden:
nano /home/$USER/docker/vaultwarden/docker-compose.ymli zmieniamy jego zawartość analogicznie do poniższego przykładu:
version: "3" services: vaultwarden: container_name: vaultwarden image: vaultwarden/server:latest ports: - "80:80" environment: PUID: '1000' PGID: '1000' TZ: 'Europe/Warsaw' ROCKET_TLS: '{certs="/ssl/vaultwarden.crt",key="/ssl/vaultwarden.key"}' volumes: - '/home/$USER/docker/vaultwarden/volumes/data:/data' - '/etc/ssl/certs:/ssl' restart: unless-stoppedJak widać dodana została jedna zmienna środowiskowa (environment) i wolumen, w którym zapisaliśmy wygenerowany certyfikat.
To niestety jeszcze nie koniec, bo tworzenie własnego certyfikatu wiąże się z tym, iż konieczne będzie przerzucenie go na wszystkie urządzenia, które będą korzystać z menedżera haseł. Bez tego nie zostaną one prawidłowo uwierzytelnione. W tym celu potrzebujemy wyciągnąć z serwera plik self-signed-ca-cert.crt i wrzucić go do pamięci wszystkich urządzeń, na których zamierzamy korzystać z Vaultwardena.
Omówmy sobie jak go zaaplikować do najpopularniejszych przeglądarek i urządzeń:
- Firefox – Ustawienia -> Prywatność i bezpieczeństwo -> Certyfikaty -> Wyświetl certyfikaty… -> zakładka Organy certyfikacji -> Importuj… wybieramy z dysku certyfikat, w okienku zaznaczamy Zaufaj temu CA przy identyfikacji witryn internetowych., na koniec potwierdzamy przyciskiem OK. Dobrze jest zrestartować przeglądarkę.
- Chrome – Ustawienia -> Prywatność i bezpieczeństwo -> Bezpieczeństwo -> Zarządzaj certyfikatami -> odpali się okno Certyfikaty -> zakładka Zaufane główne urzędy certyfikacji -> Importuj… -> Dalej -> Przeglądaj… -> wybieramy z dysku certyfikat -> Dalej -> Zakończ, na koniec wyskoczy pewnie jeszcze Security Warning, na którym potwierdzamy Tak. Dobrze jest zrestartować przeglądarkę.
- iOS / iPadOS – tutaj wystarczy w dowolny sposób przerzucić certyfikat na urządzenie i uruchomić go. Wyskoczy okienko Wybierz urządzenie, na którym chcesz zainstalować ten profil, w którym wybieramy iPhone, po czym certyfikat powinien pojawić się w Ustawieniach i wystarczy go tylko włączyć w Ustawienia -> Ogólne -> VPN i urządzenia zarządzane -> sekcja Profil konfiguracji -> tu powinien już być do wybrania nasz certyfikat pod nazwą, którą mu nadaliśmy -> Zainstaluj -> podajemy kod do odblokowania urządzenia -> Instaluj -> wychodzimy OK. Konieczne pozostało dodanie certyfikatu do zaufanych w Ustawienia -> Ogólne -> To urządzenie… -> na samym dole Ustawienia zaufanych certyfikatów -> sekcja Włącz pełne zaufanie do certyfikatów głównych -> aktywujemy nasz certyfikat, tak aby przełącznik znajdujący się przy nim był na zielono -> w okienku, które wyskoczy wciskamy Dalej i gotowe.
- Android – tak samo jak na iOS wystarczy w dowolny sposób pobrać certyfikat na telefon i otworzyć go, zostaniemy zapytani czy otworzyć Instalator certyfikatów, oczywiście potwierdzamy i zostaniemy przeniesieni do okienka, w którym podajemy nazwę certyfikatu oraz z listy rozwijanej wybieramy, iż ma zostać użyty dla VPN i aplikacji.
Teraz, gdy już dla wszystkich urządzeń mamy zainstalowane certyfikaty, możemy przejść pod adres, pod którym uruchomiony jest Vaultwarden i zalogować się do skarbca.
Aplikacje i rozszerzenia do przeglądarek
Przydatną rzeczą w kontekście menedżera haseł jest posiadanie aplikacji mobilnych i/lub rozszerzeń do przeglądarek, które same będą nam przeszukiwać bazę haseł i wypełniać odpowiednie z nich na odpowiednich stronach. Bitwarden udostępnia aplikacje na każdy popularny system operacyjny i rozszerzenia do wszystkich przeglądarek. Działają one z Vaultwardenem. Jednak w naszym przypadku, aby korzystać z tych aplikacji/rozszerzeń musimy wskazać nasz serwer niestandardowy, czyli po instalacji na ekranie logowania wejść do ustawień (nacisnąć ikonę koła zębatego) i wpisać jako Adres URL serwera adres (poprzedzony https://), pod którym działa Vaultwarden.
Kopia zapasowa
Robienie kopii zapasowych to zawsze bardzo ważna sprawa. Jednakże posiadanie backupu skarbca menedżera haseł to sprawa życia lub śmierci. Nie ma tutaj znaczenia, czy uruchamiamy Vaultwardena w chmurze czy też na serwerze domowy, na nowym czy na starym sprzęcie. Zawsze należy zakładać, iż coś może pójść nie tak i trzeba być na to przygotowanym. Ja osobiście nie wyobrażam sobie stracić dostępu do mojej bazy haseł, bo zabiłoby to moje cyfrowe życie. Z uwagi na to mam dużo kopii zapasowych rozlokowanych w wielu miejscach, na wielu rodzajach nośników i każdemu polecam taką praktykę.
Bitwarden – podstawowa konfiguracja
W moim przypadku, poza ogarnięciem sprawy kopii zapasowych, konfiguracja zaraz po uruchomieniu własnego skarbca składa się jeszcze z jedynie dwóch kroków.
Pierwszym z nich jest włączenie dwuskładnikowego uwierzytelnienia podczas logowania, bo zabezpieczenie swoich haseł to podstawa. Realizuje się to poprzez rozwinięcie menu użytkownika znajdującego się w prawym górnym rogu [1], wejście w Ustawienia konta [2], następnie po lewej zakładka Zabezpieczenia [3] i Logowanie dwustopniowe [4]. W tym miejscu można skonfigurować takie zabezpieczenia jak TOTP (aplikacje z kodami czasowymi), klucze sprzętowe Yubico (YubiKey) czy w ostateczności (bo jest to najgorsza forma) kody przesyłane na skrzynkę mailową.
Drugą czynnością jest migracja mojej bazy haseł. Narzędzie do importu znajduje się w zakładce Narzędzia [5] w zakładce Importuj dane [6].