Skip to content

Commit 0c85a33

Browse files
RothAndrewjeff-mccoy
authored andcommitted
Add authentication to utility registry (#144)
Signed-off-by: Jeff McCoy <[email protected]>
1 parent e70d05f commit 0c85a33

30 files changed

+345
-96
lines changed

assets/manifests/registry/registry.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ spec:
3838
image:
3939
repository: registry1.dso.mil/ironbank/opensource/docker/registry-v2
4040
pullPolicy: Never
41+
secrets:
42+
htpasswd: ###ZARF_HTPASSWD###
4143
resources:
4244
requests:
4345
cpu: "100m"

assets/misc/registries.yaml

+6
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@ mirrors:
1111
registry-1.docker.io:
1212
endpoint:
1313
- "https://127.0.0.1"
14+
ghcr.io:
15+
endpoint:
16+
- "https://127.0.0.1"
17+
registry.opensource.zalan.do:
18+
endpoint:
19+
- "https://127.0.0.1"

cli/internal/k3s/install.go

+7
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ func Install(options InstallOptions) {
3737

3838
gitSecret := git.GetOrCreateZarfSecret()
3939

40+
// Now that we have what the password will be, we should add the login entry to the system's registry config
41+
err := utils.Login(config.ZarfLocalIP, config.ZarfGitUser, gitSecret)
42+
if err != nil {
43+
logrus.Debug(err)
44+
logrus.Fatal("Unable to add login credentials for the utility registry")
45+
}
46+
4047
logrus.Info("Installation complete. You can run \"/usr/local/bin/k9s\" to monitor the status of the deployment.")
4148
logrus.WithFields(logrus.Fields{
4249
"Gitea Username (if installed)": config.ZarfGitUser,

cli/internal/packager/deploy.go

+10-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package packager
22

33
import (
44
"crypto/sha256"
5+
"encoding/base64"
56
"encoding/hex"
7+
"fmt"
68
"io"
79
"net/http"
810
"net/url"
@@ -168,10 +170,17 @@ func deployComponents(tempPath componentPaths, assets config.ZarfComponent) {
168170
// Get a list of all the k3s manifest files
169171
manifests := utils.RecursiveFileList(tempPath.manifests)
170172

171-
// Iterate through all the manifests and replace any ZARF_SECRET values
173+
// Iterate through all the manifests and replace any ZARF_SECRET, ZARF_HTPASSWD, or ZARF_DOCKERAUTH values
172174
for _, manifest := range manifests {
173175
logrus.WithField("path", manifest).Info("Processing manifest file")
174176
utils.ReplaceText(manifest, "###ZARF_SECRET###", gitSecret)
177+
htpasswd, err := utils.GetHtpasswdString(config.ZarfGitUser, gitSecret)
178+
if err != nil {
179+
logrus.Debug(err)
180+
logrus.Fatal("Unable to define `htpasswd` string for the Zarf user")
181+
}
182+
utils.ReplaceText(manifest, "###ZARF_HTPASSWD###", htpasswd)
183+
utils.ReplaceText(manifest, "###ZARF_DOCKERAUTH###", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", config.ZarfGitUser, gitSecret))))
175184
}
176185

177186
utils.CreatePathAndCopy(tempPath.manifests, config.K3sManifestPath)

cli/internal/utils/auth.go

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package utils
2+
3+
import (
4+
"github.com/docker/cli/cli/config"
5+
"github.com/docker/cli/cli/config/types"
6+
"github.com/google/go-containerregistry/pkg/authn"
7+
"github.com/google/go-containerregistry/pkg/name"
8+
"log"
9+
"os"
10+
)
11+
// Login adds the given creds to the user's Docker config, usually located at $HOME/.docker/config.yaml. It does not try
12+
// to connect to the given registry, it just simply adds another entry to the config file.
13+
// This function was mostly adapted from https://github.com/google/go-containerregistry/blob/5c9c442d5d68cd96787559ebf6e984c7eb084913/cmd/crane/cmd/auth.go
14+
func Login(serverAddress string, user string, password string) error {
15+
cf, err := config.Load(os.Getenv("DOCKER_CONFIG"))
16+
if err != nil {
17+
return err
18+
}
19+
creds := cf.GetCredentialsStore(serverAddress)
20+
if serverAddress == name.DefaultRegistry {
21+
serverAddress = authn.DefaultAuthKey
22+
}
23+
if err := creds.Store(types.AuthConfig{
24+
ServerAddress: serverAddress,
25+
Username: user,
26+
Password: password,
27+
}); err != nil {
28+
return err
29+
}
30+
31+
if err := cf.Save(); err != nil {
32+
return err
33+
}
34+
log.Printf("logged in via %s", cf.Filename)
35+
return nil
36+
}

cli/internal/utils/htpasswd.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package utils
2+
3+
import (
4+
"fmt"
5+
"golang.org/x/crypto/bcrypt"
6+
)
7+
8+
// GetHtpasswdString converts a username and password to a properly formatted and hashed format for `htpasswd`
9+
func GetHtpasswdString(username string, password string) (string, error) {
10+
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
11+
if err != nil {
12+
return "", err
13+
}
14+
return fmt.Sprintf("%s:%s", username, hash), nil
15+
}

examples/Makefile

+5-5
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,12 @@ vm-destroy: ## Cleanup plz
5454
@vagrant destroy -f
5555

5656
.PHONY: package-examples
57-
package-examples: package-example-big-bang package-example-appliance package-example-data-injection package-example-game package-example-single-big-bang-package package-example-tiny-kafka package-example-postgres-operator ## Create zarf packages from all examples
57+
package-examples: package-example-big-bang package-example-data-injection package-example-game package-example-gitops-data package-example-single-big-bang-package package-example-tiny-kafka package-example-postgres-operator ## Create zarf packages from all examples
5858

5959
.PHONY: package-example-big-bang
6060
package-example-big-bang: ## Create the Big Bang Core example
6161
cd big-bang && kustomize build template/bigbang > manifests/bigbang_generated.yaml && kustomize build template/flux > manifests/flux_generated.yaml && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/
6262

63-
.PHONY: package-example-appliance
64-
package-example-appliance: ## Create the Podinfo example
65-
cd appliance && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/
66-
6763
.PHONY: package-example-data-injection
6864
package-example-data-injection: ## Create the Data Injection example
6965
cd data-injection && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/
@@ -72,6 +68,10 @@ package-example-data-injection: ## Create the Data Injection example
7268
package-example-game: ## Create the Doom example
7369
cd game && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/
7470

71+
.PHONY: package-example-gitops-data
72+
package-example-gitops-data: ## Create the gitops-data example
73+
cd gitops-data && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/
74+
7575
.PHONY: package-example-single-big-bang-package
7676
package-example-single-big-bang-package: ## Create the Single Big Bang Package example
7777
cd single-big-bang-package && $(ZARF_BIN) package create --confirm && mv zarf-package-* ../sync/

examples/Vagrantfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ Vagrant.configure("2") do |config|
3030
sysctl -w vm.max_map_count=262144
3131
3232
# Airgap images please
33-
echo "0.0.0.0 registry.hub.docker.com hub.docker.com charts.helm.sh repo1.dso.mil github.com registry.dso.mil registry1.dso.mil docker.io index.docker.io auth.docker.io registry-1.docker.io dseasb33srnrn.cloudfront.net production.cloudflare.docker.com" >> /etc/hosts
33+
echo "0.0.0.0 registry.opensource.zalan.do ghcr.io registry.hub.docker.com hub.docker.com charts.helm.sh repo1.dso.mil github.com registry.dso.mil registry1.dso.mil docker.io index.docker.io auth.docker.io registry-1.docker.io dseasb33srnrn.cloudfront.net production.cloudflare.docker.com" >> /etc/hosts
3434
SHELL
3535
end

examples/appliance/README.md

-7
This file was deleted.

examples/appliance/manifests/podinfo.yaml

-26
This file was deleted.

examples/appliance/zarf.yaml

-17
This file was deleted.

examples/big-bang/manifests/other_manifests.yaml

+28
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,31 @@ metadata:
77
stringData:
88
username: "zarf-git-user"
99
password: "###ZARF_SECRET###"
10+
---
11+
apiVersion: v1
12+
kind: Secret
13+
type: kubernetes.io/dockerconfigjson
14+
metadata:
15+
name: private-registry
16+
namespace: flux-system
17+
stringData:
18+
.dockerconfigjson: |
19+
{
20+
"auths": {
21+
"registry.dso.mil": {
22+
"auth":"###ZARF_DOCKERAUTH###"
23+
},
24+
"registry1.dso.mil": {
25+
"auth":"###ZARF_DOCKERAUTH###"
26+
},
27+
"docker.io": {
28+
"auth":"###ZARF_DOCKERAUTH###"
29+
},
30+
"registry-1.docker.io": {
31+
"auth":"###ZARF_DOCKERAUTH###"
32+
},
33+
"ghcr.io": {
34+
"auth":"###ZARF_DOCKERAUTH###"
35+
}
36+
}
37+
}

examples/big-bang/template/bigbang/values.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
domain: bigbang.dev
22

3+
registryCredentials:
4+
registry: "registry1.dso.mil"
5+
username: "zarf-git-user"
6+
password: "###ZARF_SECRET###"
7+
38
git:
49
existingSecret: "zarf-git-secret"
510

examples/data-injection/manifests/data-injection.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@ spec:
1616
- name: data-injection
1717
image: registry1.dso.mil/ironbank/redhat/ubi/ubi8:8.4
1818
command: ["/bin/sh", "-ec", "mkdir -p /test && while :; do ls -lah /test; sleep 5 ; done"]
19+
imagePullSecrets:
20+
- name: private-registry
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
apiVersion: v1
2+
kind: Secret
3+
type: kubernetes.io/dockerconfigjson
4+
metadata:
5+
name: private-registry
6+
namespace: demo
7+
stringData:
8+
.dockerconfigjson: |
9+
{
10+
"auths": {
11+
"registry.dso.mil": {
12+
"auth":"###ZARF_DOCKERAUTH###"
13+
},
14+
"registry1.dso.mil": {
15+
"auth":"###ZARF_DOCKERAUTH###"
16+
},
17+
"docker.io": {
18+
"auth":"###ZARF_DOCKERAUTH###"
19+
},
20+
"registry-1.docker.io": {
21+
"auth":"###ZARF_DOCKERAUTH###"
22+
},
23+
"ghcr.io": {
24+
"auth":"###ZARF_DOCKERAUTH###"
25+
}
26+
}
27+
}

examples/game/manifests/game.yaml

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ apiVersion: networking.k8s.io/v1
22
kind: Ingress
33
metadata:
44
name: demo-ingress
5+
namespace: default
56
annotations:
67
kubernetes.io/ingress.class: "traefik"
78
traefik.ingress.kubernetes.io/router.middlewares: kube-system-ssl-redirect@kubernetescrd
@@ -21,6 +22,7 @@ apiVersion: apps/v1
2122
kind: Deployment
2223
metadata:
2324
name: game
25+
namespace: default
2426
spec:
2527
selector:
2628
matchLabels:
@@ -37,11 +39,14 @@ spec:
3739
- name: http
3840
containerPort: 8000
3941
protocol: TCP
42+
imagePullSecrets:
43+
- name: private-registry
4044
---
4145
apiVersion: v1
4246
kind: Service
4347
metadata:
4448
name: game
49+
namespace: default
4550
spec:
4651
type: ClusterIP
4752
selector:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
apiVersion: v1
2+
kind: Secret
3+
type: kubernetes.io/dockerconfigjson
4+
metadata:
5+
name: private-registry
6+
namespace: default
7+
stringData:
8+
.dockerconfigjson: |
9+
{
10+
"auths": {
11+
"registry.dso.mil": {
12+
"auth":"###ZARF_DOCKERAUTH###"
13+
},
14+
"registry1.dso.mil": {
15+
"auth":"###ZARF_DOCKERAUTH###"
16+
},
17+
"docker.io": {
18+
"auth":"###ZARF_DOCKERAUTH###"
19+
},
20+
"registry-1.docker.io": {
21+
"auth":"###ZARF_DOCKERAUTH###"
22+
},
23+
"ghcr.io": {
24+
"auth":"###ZARF_DOCKERAUTH###"
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)