[BUG] Proxmox 9.1 upgrade: Terraform API user disabled #1

Closed
opened 2025-12-07 12:23:18 +00:00 by Damien · 2 comments
Owner

Problem Description

After upgrading to Proxmox VE 9.1, the Terraform API user has been disabled, preventing Terraform from authenticating with the Proxmox API.

Symptoms

  • Terraform plan or apply commands fail with authentication errors
  • API calls return 401 Unauthorized or 403 Permission check failed (user 'username@pve' is disabled)
  • The user appears disabled in the Proxmox web UI under Datacenter → Permissions → Users

Root Cause

During the Proxmox 9.1 upgrade, user accounts may have been disabled. This is controlled by the enable flag in /etc/pve/user.cfg.

The user configuration line format is:

user:<username>@<realm>:<enable>:<expire>:<firstname>:<lastname>:<email>:<comment>:<keys>

Where <enable> is 1 (enabled) or 0 (disabled).


Solution

SSH into the Proxmox host and run:

# Re-enable the terraform user
pveum user modify terraform@pve --enable 1

# Verify the user is enabled
pveum user list | grep terraform

Option 2: Via Direct Config Edit

If CLI doesn't work, edit the configuration directly:

# Edit the user configuration
nano /etc/pve/user.cfg

Find the line:

user:terraform@pve:0:0:::...

Change the first 0 to 1:

user:terraform@pve:1:0:::...

Then restart the relevant services:

systemctl restart pvedaemon pveproxy

Option 3: Via Web UI

  1. Navigate to Datacenter → Permissions → Users
  2. Select the terraform@pve user
  3. Click Edit
  4. Check the Enabled checkbox
  5. Click OK

Verification

Test the API token after re-enabling:

# Test with curl
curl -k -H "Authorization: PVEAPIToken=terraform@pve!terraform_token=YOUR_TOKEN_SECRET" \
  https://pve01.taila5ad8.ts.net:8006/api2/json/version

# Or test Terraform
cd terraform/prod
terraform plan

Prevention

Consider documenting the Proxmox user configuration in this repository. Add a file docs/proxmox-setup.md with:

Required User Configuration

# Create terraform user (if not exists)
pveum user add terraform@pve --comment "Terraform automation user"

# Create API token (save the secret!)
pveum user token add terraform@pve terraform_token --privsep 0

# Assign Administrator role
pveum acl modify / --user terraform@pve --role Administrator

# Verify configuration
pveum user list
pveum user token list terraform@pve

Required Permissions

The terraform@pve user needs at minimum:

  • Administrator role on / for full VM management
  • Or a custom role with these privileges:
    • Datastore.AllocateSpace
    • Datastore.Audit
    • VM.Allocate
    • VM.Audit
    • VM.Clone
    • VM.Config.*
    • VM.Console
    • VM.Monitor
    • VM.PowerMgmt
    • Sys.Audit
    • Sys.Modify (for cloud-init snippets)


Labels: bug, proxmox, documentation

