devops_安全扫描您的DevOps管道

devops

安全性是在任何环境中运行的最重要考虑因素之一,使用开源软件是一种在不超出公司环境或家庭设置预算的前提下处理安全性的好方法。 谈论安全性的概念很容易,但是了解可以帮助您实现安全性的工具是另一回事。 本教程介绍了如何使用JenkinsAnchore来设置安全性。

有许多方法可以运行Kubernetes 。 使用Minikube (一种专为本地测试而设计的预打包虚拟机(VM)环境)可以降低运行环境的复杂性。

技术 它是什么?
Jenkins 开源自动化服务器
Anchore 用于检查,分析和认证容器图像的集中服务
Minikube VM内的单节点Kubernetes集群

在本教程中,您将学习如何将Jenkins和Anchore添加到Kubernetes,以及如何为新的容器映像和注册表配置扫描管道。

注意:为了在本教程中获得最佳性能,Minikube至少需要四个CPU。

基本要求

知识

  • Docker(包括Docker Hub帐户)
  • 迷你库
  • 詹金斯
  • Kubectl

软件

  • 迷你库
  • Kubectl客户
  • 本地安装的Anchore CLI

搭建环境

以对您的环境有意义的任何方式安装Minikube 。 如果您有足够的资源,建议您为虚拟机提供更多的默认内存和CPU功能:


   
   
$ minikube config set memory 8192
⚠️  These changes will take effect upon a minikube delete and then a minikube start
$ minikube config set cpus 4
⚠️  These changes will take effect upon a minikube delete and then a minikube start

如果您已经在运行Minikube实例,则必须先使用minikube delete将其删除,然后再继续。

接下来,以对您的操作系统有意义的任何方式安装标准Kubernetes软件包管理器Helm

现在您可以安装应用程序了。

安装和配置Anchore和Jenkins

首先,启动Minikube及其仪表板。


   
   
$ minikube start
😄  minikube v1.1.0 on darwin ( amd64 )
💡  Tip: Use 'minikube start -p <name>' to create a new cluster, or 'minikube delete' to delete this one.
🔄  Restarting existing virtualbox VM for "minikube" ...
⌛  Waiting for SSH access ...
🐳  Configuring environment for Kubernetes v1.14.2 on Docker 18.09.6
🔄  Relaunching Kubernetes v1.14.2 using kubeadm ...
⌛  Verifying: apiserver proxy etcd scheduler controller dns
🏄  Done ! kubectl is now configured to use "minikube"

$ minikube dashboard
🔌  Enabling dashboard ...
🤔  Verifying dashboard health ...
🚀  Launching proxy ...
🤔  Verifying proxy health ...
🎉  Opening http: // 127.0.0.1: 52646 / api / v1 / namespaces / kube-system / services / http:kubernetes-dashboard: / proxy / in your default browser...

只要您保持与该终端会话的联系,您就可以在127.0.0.1:52646访问Minikube的可视仪表板。

Minikube dashboard

创建名称空间并安装Jenkins

下一步是启动并运行Jenkins构建环境。 首先,请确保为持久性配置了存储,以便以后可以重复使用。 在安装Helm之前,请为Persistent Volumes设置存储类,这样其安装将在重新启动后保持不变。

使用CTRL + C退出仪表板或打开一个新终端以运行:


   
   
$ minikube addons enable default-storageclass
✅  default-storageclass was successfully enabled

使用名称空间

我测试了许多不同的应用程序,发现在Kubernetes中使用名称空间非常有用。 将所有内容留在默认名称空间中可能会使它拥挤不堪,并使得卸载Helm安装的应用程序面临挑战。 如果您对Jenkins坚持这一点,则可以通过运行helm del --purge jenkins --namespace jenkins删除它,然后kubectl delete ns jenkins删除它 。 这比手动搜寻和啄一堆容器要容易得多。

安装头盔

要使用Kubernetes的默认软件包管理器Helm,请初始化环境并安装Jenkins。


   
   
$ kubectl create ns jenkins
namespace "jenkins" created
$ helm init
helm init
Creating / Users / alleycat / .helm
Creating / Users / alleycat / .helm / repository
Creating / Users / alleycat / .helm / repository / cache
Creating / Users / alleycat / .helm / repository / local
Creating / Users / alleycat / .helm / plugins
Creating / Users / alleycat / .helm / starters
Creating / Users / alleycat / .helm / cache / archive
Creating / Users / alleycat / .helm / repository / repositories.yaml
Adding stable repo with URL: https: // kubernetes-charts.storage.googleapis.com
Adding local repo with URL: http: // 127.0.0.1: 8879 / charts
$HELM_HOME has been configured at / Users / alleycat / .helm.

Tiller ( the Helm server-side component ) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run ` helm init ` with the --tiller-tls-verify flag.
For more information on securing your installation see: https: // docs.helm.sh / using_helm / #securing-your-helm-installation
$ helm install --name jenkins stable / jenkins --namespace jenkins
NAME:   jenkins
LAST DEPLOYED: Tue May 28 11 : 12 : 39 2019
NAMESPACE: jenkins
STATUS: DEPLOYED

RESOURCES:
== > v1 / ConfigMap
NAME           DATA  AGE
jenkins         5     0s
jenkins-tests   1     0s

== > v1 / Deployment
NAME     READY  UP-TO-DATE  AVAILABLE  AGE
jenkins   0 / 1     1           0          0s

== > v1 / PersistentVolumeClaim
NAME     STATUS   VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
jenkins  Pending  standard  0s

== > v1 / Pod ( related )
NAME                      READY  STATUS   RESTARTS  AGE
jenkins-7565554b8f-cvhbd   0 / 1    Pending   0         0s

== > v1 / Role
NAME                     AGE
jenkins-schedule-agents  0s

== > v1 / RoleBinding
NAME                     AGE
jenkins-schedule-agents  0s

== > v1 / Secret
NAME     TYPE    DATA  AGE
jenkins  Opaque   2     0s

== > v1 / Service
NAME           TYPE          CLUSTER-IP    EXTERNAL-IP  PORT ( S )         AGE
jenkins        LoadBalancer  10.96.90.0     < pending >     8080 : 32015 / TCP  0s
jenkins-agent  ClusterIP     10.103.85.49   < none >       50000 / TCP       0s

== > v1 / ServiceAccount
NAME     SECRETS  AGE
jenkins   1        0s


NOTES:
1 . Get your 'admin' user password by running:
  printf $ ( kubectl get secret --namespace jenkins jenkins -o jsonpath = "{.data.jenkins-admin-password}" | base64 --decode ) ; echo
2 . Get the Jenkins URL to visit by running these commands in the same shell:
  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        You can watch the status of by running 'kubectl get svc --namespace jenkins -w jenkins'
  export SERVICE_IP =$ ( kubectl get svc --namespace jenkins jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}" )
  echo http: // $SERVICE_IP : 8080 / login

3 . Login with the password from step 1 and the username: admin


For more information on running Jenkins on Kubernetes, visit:
https: // cloud.google.com / solutions / jenkins-on-container-engine

注意上面以Bashf开头的Bash单行代码; 它允许您查询Jenkins密码,而没有它则很难找到默认的Jenkins密码 。 记下它并保存以备后用。

设置端口转发以登录到UI

现在,您已经安装了Minikube和Jenkins,请登录以配置Jenkins。 您需要使用Pod名称进行端口转发:


   
   
$ kubectl get pods --namespace jenkins
NAME                       READY     STATUS    RESTARTS   AGE
jenkins-7565554b8f-cvhbd   1 / 1       Running   0          9m

运行以下命令以设置端口转发(使用您的Jenkins Pod名称,该名称将与下面的名称不同):


   
   
# verify your pod name from the namespace named jenkins
kubectl get pods --namespace jenkins
NAME                       READY     STATUS    RESTARTS   AGE
jenkins-7565554b8f-cvhbd   1 / 1       Running   0          37m
# then forward it
$ kubectl port-forward jenkins-7565554b8f-cvhbd 8088 : 8080 -n jenkins
Forwarding from 127.0.0.1: 8088 - > 8080
Forwarding from [ :: 1 ] : 8088 - > 8080

请注意,运行port-forwarding命令后,终端中将需要多个选项卡。

保持此选项卡为打开状态,以维护您的端口转发会话。

通过转到localhost:8088在首选的浏览器中导航到Jenkins。 默认用户名是admin ,密码存储在Kubernetes Secrets中。 在helm install jenkins步骤末尾使用命令:


   
   
$ printf $ ( kubectl get secret --namespace jenkins jenkins -o jsonpath = "{.data.jenkins-admin-password}" | base64 --decode ) ; echo
Jfstacz2vy

登录后,UI将显示“ 欢迎使用Jenkins!

Jenkins UI

从这里开始,我们将不得不为Jenkins安装一些插件,以使我们的管道正常工作。 在主页上,选择左侧的Manage Jenkins

然后选择管理插件

然后选择可用

然后选中下面显示的这些插件旁边的复选框

选中复选框后,滚动到页面底部,然后选择“ 安装而无需重新启动”

部署锚点

Anchore Engine “是一个开源项目,为容器图像的检查,分析和认证提供集中化服务。” 在Minikube中部署它,以对Jenkins管道进行一些安全检查。 为Helm安装添加安全名称空间,然后运行安装:


   
   
$ kubectl create ns security
namespace "security" created
$ helm install --name anchore-engine stable / anchore-engine --namespace security
NAME:   anchore-engine
LAST DEPLOYED: Wed May 29 12 : 22 : 25 2019
NAMESPACE: security
STATUS: DEPLOYED
## And a lot more output

使用以下命令确认服务已启动并正在运行:


   
   
kubectl run -i --tty anchore-cli --restart =Always --image anchore / engine-cli --env ANCHORE_CLI_USER =admin --env ANCHORE_CLI_PASS = ${ANCHORE_CLI_PASS} --env ANCHORE_CLI_URL =http: // anchore-engine-anchore-engine-api.security.svc.cluster.local: 8228 / v1 /
If you don 't see a command prompt, try pressing enter.
[anchore@anchore-cli-86d7fd9568-rmknw anchore-cli]$

如果您登录到Anchore容器(与上面类似),则系统处于联机状态。 Anchore的默认密码是admin / foobar 。 键入exit离开终端。

再次使用端口转发从主机系统访问Anchore Engine API:


   
   
$ kubectl get pods --namespace security
NAME                                                         READY     STATUS    RESTARTS   AGE
anchore-engine-anchore-engine-analyzer-7cf5958795-wtw69       1 / 1       Running   0          3m
anchore-engine-anchore-engine-api-5c4cdb5587-mxkd7           1 / 1       Running   0          3m
anchore-engine-anchore-engine-catalog-648fcf54fd-b8thl       1 / 1       Running   0          3m
anchore-engine-anchore-engine-policy-7b78dd57f4-5dwsx         1 / 1       Running   0          3m
anchore-engine-anchore-engine-simplequeue-859c989f99-5dwgf   1 / 1       Running   0          3m
anchore-engine-postgresql-844dfcc468-s92c5                   1 / 1       Running   0          3m
# Find the API pod name above and add it to the command below
$ kubectl port-forward anchore-engine-anchore-engine-api-5c4cdb5587-mxkd7 8228 : 8228 --namespace security

加入安克雷和詹金斯

返回http://127.0.0.1:8088/的Jenkins UI。 在主菜单上,单击管理Jenkins>管理插件 。 选择“ 可用”标签,然后向下滚动或搜索“ 锚定容器图像扫描仪插件” 。 选中插件旁边的框,然后选择“ 不重新启动就安装”

Jenkins plugin manager

安装完成后,返回Jenkins的主菜单,然后选择Manage Jenkins ,然后选择Configure System 。 向下滚动到“ 锚点配置” 。 确认已选择引擎模式并输入URL,该URL是从Helm安装中输出的。 添加用户名和密码(默认为admin / foobar )。 出于调试目的,请选中“ 启用DEBUG日志记录”

Anchore plugin mode

现在已经配置了插件,您可以设置一个Jenkins管道来扫描您的容器构建。

詹金斯管道和锚固扫描

此设置的目的是能够即时检查容器映像,以确保它们满足安全要求。 为此,请使用Anchore Engine并授予其访问图像的权限。 在此示例中,它们位于Docker Hub上,但也可以位于Quay或Anchore支持的任何其他容器注册表中

为了在命令行上运行必要的命令,我们需要找到我们的Anchore Pod名称,然后使用kubectl exec SSH到其中:


   
   
$ kubectl get all
NAME                               READY     STATUS    RESTARTS   AGE
pod / anchore-cli-86d7fd9568-rmknw   1 / 1       Running   2          2d

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT ( S )   AGE
service / kubernetes   ClusterIP   10.96.0.1     < none >         443 / TCP   7d

