<p>kubeadm์€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์„ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2020๋…„ 09์›” 11์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kubernetes/kubeadm

์ด ํ•ญ๋ชฉ์„ ์ œ์ถœํ•˜๊ธฐ ์ „์— kubeadm ๋ฌธ์ œ์—์„œ ์–ด๋–ค ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜์…จ์Šต๋‹ˆ๊นŒ?

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

aresecurity kincleanup prioritbacklog

๋ชจ๋“  3 ๋Œ“๊ธ€

kubeadm์˜ delete ๋ช…๋ น์€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ ID ๋˜๋Š” ์ „์ฒด ํ† ํฐ์„ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์ด ID์ธ์ง€ ์•„๋‹ˆ๋ฉด ์ „์ฒด ํ† ํฐ์ธ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์ „์— kubeadm์€ klog๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์‚ญ์ œ์— ์‹คํŒจํ•˜๋ฉด ํ† ํฐ์€ ๊ณ„์† ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ž๋Š” ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ ๋˜๋Š” ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ์— ๋…ธ๋“œ ๊ฒฐํ•ฉ๊ณผ ๊ฐ™์€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ฌธ์ œ๋ฅผ ๊ธฐ๋กํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ๊ทธ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด ์˜ฌ๋ฐ”๋ฅธ ๊ถŒํ•œ์ด ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๋กœ๊ทธ๊ฐ€ ๋ฃจํŠธ ์•ก์„ธ์Šค ํ•˜์— ์žˆ๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ† ํฐ๋ณด๋‹ค ๋†’์€ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ€์ง„ ํŠน์ • ๊ทธ๋ฃน์— ์ œ๊ณต๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ:

  • --v=>1 ํ† ํฐ์ด ์œ ํšจํ•œ ํ˜•์‹์ธ ๊ฒฝ์šฐ kubeadm token delete ์‹คํ–‰ ์ค‘์— ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 24์‹œ๊ฐ„ ํ›„์— ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

PR์˜ ๊ฐœ์„ ์€ ๋Œ€๋ถ€๋ถ„ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ๊ณต๊ฒฉ์˜ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์ด์ „ ๋ฆด๋ฆฌ์Šค(<1.20)๋กœ ๋ฐฑํฌํŠธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฐฑํฌํŠธํ•˜์ง€ ์•Š๋Š” @neolit123 ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค(์‹ค์ œ๋กœ ํŠน์ •ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์—†๋Š” ํ•œ)
์ˆ˜์ • ์‚ฌํ•ญ์— ๋Œ€ํ•œ WRT, ๋กœ๊ทธ์—์„œ TokenID๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ +1์ž…๋‹ˆ๋‹ค.

https://github.com/kubernetes/kubernetes/pull/94727 ๋ณ‘ํ•ฉ์œผ๋กœ ๋‹ซํž™๋‹ˆ๋‹ค.
๊ฐ์‚ฌ ํ•ด์š”

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