AKS | Restreindre l’accès a API Server

Bonjour,

Je commence une série de blog posts sur la sécurité dans AKS, pour rappel AKS est le service managé de Kubernetes pour Azure.

Dans ce premier blog post nous allons voir ensemble comment restreindre l’accès à API Server. Mais avant cela je vous invite à regarder de nouveau l’architecture d’un cluster Kubernetes.

Avec le service managé AKS, Microsoft à la responsabilité de gérer et d’opérer le composant « Kubernetes Master ». Ce composant est composé des sous-composants suivants :

  • Control Manager
  • Scheduler
  • etcd
  • API Server

Les nodes de votre cluster vont interagir directement avec le composant API Server. Si vous souhaitez accéder à votre cluster Kubernetes vous allez également interagir avec API Server. Ce composant est un composant clé de l’architecture de votre cluster Kubernetes.

Quand vous déployez un cluster managé dans Azure, un cluster AKS, Microsoft va créer un « endpoint » publique vous permettant d’interagir avec votre cluster. Par défaut, vous pouvez accéder à votre cluster avec l’aide de vos identifiants depuis n’importe quelle adresse IP internet …

Dans cet article, je vous présente comment réduire la portée d’accès à l’API Server en filtrant l’accès depuis une adresse IP publique spécifique ou depuis une plage d’adresses IP publiques.

Nous partons de la prémisse que notre cluster AKS est déjà déployé, ci ce n’était pas le cas, je vous invite à regarder la vidéo ci-dessous:

Afin de restreindre les accès à API Serveur nous allons utiliser le service Azure Firewall, nous allons créer dans un premier temps une passerelle sortante pour nos nodes.

L’ensemble de nos nodes vont avoir la meme adresse IP publique de sortie, l’adresse de notre Azure Firewall. Puis dans un second temps nous allons mettre à jour notre cluster afin d’autoriser uniquement cette adresse IP publique.

La fonctionnalité que nous utilisons est « preview » lors de l’écriture de cet article, pour cela je vous invite à suivre les pré-requis suivant:

az feature register --name APIServerSecurityPreview --namespace Microsoft.ContainerService

az feature list -o table --query "[ contains(name,'Microsoft.ContainerService/APIServerSecurityPreview')].{Name:name,State:properties.state}"

az provider register --namespace Microsoft.ContainerService

Nous créons un sous-réseau dédié à notre Azure Firewall, dans le VNet de notre cluster AKS

# Get the name of the virtual network used by the cluster
VNET_NAME=$(az network vnet list --resource-group $MC_RESOURCE_GROUP --query [0].name -o tsv) 

# Create a subnet in the virtual network for Azure Firewall 
az network vnet subnet create --resource-group $MC_RESOURCE_GROUP --vnet-name $VNET_NAME --name AzureFirewallSubnet --address-prefixes 10.200.0.0/16

Nous allons créer notre Azure Firewall, puis dans un second temps nous allons créer une adresse IP publique pour notre Azure Firewall :

# Install the CLI extension for Azure Firewall
az extension add --name azure-firewall 

# Create an Azure firewall  
az network firewall create --resource-group $MC_RESOURCE_GROUP --name myAzureFirewall

# Create a public IP address for the firewall FIREWALL_PUBLIC_IP=$(az network public-ip create --resource-group $MC_RESOURCE_GROUP --name myAzureFirewallPublicIP --sku Standard --query publicIp.ipAddress -o tsv)

Enfin nous attachons notre Azure Firewall avec le subnet précédemment créé:

# Associated the firewall with virtual network 
az network firewall ip-config create --resource-group $MC_RESOURCE_GROUP --name myAzureFirewallIPConfig --vnet-name $VNET_NAME --firewall-name myAzureFirewall --public-ip-address myAzureFirewallPublicIP

Nous allons créer une première règle de pare-feu pour autoriser l’ensemble du traffic sortant. (Je ne vous recommande pas de mettre en place ce type de règle pour un cluster de production, mais de filter en sortie uniquement les adresses requises pour vos nodes : https://docs.microsoft.com/en-us/azure/aks/limit-egress-traffic)

az network firewall network-rule create --resource-group $MC_RESOURCE_GROUP --firewall-name myAzureFirewall --name AllowTCPOutbound --collection-name myAzureFirewallCollection --priority 200 --action Allow --protocols TCP --source-addresses '*' --destination-addresses '*' destination-ports '*'

Nous déployons une table de routage afin router le traffic entre l’interface privé et l’interface publique de notre Azure Firewall.

# Get the AKS cluster route table 
ROUTE_TABLE=$(az network route-table list --resource-group $MC_RESOURCE_GROUP --query "[?contains(name,'agentpool')].name" -o tsv) 

# Get internal IP address of the firewall FIREWALL_INTERNAL_IP=$(az network firewall show --resource-group $MC_RESOURCE_GROUP --name myAzureFirewall --query ipConfigurations[0].privateIpAddress -o tsv) 

# Get the IP address of API server endpoint K8S_ENDPOINT_IP=$(kubectl get endpoints -o=jsonpath='{.items[?(@.metadata.name == "kubernetes")].subsets[].addresses[].i

az network route-table route create --resource-group $MC_RESOURCE_GROUP --route-table-name $ROUTE_TABLE  --name AzureFirewallAPIServer --address-prefix $K8S_ENDPOINT_IP/32 --next-hop-ip-address $FIREWALL_INTERNAL_IP --next-hop-type VirtualAppliance echo "Public IP address for the Azure Firewall instance that should be added to the list of API server authorized addresses is:" $FIREWALL_PUBLIC_IP

Dernière étape nous mettons à jour notre cluster AKS afin de n’autoriser que l’adresse IP publique du Azure Firewall. Nous pouvons si nous le souhaitons par la même occasion autoriser l’adresse IP publique de notre connexion internet afin d’interagir avec API Server directement depuis notre poste de travail avec l’aide de l’outil kubectl.

az aks update --resource-group myResourceGroup --name myAKSCluster --api-server-authorized-ip-ranges @IP_Public_Firewall_Azure/32

Lien vers la documentation : https://docs.microsoft.com/en-us/azure/aks/api-server-authorized-ip-ranges

Démarrez une conversation

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *