Skip to content

Commit a22c26e

Browse files
committed
1 parent dd495b7 commit a22c26e

765 files changed

Lines changed: 16539 additions & 10611 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

404.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,8 @@ <h1>找不到页面</h1>
742742
<h2>最新</h2>
743743
<ul>
744744

745+
<li><a href="/blog/istiocon-at-kubecon-na/">KubeCon 北美大会同场活动 IstioCon 2023 回顾</a></li>
746+
745747
<li><a href="/blog/why-we-decided-to-start-fresh-with-our-nginx-gateway-fabric/">为什么我们决定从新开始我们的 NGINX Gateway Fabric</a></li>
746748

747749
<li><a href="/blog/kubernetes-secure-development-best-practices-in-action/">Kubernetes 安全开发最佳实践的实际应用</a></li>
@@ -760,8 +762,6 @@ <h2>最新</h2>
760762

761763
<li><a href="/blog/7-steps-to-highly-effective-kubernetes-policies/">创建高效 Kubernetes 策略的 7 个步骤</a></li>
762764

763-
<li><a href="/blog/can-chatgpt-save-collective-kubernetes-troubleshooting/">Kubernetes 故障排除智慧的演变</a></li>
764-
765765
</ul>
766766

767767

author/ciara-stacke/index.xml

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,22 @@
2727
&lt;p&gt;当我们开发 &lt;a href=&#34;https://github.com/nginxinc/nginx-gateway-fabric&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;NGINX Gateway Fabric&lt;/a&gt;(我们实现新的 Kubernetes Gateway API)时,我们利用了多种工具和策略来确保安全性和优化。在本文中,我们将介绍我们的设计决策:&lt;/p&gt;
2828
&lt;ul&gt;
2929
&lt;li&gt;减少攻击面&lt;/li&gt;
30-
&lt;li&gt;图像安全扫描&lt;/li&gt;
30+
&lt;li&gt;镜像安全扫描&lt;/li&gt;
3131
&lt;li&gt;代码质量和安全性&lt;/li&gt;
3232
&lt;li&gt;部署安全最佳实践&lt;/li&gt;
3333
&lt;/ul&gt;
3434
&lt;h2 id=&#34;减少攻击面&#34;&gt;减少攻击面&lt;/h2&gt;
3535
&lt;p&gt;我们选择从尽可能小的容器开始。事实上,我们不能再小了。基于 &amp;lsquo;scratch&amp;rsquo;,我们的 &amp;rsquo;nginx- gateway-fabric&amp;rsquo; 镜像只包含 Golang 二进制文件,没有其他内容。在生成最终版本之前,我们采取了几个步骤,但我们确保最终版本仅包含必要的内容,即二进制文件。Dockerfile 如下所示:&lt;/p&gt;
36-
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Dockerfile
37-
FROM alpine:3.18
38-
RUN apk add --no-cache libcap
39-
COPY ./build/out/gateway /usr/bin/
40-
RUN setcap &amp;#39;cap_kill=+ep&amp;#39; /usr/bin/gateway
41-
FROM scratch
42-
USER 102:1001
43-
ENTRYPOINT [ &amp;#34;/usr/bin/gateway&amp;#34; ]
44-
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这个多步骤的 Dockerfile 允许我们将“alpine”与最新版本的 libcap 一起使用,将我们预先构建的二进制文件复制到正确的位置,并为我们管理 nginx 设置必要的权限。然后,我们使用“scratch”作为生产映像的基础,并设置用户和组 ID,以便我们可以控制和限制容器有权访问的权限。&lt;/p&gt;
36+
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; alpine:3.18 &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
37+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; apk add --no-cache libcap &lt;span class=&#34;err&#34;&gt;
38+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; ./build/out/gateway /usr/bin/ &lt;span class=&#34;err&#34;&gt;
39+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; setcap &lt;span class=&#34;s1&#34;&gt;&amp;#39;cap_kill=+ep&amp;#39;&lt;/span&gt; /usr/bin/gateway &lt;span class=&#34;err&#34;&gt;
40+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; scratch &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
41+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;USER&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; 102:1001 &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
42+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;ENTRYPOINT&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/usr/bin/gateway&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
43+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这个多步骤的 Dockerfile 允许我们将“alpine”与最新版本的 libcap 一起使用,将我们预先构建的二进制文件复制到正确的位置,并为我们管理 nginx 设置必要的权限。然后,我们使用“scratch”作为生产映像的基础,并设置用户和组 ID,以便我们可以控制和限制容器有权访问的权限。&lt;/p&gt;
4544
&lt;p&gt;使用这种方法,“nginx-gateway-fabric”映像的大小大致与二进制文件本身的大小相同,没有任何额外的膨胀。二进制文件不需要任何额外的依赖项即可运行,并且我们保持了尽可能小的大小和攻击面。&lt;/p&gt;
46-
&lt;h2 id=&#34;图像安全扫描&#34;&gt;图像安全扫描&lt;/h2&gt;
45+
&lt;h2 id=&#34;镜像安全扫描&#34;&gt;镜像安全扫描&lt;/h2&gt;
4746
&lt;p&gt;确保产品安全的最有效方法之一是定期进行安全扫描。在 &lt;a href=&#34;https://trivy.dev/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Trivy&lt;/a&gt; 的帮助下,我们定期运行镜像安全扫描,作为 Github CI/CD 管道的一部分。Trivy 扫描容器镜像查找库或二进制文件中存在的任何已知漏洞(CVE)。使用“scratch”镜像可以保护我们免受基础映像中的任何漏洞的影响,但 Trivy 仍然可以捕获在我们的 Golang 二进制文件中编译的库中的任何漏洞。扫描结果将上传到存储库的 Github 安全选项卡,使我们的团队可以轻松查看发现的任何问题。&lt;/p&gt;
4847
&lt;h2 id=&#34;代码质量和安全性&#34;&gt;代码质量和安全性&lt;/h2&gt;
4948
&lt;p&gt;除了最小化容器镜像外,我们还优先考虑应用程序中的代码质量和安全性,采用安全第一的思维方式。我们从一开始就将安全性放在首位,以安全性为重点,全面评估每个设计和功能。我们在流程的早期阶段主动识别和保护资产,确保在整个开发生命周期中对其进行保护,并遵守安全设计的最佳实践,包括适当的身份验证、授权和加密机制。维护这些标准的一个重要部分是我们使用强大的代码审查流程。项目的每个贡献者为任何变化都需要创建一个 PR,并且每个 PR 必须得到至少两个项目维护者的批准。除了这个过程之外,我们还结合了 linter 和工具的使用,以保持我们对代码安全性和质量的高标准。&lt;/p&gt;

0 commit comments

Comments
 (0)