Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Core key vault firewall should not be set to "Allow public access from all networks" #4260

Merged
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e0753da
Core key vault firewall should not be set to "Allow public access fro…
jonnyry Jan 7, 2025
e33f235
Linting
jonnyry Jan 7, 2025
c9af674
Update core version
jonnyry Jan 7, 2025
9f1ef68
Linting
jonnyry Jan 7, 2025
1fefc9f
Linting
jonnyry Jan 7, 2025
8af920d
Linting
jonnyry Jan 7, 2025
8c24844
Simplified: Remove use of azure tags, make specific to key vault
jonnyry Jan 8, 2025
357891f
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Jan 8, 2025
f6ed85a
Update core version
jonnyry Jan 8, 2025
dcb0b8f
Linting
jonnyry Jan 8, 2025
135be76
Update to deal with scenario where TRE_ID is not available
jonnyry Jan 8, 2025
4a1b8b8
Remove unused null provisioner from .terraform.lock.hcl
jonnyry Jan 8, 2025
d7ce398
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Jan 15, 2025
e9833c4
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Jan 19, 2025
2fa2a95
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 5, 2025
56d91d1
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 6, 2025
6251320
Remove unused scripts: key_vault_list.sh & set_contributor_sp_secret…
jonnyry Feb 6, 2025
de97183
Refactor as per @marrobi
jonnyry Feb 6, 2025
bd786c4
Update letsencrypt.sh
jonnyry Feb 6, 2025
cc2551e
Update kv_add_network_exception.sh
jonnyry Feb 6, 2025
417c195
Update kv_add_network_exception.sh
jonnyry Feb 6, 2025
dee1c14
Update kv_add_network_exception.sh
jonnyry Feb 6, 2025
67c2b2a
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 7, 2025
73049a1
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 9, 2025
6dc3fe0
Update CHANGELOG.md
jonnyry Feb 9, 2025
df52d62
Simplify
jonnyry Feb 9, 2025
3d8e6c1
Update letsencrypt.sh
jonnyry Feb 9, 2025
f480b32
Update kv_add_network_exception.sh
jonnyry Feb 9, 2025
1aaffb2
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 9, 2025
97db895
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 11, 2025
b94443a
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 12, 2025
d65eaf4
Merge branch 'main' into jr/upstream-main/93-close-keyvault-firewall
jonnyry Feb 13, 2025
f2c8c96
Update version.txt
jonnyry Feb 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
**BREAKING CHANGES & MIGRATIONS**:

ENHANCEMENTS:
* Core key vault firewall should not be set to "Allow public access from all networks" ([#4250](https://github.com/microsoft/AzureTRE/issues/4250))
* Allow workspace App Service Plan SKU to be updated ([#4331](https://github.com/microsoft/AzureTRE/issues/4331))
* Remove public IP from TRE's firewall when forced tunneling is configured ([#4346](https://github.com/microsoft/AzureTRE/pull/4346))

Expand Down
3 changes: 3 additions & 0 deletions core/terraform/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ set -o pipefail
set -o nounset
# set -o xtrace

# shellcheck disable=SC1091
source "../../devops/scripts/kv_add_network_exception.sh"

# This is where we can migrate any Terraform before we plan and apply
# For instance deprecated Terraform resources
# shellcheck disable=SC1091
Expand Down
3 changes: 3 additions & 0 deletions core/terraform/destroy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ set -o pipefail
set -o nounset
# set -o xtrace

# shellcheck disable=SC1091
source "../../devops/scripts/kv_add_network_exception.sh"

# These variables are loaded in for us
# shellcheck disable=SC2154
../../devops/scripts/terraform_wrapper.sh -g "${TF_VAR_mgmt_resource_group_name}" \
Expand Down
24 changes: 22 additions & 2 deletions core/terraform/keyvault.tf
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
resource "azurerm_key_vault" "kv" {
name = "kv-${var.tre_id}"
name = local.kv_name
tenant_id = data.azurerm_client_config.current.tenant_id
location = azurerm_resource_group.core.location
resource_group_name = azurerm_resource_group.core.name
Expand All @@ -8,7 +8,27 @@ resource "azurerm_key_vault" "kv" {
purge_protection_enabled = var.kv_purge_protection_enabled
tags = local.tre_core_tags

lifecycle { ignore_changes = [access_policy, tags] }
public_network_access_enabled = local.kv_public_network_access_enabled

network_acls {
default_action = local.kv_network_default_action
bypass = local.kv_network_bypass
ip_rules = [local.myip] # exception for deployment IP, this is removed in kv_remove_network_exception.sh
}

lifecycle {
ignore_changes = [access_policy, tags]
}

# create provisioner required due to https://github.com/hashicorp/terraform-provider-azurerm/issues/18970
#
provisioner "local-exec" {
when = create
command = <<EOT
az keyvault update --name ${local.kv_name} --public-network-access ${local.kv_public_network_access_enabled ? "Enabled" : "Disabled"} --default-action ${local.kv_network_default_action} --bypass "${local.kv_network_bypass}" --output none
az keyvault network-rule add --name ${local.kv_name} --ip-address ${local.myip} --output none
EOT
}
}

resource "azurerm_role_assignment" "keyvault_deployer_role" {
Expand Down
6 changes: 6 additions & 0 deletions core/terraform/locals.tf
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,10 @@ locals {

cmk_name = "tre-encryption-${var.tre_id}"
encryption_identity_name = "id-encryption-${var.tre_id}"

# key vault variables
kv_name = "kv-${var.tre_id}"
kv_public_network_access_enabled = true
kv_network_default_action = var.enable_local_debugging ? "Allow" : "Deny"
kv_network_bypass = "AzureServices"
}
5 changes: 5 additions & 0 deletions core/terraform/scripts/letsencrypt.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ if [[ -z ${STORAGE_ACCOUNT} ]]; then
exit 1
fi

if [[ -n ${KEYVAULT} ]]; then
# shellcheck disable=SC1091
source "$script_dir/../../../devops/scripts/kv_add_network_exception.sh"
fi

# The storage account is protected by network rules
#
# The rules need to be temporarily lifted so that the script can determine if the index.html file
Expand Down
2 changes: 1 addition & 1 deletion core/version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.11.23"
__version__ = "0.11.24"
5 changes: 5 additions & 0 deletions devops/scripts/destroy_env_no_terraform.sh
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ then
no_wait_option="--no-wait"
fi

script_dir=$(realpath "$(dirname "${BASH_SOURCE[0]}")")

# shellcheck disable=SC1091
source "$script_dir/kv_add_network_exception.sh"

group_show_result=$(az group show --name "${core_tre_rg}" > /dev/null 2>&1; echo $?)
if [[ "$group_show_result" != "0" ]]; then
echo "Resource group ${core_tre_rg} not found - skipping destroy"
Expand Down
17 changes: 0 additions & 17 deletions devops/scripts/key_vault_list.sh

This file was deleted.

131 changes: 131 additions & 0 deletions devops/scripts/kv_add_network_exception.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
#!/bin/bash

#
# Add an IP exception to the Key Vault firewall for deployment, and remove on script exit
# The current machine's IP address is used, or $PUBLIC_DEPLOYMENT_IP_ADDRESS if set
#
# Note: Ensure you "source" this script, or else the EXIT trap won't fire at the right time
#


function kv_add_network_exception() {

# set up variables
#
local KV_NAME
KV_NAME=$(get_kv_name)

local MY_IP
MY_IP=$(get_my_ip)

echo -e "\nAdding deployment network exception to key vault $KV_NAME..."

# ensure kv exists
#
if ! does_kv_exist "$KV_NAME"; then
return 0 # don't cause outer sourced script to fail
fi

# add keyvault network exception
#
az keyvault network-rule add --name "$KV_NAME" --ip-address "$MY_IP" --output none

local ATTEMPT=1
local MAX_ATTEMPTS=10

while true; do

if KV_OUTPUT=$(az keyvault secret list --vault-name "$KV_NAME" --query '[].name' --output tsv 2>&1); then
echo -e " Keyvault $KV_NAME is now accessible\n"
break
fi

if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then
echo -e "Could not add deployment network exception for $KV_NAME"
echo -e "Unable to access keyvault $KV_NAME after $ATTEMPT/$MAX_ATTEMPTS.\n"
echo -e "$KV_OUTPUT\n"

exit 1
fi

echo " Unable to access keyvault $KV_NAME after $ATTEMPT/$MAX_ATTEMPTS. Waiting for network rules to take effect."
sleep 5
((ATTEMPT++))

done

}

function kv_remove_network_exception() {

# set up variables
#
local KV_NAME
KV_NAME=$(get_kv_name)

local MY_IP
MY_IP=$(get_my_ip)

echo -e "\nRemoving deployment network exception to key vault $KV_NAME..."

# ensure kv exists
#
if ! does_kv_exist "$KV_NAME"; then
return 0 # don't cause outer sourced script to fail
fi

# remove keyvault network exception
#
az keyvault network-rule remove --name "$KV_NAME" --ip-address "$MY_IP" --output none
echo -e " Deployment network exception removed\n"
}


function get_kv_name() {

local TRE_ID_LOCAL="${TRE_ID:-}"

if [[ -z "$TRE_ID_LOCAL" ]]; then
if [[ "${core_tre_rg:-}" == rg-* ]]; then # TRE_ID may not be available when called from destroy_env_no_terraform.sh
TRE_ID_LOCAL="${core_tre_rg#rg-}"
fi
fi

if [[ -z "$TRE_ID_LOCAL" ]]; then
echo -e "Could not add/remove keyvault deployment network exception: TRE_ID is not set\nExiting...\n"
exit 1
fi

echo "kv-${TRE_ID_LOCAL}"
}

function get_my_ip() {

local MY_IP="${PUBLIC_DEPLOYMENT_IP_ADDRESS:-}"

if [[ -z "$MY_IP" ]]; then
MY_IP=$(curl -s "ipecho.net/plain"; echo)
fi

echo "$MY_IP"
}


function does_kv_exist() {

KV_NAME=$1

if [[ -z "$(az keyvault list --query "[?name=='$KV_NAME'].id" --output tsv)" ]]; then
echo -e " Core key vault $KV_NAME not found\n"
return 1
fi

return 0
}


# setup the trap to remove network exception on exit
trap kv_remove_network_exception EXIT

# now add the network exception
kv_add_network_exception "$@"
22 changes: 0 additions & 22 deletions devops/scripts/set_contributor_sp_secrets.sh

This file was deleted.

Loading