Skip to content

Commit

Permalink
Split out VPN guides
Browse files Browse the repository at this point in the history
  • Loading branch information
tashian committed Jun 11, 2024
1 parent 5f6a3bd commit e151a89
Show file tree
Hide file tree
Showing 5 changed files with 479 additions and 368 deletions.
12 changes: 12 additions & 0 deletions manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,18 @@
{
"title": "Set up certificate-based VPN with Smallstep",
"path": "/tutorials/vpn-setup-guide.mdx"
},
{
"title": "Set up strongSwan VPN with Smallstep",
"path": "/tutorials/vpn-setup-guide-strongswan.mdx"
},
{
"title": "Set up F5 VPN with Smallstep",
"path": "/tutorials/vpn-setup-guide-f5.mdx"
},
{
"title": "Set up Azure VPN with Smallstep",
"path": "/tutorials/vpn-setup-guide-azure-vng.mdx"
}
]
},
Expand Down
73 changes: 73 additions & 0 deletions tutorials/vpn-setup-guide-azure-vng.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
title: Configure Azure Virtual Network Gateway VPN with Smallstep
updated_at: June 11, 2024
html_title: How to configure an Azure VPN server to use Smallstep for client and server certificate authentication
description: This tutorial describes how to configure Smallstep with an Azure VPN for a high-security, certificate-based VPN access
---

This tutorial describes how to deploy and configure an Azure Virtual Network Gateway for certificate-based IPSec IKEv2 VPN authentication with Smallstep.
The Smallstep app can will configure and issue certificates to your clients.

## Introduction

