Pour garantir la sécurité de vos bases de données, restreignez les services autorisés à y accéder. Par exemple, autorisez les services des namespaces de production à accéder aux bases de données de production tout en bloquant ceux des namespaces de développement. Cette rubrique explique comment utiliser une politique d'autorisation pour contrôler l'accès à une base de données RDS externe spécifique.
Prérequis
Le cluster est ajouté à l'instance ASM. Pour plus d'informations, consultez Ajouter un cluster à une instance ASM.
Étape 1 : Injecter un proxy sidecar
Créez un namespace nommé demo-server et injectez-y un proxy sidecar. Vous pourrez ainsi gérer les autorisations pour les services de ce namespace. Pour plus d'informations, consultez Gérer les namespaces globaux.
Étape 2 : Créer un client de base de données
Créez un client dans le namespace demo-server pour initier des requêtes de connexion à la base de données.
-
Encodez le mot de passe de connexion à la base de données en Base64.
echo <your-database-password> | base64 Obtenir le fichier kubeconfig d'un cluster et utiliser kubectl pour s'y connecter.
-
Créez un client MySQL dans le namespace
demo-server.-
Créez un fichier nommé
k8s-mysql.yamlcontenant les éléments suivants.apiVersion: v1 data: password: # The Base64-encoded database connection password. kind: Secret metadata: name: mysql-pass type: Opaque --- apiVersion: apps/v1 kind: Deployment metadata: labels: name: lbl-k8s-mysql name: k8s-mysql spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: name: lbl-k8s-mysql strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: name: lbl-k8s-mysql spec: containers: - env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: key: password name: mysql-pass image: 'mysql:latest' imagePullPolicy: Always name: mysql ports: - containerPort: 3306 name: mysql protocol: TCP resources: limits: cpu: 500m terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /var/lib/mysql name: k8s-mysql-storage dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - emptyDir: {} name: k8s-mysql-storage -
Exécutez la commande suivante pour créer le client MySQL.
kubectl apply -f k8s-mysql.yaml -n demo-server
-
-
Vérifiez que le proxy sidecar est bien injecté dans le pod du client MySQL.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
-
Sur la page Pods, cliquez sur le nom du pod du client MySQL.
L'onglet Containers affiche le conteneur
istio-proxy, ce qui confirme l'injection du proxy sidecar.
Étape 3 : Créer une passerelle sortante
Les services d'un Service Mesh doivent utiliser une passerelle sortante pour contrôler le trafic sortant vers les services externes. La configuration d'une politique d'autorisation pour cette passerelle permet de définir des conditions de contrôle d'accès à la base de données.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Egress Gateway, cliquez sur Create.
-
Sur la page Create, définissez le Name sur egressgateway et sélectionnez un Cluster. Dans la section Port Mapping, définissez le Protocol sur TCP et le Service Port sur 13306. Cliquez ensuite sur Create.
Pour plus d'informations sur les paramètres, consultez Créer une passerelle sortante.
Étape 4 : Configurer la politique de trafic sortant
Par défaut, les services du maillage peuvent accéder à tous les services externes. Pour restreindre l'accès à des services externes spécifiques, définissez la politique de trafic sortant sur REGISTRY_ONLY. Avec ce paramètre, les services du Service Mesh ne peuvent pas accéder aux services externes non définis dans un ServiceEntry.
-
Définissez la politique de trafic sortant.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez .
Dans l'onglet global, cliquez sur Outbound Traffic Policy, définissez Outbound Traffic Policy sur REGISTRY_ONLY, puis cliquez sur Update Settings.
-
Enregistrez le service externe en créant un ServiceEntry.
Sur la page de détails de l'instance ASM, choisissez dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Create from YAML.
-
Définissez les Namespaces sur demo-server, collez le contenu suivant dans la zone de texte, puis cliquez sur Create. Remplacez
rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.compar l'endpoint de votre instance RDS.apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: demo-server-rds namespace: demo-server spec: endpoints: - address: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com # Database address. ports: tcp: 3306 hosts: - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com location: MESH_EXTERNAL ports: - name: tcp number: 3306 # Database port. protocol: TCP # Database protocol. resolution: DNS
Étape 5 : Créer des politiques de trafic
Créez une Gateway, une DestinationRule et une VirtualService pour acheminer le trafic du namespace demo-server vers le port 13306 de la passerelle sortante. Celle-ci achemine ensuite le trafic vers le port 3306 de la base de données.
-
Créez une Gateway.
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez . Sur la page qui s'affiche, cliquez sur Create from YAML.
-
Définissez les Namespaces sur istio-system, collez le contenu suivant dans la zone de texte, puis cliquez sur Create.
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-egressgateway namespace: istio-system spec: selector: istio: egressgateway servers: - hosts: - '*' port: name: http-0 number: 13306 protocol: TLS tls: mode: ISTIO_MUTUALLe paramètre
modeest défini surISTIO_MUTUALpour activer l'authentification TLS mutuel (mTLS) sur la passerelle. Les clients situés à l'intérieur du maillage doivent ainsi présenter un certificat à la passerelle sortante.
-
Créez une DestinationRule.
Sur la page de détails de l'instance ASM, choisissez dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Create from YAML.
-
Sur la page Create, définissez les Namespaces sur demo-server, collez le contenu suivant dans la zone de texte, puis cliquez sur Create.
apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: demo-server-egress-gateway namespace: demo-server spec: host: istio-egressgateway.istio-system.svc.cluster.local subsets: - name: mysql-gateway-mTLS trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 13306 # The gateway port mapping. tls: mode: ISTIO_MUTUAL sni: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com # The host address of the database.Le paramètre
modeest défini surISTIO_MUTUAL. Les proxys sidecars clients initient alors une connexion mTLS vers le service de passerelle sortante.
-
Créez une VirtualService.
Sur la page de détails de l'instance ASM, choisissez dans le volet de navigation de gauche. Sur la page qui s'affiche, cliquez sur Create from YAML.
-
Sur la page Create, définissez les Namespaces sur demo-server, collez le contenu suivant dans la zone de texte, puis cliquez sur Create.
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: demo-server-through-egress-gateway namespace: demo-server spec: exportTo: - istio-system - demo-server gateways: - mesh - istio-system/istio-egressgateway hosts: - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com tcp: - match: - gateways: - mesh port: 3306 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 13306 subset: mysql-gateway-mTLS weight: 100 - match: - gateways: - istio-system/istio-egressgateway port: 13306 route: - destination: host: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com port: number: 3306 weight: 100La section http contient deux règles de correspondance. La première définit gateways sur mesh. Ce paramètre s'applique aux proxys sidecars du namespace demo-server et achemine le trafic de ce namespace vers le port 13306 de la passerelle sortante. La seconde règle définit gateways sur istio-system/istio-egressgateway et achemine le trafic de la passerelle sortante vers le port 3306 de la base de données enregistrée.
Étape 6 : Vérifier le contrôle d'accès avec une politique d'autorisation
La modification de l'action de la politique d'autorisation permet de refuser ou d'autoriser les services du namespace demo-server à accéder à la base de données externe.
-
Créez une politique d'autorisation pour refuser les requêtes d'accès provenant du namespace
demo-server.Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez . Sur la page qui s'affiche, cliquez sur Create.
-
Sur la page Create, configurez les paramètres suivants et cliquez sur Create.
Paramètre
Description
Name
Saisissez un nom pour la politique d'autorisation.
Policy Type
Sélectionnez DENY.
Onglet Gateway Scope
ASM Gateway
Sélectionnez egressgateway. Le Match Label est alors automatiquement défini sur istio:egressgateway.
Request Matching Rules
Activez le commutateur Namespaces et définissez la valeur sur demo-server.
-
Tentez d'accéder à la base de données externe.
Connectez-vous à la console ACK. Dans le volet de navigation de gauche, cliquez sur Clusters.
Sur la page Clusters, cliquez sur le nom de votre cluster. Dans le volet de navigation de gauche, cliquez sur .
Sur la page Pods, localisez le pod
k8s-mysql, cliquez sur Actions dans la colonne Terminal, puis sélectionnez le conteneur mysql.-
Dans le terminal du pod, exécutez la commande suivante pour accéder à la base de données externe.
mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.comLe message
ERROR 2013s'affiche, indiquant que l'accès à la base de données échoue comme prévu.
-
Pour autoriser l'accès depuis le namespace
demo-server, remplacez l'action de la politique d'autorisation parALLOW.Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez .
Sur la page AuthorizationPolicy, localisez la politique cible et cliquez sur View YAML dans la colonne Actions.
Dans la boîte de dialogue Edit, remplacez la valeur du paramètre
actionpar ALLOW et cliquez sur OK.
-
Dans le terminal du pod, exécutez à nouveau la commande suivante pour accéder à la base de données externe.
mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.comLe message
Welcome to the MySQL monitors'affiche, confirmant la réussite de l'accès à la base de données.Ces résultats confirment qu'une politique d'autorisation permet de contrôler l'accès à une base de données externe.