NAME                          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps / anchore-cli   1         1         1             1           2d

NAME                                     DESIRED   CURRENT   READY     AGE
replicaset.apps / anchore-cli-86d7fd9568   1         1         1         2d
# Let’s connect to our anchore-cli pod
$ kubectl exec -it anchore-cli-86d7fd9568-rmknw -i -t -- bash
[ anchore @ anchore-cli-86d7fd9568-rmknw anchore-cli ] $ anchore-cli --u admin   --p foobar  registry add index.docker.io < username > < password >
Registry: index.docker.io
User: jrepka
Type: docker_v2
Verify TLS: True
Created: 2019 -05-14T22: 37 :59Z
Updated: 2019 -05-14T22: 37 :59Z

Anchore Engine现在可以使用您的注册表了。 有几种方法可以做到这一点,包括:

  • 分析图像
  • 检查图像内容
  • 扫描储存库
  • 查看安全漏洞

将Anchore Engine指向图像,以根据您的策略对其进行分析。 在测试中,我们将使用可公开获得的Cassandra图片:


   
   
[ anchore @ anchore-cli-86d7fd9568-rmknw anchore-cli ] $ anchore-cli --u admin   --p foobar   image add
docker.io / library / cassandra:latest

Image Digest: sha256:7f7afff84384e36593b085d62e087674029de9aced4482c7780f155d8ee55fad
Parent Digest: sha256:800084987d58c2a62daeea4662ecdd79fd4928d449279bd410ef7690ef482469
Analysis Status: not_analyzed
Image Type: docker
Analyzed At: None
Image ID: a34c036183d18527684cdb613fbb1c806c7e1bc26f6911dcc25e918aa7b093fc
Dockerfile Mode: None
Distro: None
Distro Version: None
Size: None
Architecture: None
Layer Count: None

Full Tag: docker.io / library / cassandra:latest
Tag Detected At: 2019 -07-09T17: 44 :45Z

您还需要获取默认的策略ID,以针对您的管道进行测试。 (在以后的文章中,我将介绍自定义策略和白名单规则。)

运行以下命令以获取策略ID:


   
   
[ anchore @ anchore-cli-86d7fd9568-rmknw anchore-cli ] $ anchore-cli --u admin   --p foobar policy list

Policy ID                                   Active        Created                     Updated                    
2c53a13c- 1765 -11e8-82ef-23527761d060        True           2019 -05-14T22: 12 :05Z         2019 -05-14T22: 12 :05Z

现在,您已经添加了注册表和所需的图像,您可以构建管道以对其进行连续扫描。

扫描按以下顺序进行: 构建,推送,扫描。 为了防止不符合安全要求的映像进入生产环境,我建议采用分层方法进行安全扫描:将容器映像提升到单独的开发环境,并仅在通过Anchore Engine的扫描后才将其提升到生产环境。

在配置自定义策略之前,我们不会做任何令人兴奋的事情,因此,我们将通过运行Hello World版本来确保扫描成功完成。 下面是用Groovy编写的示例工作流:


   
   
node {
    echo 'Hello World'
}

要运行此代码,请登录到localhost:8088的Jenkins UI,选择New Item,Pipeline,然后将此代码块放入Pipeline Script区域。

The "Hello World" of Jenkins

由于我们要构建上面添加的整个Cassandra图像,因此需要一些时间才能完成。 同时,您将看到一个闪烁的红色图标。

Jenkins building
它最终将完成并通过。 这意味着我们已正确设置了所有内容。

这是一个包装

如果到此为止,您将可以使用Jenkins和Anchore Engine运行Minikube配置。 您还可以在容器注册表服务上托管一个或多个图像,并且当图像不符合默认策略时,Jenkins可以显示错误。 在下一篇文章中,我们将构建一个自定义管道,以验证Anchore Engine设置的安全策略。

只要在Jenkins中正确配置了凭据,Anchore也可以用于扫描大型Amazon Elastic Container Registries(ECR)。

其他资源

对于一篇文章,这是很多信息。 如果您想了解更多详细信息,以下链接(包括本教程中所有示例的GitHub)可能会有所帮助:

您是否希望在下一个教程中构建任何特定的管道? 在评论中让我知道。

翻译自: https://opensource.com/article/19/7/security-scanning-your-devops-pipeline

devops

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值