Nasazení Always On VPN user tunnel prostřednictvím GPO trochu jinak

Blog

 
 Michal Švec

Při nasazování tunelu Always On VPN je obecně možné setkat se s množstvím problémů vzhledem k obsáhlosti řešení a všem požadavkům, které je třeba splnit. Konfiguraci na straně klienta je možné snadno řešit v případě, že používáte Cloud službu Microsoft Intune. V případě, kdy jste částečně nebo zcela odkázáni na starou dobrou Active Directory a GPO, situace se začíná trochu komplikovat. Jak správně na konfiguraci Always On VPN klienta pomocí GPO se tedy podíváme trochu podrobněji.

Hlavní změnou v nastavování této VPN oproti klasice je zde využití CSP a nových WMI tříd, které jsou určeny primárně pro Mobile Desktop Management (MDM) jako je Intune. Nové WMI třídy slouží jako nástroj pro konfiguraci CSP, pokud MDM nepoužíváte. WMI objekty pro VPN najdete konkrétně zde:

Namespace - root\cimv2\mdm\dmmap
Třída - MDM_VPNv2_01

Pojďme se podívat na oficiální Microsoft postup nasazování konfigurace na koncová zařízení:

1. Na vzorovém počítači s Windows 10 vytvořte ze Settings/Network & Internet nový VPN profil se základními parametry. Pracujte pod účtem s právem lokálního administrátora

2. Pokračujte do Network Connections a zde dokončete konfiguraci v nastavení adaptéru podrobná nastavení korespondující s nastavením serveru. Jedná se zejména o vynucení PEAP a nastavení omezení na určitou certifikační autoritu, případně detailnější specifikaci použitého certifikátu pro autentizaci uživatele

img

img

3. Vytvořte na základě právě nastaveného profilu XML soubor s kompletní konfigurací pro CSP. K tomu je potřeba skript MakeProfile.ps1. Editujte proměnné na začátku tohoto skriptu:

$TemplateName =  'SampleVPN'            # název vzorového  profilu
$ProfileName =  'MyCompanyName VPN'     # název výsledného  profilu
$Servers =  'vpn.mydomain.com'          # FQDN VPN serveru
$DnsSuffix =  'mydomain.com'            # sufix pro síť tunelu
$DomainName =  '.mydomain.com'          # název domény (včetně  tečky)
$DNSServers =  '10.10.0.2,10.10.0.3'    # vynucení použitých  DNS
$TrustedNetwork =  'mydomain.com'       # DNS sufix pro Always  On 

4. Po spuštění skriptu jsou na ploše vytvořeny dva soubory - VPN_Profile.xml a VPN_Profile.ps1. XML soubor slouží pro nasazení přes Intune a PS1 je určen pro manuální instalaci a distribuci pomocí GPO nebo SCCM.

5. Pokud stále pracujete s právy lokálního admina, tak spusťte soubor VPN_Profile.ps1. Skript by Vám měl vytvořit profil s názvem uvedeným v proměnné $ProfileName dle vašeho vzorového profilu. Tento profil navíc obohatí o další nastavení, která jsou z Windows GUI nezjistitelná.

6. Ověření existence a správné konfigurace nového profilu provedete dotazem do WMI příkazem:

 Get-WmiObject -Namespace root\cimv2\mdm\dmmap -Class MDM_VPNv2_01

Zde je třeba zkontrolovat zejména parametry AlwaysOn = True a aby byl ProfileXML naplněn XML kódem:

__GENUS                 : 2
__CLASS                 : MDM_VPNv2_01
__SUPERCLASS            :
__DYNASTY               : MDM_VPNv2_01
__RELPATH               : MDM_VPNv2_01.InstanceID="SampleVPN",ParentID="./Vendor/MSFT/VPNv2"
__PROPERTY_COUNT        : 10
__DERIVATION            : {}
__SERVER                : DESKTOP-TESTER
__NAMESPACE             : root\cimv2\mdm\dmmap
__PATH                  : \\DESKTOP-TESTER\root\cimv2\mdm\dmmap:MDM_VPNv2_01.InstanceID="SampleVPN",ParentID="./Vendor/MSFT/VPNv2"
AlwaysOn                :
ByPassForLocal          :
DnsSuffix               :
EdpModeId               :
InstanceID              : SampleVPN
LockDown                :
ParentID                : ./Vendor/MSFT/VPNv2
ProfileXML              : 
<VPNProfile>
    <APNBinding>
        <AuthenticationType>None</AuthenticationType>
    </APNBinding>
    <NativeProfile>
        <Servers>vpn.mydomain.com;vpn.mydomain.com</Servers>
        <NativeProtocolType>Ikev2</NativeProtocolType>
        <Authentication>
            <UserMethod>Eap</UserMethod>
            <MachineMethod>Eap</MachineMethod>
            <Eap>
                <Configuration>
                    <EapHostConfig xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
                        <EapMethod>
                            <Type xmlns="http://www.microsoft.com/provisioning/EapCommon">13</Type>
                            <VendorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorId>
                            <VendorType xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorType>
                            <AuthorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</AuthorId>
                        </EapMethod>
                        <Config xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
                            <Eap xmlns="http://www.microsoft.com/provisioning/BaseEapConnectionPropertiesV1">
                                <Type>13</Type>
                                <EapType xmlns="http://www.microsoft.com/provisioning/EapTlsConnectionPropertiesV1">
                                    <CredentialsSource>
                                        <CertificateStore>
                                            <SimpleCertSelection>true</SimpleCertSelection>
                                        </CertificateStore>
                                    </CredentialsSource>
                                    <ServerValidation>
                                        <DisableUserPromptForServerValidation>false</DisableUserPromptForServerValidation>
                                        <ServerNames></ServerNames>
                                    </ServerValidation>
                                    <DifferentUsername>false</DifferentUsername>
                                    <PerformServerValidation xmlns="http://www.microsoft.com/provisioning/EapTlsConnectionPropertiesV2">true</PerformServerValidation>
                                    <AcceptServerName xmlns="http://www.microsoft.com/provisioning/EapTlsConnectionPropertiesV2">true</AcceptServerName>
                                </EapType>
                            </Eap>
                        </Config>
                    </EapHostConfig>
                </Configuration>
            </Eap>
        </Authentication>
    </NativeProfile>
</VPNProfile>
RememberCredentials     :
TrustedNetworkDetection :
PSComputerName          : DESKTOP-TESTER
__GENUS                 : 2
__CLASS                 : MDM_VPNv2_01
__SUPERCLASS            :
__DYNASTY               : MDM_VPNv2_01
__RELPATH               : MDM_VPNv2_01.InstanceID="MyCompanyName%20VPN",ParentID="./Vendor/MSFT/VPNv2"
__PROPERTY_COUNT        : 10
__DERIVATION            : {}
__SERVER                : DESKTOP-TESTER
__NAMESPACE             : root\cimv2\mdm\dmmap
__PATH                  : \\DESKTOP-TESTER\root\cimv2\mdm\dmmap:MDM_VPNv2_01.InstanceID="MyCompanyName%20VPN",ParentID="./Vendor/MSFT/VPNv2"
AlwaysOn                : True
ByPassForLocal          :
DnsSuffix               : mydomain.com
EdpModeId               :
InstanceID              : MyCompanyName%20VPN
LockDown                :
ParentID                : ./Vendor/MSFT/VPNv2
ProfileXML              : 
<VPNProfile>
    <RememberCredentials>true</RememberCredentials>
    <AlwaysOn>true</AlwaysOn>
    <DnsSuffix>mydomain.com</DnsSuffix>
    <TrustedNetworkDetection>mydomain.com</TrustedNetworkDetection>
    <NativeProfile>
        <Servers>vpn.                         mydomain.com;vpn.mydomain.com</Servers>
        <RoutingPolicyType>ForceTunnel</RoutingPolicyType>
        <NativeProtocolType>Ikev2</NativeProtocolType>
        <Authentication>
            <UserMethod>Eap</UserMethod>
            <MachineMethod>Eap</MachineMethod>
            <Eap>
                <Configuration>
                    <EapHostConfig xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
                        <EapMethod>
                            <Type xmlns="http://www.microsoft.com/provisioning/EapCommon">13</Type>
                            <VendorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorId>
                            <VendorType xmlns="http://www.microsoft.com/provisioning/EapCommon">0</VendorType>
                            <AuthorId xmlns="http://www.microsoft.com/provisioning/EapCommon">0</AuthorId>
                        </EapMethod>
                        <Config xmlns="http://www.microsoft.com/provisioning/EapHostConfig">
                            <Eap xmlns="http://www.microsoft.com/provisioning/BaseEapConnectionPropertiesV1">
                                <Type>13</Type>
                                <EapType xmlns="http://www.microsoft.com/provisioning/EapTlsConnectionPropertiesV1">
                                    <CredentialsSource>
                                        <CertificateStore>
                                            <SimpleCertSelection>true</SimpleCertSelection>
                                        </CertificateStore>
                                    </CredentialsSource>
                                    <ServerValidation>
                                        <DisableUserPromptForServerValidation>false</DisableUserPromptForServerValidation>
                                        <ServerNames></ServerNames>
                                    </ServerValidation>
                                    <DifferentUsername>false</DifferentUsername>
                                    <PerformServerValidation xmlns="http://www.microsoft.com/provisioning/EapTlsConnectionPropertiesV2">true</PerformServerValidation>
                                    <AcceptServerName xmlns="http://www.microsoft.com/provisioning/EapTlsConnectionPropertiesV2">true</AcceptServerName>
                                </EapType>
                            </Eap>
                        </Config>
                    </EapHostConfig>
                </Configuration>
            </Eap>
        </Authentication>
    </NativeProfile>
    <DomainNameInformation>
        <DomainName>.mydomain.com</DomainName>
        <DnsServers>10.10.0.2,10.10.0.3</DnsServers>
    </DomainNameInformation>
