在Kubernetes秘密中调试不必要的换行符

时间:2018-03-07 15:10:54

标签: kubernetes base64

我有一个名为GOOGLE_MAPS_DIRECTIONS_API_KEY的环境变量,由Kubernetes秘密填充YAML

apiVersion: v1
kind: Secret
metadata:
  name: google-maps-directions-api-secret
type: Opaque
data:
  GOOGLE_MAPS_DIRECTIONS_API_KEY: QUl...QbUpqTHNJ

通过在我的API密钥上复制粘贴运行echo -n "AIz..." | base64的结果来创建秘密。我已在此代码段中提供了密钥的开头和结尾,以显示密码文件中包含的密钥中没有换行符。

以下是我在运行cat google-maps-directions-api-key-secret.yaml | hexdump -C时看到的内容:

00000000  61 70 69 56 65 72 73 69  6f 6e 3a 20 76 31 0a 6b  |apiVersion: v1.k|
00000010  69 6e 64 3a 20 53 65 63  72 65 74 0a 6d 65 74 61  |ind: Secret.meta|
00000020  64 61 74 61 3a 0a 20 20  6e 61 6d 65 3a 20 67 6f  |data:.  name: go|
00000030  6f 67 6c 65 2d 6d 61 70  73 2d 64 69 72 65 63 74  |ogle-maps-direct|
00000040  69 6f 6e 73 2d 61 70 69  2d 73 65 63 72 65 74 0a  |ions-api-secret.|
00000050  74 79 70 65 3a 20 4f 70  61 71 75 65 0a 64 61 74  |type: Opaque.dat|
00000060  61 3a 0a 20 20 47 4f 4f  47 4c 45 5f 4d 41 50 53  |a:.  GOOGLE_MAPS|
00000070  5f 44 49 52 45 43 54 49  4f 4e 53 5f 41 50 49 5f  |_DIRECTIONS_API_|
00000080  4b 45 59 3a 20 51 55 6c  36 59 56 4e 35 51 7a 68  |KEY: QUl6YVN5Qzh|
...
000000b0  51 62 55 70 71 54 48 4e  4a                       |QbUpqTHNJ|
000000b9

但是!当我进入pod中的Node.JS解释器时,我看到以下内容:

> process.env.GOOGLE_MAPS_DIRECTIONS_API_KEY
'AIz...jLsI\n'

在字符串的末尾附加了一个辅助换行符!

坦率地说,这非常令人沮丧。关于这个问题,我有几个问题。

  • 你能发现我的错误吗?例如。我在秘密传播管道中的哪个位置意外地插入了换行符?
  • 我应该使用什么Unix命令将换行符打印到控制台,以便按字面解释(作为\n),以便我实际看到它
  • 将从环境变量中删除尾随换行符的代码注入我的容器映像中是否被视为不良做法?我知道这在技术上并不正确,但是这很痛苦。

2 个答案:

答案 0 :(得分:1)

我的秘密看起来并不奇怪。正如你所提到的,我要做的第一件事就是exec进入pod,然后放入bash,并回显出环境变量以确认它传播不正确。在进行快速测试后,换行符应该显示为printf:

printf '%s' $GOOGLE_MAPS_DIRECTIONS_API_KEY

如果从bash打印它看起来很好,那么问题在于节点如何解释它。如果它看起来搞砸了,那么你需要再看看你是如何生成它的。

仅如果process.env的结果实际上是您的API密钥,您应该尽快撤销它,就像您刚刚在问题中发布它一样。

至于剥离换行是否是不好的做法,是的。如果实际的秘密信息包含换行符,这可能会导致意外问题。

答案 1 :(得分:1)

如果您之前没有-n echo选项创建密码,请验证API中保留的密码(kubectl get secret/google-maps-directions-api-secret -o yaml)是否与您的yaml文件中的密钥匹配,并验证已经重新部署了消费应用程序,因为秘密已使用正确的值更新