Skip to content

Commit 837fb39

Browse files
committed
apps wc: end user as service account
1 parent 5181926 commit 837fb39

File tree

15 files changed

+182
-40
lines changed

15 files changed

+182
-40
lines changed

WIP-CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
- Added basic alerts for Cluster-API
99
- Add support for self-managed CRDs (Beta)
1010
- Add support for sealedsecrets and mongodb
11+
- Add end-user service account kube-config for devs
12+
- Enabled developers to easily create a kube-config to act as an end-user
1113

1214
### Changed
1315

bin/ck8s

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ case "${1}" in
130130
sops_exec_file "${secrets[s3cfg_file]}" 's3cmd --config="{}" '"${*}"
131131
;;
132132
kubeconfig)
133-
[[ "${2}" =~ ^(user|admin)$ ]] || usage
133+
[[ "${2}" =~ ^(user|dev|admin)$ ]] || usage
134134
shift
135135
"${here}/kubeconfig.bash" "${@}"
136136
;;

bin/kubeconfig.bash

Lines changed: 91 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,102 @@ here="$(dirname "$(readlink -f "$0")")"
77
source "${here}/common.bash"
88

99
usage() {
10-
echo "Usage: kubeconfig <user|admin <wc|sc> [cluster_name]>" >&2
10+
echo "Usage: kubeconfig <user| dev <serviceaccount> |admin <wc|sc> [cluster_name]>" >&2
1111
exit 1
1212
}
1313

14+
get_user_server() {
15+
(
16+
with_kubeconfig "${kubeconfig}" \
17+
kubectl config view -o jsonpath="{.clusters[0].cluster.server}"
18+
)
19+
}
20+
21+
set_cluster() {
22+
23+
user_kubeconfig=$1
24+
25+
user_server=$(get_user_server)
26+
user_certificate_authority=/tmp/user-authority.pem
27+
append_trap "rm ${user_certificate_authority}" EXIT
28+
(
29+
with_kubeconfig "${kubeconfig}" \
30+
kubectl config view --raw \
31+
-o jsonpath="{.clusters[0].cluster.certificate-authority-data}" \
32+
| base64 --decode > ${user_certificate_authority}
33+
)
34+
35+
kubectl --kubeconfig="${user_kubeconfig}" config set-cluster "${cluster_name}" \
36+
--server="${user_server}" \
37+
--certificate-authority="${user_certificate_authority}" --embed-certs=true
38+
}
39+
40+
set_dex_credentials() {
41+
user_kubeconfig=$1
42+
name=$2
43+
cluster_name=$3
44+
45+
base_domain=$(yq4 '.global.baseDomain' "${cluster_config}")
46+
47+
kubectl --kubeconfig="${user_kubeconfig}" config set-credentials "${name}@${cluster_name}" \
48+
--exec-command=kubectl \
49+
--exec-api-version=client.authentication.k8s.io/v1beta1 \
50+
--exec-arg=oidc-login \
51+
--exec-arg=get-token \
52+
--exec-arg=--oidc-issuer-url="https://dex.${base_domain}" \
53+
--exec-arg=--oidc-client-id=kubelogin \
54+
--exec-arg=--oidc-client-secret="$(sops -d --extract '["dex"]["kubeloginClientSecret"]' "${secrets[secrets_file]}")" \
55+
--exec-arg=--oidc-extra-scope=email \
56+
--exec-arg=--oidc-extra-scope=groups
57+
}
58+
59+
set_context() {
60+
61+
user_kubeconfig=$1
62+
cluster_name=$2
63+
context_name=$3
64+
user_name=$4
65+
context_namespace=$5
66+
67+
kubectl --kubeconfig="${user_kubeconfig}" config set-context \
68+
"${context_name}" \
69+
--user "${user_name}@${cluster_name}" --cluster="${cluster_name}" --namespace="${context_namespace}"
70+
}
71+
72+
use_context() {
73+
74+
user_kubeconfig=$1
75+
cluster_name=$2
76+
77+
kubectl --kubeconfig="${user_kubeconfig}" config use-context \
78+
"${cluster_name}"
79+
}
80+
1481
case "${1}" in
1582
user)
1683
config_load wc
1784
cluster_config="${config[config_file_wc]}"
1885
kubeconfig="${config[kube_config_wc]}"
1986
user_kubeconfig=${CK8S_CONFIG_PATH}/user/secret/kubeconfig.yaml
2087
;;
88+
dev)
89+
log_info "Adding dev ${2} context to wc-config"
90+
91+
config_load wc
92+
cluster_config="${config[config_file_wc]}"
93+
kubeconfig="${config[kube_config_wc]}"
94+
95+
token=$(with_kubeconfig "${kubeconfig}" kubectl get secrets secret-"${2}" -ojsonpath="{.data.token}" | base64 -d)
96+
cluster_name=$(yq4 '.global.clusterName' "${cluster_config}")
97+
98+
kubectl --kubeconfig="${kubeconfig}" config set-credentials "${2}@${cluster_name}" \
99+
--token="${token}"
100+
101+
set_context "${kubeconfig}" "${cluster_name}" "${2}" "${2}" "default"
102+
103+
log_info "Dev context finished"
104+
exit
105+
;;
21106
admin)
22107
case "${2}" in
23108
sc)
@@ -47,42 +132,12 @@ if [[ ! -f "${kubeconfig}" ]]; then
47132
usage
48133
fi
49134

50-
get_user_server() {
51-
(
52-
with_kubeconfig "${kubeconfig}" \
53-
kubectl config view -o jsonpath="{.clusters[0].cluster.server}"
54-
)
55-
}
56-
57135
log_info "Creating kubeconfig for the ${1}"
58136

59137
cluster_name=$(yq4 '.global.clusterName' "${cluster_config}")
60-
base_domain=$(yq4 '.global.baseDomain' "${cluster_config}")
61-
62-
# Get server and certificate from the admin kubeconfig
63-
user_server=$(get_user_server)
64-
user_certificate_authority=/tmp/user-authority.pem
65-
append_trap "rm ${user_certificate_authority}" EXIT
66-
(
67-
with_kubeconfig "${kubeconfig}" \
68-
kubectl config view --raw \
69-
-o jsonpath="{.clusters[0].cluster.certificate-authority-data}" \
70-
| base64 --decode > ${user_certificate_authority}
71-
)
72-
73-
kubectl --kubeconfig="${user_kubeconfig}" config set-cluster "${cluster_name}" \
74-
--server="${user_server}" \
75-
--certificate-authority="${user_certificate_authority}" --embed-certs=true
76-
kubectl --kubeconfig="${user_kubeconfig}" config set-credentials "${1}@${cluster_name}" \
77-
--exec-command=kubectl \
78-
--exec-api-version=client.authentication.k8s.io/v1beta1 \
79-
--exec-arg=oidc-login \
80-
--exec-arg=get-token \
81-
--exec-arg=--oidc-issuer-url="https://dex.${base_domain}" \
82-
--exec-arg=--oidc-client-id=kubelogin \
83-
--exec-arg=--oidc-client-secret="$(sops -d --extract '["dex"]["kubeloginClientSecret"]' "${secrets[secrets_file]}")" \
84-
--exec-arg=--oidc-extra-scope=email \
85-
--exec-arg=--oidc-extra-scope=groups
138+
139+
set_cluster "${user_kubeconfig}"
140+
set_dex_credentials "${user_kubeconfig}" "${1}" "${cluster_name}"
86141

87142
# Create context with relevant namespace
88143
# Pick the first namespace
@@ -92,10 +147,7 @@ else
92147
context_namespace="default"
93148
fi
94149

95-
kubectl --kubeconfig="${user_kubeconfig}" config set-context \
96-
"${cluster_name}" \
97-
--user "${1}@${cluster_name}" --cluster="${cluster_name}" --namespace="${context_namespace}"
98-
kubectl --kubeconfig="${user_kubeconfig}" config use-context \
99-
"${cluster_name}"
150+
set_context "${user_kubeconfig}" "${cluster_name}" "${cluster_name}" "${1}" "${context_namespace}"
151+
use_context "${user_kubeconfig}" "${cluster_name}"
100152

101153
log_info "User kubeconfig can now be found at ${user_kubeconfig}."

config/config/wc-config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ user:
3030
- set-me
3131
- admin@example.com
3232

33+
## List of serviceAccounts to create RBAC rules for, used for dev situations.
34+
serviceAccounts: []
35+
3336
## List of groups to create RBAC rules for.
3437
adminGroups:
3538
- set-me

docs/end-user-dev-kubeconifg.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# User admin for development
2+
3+
There can be situations where you as a developer needs to act as a end user.
4+
This document describes how to add a service account to act as a end user for development purposes.
5+
6+
First add a name for the service account in your `wc-config.yaml`
7+
8+
```diff
9+
...
10+
user:
11+
namespaces:
12+
- production
13+
+ serviceAccounts:
14+
+ - test
15+
adminUsers:
16+
- admin@example.com
17+
...
18+
```
19+
20+
Then run `bin/ck8s kubeconfig dev test`.
21+
22+
This will add a possible context to your `kube_config_wc.yaml`.
23+
24+
To see the new context `kubectl config get-contexts`
25+
26+
```console
27+
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
28+
test foo-wc test@foo-wc default
29+
* foo-wc foo-wc admin@foo-wc default
30+
```
31+
32+
To switch to the new context run the following `kubectl config use-context test`

helmfile/charts/user-rbac/templates/clusterrolebindings/user-admin-cluster-wide-delegation.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,8 @@ subjects:
1818
kind: Group
1919
name: {{ $group }}
2020
{{- end }}
21+
{{- range $serviceAccount := $.Values.serviceAccounts }}
22+
- kind: ServiceAccount
23+
name: {{ $serviceAccount }}
24+
namespace: default
25+
{{- end }}

helmfile/charts/user-rbac/templates/clusterrolebindings/user-crds.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,8 @@ subjects:
1818
kind: Group
1919
name: {{ $group }}
2020
{{- end }}
21+
{{- range $serviceAccount := $.Values.serviceAccounts }}
22+
- kind: ServiceAccount
23+
name: {{ $serviceAccount }}
24+
namespace: default
25+
{{- end }}

helmfile/charts/user-rbac/templates/clusterrolebindings/user-view.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,8 @@ subjects:
1818
kind: Group
1919
name: {{ $group }}
2020
{{- end }}
21+
{{- range $serviceAccount := $.Values.serviceAccounts }}
22+
- kind: ServiceAccount
23+
name: {{ $serviceAccount }}
24+
namespace: default
25+
{{- end }}

helmfile/charts/user-rbac/templates/rolebindings/falco-viewer.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,9 @@ subjects:
2020
kind: Group
2121
name: {{ $group }}
2222
{{- end }}
23+
{{- range $serviceAccount := $.Values.serviceAccounts }}
24+
- kind: ServiceAccount
25+
name: {{ $serviceAccount }}
26+
namespace: default
27+
{{- end }}
2328
{{- end }}

helmfile/charts/user-rbac/templates/rolebindings/fluentd-configurer.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ subjects:
1919
kind: Group
2020
name: {{ $group }}
2121
{{- end }}
22+
{{- range $serviceAccount := $.Values.serviceAccounts }}
23+
- kind: ServiceAccount
24+
name: {{ $serviceAccount }}
25+
namespace: default
26+
{{- end }}

0 commit comments

Comments
 (0)