> ## Documentation Index
> Fetch the complete documentation index at: https://biznetgio.creations.ren/llms.txt
> Use this file to discover all available pages before exploring further.

# Manage secret dengan cara yang bener

> Jauhin API token dan credential dari git dan amanin di CI

Halaman [Authentication](/id/authentication) udah cover apa yang provider ini lakuin buat lu: `api_key`/`apiToken` ditandain sensitive, dan tiap output `raw` di-redact. Tutorial ini soal layer di atas itu, jauhin token itu sendiri dari git dan masukin dia dengan aman ke CI, soalnya layer itu tanggung jawab lu sepenuhnya.

## Aturan satu: jangan pernah commit token beneran

* Export sebagai environment variable (`BIZNETGIO_API_KEY`) daripada nulis ke file yang di-commit.
* Jangan pernah pass pake `-var` di CLI Terraform; argument command-line ujung-ujungnya masuk shell history lu.
* Gitignore file `tfvars` apapun yang pernah nyimpen value beneran, sesuai tutorial [project structure](/id/tutorials/project-structure).

## Terraform Cloud variable

Kalau lu ngikutin jalur yang direkomendasiin di tutorial [state and collaboration](/id/tutorials/state-and-collaboration), set token-nya sebagai workspace variable: category "environment variable", key `BIZNETGIO_API_KEY`, terus centang checkbox sensitive-nya. Dia keinject ke tiap run plan dan apply dan gak pernah nongol di log.

## Pulumi config dan ESC

`pulumi config set --secret` encrypt value-nya dulu sebelum nulis ke `Pulumi.<stack>.yaml`:

```bash theme={null}
pulumi config set --secret biznetgio:apiToken <your-token>
```

Defaultnya value-nya diencrypt pake key yang dikelola Pulumi Cloud; siapapun yang punya akses ke stack itu di organization Pulumi Cloud lu bisa decrypt lewat CLI. Kalau lu self-hosting state pake passphrase (liat tutorial sebelumnya), lu yang distribusiin passphrase itu sendiri, dan kalau hilang, lu kehilangan kemampuan buat baca secret-nya balik, walaupun stack-nya tetep bisa diupdate tanpa itu.

Buat satu token yang dishare di banyak stack atau project, **Pulumi ESC** (Environments, Secrets, and Configuration) centralize itu:

```bash theme={null}
esc env set biznetgio/production biznetgio:apiToken <your-token> --secret
```

Terus reference dari `Pulumi.yaml` daripada ngulang `config set` di tiap stack:

```yaml theme={null}
environment:
  - biznetgio/production
```

## GitHub Actions secret

Simpen token-nya sebagai repository secret, atau lebih bagus lagi, sebagai **environment secret** yang discope ke environment tertentu (contohnya `production`) dengan required reviewers dinyalain. Itu yang ngejaga job apply/up-nya [tutorial CI/CD](/id/tutorials/cicd) di belakang approval manusia, soalnya secret-nya sendiri baru available begitu protection rules environment-nya lolos.

```yaml theme={null}
env:
  BIZNETGIO_API_KEY: ${{ secrets.BIZNETGIO_API_KEY }}
```

## Rotate token yang kebocor

1. Generate yang baru di [portal](https://portal.biznetgio.com) (liat [Authentication](/id/authentication)); yang lama langsung berhenti kerja.
2. Update tiap tempat yang nyimpen value lama: CI secret, environment Pulumi ESC, variable Terraform Cloud.
3. Jalanin ulang plan/preview buat konfirmasi token barunya bisa authenticate sebelum merge apapun.

## Gak ada token yang scoped

Warning di halaman [Authentication](/id/authentication) berlaku langsung di sini: API token ngasih kontrol penuh ke account, dan gak ada variant read-only atau scoped. Artinya ngasih pipeline CI akses ke situ setara sama ngasih pipeline itu akses penuh ke account. Jaga siapa yang bisa trigger pipeline yang punya akses itu (branch protection, required reviewers di environment production) sama ketatnya kayak lu jaga siapa yang punya token itu sendiri.

## Langkah berikutnya

* [CI/CD with GitHub Actions](/id/tutorials/cicd) - pake token ini buat kerja di pipeline beneran