## Problem Description After upgrading to Proxmox VE 9.1, the Terraform API user has been disabled, preventing Terraform from authenticating with the Proxmox API. ### Symptoms - Terraform `plan` or `apply` commands fail with authentication errors - API calls return `401 Unauthorized` or `403 Permission check failed (user 'username@pve' is disabled)` - The user appears disabled in the Proxmox web UI under **Datacenter → Permissions → Users** ### Root Cause During the Proxmox 9.1 upgrade, user accounts may have been disabled. This is controlled by the `enable` flag in `/etc/pve/user.cfg`. The user configuration line format is: ``` user:<username>@<realm>:<enable>:<expire>:<firstname>:<lastname>:<email>:<comment>:<keys> ``` Where `<enable>` is `1` (enabled) or `0` (disabled). --- ## Solution ### Option 1: Via CLI (Recommended) SSH into the Proxmox host and run: ```bash # Re-enable the terraform user pveum user modify terraform@pve --enable 1 # Verify the user is enabled pveum user list | grep terraform ``` ### Option 2: Via Direct Config Edit If CLI doesn't work, edit the configuration directly: ```bash # Edit the user configuration nano /etc/pve/user.cfg ``` Find the line: ``` user:terraform@pve:0:0:::... ``` Change the first `0` to `1`: ``` user:terraform@pve:1:0:::... ``` Then restart the relevant services: ```bash systemctl restart pvedaemon pveproxy ``` ### Option 3: Via Web UI 1. Navigate to **Datacenter → Permissions → Users** 2. Select the `terraform@pve` user 3. Click **Edit** 4. Check the **Enabled** checkbox 5. Click **OK** --- ## Verification Test the API token after re-enabling: ```bash # Test with curl curl -k -H "Authorization: PVEAPIToken=terraform@pve!terraform_token=YOUR_TOKEN_SECRET" \ https://pve01.taila5ad8.ts.net:8006/api2/json/version # Or test Terraform cd terraform/prod terraform plan ``` --- ## Prevention Consider documenting the Proxmox user configuration in this repository. Add a file `docs/proxmox-setup.md` with: ### Required User Configuration ```bash # Create terraform user (if not exists) pveum user add terraform@pve --comment "Terraform automation user" # Create API token (save the secret!) pveum user token add terraform@pve terraform_token --privsep 0 # Assign Administrator role pveum acl modify / --user terraform@pve --role Administrator # Verify configuration pveum user list pveum user token list terraform@pve ``` ### Required Permissions The `terraform@pve` user needs at minimum: - `Administrator` role on `/` for full VM management - Or a custom role with these privileges: - `Datastore.AllocateSpace` - `Datastore.Audit` - `VM.Allocate` - `VM.Audit` - `VM.Clone` - `VM.Config.*` - `VM.Console` - `VM.Monitor` - `VM.PowerMgmt` - `Sys.Audit` - `Sys.Modify` (for cloud-init snippets) --- ## Related - Proxmox User Management: https://pve.proxmox.com/wiki/User_Management - Proxmox API Tokens: https://pve.proxmox.com/wiki/Proxmox_VE_API#API_Tokens - bpg/proxmox Terraform Provider: https://registry.terraform.io/providers/bpg/proxmox/latest/docs --- **Labels:** `bug`, `proxmox`, `documentation`
Author
Owner

Procédure complète via l'interface Web Proxmox 9.1

Étape 1 : Créer le rôle Terraform

  1. Aller dans Datacenter → Permissions → Roles
  2. Cliquer sur Create
  3. Nom du rôle : TerraformRole
  4. Cocher les privilèges suivants :

Datastore :

  • ☑️ Datastore.Allocate
  • ☑️ Datastore.AllocateSpace
  • ☑️ Datastore.AllocateTemplate
  • ☑️ Datastore.Audit

System :

  • ☑️ Sys.Audit
  • ☑️ Sys.Console
  • ☑️ Sys.Modify

VM :

  • ☑️ VM.Allocate
  • ☑️ VM.Audit
  • ☑️ VM.Clone
  • ☑️ VM.Config.CDROM
  • ☑️ VM.Config.Cloudinit
  • ☑️ VM.Config.CPU
  • ☑️ VM.Config.Disk
  • ☑️ VM.Config.HWType
  • ☑️ VM.Config.Memory
  • ☑️ VM.Config.Network
  • ☑️ VM.Config.Options
  • ☑️ VM.Console
  • ☑️ VM.Migrate
  • ☑️ VM.PowerMgmt
  • ☑️ VM.Snapshot
  • ☑️ VM.Snapshot.Rollback

Pool & SDN :

  • ☑️ Pool.Allocate
  • ☑️ Pool.Audit
  • ☑️ SDN.Use

⚠️ Note Proxmox 9.1 : Le privilège VM.Monitor a été déprécié dans Proxmox 9 et n'est plus nécessaire. Ne pas l'inclure.

  1. Cliquer sur Create

Étape 2 : Créer l'utilisateur Terraform

  1. Aller dans Datacenter → Permissions → Users
  2. Cliquer sur Add
  3. Remplir les champs :
    • User name : terraform
    • Realm : Proxmox VE authentication server (pve)
    • Password : (définir un mot de passe fort, même si on utilisera un token)
    • Enabled : ☑️ Coché (important !)
    • Expire : never
    • Comment : Terraform automation user
  4. Cliquer sur Add

Étape 3 : Créer le Token API

  1. Aller dans Datacenter → Permissions → API Tokens
  2. Cliquer sur Add
  3. Remplir les champs :
    • User : terraform@pve
    • Token ID : terraform_token
    • Privilege Separation : ☐ Décoché (le token hérite des permissions de l'utilisateur)
    • Expire : never
  4. Cliquer sur Add
  5. ⚠️ IMPORTANT : Copier et sauvegarder le Token Secret affiché. Il ne sera plus visible après !

Le format du token sera : terraform@pve!terraform_token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx


Étape 4 : Assigner les permissions (ACL)

  1. Aller dans Datacenter → Permissions
  2. Cliquer sur Add → User Permission
  3. Remplir les champs :
    • Path : / (pour tout le datacenter)
    • User : terraform@pve
    • Role : TerraformRole
    • Propagate : ☑️ Coché
  4. Cliquer sur Add

Étape 5 : Configurer l'accès SSH (requis par bpg/proxmox)

Le provider bpg/proxmox utilise SSH pour certaines opérations (upload de fichiers cloud-init, etc.).

Sur le serveur Proxmox :

# Créer l'utilisateur système terraform
useradd -m -s /bin/bash terraform

# Configurer sudo sans mot de passe
echo 'terraform ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/terraform
chmod 440 /etc/sudoers.d/terraform

# Créer le répertoire SSH
mkdir -p /home/terraform/.ssh
chmod 700 /home/terraform/.ssh

# Ajouter votre clé publique SSH
echo "votre_clé_publique_ssh" >> /home/terraform/.ssh/authorized_keys
chmod 600 /home/terraform/.ssh/authorized_keys
chown -R terraform:terraform /home/terraform/.ssh

Étape 6 : Mettre à jour terraform.tfvars

# Configuration Proxmox
proxmox_url = "https://pve01.taila5ad8.ts.net:8006"

# Format: user@realm!tokenid=secret
proxmox_api_token = "terraform@pve!terraform_token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Étape 7 : Vérification

# Tester le token avec curl
curl -k -H "Authorization: PVEAPIToken=terraform@pve!terraform_token=YOUR_SECRET" \
  https://pve01.taila5ad8.ts.net:8006/api2/json/version

# Réponse attendue : {"data":{"version":"9.1-1","release":"9.1",...}}

# Tester Terraform
cd terraform/prod
terraform init
terraform plan

Résumé des privilèges pour Proxmox 9.1

Catégorie Privilèges
Datastore Allocate, AllocateSpace, AllocateTemplate, Audit
System Audit, Console, Modify
VM Allocate, Audit, Clone, Config.*, Console, Migrate, PowerMgmt, Snapshot, Snapshot.Rollback
Pool Allocate, Audit
SDN Use

📝 Référence : bpg/terraform-provider-proxmox documentation

## Procédure complète via l'interface Web Proxmox 9.1 ### Étape 1 : Créer le rôle Terraform 1. Aller dans **Datacenter → Permissions → Roles** 2. Cliquer sur **Create** 3. Nom du rôle : `TerraformRole` 4. Cocher les privilèges suivants : **Datastore :** - ☑️ `Datastore.Allocate` - ☑️ `Datastore.AllocateSpace` - ☑️ `Datastore.AllocateTemplate` - ☑️ `Datastore.Audit` **System :** - ☑️ `Sys.Audit` - ☑️ `Sys.Console` - ☑️ `Sys.Modify` **VM :** - ☑️ `VM.Allocate` - ☑️ `VM.Audit` - ☑️ `VM.Clone` - ☑️ `VM.Config.CDROM` - ☑️ `VM.Config.Cloudinit` - ☑️ `VM.Config.CPU` - ☑️ `VM.Config.Disk` - ☑️ `VM.Config.HWType` - ☑️ `VM.Config.Memory` - ☑️ `VM.Config.Network` - ☑️ `VM.Config.Options` - ☑️ `VM.Console` - ☑️ `VM.Migrate` - ☑️ `VM.PowerMgmt` - ☑️ `VM.Snapshot` - ☑️ `VM.Snapshot.Rollback` **Pool & SDN :** - ☑️ `Pool.Allocate` - ☑️ `Pool.Audit` - ☑️ `SDN.Use` > ⚠️ **Note Proxmox 9.1** : Le privilège `VM.Monitor` a été **déprécié** dans Proxmox 9 et n'est plus nécessaire. Ne pas l'inclure. 5. Cliquer sur **Create** --- ### Étape 2 : Créer l'utilisateur Terraform 1. Aller dans **Datacenter → Permissions → Users** 2. Cliquer sur **Add** 3. Remplir les champs : - **User name** : `terraform` - **Realm** : `Proxmox VE authentication server` (pve) - **Password** : (définir un mot de passe fort, même si on utilisera un token) - **Enabled** : ☑️ **Coché** (important !) - **Expire** : `never` - **Comment** : `Terraform automation user` 4. Cliquer sur **Add** --- ### Étape 3 : Créer le Token API 1. Aller dans **Datacenter → Permissions → API Tokens** 2. Cliquer sur **Add** 3. Remplir les champs : - **User** : `terraform@pve` - **Token ID** : `terraform_token` - **Privilege Separation** : ☐ **Décoché** (le token hérite des permissions de l'utilisateur) - **Expire** : `never` 4. Cliquer sur **Add** 5. ⚠️ **IMPORTANT** : Copier et sauvegarder le **Token Secret** affiché. Il ne sera plus visible après ! Le format du token sera : `terraform@pve!terraform_token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` --- ### Étape 4 : Assigner les permissions (ACL) 1. Aller dans **Datacenter → Permissions** 2. Cliquer sur **Add → User Permission** 3. Remplir les champs : - **Path** : `/` (pour tout le datacenter) - **User** : `terraform@pve` - **Role** : `TerraformRole` - **Propagate** : ☑️ **Coché** 4. Cliquer sur **Add** --- ### Étape 5 : Configurer l'accès SSH (requis par bpg/proxmox) Le provider `bpg/proxmox` utilise SSH pour certaines opérations (upload de fichiers cloud-init, etc.). **Sur le serveur Proxmox :** ```bash # Créer l'utilisateur système terraform useradd -m -s /bin/bash terraform # Configurer sudo sans mot de passe echo 'terraform ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/terraform chmod 440 /etc/sudoers.d/terraform # Créer le répertoire SSH mkdir -p /home/terraform/.ssh chmod 700 /home/terraform/.ssh # Ajouter votre clé publique SSH echo "votre_clé_publique_ssh" >> /home/terraform/.ssh/authorized_keys chmod 600 /home/terraform/.ssh/authorized_keys chown -R terraform:terraform /home/terraform/.ssh ``` --- ### Étape 6 : Mettre à jour terraform.tfvars ```hcl # Configuration Proxmox proxmox_url = "https://pve01.taila5ad8.ts.net:8006" # Format: user@realm!tokenid=secret proxmox_api_token = "terraform@pve!terraform_token=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" ``` --- ### Étape 7 : Vérification ```bash # Tester le token avec curl curl -k -H "Authorization: PVEAPIToken=terraform@pve!terraform_token=YOUR_SECRET" \ https://pve01.taila5ad8.ts.net:8006/api2/json/version # Réponse attendue : {"data":{"version":"9.1-1","release":"9.1",...}} # Tester Terraform cd terraform/prod terraform init terraform plan ``` --- ### Résumé des privilèges pour Proxmox 9.1 | Catégorie | Privilèges | |-----------|------------| | Datastore | `Allocate`, `AllocateSpace`, `AllocateTemplate`, `Audit` | | System | `Audit`, `Console`, `Modify` | | VM | `Allocate`, `Audit`, `Clone`, `Config.*`, `Console`, `Migrate`, `PowerMgmt`, `Snapshot`, `Snapshot.Rollback` | | Pool | `Allocate`, `Audit` | | SDN | `Use` | > 📝 **Référence** : [bpg/terraform-provider-proxmox documentation](https://github.com/bpg/terraform-provider-proxmox/blob/main/docs/index.md)
Author
Owner

📝 Documentation créée

Branch : feature/docs-proxmox-setup

Fichier : docs/proxmox-setup.md

La documentation inclut :

  • Rôle dédié TerraformRole (pas de rôle Administrator)
  • Liste des privilèges minimaux pour Proxmox 9.1
  • Procédure Web UI
  • Procédure CLI
  • Configuration SSH
  • Configuration Terraform

Prêt pour review et merge dans dev.

## 📝 Documentation créée Branch : [`feature/docs-proxmox-setup`](https://gitea.arnodo.fr/Damien/iac-homelab/src/branch/feature/docs-proxmox-setup) Fichier : [`docs/proxmox-setup.md`](https://gitea.arnodo.fr/Damien/iac-homelab/src/branch/feature/docs-proxmox-setup/docs/proxmox-setup.md) La documentation inclut : - ✅ Rôle dédié `TerraformRole` (pas de rôle Administrator) - ✅ Liste des privilèges minimaux pour Proxmox 9.1 - ✅ Procédure Web UI - ✅ Procédure CLI - ✅ Configuration SSH - ✅ Configuration Terraform Prêt pour review et merge dans `dev`.
Damien added reference feature/docs-proxmox-setup 2025-12-07 12:34:35 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Damien/iac-homelab#1