# OVHcloud

> Verbind OVHcloud met Tidal Control via een OAuth2 service account met de client credentials flow, zodat tests je beveiligingsinstellingen kunnen uitlezen.

Source: https://tidalcontrol.com/nl/docs/integrations/ovhcloud

Tidal Control's OVHcloud integratie monitort de beveiligingsconfiguratie van je account voor compliance doeleinden. De integratie gebruikt een **OAuth2 service account** (client credentials flow) om te authenticeren tegen de OVHcloud v1- en v2-API's.

## Wat deze integratie monitort

- **IAM users (sub-users):** Inventaris van account-identiteiten
- **IAM groups:** Groepslidmaatschap
- **IAM policies:** Configuratie van toegangsbeleid
- **Legacy API applications en credentials:** Oudere API-toegang
- **OAuth2 service accounts:** Inventaris van service-accounts
- **Public Cloud projects:** Projectinventaris
- **Cloud project users:** Gebruikers per project
- **SSH keys:** Inventaris van cloud SSH-credentials
- **Cloud instances:** Compute-inventaris
- **Managed databases:** Databaseservices
- **KMS resources:** Inventaris van de Key Management Service

## Vereisten

- Super User rol in Tidal Control
- OVHcloud account met toegang tot de API-console en IAM
- Het EU-endpoint (`https://api.eu.ovhcloud.com`), momenteel de enige ondersteunde regio

> **info:**

**Security groups zijn niet inbegrepen.** OVHcloud security groups zijn alleen beschikbaar via de OpenStack API, niet via de OVHcloud REST API, dus de connector monitort ze niet.

## Configuratie stappenplan

We maken een **OAuth2 service account** aan, kopiëren de **identity URN**, maken een **IAM-policy** met read-only toegang, en voegen daarna de verbinding toe in Tidal Control.

**Configuratie stappen:**

1. **OAuth2 client (service account) aanmaken**
2. **De identity URN van het service account kopiëren**
3. **Een IAM-policy aanmaken**
4. **Integratie configureren in Tidal Control**

## Stap 1: OAuth2 client (service account) aanmaken

