token
, error
_SECURITY_ ๋ณด๊ณ ์
kubeadm
์ delete
๋ช
๋ น์ ๋ถํธ์คํธ๋ฉ ํ ํฐ ID ๋๋ ์ ์ฒด ํ ํฐ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์
๋ ฅ์ด id์ธ์ง ์๋๋ฉด ์ ์ฒด ํ ํฐ์ธ์ง ๊ฒฐ์ ํ๊ธฐ ์ ์ kubeadm
๋ klog
์ฌ์ฉํ์ฌ ์
๋ ฅ์ ๊ธฐ๋กํฉ๋๋ค. ์ญ์ ์ ์คํจํ๋ฉด ํ ํฐ์ ๊ณ์ ์ ํจํฉ๋๋ค. ๋ก๊ทธ์ ์ก์ธ์คํ ์ ์๋ ๊ณต๊ฒฉ์๋ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ ์์ฑ ๋๋ ๊ธฐ์กด ํด๋ฌ์คํฐ์ ๋
ธ๋ ๊ฒฐํฉ๊ณผ ๊ฐ์ ๋ถํธ์คํธ๋ฉ ํ ํฐ์ด ํ์ํ ์์
์ ์ํํ ์ ์์ต๋๋ค.
์ทจ์ฝํ ์ฝ๋๋ kubernetes 1.19์ ์์ต๋๋ค. klog
์ ๋ํ ํธ์ถ์ด ํฌํจ๋ ํน์ ํ์ 2019-03-24์ ๋ง์ง๋ง์ผ๋ก ํธ์ง๋์์ต๋๋ค.
์ทจ์ฝํ ์ฝ๋๋ github.com/kubernetes
์ ์ฅ์์ kubernetes/cmd/kubeadm/app/cmd/token.go
ํ์ผ, 423ํ์ ์์ต๋๋ค. ์ ์ฒด ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// RunDeleteTokens removes a bootstrap tokens from the server.
func RunDeleteTokens(out io.Writer, client clientset.Interface, tokenIDsOrTokens []string) error {
for _, tokenIDOrToken := range tokenIDsOrTokens {
// Assume this is a token id and try to parse it
tokenID := tokenIDOrToken
klog.V(1).Infof("[token] parsing token %q", tokenIDOrToken) // POTENTIAL LEAK HERE
if !bootstraputil.IsValidBootstrapTokenID(tokenIDOrToken) {
// Okay, the full token with both id and secret was probably passed. Parse it and extract the ID only
bts, err := kubeadmapiv1beta2.NewBootstrapTokenString(tokenIDOrToken)
if err != nil {
return errors.Errorf("given token %q didn't match pattern %q or %q",
tokenIDOrToken, bootstrapapi.BootstrapTokenIDPattern, bootstrapapi.BootstrapTokenIDPattern)
}
tokenID = bts.ID
}
tokenSecretName := bootstraputil.BootstrapTokenSecretName(tokenID)
klog.V(1).Infof("[token] deleting token %q", tokenID)
if err := client.CoreV1().Secrets(metav1.NamespaceSystem).Delete(context.TODO(), tokenSecretName, metav1.DeleteOptions{}); err != nil {
return errors.Wrapf(err, "failed to delete bootstrap token %q", tokenID)
}
fmt.Fprintf(out, "bootstrap token %q deleted\n", tokenID)
}
return nil
}
๋ค์์ ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ kubeadm ๋ช ๋ น์ ์ ์์ ๋๋ค(๋์ผํ ํ์ผ์์).
deleteCmd := &cobra.Command{
Use: "delete [token-value] ...",
DisableFlagsInUseLine: true,
Short: "Delete bootstrap tokens on the server",
Long: dedent.Dedent(`
This command will delete a list of bootstrap tokens for you.
The [token-value] is the full Token of the form "[a-z0-9]{6}.[a-z0-9]{16}" or the
Token ID of the form "[a-z0-9]{6}" to delete.
`),
RunE: func(tokenCmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.Errorf("missing subcommand; 'token delete' is missing token of form %q", bootstrapapi.BootstrapTokenIDPattern)
}
kubeConfigFile = cmdutil.GetKubeConfigPath(kubeConfigFile)
client, err := getClientset(kubeConfigFile, dryRun)
if err != nil {
return err
}
return RunDeleteTokens(out, client, args)
},
}
๋ก๊ทธ์์ ๋ถํธ์คํธ๋ฉ ํ ํฐ์ ์ป์ ๊ณต๊ฒฉ์๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ kubeadm
๋ก ์ธ์ฆํ๊ณ ์ ํด๋ฌ์คํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ๋
ธ๋๋ฅผ ๊ธฐ์กด ํด๋ฌ์คํฐ์ ์กฐ์ธํ ์ ์์ต๋๋ค(์: ์ปดํจํ
๋ฆฌ์์ค ์ฌ์ฉ). ๊ณต๊ฒฉ์๋ kubeadm
์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์์
์ ์ํํ ์๋ ์์ต๋๋ค(์: ๋ค๋ฅธ ํ ํฐ ๋์ด ๋๋ ์ญ์ ).
๋๋ ์ด ์ทจ์ฝ์ ์ HackerOne์ ๋ณด๊ณ ํ๊ณ ๊ทธ๋ค์ ๋์ ๊ณต๊ฒฉ ๋ณต์ก์ฑ๊ณผ ๋ฎ์ ์ฌ๊ฐ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๊ฒ์ด ๊ณต๊ฐ์ ์ผ๋ก ๋ณด๊ณ ๋๊ณ ์์ ๋ ์ ์๋ค๊ณ ์๊ฐํ๋ค๊ณ ๋์๊ฒ ์๋ ธ์ต๋๋ค.
์์ ์ฌํญ์ ๊ตฌํํ๋ kubernetes์ ๋ํ PR์ ์ด์์ต๋๋ค. https://github.com/kubernetes/kubernetes/pull/94727
kubeadm์ delete ๋ช ๋ น์ ๋ถํธ์คํธ๋ฉ ํ ํฐ ID ๋๋ ์ ์ฒด ํ ํฐ์ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํฉ๋๋ค. ์ ๋ ฅ์ด ID์ธ์ง ์๋๋ฉด ์ ์ฒด ํ ํฐ์ธ์ง ๊ฒฐ์ ํ๊ธฐ ์ ์ kubeadm์ klog๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฅ์ ๊ธฐ๋กํฉ๋๋ค. ์ญ์ ์ ์คํจํ๋ฉด ํ ํฐ์ ๊ณ์ ์ ํจํฉ๋๋ค. ๋ก๊ทธ์ ์ก์ธ์คํ ์ ์๋ ๊ณต๊ฒฉ์๋ ๋ก๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ ์์ฑ ๋๋ ๊ธฐ์กด ํด๋ฌ์คํฐ์ ๋ ธ๋ ๊ฒฐํฉ๊ณผ ๊ฐ์ ๋ถํธ์คํธ๋ฉ ํ ํฐ์ด ํ์ํ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
์๋ ํ์ธ์. ๋ฌธ์ ๋ฅผ ๊ธฐ๋กํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๋ฌํ ๋ก๊ทธ๋ฅผ ์ฝ์ ์ ์์ผ๋ ค๋ฉด ์ฌ๋ฐ๋ฅธ ๊ถํ์ด ์์ด์ผ ํ๋ฉฐ ๋ก๊ทธ๊ฐ ๋ฃจํธ ์ก์ธ์ค ํ์ ์๊ฑฐ๋ ์ด๋ฏธ ๋ถํธ์คํธ๋ฉ ํ ํฐ๋ณด๋ค ๋์ ์ก์ธ์ค ๊ถํ์ ๊ฐ์ง ํน์ ๊ทธ๋ฃน์ ์ ๊ณต๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
๋ํ:
--v=>1
ํ ํฐ์ด ์ ํจํ ํ์์ธ ๊ฒฝ์ฐ kubeadm token delete
์คํ ์ค์ ํ์ฑํํด์ผ ํฉ๋๋ค.PR์ ๊ฐ์ ์ ๋๋ถ๋ถ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ฌํ ๊ณต๊ฒฉ์ ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์ด์ ๋ฆด๋ฆฌ์ค(<1.20)๋ก ๋ฐฑํฌํธํด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋๋ ๋ฐฑํฌํธํ์ง ์๋ @neolit123 ์ ๋์ํฉ๋๋ค(์ค์ ๋ก ํน์ ํ ์๊ตฌ์ฌํญ์ด ์๋ ํ)
์์ ์ฌํญ์ ๋ํ WRT, ๋ก๊ทธ์์ TokenID๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ +1์
๋๋ค.
https://github.com/kubernetes/kubernetes/pull/94727 ๋ณํฉ์ผ๋ก ๋ซํ๋๋ค.
๊ฐ์ฌ ํด์