You can use an [Azure Point-to-Site VPN](https://learn.microsoft.com/en-us/azure/vpn-gateway/point-to-site-about) to connect clients to your Azure virtual network.

In this tutorial, we'll set up client certificate authenticatin with Smallstep, using an IPSec IKEv2 VPN.

## Step-by-step instructions

1. Start by deploying a Virtual Network Gateway. Follow the steps in [Create the VPN Gateway](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#creategw) section of Microsoft's tutorial. Deploy the gateway, but do not generate any certificates yet.

2. Once the Gateway is deployed, gather the following properties for your Virtual Network Gateway:

* The gateway's **Public IP Address**
* The gateway's **Remote ID** and **Root CA Certificate**.
These are loacated inside the Point-to-Site configuration settings file.
To find these values,
in the Point-to-Site Configuration tab of the Virtual Network Gateway settings,
choose **Download VPN Client**.

When you choose "Download VPN Client", you will receive a ZIP file containing two crucial configuration parameters:

* Your gateway's **Remote ID**, located in `Generic/VpnSettings.xml`.
The Remote ID is the value inside the `<VpnServer>` XML tag.
It will look like this:

```
azuregateway-90fe1132-27af-6789-8aa9-4993ac57dd5b-7981e7988384.vpn.azure.com
```

* Your gateway's **Root CA Certificate**, located in `Generic/VpnServerRoot.cer_0`

This file is in DER (binary) certificate format.
Before you upload it to Smallstep, convert it to PEM format.
Run:

```
step certificate format VpnServerRoot.cer_0 > VpnServerRoot.pem
```

3. In [Smallstep](https://smallstep.com/app), create a Mobile Device Collection and add your device to it.
(If you're using the Smallstep app, a New Devices collection will be created for you when you sign in.)

4. Now, under the Accounts tab of your Device Collection, create a VPN Account:

* Connection type: **IKEv2 with IPSec**
* Remote address: Use the server name or remote IP of your Azure VPN
* Remote ID: Use the Remote ID you located earier.
* Server Certificate Roots: Choose "Upload external root" and upload the `VpnServerRoot.pem` file you created earlier.

5. Choose "Save account"
6. Download your Smallstep Root Certificate from the Authority Settings page.
7. In Azure, follow the instructions in [Upload root certificate public key information](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#uploadfile) to add the Smallstep Root Certifcate to the Root certificates section of your VPN's Point-to-site Configuration.

You're now ready to verify your VPN connection.

### Further reading

Microsoft's "Configure a point-to-site VPN" tutorial provides the basis for this tutorial:

* [Azure Portal version](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal)
* [Azure PowerShell version](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-rm-ps)


301 changes: 301 additions & 0 deletions tutorials/vpn-setup-guide-f5.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,301 @@
---
title: Configure F5 SSL VPN with Smallstep
updated_at: June 11, 2024
html_title: How to configure an F5 VPN to use Smallstep for client and server certificate authentication
description: This tutorial describes how to configure Smallstep with an F5 VPN server for a high-security, certificate-based access
---

This tutorial describes how to configure an F5 VPN server for certificate-based authentication with Smallstep.
The Smallstep app can then configure and issue certificates to your clients.

Intended audience: Enterprise IT administrators
Estimated time commitment: 1 hour

## Introduction

In this tutorial, we will configure an F5 SSL VPN on [F5 BIG-IP® APM](https://www.f5.com/products/big-ip-services/access-policy-manager) to use Smallstep certificate-based authentication with mutual TLS.

Client certificate management is not documented here. Client certificates could be issued to the F5 Access or Edge Client by the Smallstep app or by an MDM.

You will need a BIG-IP® instance with Local Traffic (LTM) and Access Policy (APM) resources provisioned.

This tutorial was tested on BIG-IP® VE v17.1.1 Build 0.2.6.

## Overview of the setup

For a complete setup, you will add the following to your F5 BIG-IP® configuration:

- An Access Profile with an Access Policy that performs certificate authentication and assigns resources to clients that successfully authenticate.

The Access Profile also contains configuration for the VPN itself, including IP lease pools and DNS settings.

- A Virtual Server which will serve your VPN traffic. This is where you’ll configure the mutual TLS handshake for your VPN server. The Virtual Server will accept client certificates from Smallstep, and use a server certificate from Smallstep.

## Step-by-step instructions

### Access Profile

The Access Profile defines the certificate authentication flow and VPN settings for F5 BIG-IP®.

**This is just an example policy. After importing, please review and modify it as needed**. You may want a fallback authentication method, for instance, in case certificate authentication fails. Or you may want a different set of resource assignments after successful certificate authentication.

1. Download this profile: [smallstep-vpn-profile.conf.tar.gz](https://files.smallstep.com/smallstep-vpn-profile.conf.tar.gz)
2. Go to Access → Profiles / Policies and choose Import…
- Profile name: `smallstep`
- Config File Upload: Upload smallstep-vpn-profile.conf.tar.gz

3. Choose “Import”

Here’s what the Access Policy will look like once imported:

![Imported BIG IP Access Policy](/graphics/imported-access-policy.png)

After import, you’ll need to customize your Access Profile to align with your VPN needs. Users commonly customize things like:

- IP Lease Pool address ranges
- Compression settings (in the Network Access List)
- DNS servers and domain suffix (in the Network Access List)

### Configuring TLS

Next, you’ll configure the TLS handshake for your VPN. You’ll add the following:

- CAs and Certificates for your Virtual Server
- F5 Menu: System → Certificate Management → Traffic Certificate Management → SSL Certificate List
- A Client SSL Profile
- F5 Menu: Local Traffic → Profiles → SSL → Client
- Virtual Server Configurations for ports 80 and 443
- F5 Menu: Local Traffic → Virtual Servers

### Certificates and Certificate Authorities

Now let’s configure CAs and Certificates on the BIG IP.

First, you’ll add a root of trust that will verify client certificates:

1. Go to System → Certificate Management → Traffic Certificate Management → SSL Certificate List
2. Choose “Import…” and on the next screen, choose:
- Import Type: Certificate
- Certificate Name: `smallstep-accounts-root-intermediate`
- Certificate Source: Browse for the Intermediate and Root Cert Bundle from your Smallstep Accounts CA
- Choose Import
3. You should now see a new Certificate Bundle in the list.

Next, you’ll configure a server certificate and private key for your virtual server’s Client SSL profile. This certificate must be issued by a root CA that will be trusted by your VPN clients when they connect.

<aside>
These instructions will help you create and import a certificate and key manually. A fully automated certificate management workflow is beyond the scope of this document. In a production environment, it is recommended to automate BIG IP server certificate management using Ansible, Terraform, or another IaC tool. BIG IP’s REST API can be leveraged for certificate automation. See [this F5 DevCentral post](https://community.f5.com/discussions/technicalforum/lets-encrypt-with-cloudflare-dns-and-f5-rest-api/292929) for details.
</aside>

1. Create the server certificate and private key. You can do this in the Smallstep UI, or locally by running `step ca certificate`. For example:

```bash
$ step ca certificate vpn.example.com server.crt server.key \
--not-after 8160h \
--san vpn.example.com \
--san 14.13.12.10
```

2. Combine the certificate + intermediate CA certificate and the private key into a PKCS 12 archive. You can generate a PKCS 12 archive with `step`. For example, if `server.crt` contains your server certificate and intermediate CA PEM blocks, and `server.key` contains your server private key, run:

```bash
$ step certificate p12 server.p12 server.crt server.key
```

You’ll be asked to provide a password to encrypt the file.

3. Next, in F5 BIG IP, go to System → Certificate Management → Traffic Certificate Management → SSL Certificate List
4. Choose “Import…” and on the next screen, choose:
- Import Type: PKCS 12 (IIS)
- Certificate and Key Name: `smallstep-vpn-server`
- Certificate and Key Source, browse for your `server.p12` PKCS 12 archive
- Enter the password you used to encrypt the PKCS 12 archive
5. Choose Import

You should now see the EC Certificate & Key you uploaded, in the SSL Certificate List.

### Virtual Servers

Now you’ll associate your Access Policy to a Virtual Server

You’ll need two Virtual Server configurations:

- For port 80, to redirect to port 443 using the built-in redirect iRule
- For port 443, with attached profiles

To get started, create a Client SSL profile:

1. Go to Local Traffic → Profiles → SSL → Client
2. Create a new Client SSL Profile
3. Use the following values:
- Name: `smallstep-clientssl`
- Certificate Key Chain: Add the `smallstep-vpn-server` server certificate and private key you imported earlier
- Client Certificate: Request
- Trusted Certificate Authorities: Choose the `smallstep-accounts-root-intermediate` CA Bundle that you imported earlier. Your client certificates must be issued by this CA.
- Advertised Certificate Authorities: Same value as Trusted Certificate Authorities
4. Save the Profile

Next, create a Connectivity Profile:

1. Go to Local Traffic → Profiles → Services → Connectivity
2. Choose “Add…”
- Name: `smallstep-connectivity`
- Parent profile: `/Common/connectivity`
3. Ok

Next, create the Virtual Server for port 80

1. Go to Local Traffic → Virtual Servers
2. Choose “Create…”
3. Use the following properties:
- Name: `smallstep-vpn-redirect`
- Provide your source address mask, eg. `0.0.0.0/0`
- Provide your destination address/mask. This may be the internal IP addresses of your F5 BIG IP.
- Service port: 80 / HTTP
- HTTP Profile (Client): http
- Add iRule **`_sys_https_redirect`**

Finally, create a Virtual Server for port 443:

1. Go to Local Traffic → Virtual Servers
2. Choose “Create…”
3. Use the following properties:
- Name: `smallstep-vpn`
- Provide your source and destination addresses/masks
- Service port: 443 / HTTPS
- HTTP Profile (Client): http
- SSL Profile (Client): Add the Client SSL Profile you created above
- Access Profile: Select the Access Profile you imported above
- Connectivity Profile: Select the Connectivity Profile you created above

Your VPN configuration is now ready for testing.

### Further reading

- [F5: Configuring an HTTP virtual server to redirect to HTTPS using an iRule](https://my.f5.com/manage/s/article/K10090418)
- [F5’s Dev/Central](https://community.f5.com/) Community support

---

### Addendum: Creating an Access Profile manually

This is an optional, alternative approach to creating the Access Profile.
If you want to create an Access Profile manually instead of importing ours, do the following:

#### Add a Network Access List

1. Go to Access → Connectivity / VPN → Network Access (VPN) → Network Access Lists
2. Choose “Create…”
- Name: `smallstep-na-res`
- Description: `Smallstep VPN Access`
- Customize the Customization Settings as desired
3. Choose “Finished”

#### Add an IPv4/IPv6 Lease Pool

Add at least one lease IPv4 or IPv6 lease pool:

1. Go to Access → Connectivity / VPN → Network Access (VPN) → IPv4 Lease Pools
2. Choose “Create…”
- Name: `smallstep-lp`
- Start IP: `192.168.133.2`, for example
- End IP: `192.168.133.254`, for example

#### Add an Access Profile

1. Go to Access → Profiles / Policies and create an Access Profile
- Name: `smallstep-vpn`
- Profile Type: All
- Languages: Add a language
- Choose “Finish”
2. Open the access policy you just created. In the Access Policy tab, open the visual policy editor
3. Import the following Access Policy:

If you want to create this policy manually, do the following:

- Authentication → On-Demand Cert Auth: Dynamically initiate an SSL re-handshake and validate the received client certificate
- Choose Auth Mode: “Require”
- Leave all other settings as default
- On the “Successful” branch after “On-Demand Cert Auth”, add Authentication → Client Cert Inspection: Check the result of client certificate authentication by the Local Traffic Client SSL profile
- Leave all settings as default
- On the “Successful” branch after “Client Cert Inspection”, add Assignment → Advanced Resource Assign:
- Use the Simple Expression “Client Cert is valid”
- Add a new Resource Assignment entry
- Assign your Network Access Profile
- Save

The Advanced Resource Assign properties should look like this:

![Advanced Resource Assign properties](/graphics/advanced-resource-assign.png)

- Finally, change the fallback Ending from Advanced Resource Assign to **Allow**

## Azure Virtual Network Gateway

You can use an [Azure Point-to-Site VPN](https://learn.microsoft.com/en-us/azure/vpn-gateway/point-to-site-about) to connect clients to your Azure virtual network.

In this tutorial, we'll set up client certificate authenticatin with Smallstep, using an IPSec IKEv2 VPN.

1. Start by deploying a Virtual Network Gateway. Follow the steps in [Create the VPN Gateway](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#creategw) section of Microsoft's tutorial. Deploy the gateway, but do not generate any certificates yet.

2. Once the Gateway is deployed, gather the following properties for your Virtual Network Gateway:

* The gateway's **Public IP Address**
* The gateway's **Remote ID** and **Root CA Certificate**.
These are loacated inside the Point-to-Site configuration settings file.
To find these values,
in the Point-to-Site Configuration tab of the Virtual Network Gateway settings,
choose **Download VPN Client**.

When you choose "Download VPN Client", you will receive a ZIP file containing two crucial configuration parameters:

* Your gateway's **Remote ID**, located in `Generic/VpnSettings.xml`.
The Remote ID is the value inside the `<VpnServer>` XML tag.
It will look like this:

```
azuregateway-90fe1132-27af-6789-8aa9-4993ac57dd5b-7981e7988384.vpn.azure.com
```

* Your gateway's **Root CA Certificate**, located in `Generic/VpnServerRoot.cer_0`

This file is in DER (binary) certificate format.
Before you upload it to Smallstep, convert it to PEM format.
Run:

```
step certificate format VpnServerRoot.cer_0 > VpnServerRoot.pem
```

3. In [Smallstep](https://smallstep.com/app), create a Mobile Device Collection and add your device to it.
(If you're using the Smallstep app, a New Devices collection will be created for you when you sign in.)

4. Now, under the Accounts tab of your Device Collection, create a VPN Account:

* Connection type: **IKEv2 with IPSec**
* Remote address: Use the server name or remote IP of your Azure VPN
* Remote ID: Use the Remote ID you located earier.
* Server Certificate Roots: Choose "Upload external root" and upload the `VpnServerRoot.pem` file you created earlier.

5. Choose "Save account"
6. Download your Smallstep Root Certificate from the Authority Settings page.
7. In Azure, follow the instructions in [Upload root certificate public key information](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal#uploadfile) to add the Smallstep Root Certifcate to the Root certificates section of your VPN's Point-to-site Configuration.

You're now ready to verify your VPN connection.

### Further reading

Microsoft's "Configure a point-to-site VPN" tutorial provides the basis for this tutorial:

* [Azure Portal version](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal)
* [Azure PowerShell version](https://learn.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-howto-point-to-site-rm-ps)


## Juniper SSL-VPN

See [Create a Remote Access VPN—Juniper Secure Connect](https://www.juniper.net/documentation/us/en/software/jweb-srx21.3/jweb-srx/topics/task/j-web-security-ipsec-remote-access-vpn-juniper-secure-connect-creating.html)

## Cisco Meraki AnyConnect

- [Server docs at meraki.net](https://learning.meraki.net/#/online-courses/3def4293-8b71-406f-ae12-ab0c1028261b)
- [Client docs at meraki.net](https://documentation.meraki.com/MX/Client_VPN/AnyConnect_on_the_MX_Appliance/Client_deployment)
Loading

0 comments on commit e151a89

Please sign in to comment.