<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>signing | 伪架构师</title>
    <link>/tags/signing/</link>
      <atom:link href="/tags/signing/index.xml" rel="self" type="application/rss+xml" />
    <description>signing</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Fri, 13 Dec 2019 10:39:08 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>signing</title>
      <link>/tags/signing/</link>
    </image>
    
    <item>
      <title>使用 Harbor 提供可信镜像</title>
      <link>/post/content-trust-with-harbor/</link>
      <pubDate>Fri, 13 Dec 2019 10:39:08 +0800</pubDate>
      <guid>/post/content-trust-with-harbor/</guid>
      <description>

&lt;p&gt;应用上云的过程中，过了部署关和应用改造关之后，安全就是下一个大问题了。对于容器化应用来说，镜像的安全是个非常根本的问题，例如 Harbor 中集成了 Clair 组件，用于对镜像进行漏洞扫描；&lt;a href=&#34;https://blog.yamler.io/post/introducing-trivy/&#34; target=&#34;_blank&#34;&gt;之前介绍的 Trivy&lt;/a&gt; 也能够提供对镜像各层进行扫描的能力，类似的工具还有很多。在完成镜像本身的安全保障之后，一方面要把安全构建出来的镜像能够”原汁原味“的提供给运行时进行使用，同时还要对运行时环境进行约束，只允许获取和运行可靠镜像，如此才能够保证镜像供应链的完整。&lt;/p&gt;

&lt;h2 id=&#34;快速上手&#34;&gt;快速上手&lt;/h2&gt;

&lt;p&gt;Harbor 中提供了 &lt;a href=&#34;https://github.com/theupdateframework/notary&#34; target=&#34;_blank&#34;&gt;Notary&lt;/a&gt; 服务来提供了这方面的保障，Docker 17.12 之后也提供了对应的运行时支持。&lt;/p&gt;

&lt;p&gt;这里用 1.10.0 版本的 Harbor 为例，在安装命令中加入参数 &lt;code&gt;--with-notary&lt;/code&gt; 就可以启用这个服务了。启动 Harbor 之后，使用 Docker 客户端的终端设置环境变量：&lt;code&gt;export DOCKER_CONTENT_TRUST=1&lt;/code&gt;。启用 Docker 的内容信任模式。&lt;/p&gt;

&lt;p&gt;使用 &lt;code&gt;docker login&lt;/code&gt; 命令登录仓库，然后进行镜像推送，例如：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ docker push 10.211.55.27/sign/clare:s1
The push refers to repository [10.211.55.27/sign/clare]
bbef02a499c4: Layer already exists
...
47a4bb1cfbc7: Layer already exists
s1: digest: sha256:bafc293fd765dbbad5ed3d57d771f0566e5d63a668213f1f61c469cbb199fca6 size: 1162
Signing and pushing trust metadata
You are about to create a new root signing key passphrase. This passphrase
...
Enter passphrase for new root key with ID b52c1ba:
Repeat passphrase for new root key with ID b52c1ba:
Enter passphrase for new repository key with ID c37e6d2:
Repeat passphrase for new repository key with ID c37e6d2:
Error: trust data missing for remote repository 10.211.55.27/sign/clare or remote repository not found: timestamp key trust data unavailable.  Has a notary repository been initialized?
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这里多出了一个初始化过程，在我们照章输入密码之后，发现出了错，这是因为我们没有设置 Notary 服务地址，加入环境变量来解决：&lt;code&gt;export DOCKER_CONTENT_TRUST_SERVER=https://10.211.55.27:4443&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;再次推送：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ docker push 10.211.55.27/sign/clare:s1
The push refers to repository [10.211.55.27/sign/clare]
...
Repeat passphrase for new repository key with ID d6068a9:
Finished initializing &amp;quot;10.211.55.27/sign/clare&amp;quot;
Successfully signed 10.211.55.27/sign/clare:s1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以看到，推送已经成功了，并且还有签署成功的反馈。查看一下他的签名信息：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ docker trust inspect 10.211.55.27/sign/clare:s1
[
    {
        &amp;quot;Name&amp;quot;: &amp;quot;10.211.55.27/sign/clare:s1&amp;quot;,
        &amp;quot;SignedTags&amp;quot;: [
            {
                &amp;quot;SignedTag&amp;quot;: &amp;quot;s1&amp;quot;,
                &amp;quot;Digest&amp;quot;: &amp;quot;bafc293fd765dbbad5ed3d57d771f0566e5d63a668213f1f61c469cbb199fca6&amp;quot;,
                &amp;quot;Signers&amp;quot;: [
                    &amp;quot;Repo Admin&amp;quot;
                ]
            }

...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果我们取消 Docker 内容信任：&lt;code&gt;unset DOCKER_CONTENT_TRUST&lt;/code&gt;。接下来推送一个新镜像：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ docker push 10.211.55.27/sign/alpine:latest
The push refers to repository [10.211.55.27/sign/alpine]
77cae8ab23bf: Pushed
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;再次开启 Docker 内容信任开关：&lt;code&gt;export DOCKER_CONTENT_TRUST=1&lt;/code&gt;，尝试拉取：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-shell&#34;&gt;$ docker pull 10.211.55.27/sign/alpine:latest
Error: remote trust data does not exist for 10.211.55.27/sign/alpine: 10.211.55.27:4443 does not have trust data for 10.211.55.27/sign/alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;可以看到 Docker 拒绝了未经签署的镜像。&lt;/p&gt;

&lt;h2 id=&#34;幕后&#34;&gt;幕后&lt;/h2&gt;

&lt;p&gt;Docker 包含了简写为 DCT 的内容签名（Docker Content Trust）支持，能够借助 Notary 进行内容签署和校验。首次签署时会要求生成根密钥，每次创建一个新的 Repository 时候，会为其单独生成签署密钥。接下来，每个 Tag 的推送都会进行签署，从而保证内容的稳定性。&lt;/p&gt;

&lt;h2 id=&#34;问题&#34;&gt;问题&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Kubernetes 能享受到这个么？&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;托管 Kubernetes 怎么办？&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;多镜像仓库怎么办？&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