</VPNProfile>
RememberCredentials     : True
TrustedNetworkDetection : mydomain.com
PSComputerName          : DESKTOP-TESTER

7. Vyzkoušejte připojení a odlaďte případně nastavení editací proměnné ProfileXML v souboru VPN_Profile.ps1 a opětovným nasazením.
Doposud je to v pořádku.

8. Dalším krokem po úspěšném ověření funkčnosti může být už samotná distribuce funkčního profilu pomocí VPN_Profile.ps1 na koncové stanice. Jenže…

Problém

…jak funguje distribuce uživatelských GPO? Pro nasazení profilů na koncové stanice se má jednoduše nastavit logon script nebo jiný druh spuštění skriptu VPN_Profile.ps1, např. pomocí Scheduled Task. Důležité ale je, aby se tento skript provedl v kontextu uživatele, kde se má profil vytvořit!

Logon script se vždy spouští s oprávněními cílového uživatele a tento má (by měl mít) ve standardně nastaveném doménovém prostředí pouze oprávnění skupiny Domain users, tedy nikoli oprávnění lokálního administrátora na stanici. A v této chvíli nám tento skript selže na absenci vyšších oprávnění.

Oficiální postup je totiž vytvořen pro uživatele s oprávněními lokálního admina, ale hlavně pro nasazení skrz MDM.

Řešení

Jaké jsou tedy možnosti řešení? Naštěstí zde několik řešení této situace existuje:

1. Uživatele zařadit do skupiny lokálních administrátorů a tím jim zvýšit na koncových stanicích oprávnění.
To se dá realizovat např. konfigurací GPO a Restricted groups.

Toto řešení ale považuji za krajně nevhodné a v zájmu zachování smyslu domény a principu „Least privilege“ to pusťte z hlavy.

2. Delegovat uživateli oprávnění na patřičnou oblast WMI na koncové stanici.
Vzhledem k tomu, že celý princip skriptu je v zapsání XML řetězce do WMI třídy, kterou potom systém vyhodnocuje jak CSP, dalo by se postupovat kontrolou oprávnění zde. Funkce opravdu selhává v tomto bodě, vzhledem k tomu, že WMI namespace root\cimv2\mdm\dmmap má nastavena tato oprávnění:

· System – Full Access

· Administrators – Full Access

