programing

Kubernetes 비밀 해독

megabox 2023. 10. 6. 21:01
반응형

Kubernetes 비밀 해독

Kubernetes/Docker 셋업을 물려받았는데 실수로 DB password와 관련된 것을 변경하여 pod를 다운시켰습니다.

저는 이 문제를 해결하려고 합니다.

저는 쿠버네티스나 도커 경험이 많지 않아서 아직도 일을 배우는 중입니다.

값은 불투명 유형의 비밀인 db-user-pass 자격 증명 내부에 포함되어 있습니다.

제가 설명하는 겁니다

kubectl describe secrets/db-user-pass
Name:         db-user-pass
Namespace:    default
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  16 bytes
username:  13 bytes

저는 이 비밀에서 어떻게 자료를 얻을 수 있는지 전혀 모릅니다.Kubernetes 사이트의 예는 제가 base64 인코딩된 문자열을 가질 것이라고 가정하는 것 같지만, 저는 그것조차 이해할 수 없는 것 같습니다.이것에 대한 값을 어떻게 구합니까?

합니다.kubectl get secrets/db-user-pass -o yaml아니면-o json가 보이는username그리고.password하고 와 수 .echo <ENCODED_VALUE> | base64 -D(Mac OS X).

이를 위한 보다 콤팩트한 원-라이너:

kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -D

사용자 이름에 대해서도 마찬가지입니다.

kubectl get secrets/db-user-pass --template={{.data.username}} | base64 -D

: GNU/ 64입니다.-d,것은 아니다.-D.

이 편리한 명령어를 사용하는 것을 제안합니다.이것은 고 템플릿의 힘을 사용합니다.모든 값을 반복하고 해독하며 키와 함께 인쇄합니다.또한 설정되지 않은 값도 처리합니다.

kubectl get secret name-of-secret -o go-template='
{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'

## In your case it would output
# password: decoded_password
# username: decoded_username

에 들지 와 다른 할 수 .yaml아니면json, 하지만 그건 64번 베이스에 의해 암호화된 비밀을 출력할 겁니다

jq(json 쿼리)가 있는 경우 다음을 수행합니다.

kubectl get secret db-user-pass -o json | jq '.data | map_values(@base64d)'

참고:

  • db-user-pass입니다의 입니다.
  • .data는) 비밀 값입니다를 하는 내의 입니다.

이는 모든 플랫폼에서 작동하며, kubectl 1.11+를 사용합니다.

kubectl get secrets/db-user-pass --template='{{.data.password | base64decode}}'

암호에 "-"가 있으면 다음이 작동합니다.

kubectl get secrets/db-user-pass --template='{{ index .data "sql-password" | base64decode}}'

그리고 모든 키를 얻고 싶다면, 값들은

kubectl get secrets/db-user-pass --template='{{ range $key, $value := .data }}{{ printf "%s: %s\n" $key ($value | base64decode) }}{{ end }}'

되어 있는 경우 ()- 점 ().):

kubectl get secret db-user-pass -o=go-template='{{index .data "password"}}' | base64 -d

jsonpath variation은 OSX에서 제게 적합합니다.

kubectl get secrets/db-user-pass -o jsonpath="{.data.username}" | base64 -d

이름에 점을 찍어 비밀을 얻는 것.

kubectl get secrets/tls -o jsonpath="{.data['tls\.crt']}" | base64 -d

이것이 당신이 찾고 있는 링크입니다.

Kubernetes 비밀은 기본 64 인코딩 형식으로 제공되어야 하며, 리눅스 배포의 경우 기본 64 바이너리를 사용하여 만들 수 있습니다.

예:

echo "hello" | base64
aGVsbG8K

Kubernetes는 우리가 비밀키를 환경 변수로 전달하거나 볼륨으로 장착할 때 base64 인코딩을 디코딩합니다.

우선 api 서버를 kubectl을 이용하여 query하여 etcd에서 비밀을 얻습니다.

kubectl get secret db-user-pass -o yaml 

이것은 yaml 형식의 base64 인코딩된 비밀을 알려줄 것입니다.

일단 yaml 파일이 그것들을 해독하게 되면,

"base64 --decode"

최종 명령은 다음과 같습니다.잊지 마세요.-nflag in echo 명령어

echo -n "jdddjdkkdkdmdl" | base64 --decode

더 쉬운 디코딩을 위해 ksd와 같은 base64 디코딩을 수행하는 도구를 사용할 수 있습니다.

kubectl get secrets/db-user-pass -o yaml | ksd

또는 https://github.com/elsesiy/kubectl-view-secret 을 사용합니다.

kubectl view-secret secrets/db-user-pass

우분투 18+에서

kubectl get secrets/db-user-pass --template={{.data.password}} | base64 -d

또 다른 접근법입니다.이 제품은 쿠벡틀 플러그인, 쿠벡틀 뷰 시크릿과 관련이 있습니다. 좋은 점은 선택한 모든 비밀만 인쇄하지 않기 때문에 때때로 도움이 될 수 있다는 것입니다.

이렇게 작동합니다.

세우다

#suppose you have krew installed
❯ kubectl krew install view-secret 

작업 예시

❯ kubectl get secrets 
NAME                        TYPE                             DATA   AGE
cert-manager-webhook-ca     Opaque                           3      30d
harbor-global-docker-pull   kubernetes.io/dockerconfigjson   1      30d

❯ kubectl view-secret cert-manager-webhook-ca
Multiple sub keys found. Specify another argument, one of:
-> ca.crt
-> tls.crt
-> tls.key

❯ kubectl view-secret cert-manager-webhook-ca ca.crt
-----BEGIN CERTIFICATE-----
MIIBwj.......

쿠버네티스 1.11+

kubectl get secrets/db-user-pass --template='{{.data.password | base64decode }}'

이 하나의 라이너는 암호화된 kubeconfig 파일을 암호화된 kubeconfig 파일을 암호화된 kubeconfig 파일을 가져오는 데 사용됩니다. 예를 들어 ci 작업에서 동적으로 사용할 파일을 생성합니다.

kubectl get secret YOUR_SECRET -o json | grep -oP '(?<=\"YOUR_SECRET_KEY\": \")[^\"]*' | base64 --decode > ./YOUR_KUBECONFIG_FILE_NAME
$kubectl get secret grafana -n monitoring -o jsonpath='{.data}'

출력은 인코딩된 문자열입니다.

아래 echo 명령에서 String을 사용합니다.

$echo "string" | base64 --decode

@B řetislav Hájek 솔루션 확장(그것에 대해 매우 감사합니다).라벨로 받아야 할 경우에는 추가로 추가해야 합니다.range반환된 항목에 대해 반복하는 명령입니다.

$ LABEL_FILTER="app.kubernetes.io/name=mysql-chart"

$ kubectl get secret  -l "$LABEL_FILTER"  -o go-template='
{{range $i := .items}}{{range $k,$v := $i.data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}{{end}}'

mysql_password: ...
mysql_root_password: ...
mysql_user: ...

바쉬로.이것은 ubuntu 18.04를 실행하고 있고, Kubernetes 1.18.5를 실행하고 있습니다.

kubectl -n metallb-system get secrets memberlist -o json | grep secretkey | grep -v f:s | awk -F '"' '{print$4}' |base64 --decode; echo

최소 nodejs CLI 도구(gitub)

npm i -g kusd
kubectl get secret your-secret -o yaml | kusd

k8s 비밀에 대한 yaml 파일이 있다면 도움이 될 것입니다.이 intellij 플러그인을 사용하여 yaml 파일의 모든 base64 인코딩 값을 디코딩할 수 있습니다.https://plugins.jetbrains.com/plugin/19099-yaml-base64-decoder

(어떤 이유에서든) 오프라인에서만 암호를 사용할 수 있는 사용자는 yq를 사용할 수 있으며 여기서 값을 앞뒤로 해독하는 것이 별칭 스니펫입니다.

elif [[ ($1 == "secret") && ($2 == "decode") ]]; then
  yq -i '.data[] |= @base64d' $3
elif [[ ($1 == "secret") && ($2 == "encode") ]]; then
  yq -i '.data[] |= @base64' $3

3달러는 문제의 비밀로 가는 길입니다.

언급URL : https://stackoverflow.com/questions/56909180/decoding-kubernetes-secret

반응형