Skip to content

Commit 87637d7

Browse files
authored
docs: refactor authentication to use CLI-based credentials (#789)
docs: refactor authentication to use CLI-based credentials Update cloud provider authentication to use standard credential chains: - GCE: Switch from GCE_KEY file to Application Default Credentials (ADC) supporting gcloud auth application-default login - Azure: Document DefaultAzureCredential with az login as recommended - AWS: Document full credential chain with aws configure as recommended Also updates minectl-sdk to v0.21.0 and fixes tablewriter v1.1.2 API changes. Signed-off-by: Engin Diri <engin.diri@ediri.de>
1 parent 363ed98 commit 87637d7

File tree

6 files changed

+283
-242
lines changed

6 files changed

+283
-242
lines changed

cmd/minectl/create.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,11 @@ func runCreate(cmd *cobra.Command, _ []string) error {
5050
return err
5151
}
5252
if !headless {
53-
table := tablewriter.NewWriter(os.Stdout)
54-
table.SetHeader([]string{"ID", "NAME", "REGION", "TAGS", "IP"})
55-
53+
table := tablewriter.NewTable(os.Stdout,
54+
tablewriter.WithHeader([]string{"ID", "NAME", "REGION", "TAGS", "IP"}),
55+
)
5656
table.Append([]string{res.ID, res.Name, res.Region, res.Tags, res.PublicIP})
5757

58-
table.SetBorder(false)
5958
fmt.Println("")
6059
table.Render()
6160

cmd/minectl/list.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,12 @@ func runList(cmd *cobra.Command, _ []string) error {
5454
if !headless {
5555
if len(servers) > 0 {
5656
fmt.Println("")
57-
table := tablewriter.NewWriter(os.Stdout)
58-
table.SetHeader([]string{"ID", "NAME", "REGION", "TAGS", "IP"})
59-
57+
table := tablewriter.NewTable(os.Stdout,
58+
tablewriter.WithHeader([]string{"ID", "NAME", "REGION", "TAGS", "IP"}),
59+
)
6060
for _, server := range servers {
6161
table.Append([]string{server.ID, server.Name, server.Region, server.Tags, server.PublicIP})
6262
}
63-
table.SetBorder(false)
6463
table.Render()
6564
} else {
6665
return errors.New("🤷 No server found")

docs/authentication.md

Lines changed: 64 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,32 @@ export SERVICENAME=<projectid>
5656

5757
### Google Compute Engine (GCE)
5858

59+
`minectl` uses Google Cloud's Application Default Credentials (ADC) for authentication. This supports multiple authentication methods:
60+
61+
#### Option 1: Sign in with gcloud CLI (Recommended)
62+
63+
```bash
64+
gcloud auth application-default login
65+
export GOOGLE_PROJECT=<your-project-id>
66+
export GOOGLE_SERVICE_ACCOUNT_EMAIL=<your-service-account>@<project>.iam.gserviceaccount.com
67+
```
68+
69+
#### Option 2: Service account JSON file
70+
5971
```bash
60-
export GCE_KEY=<pathto>/key.json
72+
export GOOGLE_APPLICATION_CREDENTIALS=<path-to>/service-account.json
73+
export GOOGLE_PROJECT=<your-project-id>
74+
export GOOGLE_SERVICE_ACCOUNT_EMAIL=<your-service-account>@<project>.iam.gserviceaccount.com
6175
```
6276

77+
#### Required Environment Variables
78+
79+
| Variable | Description |
80+
|----------|-------------|
81+
| `GOOGLE_PROJECT` | Your GCP project ID |
82+
| `GOOGLE_SERVICE_ACCOUNT_EMAIL` | Service account email (required for OS Login SSH access) |
83+
| `GOOGLE_APPLICATION_CREDENTIALS` | (Optional) Path to service account JSON file |
84+
6385
See [Getting Started - GCE edition](getting-started-gce.md) for details on how to create a GCP service account for `minectl`.
6486

6587
### Vultr
@@ -72,50 +94,55 @@ export VULTR_API_KEY=xxx
7294

7395
> Please select a Hypervisor Generation '2' VM Size. As `minectl` uses only Hypervisor Generation 2 Images.
7496
75-
You need to set the subscription ID via the `AZURE_SUBSCRIPTION_ID` environment variable.
97+
`minectl` uses Azure's DefaultAzureCredential for authentication, which supports multiple authentication methods automatically.
98+
99+
#### Required Environment Variable
76100

77101
```bash
78102
export AZURE_SUBSCRIPTION_ID=xxx
79103
```
80104

81-
#### Option 1: Define environment variables
105+
#### Option 1: Sign in with Azure CLI (Recommended)
82106

83-
##### Service principal with a secret
107+
```bash
108+
az login
109+
export AZURE_SUBSCRIPTION_ID=<your-subscription-id>
110+
```
111+
112+
#### Option 2: Service principal with a secret
84113

85114
```bash
115+
export AZURE_SUBSCRIPTION_ID="<subscription_id>"
86116
export AZURE_TENANT_ID="<active_directory_tenant_id>"
87117
export AZURE_CLIENT_ID="<service_principal_appid>"
88118
export AZURE_CLIENT_SECRET="<service_principal_password>"
89119
```
90120

91-
##### Service principal with certificate
121+
#### Option 3: Service principal with certificate
92122

93123
```bash
124+
export AZURE_SUBSCRIPTION_ID="<subscription_id>"
94125
export AZURE_TENANT_ID="<active_directory_tenant_id>"
95126
export AZURE_CLIENT_ID="<service_principal_appid>"
96127
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"
97128
```
98129

99-
##### Username and password
130+
#### Option 4: Username and password
100131

101132
```bash
133+
export AZURE_SUBSCRIPTION_ID="<subscription_id>"
102134
export AZURE_CLIENT_ID="<service_principal_appid>"
103135
export AZURE_USERNAME="<azure_username>"
104136
export AZURE_PASSWORD="<azure_user_password>"
105137
```
106138

107-
#### Option 2: Use a managed identity
139+
#### Option 5: Managed identity (when running on Azure)
108140

109141
```bash
142+
export AZURE_SUBSCRIPTION_ID="<subscription_id>"
110143
export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"
111144
```
112145

113-
#### Option 3: Sign in with Azure CLI
114-
115-
```bash
116-
az login
117-
```
118-
119146
See [Azure authentication with the Azure SDK for Go](https://docs.microsoft.com/en-us/azure/developer/go/azure-sdk-authentication) for details.
120147

121148
### Oracle Cloud Infrastructure
@@ -139,14 +166,19 @@ Please follow the instructions at https://docs.oracle.com/en-us/iaas/Content/API
139166

140167
### Amazon AWS
141168

142-
`minectl` looks for credentials in the following order:
169+
`minectl` uses the standard AWS credential chain, which supports multiple authentication methods automatically.
143170

144-
1. Environment variables
145-
2. Shared credentials file
171+
#### Option 1: Sign in with AWS CLI (Recommended)
172+
173+
```bash
174+
aws configure
175+
```
146176

147-
#### Credentials file
177+
This creates credentials in `~/.aws/credentials` and config in `~/.aws/config`.
148178

149-
The credentials file is most often located in `~/.aws/credentials` and contains:
179+
#### Option 2: Shared credentials file
180+
181+
The credentials file is located in `~/.aws/credentials`:
150182

151183
```bash
152184
cat ~/.aws/credentials
@@ -155,14 +187,27 @@ aws_access_key_id = xxxx
155187
aws_secret_access_key = zzzz
156188
```
157189

158-
#### Environment variables
190+
#### Option 3: Environment variables
159191

160192
```bash
161193
export AWS_ACCESS_KEY_ID=<aws_access_key_id>
162194
export AWS_SECRET_ACCESS_KEY=<aws_secret_access_key>
163195
export AWS_REGION=<aws_region>
164196
```
165197

198+
#### Option 4: IAM instance profile (when running on EC2)
199+
200+
When running on EC2, credentials are automatically retrieved from the instance metadata service.
201+
202+
#### Credential Chain Order
203+
204+
`minectl` looks for credentials in the following order:
205+
1. Environment variables
206+
2. Shared credentials file (`~/.aws/credentials`)
207+
3. Shared config file (`~/.aws/config`)
208+
4. IAM instance profile (EC2)
209+
5. Container credentials (ECS/Fargate)
210+
166211
### VEXXHOST
167212

168213
It is recommended to store OpenStack credentials as environment variables because it decouples credential information from source code.

go.mod

Lines changed: 63 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
module github.com/dirien/minectl
22

3-
go 1.24.0
3+
go 1.24.9
44

55
require (
66
github.com/AlecAivazis/survey/v2 v2.3.7
77
github.com/Tnze/go-mc v1.20.2
88
github.com/blang/semver/v4 v4.0.0
99
github.com/c-bata/go-prompt v0.2.6
10-
github.com/dirien/minectl-sdk v0.20.0
10+
github.com/dirien/minectl-sdk v0.21.0
1111
github.com/fatih/color v1.18.0
1212
github.com/mitchellh/go-homedir v1.1.0
1313
github.com/morikuni/aec v1.1.0
@@ -20,76 +20,76 @@ require (
2020
sigs.k8s.io/yaml v1.6.0
2121
)
2222

23-
//replace github.com/dirien/minectl-sdk => ../minectl-sdk/
23+
// replace github.com/dirien/minectl-sdk => ../minectl-sdk/
2424

2525
require (
26-
cloud.google.com/go/auth v0.14.1 // indirect
27-
cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect
28-
cloud.google.com/go/compute/metadata v0.6.0 // indirect
26+
cloud.google.com/go/auth v0.17.0 // indirect
27+
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
28+
cloud.google.com/go/compute/metadata v0.9.0 // indirect
2929
dario.cat/mergo v1.0.1 // indirect
30-
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
31-
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 // indirect
32-
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
33-
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v6 v6.3.0 // indirect
34-
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v6 v6.2.0 // indirect
35-
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.2.0 // indirect
36-
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect
30+
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0 // indirect
31+
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 // indirect
32+
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect
33+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v7 v7.2.0 // indirect
34+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v8 v8.0.0 // indirect
35+
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources/v3 v3.0.1 // indirect
36+
github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 // indirect
3737
github.com/Masterminds/goutils v1.1.1 // indirect
3838
github.com/Masterminds/semver/v3 v3.3.0 // indirect
3939
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
40-
github.com/aws/aws-sdk-go-v2 v1.36.1 // indirect
41-
github.com/aws/aws-sdk-go-v2/config v1.29.6 // indirect
42-
github.com/aws/aws-sdk-go-v2/credentials v1.17.59 // indirect
43-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 // indirect
44-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 // indirect
45-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 // indirect
46-
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
47-
github.com/aws/aws-sdk-go-v2/service/ec2 v1.203.0 // indirect
48-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
49-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 // indirect
50-
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 // indirect
51-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 // indirect
52-
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 // indirect
53-
github.com/aws/smithy-go v1.22.2 // indirect
40+
github.com/aws/aws-sdk-go-v2 v1.41.0 // indirect
41+
github.com/aws/aws-sdk-go-v2/config v1.32.6 // indirect
42+
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 // indirect
43+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect
44+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect
45+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect
46+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
47+
github.com/aws/aws-sdk-go-v2/service/ec2 v1.279.0 // indirect
48+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
49+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // indirect
50+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect
51+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
52+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
53+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
54+
github.com/aws/smithy-go v1.24.0 // indirect
5455
github.com/beorn7/perks v1.0.1 // indirect
5556
github.com/cespare/xxhash/v2 v2.3.0 // indirect
56-
github.com/civo/civogo v0.3.94 // indirect
57+
github.com/civo/civogo v0.6.5 // indirect
5758
github.com/clipperhouse/displaywidth v0.6.0 // indirect
5859
github.com/clipperhouse/stringish v0.1.1 // indirect
5960
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
6061
github.com/davecgh/go-spew v1.1.1 // indirect
6162
github.com/deepmap/oapi-codegen v1.9.1 // indirect
62-
github.com/digitalocean/godo v1.137.0 // indirect
63+
github.com/digitalocean/godo v1.171.0 // indirect
6364
github.com/dirien/ovh-go-sdk v0.2.0 // indirect
6465
github.com/exoscale/egoscale v0.101.1 // indirect
6566
github.com/felixge/httpsnoop v1.0.4 // indirect
66-
github.com/go-logr/logr v1.4.2 // indirect
67+
github.com/go-logr/logr v1.4.3 // indirect
6768
github.com/go-logr/stdr v1.2.2 // indirect
68-
github.com/go-resty/resty/v2 v2.16.3 // indirect
69-
github.com/gofrs/flock v0.8.1 // indirect
69+
github.com/go-resty/resty/v2 v2.17.1 // indirect
70+
github.com/gofrs/flock v0.10.0 // indirect
7071
github.com/gofrs/uuid v4.4.0+incompatible // indirect
7172
github.com/gogo/protobuf v1.3.2 // indirect
72-
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
73+
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
7374
github.com/google/go-github v17.0.0+incompatible // indirect
7475
github.com/google/go-querystring v1.1.0 // indirect
7576
github.com/google/gofuzz v1.1.0 // indirect
7677
github.com/google/s2a-go v0.1.9 // indirect
7778
github.com/google/uuid v1.6.0 // indirect
78-
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
79-
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
80-
github.com/gophercloud/gophercloud/v2 v2.5.0 // indirect
79+
github.com/googleapis/enterprise-certificate-proxy v0.3.7 // indirect
80+
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
81+
github.com/gophercloud/gophercloud/v2 v2.9.0 // indirect
8182
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
82-
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
83+
github.com/hashicorp/go-retryablehttp v0.7.8 // indirect
8384
github.com/hashicorp/go-version v1.3.0 // indirect
84-
github.com/hetznercloud/hcloud-go/v2 v2.19.1 // indirect
85+
github.com/hetznercloud/hcloud-go/v2 v2.33.0 // indirect
8586
github.com/huandu/xstrings v1.5.0 // indirect
8687
github.com/inconshreveable/mousetrap v1.1.0 // indirect
8788
github.com/json-iterator/go v1.1.12 // indirect
8889
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
89-
github.com/klauspost/compress v1.17.9 // indirect
9090
github.com/kr/fs v0.1.0 // indirect
9191
github.com/kylelemons/godebug v1.1.0 // indirect
92-
github.com/linode/linodego v1.47.0 // indirect
92+
github.com/linode/linodego v1.63.0 // indirect
9393
github.com/mattn/go-colorable v0.1.13 // indirect
9494
github.com/mattn/go-isatty v0.0.20 // indirect
9595
github.com/mattn/go-runewidth v0.0.19 // indirect
@@ -104,46 +104,46 @@ require (
104104
github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 // indirect
105105
github.com/olekukonko/errors v1.1.0 // indirect
106106
github.com/olekukonko/ll v0.1.3 // indirect
107-
github.com/oracle/oci-go-sdk/v65 v65.83.1 // indirect
107+
github.com/oracle/oci-go-sdk/v65 v65.105.2 // indirect
108108
github.com/ovh/go-ovh v1.3.0 // indirect
109109
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
110110
github.com/pkg/sftp v1.13.5 // indirect
111111
github.com/pkg/term v1.2.0-beta.2 // indirect
112112
github.com/pmezard/go-difflib v1.0.0 // indirect
113-
github.com/prometheus/client_golang v1.20.5 // indirect
114-
github.com/prometheus/client_model v0.6.1 // indirect
115-
github.com/prometheus/common v0.55.0 // indirect
116-
github.com/prometheus/procfs v0.15.1 // indirect
117-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.32 // indirect
113+
github.com/prometheus/client_golang v1.23.2 // indirect
114+
github.com/prometheus/client_model v0.6.2 // indirect
115+
github.com/prometheus/common v0.66.1 // indirect
116+
github.com/prometheus/procfs v0.16.1 // indirect
117+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.36 // indirect
118118
github.com/sethvargo/go-password v0.3.1 // indirect
119119
github.com/shopspring/decimal v1.4.0 // indirect
120120
github.com/sony/gobreaker v0.5.0 // indirect
121121
github.com/spf13/cast v1.7.0 // indirect
122122
github.com/spf13/pflag v1.0.6 // indirect
123123
github.com/stretchr/objx v0.5.2 // indirect
124-
github.com/stretchr/testify v1.10.0 // indirect
125-
github.com/vultr/govultr/v3 v3.14.1 // indirect
124+
github.com/stretchr/testify v1.11.1 // indirect
125+
github.com/vultr/govultr/v3 v3.26.1 // indirect
126126
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
127127
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
128-
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
129-
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect
130-
go.opentelemetry.io/otel v1.34.0 // indirect
131-
go.opentelemetry.io/otel/metric v1.34.0 // indirect
132-
go.opentelemetry.io/otel/trace v1.34.0 // indirect
128+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
129+
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
130+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
131+
go.opentelemetry.io/otel v1.38.0 // indirect
132+
go.opentelemetry.io/otel/metric v1.38.0 // indirect
133+
go.opentelemetry.io/otel/trace v1.38.0 // indirect
133134
go.uber.org/multierr v1.10.0 // indirect
134135
go.yaml.in/yaml/v2 v2.4.2 // indirect
135-
golang.org/x/crypto v0.36.0 // indirect
136-
golang.org/x/mod v0.20.0 // indirect
137-
golang.org/x/net v0.38.0 // indirect
138-
golang.org/x/oauth2 v0.26.0 // indirect
139-
golang.org/x/sys v0.31.0 // indirect
140-
golang.org/x/term v0.30.0 // indirect
141-
golang.org/x/text v0.23.0 // indirect
142-
golang.org/x/time v0.10.0 // indirect
143-
google.golang.org/api v0.221.0 // indirect
136+
golang.org/x/crypto v0.46.0 // indirect
137+
golang.org/x/net v0.48.0 // indirect
138+
golang.org/x/oauth2 v0.34.0 // indirect
139+
golang.org/x/sys v0.39.0 // indirect
140+
golang.org/x/term v0.38.0 // indirect
141+
golang.org/x/text v0.32.0 // indirect
142+
golang.org/x/time v0.14.0 // indirect
143+
google.golang.org/api v0.258.0 // indirect
144144
google.golang.org/genproto/googleapis/api v0.0.0-20251222181119-0a764e51fe1b // indirect
145145
google.golang.org/genproto/googleapis/rpc v0.0.0-20251222181119-0a764e51fe1b // indirect
146-
google.golang.org/grpc v1.71.0 // indirect
146+
google.golang.org/grpc v1.77.0 // indirect
147147
google.golang.org/protobuf v1.36.11 // indirect
148148
gopkg.in/inf.v0 v0.9.1 // indirect
149149
gopkg.in/ini.v1 v1.66.6 // indirect

0 commit comments

Comments
 (0)