devops
安全性是在任何环境中运行的最重要考虑因素之一,使用开源软件是一种在不超出公司环境或家庭设置预算的前提下处理安全性的好方法。 谈论安全性的概念很容易,但是了解可以帮助您实现安全性的工具是另一回事。 本教程介绍了如何使用Jenkins和Anchore来设置安全性。
有许多方法可以运行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的可视仪表板。
创建名称空间并安装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安装一些插件,以使我们的管道正常工作。 在主页上,选择左侧的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的主菜单,然后选择Manage Jenkins ,然后选择Configure System 。 向下滚动到“ 锚点配置” 。 确认已选择引擎模式并输入URL,该URL是从Helm安装中输出的。 添加用户名和密码(默认为admin / foobar )。 出于调试目的,请选中“ 启用DEBUG日志记录” 。
现在已经配置了插件,您可以设置一个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区域。
由于我们要构建上面添加的整个Cassandra图像,因此需要一些时间才能完成。 同时,您将看到一个闪烁的红色图标。
这是一个包装
如果到此为止,您将可以使用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