Nabízí se tedy přidat zde oprávnění pro uživatele VPN (bezpečnostní skupinu) pro zápis a problém je vyřešen.
Jenže je tu opět komplikace a tou je fakt, že se tento prostor bohužel nedá z hlediska práv řídit více do hloubky a tímto zásahem byste otevřeli dveře k téměř neomezené konfiguraci systému bez patřičných oprávnění, a to nejen na úrovni VPN.

Tento způsob by tedy také zásadně narušil bezpečnost a není tak o moc lepší než první varianta.

3. Editovat soubor rasphone.pbk
Je možné si všimnout, že kromě již řečených umístění, existuje pro VPN ještě jedno místo, kam systém zapisuje konfigurace. Tím je klasický soubor rasphone.pbk, ve kterém jsou veškeré konfigurace přepsány do relativně čitelného textu. Tento soubor je umístěn v uživatelském profilu - *%appdata%\Microsoft\Network\Connections\Pbk\rasphone.pbk.
Struktura tohoto dokumentu je jednoduchá a obsahuje nastavení jednotlivých VPN profilů zapsaných parametricky v blocích stylem „=“:

[SampleVPN]
Encoding=1
PBVersion=5
Type=2
AutoLogon=0
UseRasCredentials=1
LowDateTime=883586304
HighDateTime=30780276
DialParamsUID=1223477937
Guid=9B05B3BB3E5B0A499E018D4BAD24CC3F
VpnStrategy=7
…
…
…
DEVICE=vpn
PhoneNumber=vpn.mydomain.com
AreaCode=
CountryCode=0
CountryID=0
UseDialingRules=0
Comment=
FriendlyName=
LastSelectedPhone=0
PromoteAlternates=0
TryNextAlternateOnFail=1

Tento soubor přejímá nastavení definovaná pomocí GUI nebo WMI okamžitě po jejich uložení a stejně tak, pokud zde provedete nějakou změnu, tak se tato změna projeví okamžitě v systému (VPN profilech).
Vzhledem k umístění souboru v uživatelském profilu není problém s oprávněními a je tedy možné tento soubor editovat s právy přihlášeného uživatele. Máme zde tedy dvě možnosti, co s tímto z hlediska centrálního managementu dělat:

a) Distribuovat celý soubor, který jsme získali ze vzorového počítače a přepisovat tak veškerá lokální uživatelská nastavení VPN. To je jednodušší metoda.

b) Použít ze vzoru pouze blok definující tuto konkrétní VPN a pomocí (logon) skriptu doplňovat obsah souboru rasphone.pbk na cílové stanici. Tato metoda je sice složitější, ale zase umožní zachovat veškerá uživatelská nastavení.

Pro úspěšné nasazení profilu pomocí editace souboru je možné použít tento skript: Add-AoVPNProfile.ps1. Skript vyžaduje přiložení souboru PBK s konfigurací VPN profilu, který vám již vznikl předchozími kroky. Pouze zkontrolujte a případně editujte následující proměnné:

$ConfigurationFile = "$ScriptPath\AOVPN-rasphone.pbk" # cesta k souboru vzorového profilu
$VPNName = "Always On VPN"      # název VPN profilu   

Oba soubory pak doporučuji nahrát do složky \mydomain.com\NETLOGON. Po nastavení a nalinkování GPO s tímto skriptem bude na koncových stanicích docházet k aktualizaci profilu při každém zalogování uživatele v doménové síti. Vzhledem k tomu, že je tento skript zpracován jako aktualizační, můžete tedy i průběžně měnit nastavení profilů úpravou PBK souboru.

Struktura CSP konfigurace VPN:

Přílohy

  • MakeProfile.ps1
  • VPN_Profile.ps1
  • VPN_Profile.xml
  • Add-AoVPNProfile.ps1
  • AOVPN-rasphone.pbk

Sdílej v médiích

Kontakt

Nenašli jste, co hledáte? Pošlete nám zprávu a zůstaneme s vámi ve spojení.

* Vyžadované pole

Osobní data použijeme pouze pro vypracování odpovědi na dotaz. Pravidla zpracování osobních údajů

map us
map eu