Po nastavení vlastního serveru OpenVPN možná budete chtít zvýšit jeho zabezpečení. Jedním ze způsobů, jak to udělat a zefektivnit proces ověřování, je použití jednotného přihlášení nebo jednotného přihlášení (SSO), někdy také označovaných jako SAML (toto je protokol SSO). To přidává další bezpečnostní opatření, které zabrání nechtěným uživatelům připojovat se k vašemu serveru a zároveň se integruje s vaším stávajícím systémem správy uživatelů, identit nebo klientů nebo procesem ověřování.
Tato příručka poskytuje příklad toho, jak by to mohlo fungovat s Okta, populární cloudovou platformou identity. Základy tohoto příkladu lze převést do většiny systémů správy identit (IDMS) s pouhými změnami způsobu komunikace s vaším vybraným IDMS.
Vezměte prosím na vědomí, že tento příklad je navržen tak, aby ukázal základy toho, jak se systém IDM nebo SSO může integrovat s OpenVPN na straně serveru, není navržen tak, aby byl používán samostatně tak, jak je.
Příprava
Pro tuto příručku předpokládáme:
- Máte účet Okta (tato příručka bude fungovat s bezplatnou zkušební verzí Okta)
- Již jste nainstalovali nejnovější verzi Ubuntu (20.04 v době psaní tohoto článku)
- Máte root přístup k této instalaci
- Máte veřejný přístup k tomuto systému na portu 80 a 443 pro přístup HTTP a HTTPS a DNS A-NAME, které na něj odkazuje (například openvpnsso.server.com)
- Na klientském zařízení již máte nainstalovanou kopii aplikace Viscosity a je již nastavena pro tento server
Dokumentaci pro Okta lze nalézt na https://help.okta.com/en/prod/Content/index.htm
Další příklad Okta lze nalézt na jejich stránce GitHub na adrese https://github.com/okta
Tato příručka by měla sloužit pouze jako příklad pro nastavení jednotného přihlášení na vašem serveru. Poskytnutá webová stránka Python Flask je navržena pouze jako příklad a není určena pro produkční použití.
Pokud začínáte od nuly s novou instalací Ubuntu 20.04, tento proces odsud až po dokončení by měl trvat jen asi 20 minut.
Nastavení Okta
Nejprve musíme nakonfigurovat Okta pro nový web, který bude zpracovávat komunikaci mezi OpenVPN a Okta.
- Přihlaste se do Okta na svém účtu správce
- Vlevo rozbalte nabídku a přejděte na Aplikace> Aplikace
- Klikněte na možnost Vytvořit integraci aplikace
- Vyberte ODIC – OpenID Connect a poté Webová aplikace a klikněte na Další
- Zadejte název pro integraci aplikace název, který poznáte jako „Můj server OpenVPN“
- Zajistěte Autorizační kód je jedinou možností zaškrtnutou pod 'Klient jednající jménem uživatele' pod 'Typ grantu'
- Nahrazením „
“ v následujícím textu nastavte URI přesměrování přihlášení na http://<yourserver.com>/authorization-code/callback
- Volitelně, opětovným nahrazením „
“ v následujícím textu, nastavte URI přesměrování při odhlášení na http://<yourserver.com>/logout
- Nastavte Řízený přístup podle vašeho výběru, pro účely testování, pokud se jedná o zkušební účet, stačí vybrat Povolit přístup všem ve vaší organizaci
- Klikněte na Uložit
Po uložení se stránka znovu načte. Buď ponechte tuto stránku otevřenou, nebo si poznamenejte ID klienta , Tajný klíč klienta a doména Okta , budeme je potřebovat později.
Nastavení serveru
Dále musíme nastavit server. Stručně řečeno, potřebujeme server OpenVPN připravený k použití, abychom mohli nainstalovat nginx jako proxy pro aplikaci Python Flask, provést nějaké malé změny firewallu, nainstalovat certifikát SSL, nakonfigurovat aplikaci flask a provést nějaké malé změny v OpenVPN.
Příprava serveru
Nejprve se přihlaste ke svému serveru přes SSH nebo otevřete terminál a spusťte následující, abyste se ujistili, že je vše aktuální
sudo apt-get update
sudo apt-get -y upgrade
Nastavení serveru OpenVPN
Nejprve budeme potřebovat OpenVPN Server připravený k použití. Pokud na tomto serveru ještě žádný nemáte, postupujte podle pokynů v části Nastavení serveru OpenVPN s Ubuntu a viskozitou.
Po nastavení se ujistěte, že se můžete připojit.
Dále musíme přidat několik řádků do konfigurace serveru OpenVPN:
- Upravte konfiguraci
sudo nano /etc/openvpn/server.conf
- Na konec souboru přidejte následující:
management 127.0.0.1 50123 auth-user-pass-optional management-client-auth
- Stiskněte Ctrl+X pro ukončení, Y pro uložení a poté Enter pro potvrzení cesty
- Restartujte server pomocí
sudo systemctl restart [email protected]
Pokud se nyní pokusíte připojit, připojení by nakonec mělo selhat se zprávou o selhání ověření.
Poznámky:
Pokud máte existující server, který má nějaké ověřovací skripty nebo pluginy, bude nutné je odstranit, protože je nahradí jednotné přihlašování. Okta lze nakonfigurovat s možnostmi 2FA, i když se jimi v této příručce nebudeme zabývat, podívejte se do dokumentace Okta.
Nastavení webového serveru
Firewall
Pokud jste postupovali podle Průvodce nastavením serveru OpenVPN s Ubuntu a viskozitou, nejprve musíme otevřít bránu firewall, aby byl povolen provoz HTTP a HTTPS, spusťte následující:
-
sudo ufw allow http
-
sudo ufw allow https
-
sudo ufw reload
Instalovat ningx
Dále musíme nainstalovat nginx. nginx je HTTP a reverzní proxy server, který bude obsluhovat komponenty naší webové aplikace a umožní použití funkcí jako TLS/SSL. Na svém serveru Ubuntu proveďte následující:
- Spusťte
sudo apt-get -y install nginx
- Upravit
sudo nano /etc/nginx/sites-enabled/default
- Přejděte dolů na řádek
server_name _;
a podtržítko (_) nahraďte názvem DNS vašeho serveru, například můjserver.com, takže to vypadá takto -server_name myserver.com;
- Stiskněte Ctrl+X pro ukončení, Y pro uložení a poté Enter pro potvrzení cesty
- Znovu načtěte nginx pomocí
sudo nginx -s reload
Nastavení Let's Encrypt
Pokud již máte certifikát SSL pro tuto sekci, můžete přeskočit na další sekci. Jinak Let's Encrypt a Certbot usnadňují získání certifikátu SSL.
- Spusťte
sudo apt-get install -y certbot python3-certbot-nginx
- Spusťte následující, nahraďte myserver.com vaším FQDN a postupujte podle pokynů
sudo certbot --nginx -d myserver.com
. Můžete zadat další domény, pokud je požadujete, napříkladsudo certbot --nginx -d myserver.com -d www.myserver.com -d sso.myserver.com
. - Může trvat několik minut, než certbot po zodpovězení výzev odpoví
- Po dokončení může certbot automaticky obnovit váš certifikát, stačí přidat cronjob ke spuštění
/usr/bin/certbot renew --quiet
jednou denně.
Nastavení nginx
Nyní máte certifikát SSL, můžeme dokončit nastavení nginx.
- Upravit
sudo nano /etc/nginx/sites-enabled/default
- Odeberte následující sekci:
location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; }
- Přejděte dolů za řádky
# managed by Certbot
, ale před}
a vložte následující:
real_ip_header X-Real-IP; real_ip_recursive on; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; location / { try_files $uri @proxy; } location @proxy { proxy_pass http://127.0.0.1:8080; proxy_pass_header Server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass_header Server; proxy_connect_timeout 3s; proxy_read_timeout 10s; }
- Stiskněte Ctrl+X pro ukončení, Y pro uložení a poté Enter pro potvrzení cesty
- Znovu načtěte nginx pomocí
sudo nginx -s reload
Instalace webové aplikace
Nyní můžeme nainstalovat webovou aplikaci a spustit ji. Vytvoříme uživatele, který bude webovou aplikaci spouštět, protože vytváří trochu větší zabezpečení. Spusťte následující:
-
sudo apt-get install -y python3-pip
Nainstalujte python pip, abychom mohli nainstalovat závislosti Flask -
sudo adduser --system --no-create-home --group ssoappuser
Vytvořte uživatele, který bude webovou aplikaci spouštět jako -
cd /home
-
sudo mkdir ssoapp
-
sudo chown ssoappuser:ssoappuser ssoapp
-
cd ssoapp
-
sudo git clone https://github.com/thesparklabs/openvpn-okta-sso-example.git
Stáhněte si webovou aplikaci z GitHubu -
cd openvpn-okta-sso-example
-
sudo python3 -m pip install -r requirements.txt
Nainstalujte závislosti pro webovou aplikaci -
sudo cp ssoapp.service /lib/systemd/system/ssoapp.service
Nainstalujte soubor služby -
sudo chown root:root /lib/systemd/system/ssoapp.service
-
sudo systemctl daemon-reload
Nastavení webové aplikace
Nakonec potřebujeme jen rychlé nastavení, aby webová aplikace fungovala a mluvila s Oktou. Zde budete potřebovat ID klienta , Tajný klíč klienta a doména Okta dříve jsme se shromáždili při nastavování Okta.
- Vytvořte kopii šablony tajných klíčů pomocí
sudo cp client_secrets.json.dist client_secrets.json
- Vytvořte náhodný tajný klíč pomocí následujícího a zkopírujte jej
openssl rand -hex 20
- Upravte konfiguraci pomocí
sudo nano client_secrets.json
- Nahradit {{THIS_IS_A_SECRET}} s náhodným řetězcem, který jsme vygenerovali před dvěma kroky
- Nahraďte {{OKTA_DOMAIN}} v auth_uri, issuer, token_uri a userinfo_uri s vaší doménou Okta
- Nahraďte {{CLIENT_ID}} s vaším ID klienta
- Nahradit {{CLIENT_SECRET]] s vaším tajemstvím klienta
- Nahraďte {{YOUR_DOMAIN}} s adresou vašeho serveru, např. myserver.com
- Stiskněte Ctrl+X pro ukončení, Y pro uložení a poté Enter pro potvrzení cesty
- Znovu načtěte nginx pomocí
sudo nginx -s reload
Nyní můžeme povolit a spustit aplikační službu pomocí
- Povolte spuštění služby, když systém
sudo systemctl enable ssoapp
- Spusťte službu
sudo systemctl start ssoapp
Nastavení klienta
Pokud jste postupovali podle tohoto průvodce a zahrnuli jste i použití našeho Průvodce nastavením serveru OpenVPN s Ubuntu a viskozitou, nemusíte nic dělat, jednoduše se připojte k aplikaci Viscosity.
Pokud jste upravili existující server, jedinou změnou, kterou budete muset provést, je vypnout ověřování uživatele/hesla, pokud je zapnuto. Chcete-li to provést, upravte připojení, přejděte do Authentication a zrušte zaškrtnutí "User User Name/Password authentication", Uložte připojení a připojte se.
Ověřovací tokeny
OpenVPN auth-gen-token
Vzorová aplikace zahrnuje podporu pro auth-gen-token. Protože nepoužíváme uživatelské jméno/heslo přes OpenVPN, je třeba to řešit přes rozhraní pro správu. Chcete-li to povolit, jednoduše přidejte auth-gen-token 0 external-auth
na konfiguraci vašeho serveru.
Obnovení tokenu Okta
Výše uvedený příklad lze rozšířit o použití tokenů Okta místo ověřovacích tokenů OpenVPN pro opětovné ověření. Nebudeme poskytovat příklad tohoto, protože vestavěná podpora OpenVPN pokryje velkou většinu nastavení.
Pokud však místo toho chcete používat Okta, zde jsou hlavní věci, které je třeba mít na paměti:
- Budete muset upravit odpověď funkce clientAllow, aby se vložil váš auth-token.
- Budete muset upravit funkci clientReauth tak, aby převzala heslo z klientského prostředí, které se předává přes rozhraní pro správu, podle dokumentace Oktas obnovte tento token a poté odešlete odpověď pro ověření klienta podobnou jako clientAllow včetně obnoveného tokenu.
- Budete muset upravit konfiguraci serveru a klienta, abyste zajistili, že reneg-sec bude kratší než vypršení platnosti tokenů Okta