Bash Makefile到base64编码kubernetes秘密

Bash Makefile到base64编码kubernetes秘密,bash,sed,makefile,kubernetes,Bash,Sed,Makefile,Kubernetes,在Kubernetes中,秘密资源是base64编码的。这是来自以下站点的yaml文件示例: 其中,两个机密数据:用户名和密码使用以下方式进行base64编码: echo -n 'my-app' | base64 echo -n 'a^8)y\7<8AAxaa(y^x' | base64 Makefile: base64: @echo "Computing base64 of secret values..." cat my-secrets-naked.yaml | ba

在Kubernetes中,秘密资源是base64编码的。这是来自以下站点的yaml文件示例:

其中,两个机密数据:用户名和密码使用以下方式进行base64编码:

echo -n 'my-app' | base64
echo -n 'a^8)y\7<8AAxaa(y^x' | base64
Makefile

base64:
    @echo "Computing base64 of secret values..."
    cat my-secrets-naked.yaml | bash base64_secrets.sh > my-secrets-base64.yaml
base64\u secrets.sh
脚本:

sed -r 's/(\s+[A-Z]\S+:\s*)(.*)/echo "\1$(echo -n "\2" | base64 -w0 )"/e;s/  -//'
命令:
makebase64

输出(
my-secrets-base64.yaml
):

理想情况下,我希望
sed
Makefile
中,而不是一个单独的脚本,但我无法理解它。但最重要的是,密码的base64是错误的!它以反斜杠破译机密,在这种情况下,
\7
会导致问题。我不知道如何在仍然使用前面的
sed
中的
\2
反向引用时回显未转义的字符。(
echo-E
不起作用,它需要
\2
字面意思。使用
printf“%s”\2
也不走运)

我知道这似乎是一个特定的问题——但一个好的解决方案对所有Kubernetes用户都有用吗

如果我让这个工作流正常工作,我打算扩展它,这样Makefile会生成第三个文件,其中的秘密经过编辑和散列,可以安全地在git中提交,同时仍然知道什么时候发生了变化



我使用的是Ubuntu 16.04,sed(GNU sed)4.2.2。

考虑使用
stringData
字段而不是
data
字段,您可以传入未编码的值。它仍将在内部存储为
数据
,并在查询回来时显示

DESCRIPTION:
Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.

FIELDS:
   type <string>
     Used to facilitate programmatic handling of secret data.

   apiVersion   <string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

   data <object>
     Data contains the secret data. Each key must be a valid DNS_SUBDOMAIN or
     leading dot followed by valid DNS_SUBDOMAIN. The serialized form of the
     secret data is a base64 encoded string, representing the arbitrary (possibly
     non-string) data value here. Described in
     https://tools.ietf.org/html/rfc4648#section-4

   kind <string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

   metadata <Object>
     Standard object's metadata. More info:
     http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata

   stringData   <object>
     stringData allows specifying non-binary secret data in string form. It is
     provided as a write-only convenience method. All keys and values are merged
     into the data field on write, overwriting any existing values. It is never
     output when reading from the API.
说明:
Secret保存某种类型的秘密数据。数据字段中值的总字节数必须小于MaxSecretSize字节数。
领域:
类型
用于促进机密数据的程序化处理。
蜂房
APIVersion定义了
对象服务器应将已识别的架构转换为最新的内部架构
值,并可能拒绝无法识别的值。更多信息:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources
数据
数据包含秘密数据。每个密钥必须是有效的DNS_子域或
前导点后跟有效的DNS_子域。的序列化形式
机密数据是base64编码的字符串,表示任意
非字符串)数据值。描述于
https://tools.ietf.org/html/rfc4648#section-4
友善的
种类是表示此对象的REST资源的字符串值
代表。服务器可以从客户端提交的端点推断出这一点
请求。无法更新。在这种情况下。更多信息:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-种类
元数据
标准对象的元数据。更多信息:
http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
字符串数据
stringData允许以字符串形式指定非二进制机密数据。它是
作为只写的方便方法提供。合并所有键和值
写入数据字段时,覆盖任何现有值。从来都不是
从API读取时的输出。

不过,我可能会建议使用JSON而不是YAML。

您可以使用perl来实现这一点

cat Makefile
base64:
        @echo "Computing base64 of secret values..."
        cat my-secrets-naked.yaml|perl -MMIME::Base64 -npe 's/^(\s+[A-Z]+:\s+)(.*)./"$$1".encode_base64($$2)/es;' > my-secrets-base64.yaml
以下是输出:

cat my-secrets-base64.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  USERNAME: bXktYXBw
  PASSWORD: YV44KXlcNzw4QUF4YWEoeV54

虽然所有的道具都是由格雷厄姆来回答的,但让我让这个答案更具可塑性。至少我错过了跳过结果

利用
stringData
首先不必对输入进行base64编码。 在部署机密时将注意编码:

机密定义中的非编码机密:

apiVersion: v1
kind: Secret
metadata:
  name: test-secret
stringData:
  USERNAME: my-app
  PASSWORD: a^8)y\7<8AAxaa(y^x

我不知道
stringData
。谢谢。这个秘密的描述来自这里——了解k8s对象的好方法!比那容易。运行
oc explain secret
kubectl explain secret
。使用字段的大写字母来确定要对哪个字段进行base64编码,这真的很聪明。但是,如果元数据
name:
字段获得“FOO:bar”,则可能会出现问题,所以最好将用户名|密码硬编码到正则表达式中。@lockcmpxchg8b我同意你的看法。kubernetes应用程序开发的最佳选择非常感谢!我不得不删除搜索中的最后一个
,但我猜这是因为我有单字节的Linux行结尾,而你有2字节的Windows行结尾。
cat Makefile
base64:
        @echo "Computing base64 of secret values..."
        cat my-secrets-naked.yaml|perl -MMIME::Base64 -npe 's/^(\s+[A-Z]+:\s+)(.*)./"$$1".encode_base64($$2)/es;' > my-secrets-base64.yaml
cat my-secrets-base64.yaml
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
data:
  USERNAME: bXktYXBw
  PASSWORD: YV44KXlcNzw4QUF4YWEoeV54
apiVersion: v1
kind: Secret
metadata:
  name: test-secret
stringData:
  USERNAME: my-app
  PASSWORD: a^8)y\7<8AAxaa(y^x
kubectl describe secret/test-secret

kubectl get secret test-secret -o jsonpath='{.data}'