Voer in de [OVHcloud Manager API-console](https://manager.eu.ovhcloud.com/beta/#/api) uit:

```
POST /me/api/oauth2/client
{
  "callbackUrls": [],
  "flow": "CLIENT_CREDENTIALS",
  "name": "tidal-control",
  "description": "Tidal Control security compliance connector"
}
```

Sla de teruggegeven `clientId` en `clientSecret` op.

Alternatief: ga naar **Account & Billing → My Account → My identities → Service accounts → Create**.

> **warning:**

**Sla de client secret direct op.** De `clientSecret` wordt slechts één keer getoond. Als je deze kwijtraakt, maak dan een nieuwe OAuth2 client aan.

## Stap 2: De identity URN van het service account kopiëren

Roep na het aanmaken van de client aan:

```
GET /me/api/oauth2/client/{clientId}
```

Kopieer het `identity`-veld. Dit ziet eruit als:

```
urn:v1:eu:identity:credentialOAuth2:{nicHandle}/EU.xxxxxxxxxxxxxxxx
```

Je **nicHandle** staat in het menu rechtsboven in de OVHcloud Manager (bijv. `hw53544-ovh`).

## Stap 3: Een IAM-policy aanmaken

Maak een read-only IAM-policy voor het service account. Dit kan via **IAM → Policies → Create a policy** in de Manager, of via de API.

> **warning:**

**Gebruik expliciete resource-URN's, geen wildcard.** Het gebruik van `urn:v1:eu:resource:*:*` faalt met een fout zoals *"a policy can't target subusers of another account"*, omdat de wildcard uitbreidt naar resources van elk account dat aan het hoofdaccount is gekoppeld. Som elke resource in plaats daarvan expliciet op.

**Resources.** Voeg één regel toe per resourcetype dat je hebt:

<table>
<thead>
<tr><th>Resourcetype</th><th>URN-formaat</th></tr>
</thead>
<tbody>
<tr><td>Account (voor <code>me/&#42;</code> en <code>iam/&#42;</code> endpoints)</td><td><code>urn:v1:eu:resource:account:&#123;nicHandle&#125;</code></td></tr>
<tr><td>Cloud project (één per project)</td><td><code>urn:v1:eu:resource:publicCloudProject:&#123;projectId&#125;</code></td></tr>
<tr><td>KMS (één per resource)</td><td><code>urn:v1:eu:resource:okms:&#123;kmsId&#125;</code></td></tr>
</tbody>
</table>

**Toegestane acties.** Geef precies deze leesacties. Let op: cloud-project-acties gebruiken het `publicCloudProject:apiovh:`-prefix, niet `account:apiovh:cloud/project/`:

<table>
<thead>
<tr><th>Doel</th><th>Actie</th></tr>
</thead>
<tbody>
<tr><td>IAM sub-users</td><td><code>account:apiovh:me/identity/user/get</code></td></tr>
<tr><td>IAM groups</td><td><code>account:apiovh:me/identity/group/get</code></td></tr>
<tr><td>Legacy API applications</td><td><code>account:apiovh:me/api/application/get</code></td></tr>
<tr><td>Legacy API credentials</td><td><code>account:apiovh:me/api/credential/get</code></td></tr>
<tr><td>Service accounts (OAuth2 clients)</td><td><code>account:apiovh:me/api/oauth2/client/get</code></td></tr>
<tr><td>IAM policies</td><td><code>account:apiovh:iam/policy/get</code></td></tr>
<tr><td>Public Cloud projects</td><td><code>publicCloudProject:apiovh:get</code></td></tr>
<tr><td>Cloud project users</td><td><code>publicCloudProject:apiovh:user/get</code></td></tr>
<tr><td>SSH keys</td><td><code>publicCloudProject:apiovh:sshkey/get</code></td></tr>
<tr><td>Cloud instances</td><td><code>publicCloudProject:apiovh:instance/get</code></td></tr>
<tr><td>Managed databases</td><td><code>publicCloudProject:apiovh:database/service/get</code></td></tr>
<tr><td>KMS resources</td><td><code>okms:apiovh:resource/get</code></td></tr>
</tbody>
</table>

De policy aanmaken via de API:

```bash
# Haal eerst een token op
TOKEN=$(curl -s -X POST https://www.ovh.com/auth/oauth2/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d "grant_type=client_credentials&scope=all" | jq -r '.access_token')

# Maak de IAM-policy aan
curl -s -X POST https://api.eu.ovhcloud.com/v2/iam/policy \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "tidal-control",
    "description": "Tidal Control read-only access",
    "identities": ["urn:v1:eu:identity:credentialOAuth2:{nicHandle}/EU.xxxxxxxxxxxxxxxx"],
    "resources": [
      "urn:v1:eu:resource:account:{nicHandle}",
      "urn:v1:eu:resource:publicCloudProject:{projectId}",
      "urn:v1:eu:resource:okms:{kmsId}"
    ],
    "permissions": {
      "allow": [
        {"action": "account:apiovh:me/identity/user/get"},
        {"action": "account:apiovh:me/identity/group/get"},
        {"action": "account:apiovh:me/api/application/get"},
        {"action": "account:apiovh:me/api/credential/get"},
        {"action": "account:apiovh:me/api/oauth2/client/get"},
        {"action": "account:apiovh:iam/policy/get"},
        {"action": "publicCloudProject:apiovh:get"},
        {"action": "publicCloudProject:apiovh:user/get"},
        {"action": "publicCloudProject:apiovh:sshkey/get"},
        {"action": "publicCloudProject:apiovh:instance/get"},
        {"action": "publicCloudProject:apiovh:database/service/get"},
        {"action": "okms:apiovh:resource/get"}
      ]
    }
  }'
```

Vervang `{nicHandle}`, `{projectId}`, `{kmsId}` en de identity URN door je eigen waarden. Voeg één `resources`-regel toe per cloud project en per KMS-resource.

## Stap 4: Integratie configureren in Tidal Control

- Ga naar **Instellingen → Integraties** in Tidal Control
- Klik op het **plus-icoon** naast **OVHcloud**
- Vul de configuratie in:
  - **Name:** Een beschrijvende naam, bijv. `OVHcloud`
  - **Client ID:** De `clientId` uit stap 1 (bijv. `EU.xxxxxxxxxxxxxxxx`)
  - **Client Secret:** De `clientSecret` uit stap 1
- Klik op **"Maken"** om de integratie op te slaan

## Configuratievelden uitgelegd

Het integratievenster vraagt om de volgende waarden:

**Name:**
- Een beschrijvende naam voor deze verbinding
- Bijvoorbeeld: `OVHcloud`, `OVHcloud Productie`

**Client ID:**
- De `clientId` van het OAuth2 service account uit stap 1
- Bijvoorbeeld: `EU.xxxxxxxxxxxxxxxx`

**Client Secret:**
- De `clientSecret` van het OAuth2 service account
- Wordt slechts één keer getoond bij aanmaken. Houd deze veilig

> **info:**

**Hoe authenticatie werkt.** De connector vraagt een token op bij `https://www.ovh.com/auth/oauth2/token` met HTTP Basic auth (`Authorization: Basic base64(clientId:clientSecret)`) en `grant_type=client_credentials&scope=all`, en roept vervolgens de EU API-base `https://api.eu.ovhcloud.com` aan.

## Verificatie

De integratie werkt wanneer het volgende allemaal klopt:

- Instellingen → Integraties toont OVHcloud onder **Geconfigureerde integraties**
- OVHcloud tests zijn beschikbaar in de Tests sectie
- Test refresh levert resultaten zonder authenticatiefouten

## Aanvullende actienamen vinden

Als er in de toekomst meer OVHcloud-endpoints gedekt moeten worden, kan de volledige lijst met IAM-actienamen worden opgehaald via de IAM-reference-API:

```bash
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://api.eu.ovhcloud.com/v2/iam/reference/action?resourceType=publicCloudProject" \
  | jq '.[].action'
```

Gebruik `resourceType=account` voor `me/*`-endpoints en `resourceType=okms` voor KMS.

## Veelvoorkomende problemen

**`"invalid identity ... a policy can't target subusers of another account"`**
- Je gebruikte de wildcard-resource `urn:v1:eu:resource:*:*`
- Vervang deze door expliciete resource-URN's (zie stap 3)

**`"unknown action"`-fouten**
- Een cloud-project-actie gebruikte het verkeerde prefix
- Cloud-project-acties moeten `publicCloudProject:apiovh:` gebruiken (bijv. `publicCloudProject:apiovh:instance/get`), niet `account:apiovh:cloud/project/...`

**Authenticatie mislukt**
- Controleer of de Client ID en Client Secret correct zijn en of de OAuth2 client de `CLIENT_CREDENTIALS`-flow gebruikt
- Controleer of je het EU-account gebruikt (`https://api.eu.ovhcloud.com`)

**Tests tonen geen data voor bepaalde resourcetypen**
- Controleer of de IAM-policy de bijbehorende actie én een expliciete resource-URN voor die resource bevat

### Kom je er nog niet uit?

Stuur een e-mail naar support@tidalcontrol.com, en we nemen zo snel mogelijk contact met je op.

> **info:**

**Support info verzamelen:** Noteer welke browser je gebruikt, exacte foutmeldingen, en welke stappen je al geprobeerd hebt. Dit versnelt de oplossing aanzienlijk.
