一、NeuVector 简介
① 什么是 NeuVector ?
NeuVector 是业界首个端到端的开源容器安全平台,唯一为容器化工作负载提供企业级零信任安全的解决方案。NeuVector 是业界领先的安全和合规解决方案,已被全球知名企业广泛采用;其代码库的开源不仅使 NeuVector 成为开源社区的首选技术,还为受严格监管的客户(包括政企、金融)提供了更可靠的保证。 NeuVector 开源容器镜像可以安装在任何 Kubernetes 集群上,支持包括红帽 OpenShift、VMWare Tanzu、Google GKE、Amazon EKS、Microsoft Azure AKS 等在内的众多企业级容器管理平台。 NeuVector 将驱动 SUSE 旗舰 Kubernetes 管理平台:SUSE Rancher 的容器安全创新,此举将有助于推动 Kubernetes 安全领域的重大生态系统革新,此前这一领域通常由闭源的专有解决方案主导。
② 功能特性
NeuVector 提供强大的端到端容器安全平台。这包括对容器、Pod 和主机的端到端漏洞扫描和完整的运行时保护,包括: CI/CD 漏洞管理和准入控制,使用 Jenkins 插件扫描镜像、扫描注册表并强制实施准入控制规则以将其部署到生产环境中; 违规保护,发现行为并创建基于白名单的策略来检测违反正常行为的行为; 威胁检测,检测容器上的常见应用程序攻击,例如 DDoS 和 DNS 攻击; DLP 和 WAF 传感器,检查网络流量以防止敏感数据丢失,并检测常见的 OWASP Top10 WAF 攻击; 运行时漏洞扫描,扫描注册表、镜像和正在运行的容器编排平台和主机以查找常见 (CVE) 以及特定于应用程序的漏洞; 合规与审计,自动运行 Docker Bench 测试和 Kubernetes CIS Benchmarks- - 端点/主机安全,检测权限升级,监控主机和容器内的进程和文件活动,并监控容器文件系统的可疑活动; 多集群管理。从单个控制台监控和管理多个 Kubernetes 集群。 NeuVector 的其他特性包括隔离容器和通过 SYSLOG 和 webhooks 导出日志的能力,为调查启动数据包捕获,以及与 OpenShift RBACs、 LDAP、 Microsoft AD 和 SSO 与 SAML 的集成。 需要注意的是,隔离意味着所有网络通信都被阻塞,容器将保持并继续运行——只是没有任何网络连接。Kubernetes 不会启动一个容器来替换隔离的容器,因为 api-server 仍然能够到达容器。
③ 全生命周期安全
构建:镜像构建扫描,避免生成有隐患的镜像; 部署:通过准入控制策略机制,避免有隐患的镜像和不符合策略要求的容器部署到环境; 运行:四层/七层防火墙避免外部攻击和数据窃取; 运行:东西向网络动态微隔离,避免内部攻击扩展,WAF 防火墙避免外部攻击; 运行:容器内病毒、木马、破解器防护; 主机、Runtime、 K8S 级别安全基线扫描,合规性评估。
④ 优势
开放性:100% 开源,无需担心供应商锁定; 灵活性:灵活部署各类 Kubernetes 发行版,Rancher、Openshift、EKS、 GKE、ACK、 TKE。 可靠性:7 年迭代,成熟稳定产品; 专业性:专业支持服务,保障业务安全可靠持续运行。
⑤ 部署模式
NeuVector 运行时容器安全方案包括四种类型安全容器:Controllers,Enforcers,Managers,Scanners。其能够部署为一个 Allinone 的特殊容器,也能即将个功能组合在一个容器总,当然也可以在虚拟机或单个操作系统的裸机上面部署。
NeuVector 提供操作系统/Runtime/K8s/容器应用三个层面安全业务进行保护:
二、在 K8S 上安装 Devtron
在 K8S 上安装 Devtron,有两种安装选项:带 CI/CD 模块或不带它。本文不会构建 CI/CD 流程,但是这个模块中包含了一些重要功能。 首先,添加 Devtron Helm 存储库:
$ helm repo add devtron https: / / helm. devtron. ai
$ helm install devtron devtron/ devtron- operator \- - create- namespace - - namespace devtroncd \- - set installer. modules= { cicd}
三、使用 Kind 创建第二个 K8S 集群
为了在本地机器上准备多集群环境,将使用 Kind,通过执行以下命令来创建第二个 K8S 集群 c1:
https: / / kind. sigs. k8s. io/
$ kind create cluster - - name c1
第二个集群的上下文是:kind-c1,创建 Kind 集群后,它将成为默认上下文:
Creating cluster "c1" ... Ensuring node image ( kindest/ node: v1.25 . 2 ) Preparing nodesWriting configurationStarting control- planeInstalling CNI Installing StorageClass
Set kubectl context to "kind-c1"
You can now use your cluster with:
kubectl cluster- info - - context kind- c1
现在的目标是将新创建的 Kind 集群添加为 Devtron 的托管集群,一个 Devtron 实例可以管理多个 K8S 集群。当然,默认情况下,它只管理一个本地集群,在将 Kind 集群添加到 Devtron 仪表板之前,应该首先在该集群上配置权限。以下脚本将生成一个 bearer token 用于身份验证,以便 Devtron 能够与目标集群通信:
$ curl - O https: / / raw. githubusercontent. com/ devtron- labs/ utilities/ main/ kubeconfig- exporter/ kubernetes_export_sa. sh && bash kubernetes_export_sa. sh cd- user devtroncd https: / / raw. githubusercontent. com/ devtron- labs/ utilities/ main/ kubeconfig- exporter/ clusterrole. yaml
bearer token 打印在该命令的输出中,复制它:
All done! Test with:
KUBECONF IG = tmp/ k8s- cd- user- - devtroncd- conf- 7821 . conf kubectl get pods
you should not have any permissions by default - you have just created the authentication part
You will need to create RBAC permissions
SERVER URL : = https: / / 127.0 . 0.1 : 63241
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BEARER TOKEN : = eyJhbGc iOiJSUzI1NiIsImtpZCI6IjlMZ0dqUkU4Z1R6MHpYdnNBVWVWeUdyb1ZldFBkbjJlLWt1ZE52UV9NdzAifQ. eyJhdWQiOlsiaHRØcHM6Ly9rdwJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN8ZXIujoxNjY1Njc1MTkxLCJpYXQi0jE2NjN1ImlzcyI6Imh8dHBz0i8va3viZXuX0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2Ui0iJkZXZ0cm9uY2QiLCJzZXJ2aWNlYWNjb3VudCI6eyJuYW1lIjoiY2QtdXNlciIsInVpZCI6ImJiZmNjZTdhLWUxMTEtNDZlNi1iNzRiLTAxZTc20DQ5ZGM50SJ9fSwi bmJmIjoxNjY1NjcxNTkxLCJzdWI iOiJz eXN0ZW06c2Vydm1 jZWF jY291bnQ6ZGV2dHJvbmNkOmNkLXVzZXIifQ. p_ 9oJFTDjYgzlDIrp0YVCP_ IAMjbGfKks Es7jgpP84mL Ø- - WUWBht4zLBxc3xNFflvwJYa4 . U ØMkRkF4Yq9VojeIKjuAUDmFfT4CDNlfI32WvCuQFVvCboEv0_139biA6T51X0Yyl1dvsLHw2_w8TumgiuKPD63lV6ZaIewNpHu7f6bb7xa4Hp1xqPu_rBLbr7iTSkbHzQGKula9WiJRY3AhYcg0p3h0YKDEh1HpeV9g_HvMFpr0aZR98f8J_OGXiWYWWuRrUlFbYL0S5fele6B7FcUby0uRVXlvRw8GQdnhKaiyna4owgCvBIEH4AYE0XR_ - j8RQ- FttYdg
还必须提供目标集群的 master API 的 URL,由于在 Kind 上运行 K8S,需要获取包含 Kind 的 Docker 容器的内部地址。为了获得它,需要运行以下命令:
$ docker inspect - f '{ { range. NetworkSettings . Networks } } { { . IPAddress } } { { end} } ' c1- control- plane
~ % docker inspect - f 'f ( range . Ne tworkSettings . Ne tworks) il. IPAddress ) llfend) ) ' c1- control- plane
172.19 . 0.2
现在拥有了在 Devtron 仪表板中添加新托管集群所需的所有数据。为此,导航到 Global Configuration 部分,然后选择 Clusters and Environments 项并单击 Add cluster 按钮,需要填写 Kind 集群 URL 和之前生成的 bearer token:
如果一切正常,可以在托管集群列表中看到第二个集群。现在还需要根据下面显示的消息在 Kind 上安装 Devtron 代理:
四、创建环境
定义三个环境,在 Devtron 环境中分配给集群,在本地集群(local)上创建一个环境,和另外两个 Kind 集群(remote-dev, remote-devqa),每个环境都有一个目标命名空间。为了简化,命名空间的名称与环境名称相同,当然也可以设置任何想要的名称:
可以看一下每个集群的详细信息,在这里可以看到 kind-c1 集群的详细视图:
五、添加自定义 Helm 存储库
Devtron 最重要的功能之一是对 Helm 图表的支持。默认情况下,Devtron 中有几个可用的 Helm 存储库,包括 bitnami 或 elastic,也可以添加自定义存储库,在这里使用 Helm 存储库,其中包含用于部署 Spring Boot 应用程序的图表,图表名称是 spring-boot-api-app,最新版本是 0.3.2:
为了在 Devtron 中添加自定义存储库,需要再次进入 Global Configurations 部分,然后转到 Chart repositories 菜单项,然后单击 Add repository 按钮。如下所示,添加一个新存储库 piomin:
创建存储库后,可以转到 Chart Store 部分以验证新图表是否可用:
六、使用 Devtron 部署 Spring Boot 应用程序
现在可以进行实践中最重要的部分:应用程序部署,本文示例 Spring Boot 应用程序可以到Kotlin编写的示例spring引导应用程序下载,这是一个用 Kotlin 编写的简单 REST 应用程序,它公开了一些用于添加和返回人员的 HTTP 端点,并使用内存存储,这是 Spring @RestController:
@ RestController
@ RequestMapping ( "/persons" )
class PersonController ( val repository: PersonRepository ) { val log: Logger = LoggerFactory . getLogger ( PersonController :: class. java) @ GetMapping ( "/{id}" ) fun findById ( @ PathVariable id: Int ) : Person ? { log. info ( "findById({})" , id) return repository. findById ( id) } @ GetMapping ( "/age/{age}" ) fun findByAge ( @ PathVariable age: Int ) : List < Person > { log. info ( "findByAge({})" , age) return repository. findByAge ( age) } @ GetMapping fun findAll ( ) : List < Person > = repository. findAll ( ) @ PostMapping fun add ( @ RequestBody person: Person ) : Person = repository. save ( person) @ PutMapping fun update ( @ RequestBody person: Person ) : Person = repository. update ( person) @ DeleteMapping ( "/{id}" ) fun remove ( @ PathVariable id: Int ) : Boolean = repository. removeById ( id) }
假设正在开发最新版本,想将其部署在 K8S 上以执行一些开发测试,第一步将在本地构建应用程序并使用 Jib Maven 插件将镜像推送到容器注册表,这是所需的配置:
< plugin> < groupId> com. google. cloud. tools< / groupId> < artifactId> jib- maven- plugin< / artifactId> < version> 3.3 . 0 < / version> < configuration> < to> < image> piomin/ sample- spring- kotlin- microservice< / image> < tags> < tag> 1.1 < / tag> < / tags> < / to> < container> < user> 999 < / user> < / container> < / configuration>
< / plugin>
$ mvn clean compile jib: build - Pjib , tomcat
除了 YAML 模板,Helm 存储库还包含一个用于values.yaml 验证的 JSON schema,多亏了该 schema ,将能够利用 Devtron GUI 从图表创建应用程序,那么它是如何工作的呢? 单击自定义图表后,将被重定向到包含详细信息的页面,最新版本的图表是0.3.2. 只需单击部署按钮。在下一页上,需要提供应用程序的配置,目标环境是存在于主集群上的 local,多亏 Devtron 对 Helm values.schema.json 的支持,使得使用 GUI 表单定义所有值。例如,可以增加更改镜像的值到最新的 1.1:
再进行一些测试调用,示例 Spring Boot 公开了 Swagger UI,因此可以轻松发送 HTTP 请求。要与运行在 K8S 上的应用程序交互,应该为服务启用端口转发 kubectl port-forward svc/sample-spring-boot-api 8080:8080。执行该命令后,可以通过 http://localhost:8080/swagger-ui.html 访问地址 Swagger UI:
Devtron 允许查看 pod 日志,还可以用 grep,如下展示了与测试调用相关的日志:
七、将应用部署到远程集群
现在将示例 Spring Boot 应用程序部署到远程集群,为了实现这一点,可以转到与以前相同的页面,但不要选择本地环境,而是选择 remote-dev,它与 kind-c1 集群相关联:
现在,有两个相同的应用程序在两个不同的集群上运行,可以对在 Kind 集群上运行的应用程序和本地集群执行相同的操作,例如验证其状态或检查日志:
八、部署应用组
假设要部署连接到数据库的应用程序,那么可以使用名为 Chart Group 的 Devtron 功能一步完成。使用该功能,可以将 Spring Boot 的 Helm 图表和 Postgres 的图表放在同一个逻辑组中。然后,可以将整个组部署到目标环境中,要创建图表组,请转到 Chart Store 菜单,然后单击 Create Group 按钮,应该设置组的名称并选择将包含的图表。这里来说,就是 bitnami/postgresql 图表和自定义 Helm 图表:
创建组后,将在 Chart Store 主页面上看到它,只需单击它即可部署应用程序:
单击 Deploy to… 按钮后,Devtron 会将重定向到下一页,因此可以为该组的所有成员图表设置目标项目和环境,将它们从集群部署到 kind-c1 集群的 remote-devqa 命名空间中,其中的镜像,可以填写 Docker 帐户中的:piomin/person:1.1。 默认情况下,它会尝试连接到 postgres 主机上的数据库,唯一需要注入应用容器的是 postgresql Secret(由 Bitnami Helm 图表生成)中 postgres 用户密码,要注入该 Secret 中的环境变量,请在自定义 Spring Boot 图表中使用 extraEnvVarsSecret 参数。最后,通过单击 Deploy 按钮在 remove-devqa 命名空间中部署 Spring Boot 和 Postgres:
九、总结
借助 Devtron,可以使用 Helm 图表轻松地支持跨多个 K8S 集群部署应用程序。 Devtron 简化了 K8S 的开发,可以通过图表组功能部署所有需要的应用程序。 可以使用 GUI 仪表板管理和监控应用程序。 可以在仪表板中执行所有操作,而无需自己传递任何 YAML 清单或执行 kubectl 命令。