Exécuter un script avec l'exécuteur d'actions privé
Présentation
L’exécuteur d’actions privé peut exécuter des scripts prédéfinis, qui sont des commandes shell, des outils de ligne de commande et des scripts que vous déclarez à l’avance dans un fichier de configuration de script. Seul ce que vous prédéfinissez peut être exécuté, de sorte que l’exécuteur n’exécute jamais de commandes en ligne arbitraires provenant d’un workflow ou d’une application.
Vous décidez quelles commandes et quels binaires l'exécuteur est autorisé à exécuter. Examinez chaque commande que vous ajoutez à la configuration du script, en particulier celles qui acceptent des paramètres, n'accordez à l'exécuteur que les privilèges dont il a besoin, et examinez attentivement les autorisations que vous partagez via les connexions. Voir
les considérations de sécurité des connexions.
Cas d’utilisation
| Cas d’utilisation | Basé sur l’Agent | Autonome | Notes |
|---|
Exécution de binaires Linux (ls, rm, find, curl) | | | Pour les exécuteurs autonomes, les fichiers pertinents doivent être accessibles au conteneur. |
Exécution d’interfaces de ligne de commande (aws, terraform, kubectl) | | | Pour les exécuteurs autonomes, l’interface de ligne de commande et les identifiants doivent être disponibles dans l’image. Pour les exécuteurs basés sur l’Agent, les outils doivent être installés sur le host. |
| Exécution de scripts bash | | | Pour les exécuteurs autonomes, les scripts peuvent être montés à l’intérieur du conteneur. Utilisez la grande image pour un interpréteur Python. |
| Exécution de scripts PowerShell | | | Pris en charge uniquement sur les exécuteurs Windows basés sur l’Agent. |
Exécution de commandes privilégiées (systemctl restart) | | | Pour les exécuteurs basés sur l’Agent, accordez des autorisations à l’utilisateur de l’exécuteur. Le sandboxing de conteneur empêche les exécuteurs autonomes d’accéder au host avec des privilèges. |
Prérequis
Pour les exécuteurs basés sur l’Agent :
Pour les exécuteurs autonomes :
Basé sur l’Agent
Modifiez le fichier /etc/datadog-agent/private-action-runner/script-config.yaml :
schemaId: script-credentials-v1
runPredefinedScript:
echo:
command: ["echo", "Hello world!"]
echo-parametrized:
command: ["echo", "{{ parameters.echoValue }}"]
restart-service:
command: ["sudo", "systemctl", "restart", "{{ parameters.service }}"]
Modifiez le fichier C:\ProgramData\Datadog\private-action-runner\powershell-script-config.yaml :
schemaId: script-credentials-v1
runPredefinedPowershellScript:
helloWorld:
script: |
Write-Output "Hello world!"
greet:
script: |
Write-Output "Run script from workflow called {{ parameters.name }} !"
parameterSchema:
properties:
name:
type: string
required:
- name
restartService:
script: |
Restart-Service -Name {{ parameters.serviceName }} -Force
parameterSchema:
properties:
serviceName:
type: string
required:
- serviceName
Dans un workflow ou une application, référencez un script par le nom que vous avez défini (par exemple, echo). Utilisez runPredefinedScript sur les exécuteurs Linux et runPredefinedPowershellScript sur les exécuteurs Windows.
Accorder des autorisations
L’exécuteur exécute les scripts en tant qu’utilisateur dd-agent. Si vos scripts nécessitent des autorisations élevées, accordez-les à l’utilisateur dd-agent :
echo "dd-agent ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx" > /etc/sudoers.d/dd-agent
chmod 440 /etc/sudoers.d/dd-agent
L’exécuteur exécute les scripts en tant que ddagentuser. Si vos scripts nécessitent l’accès à certaines ressources, accordez à l’utilisateur ddagentuser des autorisations élevées pour y accéder :
icacls "C:\<your-file-path>" /grant "ddagentuser:(OI)(CI)RX" /T
# Verify permissions
icacls "C:\<your-file-path>"
Exécuteur sans propriétaire (autorisé par la politique d’exécution)
Lorsqu’un exécuteur est inscrit en mode sans propriétaire et autorisé par Politiques d’exécution, deux éléments supplémentaires sont requis en plus des étapes ci-dessus :
- L’intégration Script doit être autorisée pour l’exécuteur via une politique d’exécution, en plus de ce que l’action predefined-script figure dans la liste d’autorisation des actions de l’exécuteur.
- L’exécuteur lit ses scripts prédéfinis à partir d’un chemin fixe, le même chemin utilisé dans Configurer les scripts ci-dessus :
/etc/datadog-agent/private-action-runner/script-config.yaml
C:\ProgramData\Datadog\private-action-runner\powershell-script-config.yaml
Livraison de la configuration sur Kubernetes
Sur Kubernetes, fournissez le fichier de configuration de script à l’exécuteur dans le Datadog Agent sous forme de ConfigMap. Montez-le dans le conteneur de l’exécuteur au chemin fixe. L’exécuteur du Cluster Agent utilise le chemin Linux ci-dessus.
Tout d’abord, créez une ConfigMap contenant votre configuration de script :
apiVersion: v1
kind: ConfigMap
metadata:
name: par-script-config
namespace: datadog
data:
script-config.yaml: |
schemaId: script-credentials-v1
runPredefinedScript:
echo:
command: ["echo", "Hello world!"]
Ensuite, sur la ressource DatadogAgent, autorisez l’action predefined-script et montez la ConfigMap dans le conteneur de l’exécuteur au chemin fixe :
apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
name: datadog
annotations:
agent.datadoghq.com/private-action-runner-enabled: "true"
agent.datadoghq.com/private-action-runner-configdata: |
private_action_runner:
enabled: true
api_key_only_enrollment: true
actions_allowlist:
- "com.datadoghq.script.runPredefinedScript"
- "com.datadoghq.kubernetes.*"
- "com.datadoghq.remoteaction.*"
spec:
override:
nodeAgent:
volumes:
- name: par-script-config
configMap:
name: par-script-config
containers:
private-action-runner:
volumeMounts:
- name: par-script-config
mountPath: /etc/datadog-agent/private-action-runner/script-config.yaml
subPath: script-config.yaml
readOnly: true
Enfin, appliquez le manifeste :
kubectl apply -f datadog-agent.yaml
Exécuteur détenu (basé sur une connexion)
Si vous avez sélectionné com.datadoghq.script.runPredefinedScript dans la liste d’autorisation des actions de l’exécuteur, vous devriez déjà avoir une connexion Script liée à votre exécuteur. Sinon, créez une connexion et spécifiez /etc/datadog-agent/private-action-runner/script-config.yaml comme chemin vers le fichier. Pour plus d’informations, consultez [Gestion des identifiants d’action privés][4].
Si vous avez sélectionné com.datadoghq.script.runPredefinedPowershellScript dans la liste d’autorisation des actions de l’exécuteur, vous devriez déjà avoir une connexion Script liée à votre exécuteur. Sinon, créez une connexion et spécifiez C:\ProgramData\Datadog\private-action-runner\powershell-script-config.yaml comme chemin vers le fichier. Pour plus d’informations, consultez [Gestion des identifiants d’action privés][4].
Autonome
Un exécuteur autonome est toujours détenu et autorisé avec des Connexions.
- Après avoir [configuré un exécuteur][2], accédez à Connections.
- Cliquez sur New Connection et sélectionnez Script.
- Saisissez un nom de connexion et, dans la liste déroulante Private Action Runner, sélectionnez votre exécuteur.
- Copiez le modèle de fichier d’identification dans le répertoire de configuration de votre exécuteur avec les commandes que vous souhaitez exécuter.
- Dans Path to file, confirmez que le chemin d’accès au fichier correspond au chemin sur le système de fichiers de votre exécuteur (la valeur par défaut suffit dans la plupart des cas).
- Cliquez sur Next, Confirm Access, configurez les autorisations, puis cliquez sur Create.
- Sélectionnez cette connexion lors de l’utilisation de l’action de script dans vos workflows ou applications.
Configurez les actions de script via le fichier config.yaml de votre exécuteur et la connexion de script
(credentials/script.yaml par défaut) :
# Add the script action to the allowlist (config.yaml)
actionsAllowlist:
- com.datadoghq.script.runPredefinedScript
# Configure your script connection (credentials/script.yaml)
schemaId: script-credentials-v1
runPredefinedScript:
echo:
command: ["echo", "Hello world"]
echo-parametrized:
command: ["echo", "{{ parameters.echoValue }}"]
parameterSchema:
properties:
echoValue:
type: string
required:
- echoValue
Lors du déploiement de l’exécuteur avec Helm, configurez les scripts via votre fichier values.yaml :
common:
actionsAllowlist:
- com.datadoghq.script.runPredefinedScript
credentials:
script:
schemaId: script-credentials-v1
runPredefinedScript:
echo:
command: ["echo", "Hello world"]
echo-parametrized:
command: ["echo", "{{ parameters.echoValue }}"]
parameterSchema:
properties:
echoValue:
type: string
required:
- echoValue
Déployez ou mettez à niveau l’exécuteur :
helm upgrade --install <RELEASE_NAME> datadog/private-action-runner -f ./values.yaml
Options d’image de l’exécuteur
Les options suivantes sont disponibles uniquement pour les exécuteurs autonomes.
Grande image
Si vous souhaitez utiliser des outils tels que Python, SSH, l’AWS CLI, Terraform ou la gcloud CLI, utilisez l’image gcr.io/datadoghq/private-action-runner:v1.22.1-large au lieu de l’image par défaut.
Images personnalisées
Pour les binaires non disponibles dans les images fournies par Datadog, créez une image personnalisée :
FROM gcr.io/datadoghq/private-action-runner:v1.22.1
USER root
# Change the line below to install the tool of your choice
RUN apt update && apt install -y python3
USER dog
Vous pouvez monter des scripts complexes à l’intérieur de l’exécuteur :
# docker-compose example
services:
runner:
build: . # if you are using a local Dockerfile
volumes:
- "./config:/etc/dd-action-runner/config" # contains credentials for actions
- "./scripts:/etc/dd-action-runner-script/scripts" # contains dependencies for script actions
# credentials/script.yaml
schemaId: script-credentials-v1
runPredefinedScript:
python:
command: ["python3", "/etc/dd-action-runner-script/scripts/script.py"]
shell:
command: ["bash", "/etc/dd-action-runner-script/scripts/script.sh"]
Dans votre workflow ou application, configurez l’action pour utiliser le nom de script que vous avez défini (par exemple, echo ou echo-parametrized). Pour les exécuteurs Linux, utilisez runPredefinedScript. Pour les exécuteurs Windows, utilisez runPredefinedPowershellScript.
Il existe deux niveaux de résolution de variable : un au niveau du workflow et un au niveau de l’action
à l’intérieur de l’exécuteur.
Pour aller plus loin
Documentation, liens et articles supplémentaires utiles: