CD/CD

Chinese, Simplified
SEO Title
CI CD

【CD/CD】不要让安全在在CI / CD环境中落后

Chinese, Simplified

持续集成(CI)和持续交付(CD)或CI / CD是Agile和DevOps软件开发方法的一部分。敏捷开发最突出的方面 - 也是最重要的规则 - 是它要求软件开发通过迭代过程对变化做出响应。

但是软件开发项目通常需要大量代码,这需要时间来编写。错误可能无法识别,并且由于不同的团队正在进行不同的工作,冲突可能会在未检测到的情况下一直滑到过程的后期。这不是敏捷。

CI和CD为这些常见问题提供了解决方案,允许更频繁,更可靠地进行代码更改。安全性是这种可靠性的一部分,但在CI和CD过程中经常会被忽略。

什么是CI / CD,为什么要实施它?


持续集成是一种软件开发方法,要求开发人员按常规计划将代码集成(签入)到共享存储库。代码通常至少每天检查一次,但正确的频率实际上取决于代码更改的频率。

每次登记都由自动构建验证。检测到错误并立即解决。

持续交付基于持续集成,使用自动化解决方案快速部署软件应用程序。在开发过程中通常使用多个环境,例如测试和生产,CD确保有一种自动机制可以快速将代码更改推送到所有环境。 CD还可以自动执行对Web服务器或数据库的所需服务调用,并在进行代码更新时根据需要重新启动数据库。

幸运的是,您不必构建自己的CI系统。有一些工具可以提供一个开箱即用的工具:

  1. Jenkins是一个可扩展的自动服务器,可用作基本的CI服务器。它是一个基于Java的程序,包含适用于Windows,Mac OS X和其他类Unix操作系统的软件包。 Jenkins包括错误检查和内置帮助,它通过Web界面进行简单配置。
  2. TeamCity是JetBrains的基于Java的CI服务器。它允许您在提交源代码更改之前构建,检查和运行自动化测试。进度报告确定了开发过程中的问题


CI和CD的好处包括:

  1. 敏捷 - 敏捷的软件开发方法通常将工作分解为一周或两周的冲刺,因此应用程序是逐步构建的。如果开发人员等到每个sprint结束时集成他们的工作,那么定位和解决错误需要更长的时间。使用CI,频繁的集成可以立即识别错误。它们在识别时得到解决,在开发结束时减少了问题。
  2. 更快的部署 -  CI / CD是构建软件的更快捷方式。频繁的签入和代码测试可以防止您的团队在错误或冲突长时间未被发现的情况下重写大量代码。
  3. 更好的质量 - 开发人员在使用CI / CD时花费更少的时间来修复错误。他们有更多时间专注于更高附加值的任务,例如可用性测试。

为了更深入地了解CI / CD流程,包括最佳实践,我们建议您下载此白皮书。

为什么不能忘记安全性以及如何构建它


请记住,CI和CD的目的是生成可靠的软件。根据定义,这意味着它必须是可信任的。它必须是安全的。

作为DevSecOps方法的一部分,安全性需要从一开始就得到解决,并且应该在整个应用程序生命周期中保持高优先级。他们应该批准整个CI / CD流程以确保其安全,而不是安全团队批准每个软件版本。安全性还应该能够随时监视和运行对进程的安全检查。

让我们看一下流程中的每个步骤,看看如何构建安全性:

CI / CD管道本身的安全性


只要您的团队在设置CI / CD管道时遵循DevSecOps的最佳实践,这不应该成为主要关注的领域。但值得注意的是,这不应该被忽视。

应该跟踪到系统的登录,推送更改应该要求身份验证,并且构建应该存储在安全的服务器上。

集成开发环境(IDE)拉动


在开发人员甚至提交代码之前,应该使用静态分析工具来检查代码是否存在漏洞和编码错误。这些工具易于设置,并且通过在开发过程中识别问题从长远来看节省时间。

这样可以最大限度地减少流程后期所需的代码审查量。示例包括Eclipse,Visual Studio和SpotBugs的Veracode插件。

CI Build


静态应用程序安全性测试(SAST)工具可用于确保代码没有漏洞。 SAST工具从内部检查应用程序,查看源代码,字节代码或应用程序二进制文件以查找安全漏洞。

作为构建过程的一部分,还必须扫描任何第三方代码以确保安全性。假设第三方代码已经过充分测试是不安全的。许多第三方组件也存在零日披露的漏洞,或者依赖于其他具有漏洞的第三方组件。即使你使用的是好的,它可能依赖于不是的代码。必须使用SAST和其他工具来确保不向应用程序引入不安全的代码。

此外,这些工具可以并且应该集成到您的CI环境中。示例包括OWASP依赖关系 - 检查第三方组件检查和Checkmarx for SAST工具。

应用程序部署到开发和测试环境中


验证代码后,将其部署到开发环境中。此时,您需要检查应用程序的运行版本是否存在漏洞。

这可以通过渗透测试工具完成,例如OWASP ZAP和动态应用程序安全测试(DAST)工具。 DAST工具从外部接近应用程序,模仿“机器人攻击者”来发现漏洞。

此过程中使用的任何工具都应该快速运行,因为CI / CD的目的是快速发布。隔夜测试可用于运行更长的代码扫描,以便进行更深入的安全检查。

完全部署到生产环境后,应继续进行安全测试。新的威胁和漏洞不断涌现,因此您无法假设您的代码是安全的。有关SAST工具,DAST工具和其他应用程序安全测试工具的更多详细信息,请参阅我们的博客。

如何在CI / CD管道中有效管理安全性


在CI / CD管道的所有阶段使用各种应用程序安全测试工具是确保应用程序始终处于生产就绪状态的唯一方法。但是,管理所有这些工具的结果可能很困难。

最简单的方法是使用应用程序漏洞管理器。这种类型的DevOps工具不是另一种测试工具。相反,它结合了结果并释放了测试工具的真正力量和潜力。

应用程序漏洞管理器:

  1. 重复结果,使用一组结果而不是混合格式的多个报告提供一个报告。
  2. 通过识别存在漏洞的特定代码行来协助补救管理。
  3. 执行合规性检查,根据HIPAA,国防信息系统机构安全技术实施指南(DISA-STIG)和支付卡行业数据安全标准(PCI DSS)等法规验证您的代码。
  4. 提供混合分析。混合分析结合了SAST和DAST工具的结果,确定哪些潜在漏洞实际可利用,因此您可以先解决最重要的问题。
  5. 允许工作流程集成。与开发人员已经在其中工作的环境集成的工具使得将安全性保持为流程的一部分变得简单。寻找一种工具,为Eclipse,IDE,Jenkins,Visual Studio,Intellij,Burp Suite和OWASP ZAP等流行环境提供插件。

CI / CD是敏捷和DevOps软件开发方法中的重要一步。但是不能牺牲安全性来支持速度。相反,必须将安全性整合到流程的每个步骤中。快速安全的版本是真正成功的CI / CD流程的产物,可以生成对最终用户有价值的软件,并保护这些用户和公司免受漏洞攻击。

原文:https://codedx.com/dont-leave-security-behind-in-your-ci-cd-environment/

本文:http://pub.intelligentx.net/dont-leave-security-behind-your-cicd-environment

讨论:请加入知识星球或者小红圈【首席架构师圈】

SEO Title
Don’t leave security behind in your CI/CD environment

【DevOps】 创建您的第一个 CI/CD 管道!!

Chinese, Simplified

什么是 CI/CD 管道?


CI/CD 管道是为了交付新版本的软件而必须执行的一系列步骤。CI/CD 管道引入了监控和自动化来改进应用程序开发过程,特别是在集成和测试阶段,如以及在交付和部署期间。尽管可以手动执行 CI/CD 管道的每个步骤,但 CI/CD 管道的真正价值是通过自动化实现的。
CI/CD 管道的元素

  • Build — 编译应用程序的阶段。
  • 测试——测试代码的阶段。这里的自动化可以节省时间和精力。
  • 发布——应用程序交付到存储库的阶段。
  • 部署——在这个阶段,代码被部署到生产环境中。
  • 验证和合规性——验证构建的步骤取决于组织的需求。图像安全扫描工具,如 Clair,可以通过将图像与已知漏洞 (CVE) 进行比较来确保图像质量。

Tools

Overview

这就是我们将在本文中创建的内容。


我们用什么?

  • Ec2 Ubuntu
  • Java, Jenkins, Maven
  • Tomcat
  • Docker


设置


1:准备2台Ubuntu服务器。 为“詹金斯”命名一个。 一个为“Tomcat” 推荐超过 t2.small 实例类型。

2:确保您可以 ssh 进入两台服务器。

设置 Jenkins 服务器


1:更新


sudo apt-get update -y

2:安装Java(Java运行环境)


sudo apt search openjdk

3:安装JDK


sudo apt-get install default-jdk -y

4:检查你的版本

ubuntu@jenkins:~$ javac -version
javac 11.0.13ubuntu@jenkins:~$ java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.20.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.20.04, mixed mode, sharing)


5:添加 Jenkins 存储库

curl -fsSL https://pkg.jenkins.io/debian/jenkins.io.key | sudo tee \
    /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
    https://pkg.jenkins.io/debian binary/ | sudo tee \
    /etc/apt/sources.list.d/jenkins.list > /dev/null


6:安装詹金斯

sudo apt update
sudo apt-get install jenkins


7:确认它正在运行。

ubuntu@jenkins:~$ sudo systemctl status jenkins
● jenkins.service - LSB: Start Jenkins at boot time
     Loaded: loaded (/etc/init.d/jenkins; generated)
     Active: active (exited) since Fri 2021-12-31 23:28:46 UTC; 57s ago
       Docs: man:systemd-sysv-generator(8)
      Tasks: 0 (limit: 2355)
     Memory: 0B
     CGroup: /system.slice/jenkins.serviceDec 31 23:28:45 jenkins systemd[1]: 
Starting LSB: Start Jenkins at boot time...
Dec 31 23:28:45 jenkins jenkins[4565]: Correct java version found
Dec 31 23:28:45 jenkins jenkins[4565]:  * Starting Jenkins Automation Server jenkins
Dec 31 23:28:45 jenkins su[4599]: (to jenkins) root on none
Dec 31 23:28:45 jenkins su[4599]: pam_unix(su-l:session): session opened for user jenkins 
by (uid=0)
Dec 31 23:28:45 jenkins su[4599]: pam_unix(su-l:session): session closed for user jenkins
Dec 31 23:28:46 jenkins jenkins[4565]:    ...done.
Dec 31 23:28:46 jenkins systemd[1]: Started LSB: Start Jenkins at boot time.


还要检查 IP + 端口 8080 以查看控制台。

请输入此命令检查密码。

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

8:安装推荐的插件

插件安装完成后,进入控制台,选择“manage jenkins”

完成之后,

9:安装Docker


更新 apt 包索引并安装包以允许 apt 通过 HTTPS 使用存储库:

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release


添加 Docker 的官方 GPG 密钥:


curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg


使用以下命令设置稳定存储库。要添加 nightly 或 test 存储库,请在以下命令中的单词 stable 之后添加单词 nightly 或 test(或两者)。


echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


安装 Docker 引擎


更新apt包索引,安装最新版本的Docker Engine和containerd,或者下一步安装具体版本:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io


列出您的存储库中可用的版本:

apt-cache madison docker-ce

使用第二列中的版本字符串安装特定版本,例如,


sudo apt-get install docker-ce=5:20.10.12~3-0~ubuntu-focal docker-ce-cli=5:20.10.12~3-0~ubuntu-focal containerd.io


通过运行 hello-world 映像来验证 Docker 引擎是否已正确安装。


sudo docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latestHello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bashShare images, automate workflows, and more with a free 
Docker ID:
 https://hub.docker.com/For more examples and ideas, visit:
 https://docs.docker.com/get-started/

 

检查状态

ubuntu@jenkins:~$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-12-31 23:40:27 UTC; 4min 55s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 6261 (dockerd)
Tasks: 9
Memory: 34.4M
CGroup: /system.slice/docker.service
└─6261 /usr/bin/docke


让我们将我们的用户名添加到 docker 组


sudo usermod -aG docker jenkins


安装 Maven

sudo apt updatesudo apt install mavenubuntu@jenkins:~$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.13, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: "linux", version: "5.11.0-1022-aws", arch: "amd64", family: "unix"


设置 Tomcat 服务器


1:安装java(请看前面的步骤)


ubuntu@tomcat:~$ java -version
openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-Ubuntu-0ubuntu1.18.04)
OpenJDK 64-Bit Server VM (build 11.0.13+8-Ubuntu-0ubuntu1.18.04, mixed mode, sharing)


2:安装tomcat

mkdir /prod
cd /prod
sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.56/bin/apache-tomcat-9.0.56.zip
sudo apt install unzipsudo unzip apache-tomcat-9.0.56.zip

3:启动tomcat

cd apache-tomcat-9.0.56/bin
chmod +x catalina.sh
ubuntu@tomcat:/prod/apache-tomcat-9.0.56/bin$ sudo bash startup.sh
Using CATALINA_BASE:   /prod/apache-tomcat-9.0.56
Using CATALINA_HOME:   /prod/apache-tomcat-9.0.56
Using CATALINA_TMPDIR: /prod/apache-tomcat-9.0.56/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /prod/apache-tomcat-9.0.56/bin/bootstrap.jar:
/prod/apache-tomcat-9.0.56/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.

我们可以看到它正在运行。
4:配置设置(对于tomcat 9)

sudo vi /prod/apache-tomcat-9.0.56/webapps/manager/META-INF/context.xml

请注释掉
添加 <role rolename="manager-gui"/>
添加 <user username="tomcat" password="<yourpassword>" roles="manager-gui"/>

另外,我们需要添加用户名

cd ../bin/
ubuntu@tomcat:/prod/apache-tomcat-9.0.56/bin$ sudo bash shutdown.sh
ubuntu@tomcat:/prod/apache-tomcat-9.0.56/bin$ sudo bash startup.sh

在 Jenkins 中创建构建管道


创建一个新项目(管道)

为您的新项目提供一个名称(例如 Pipeline webapp)并选择 Multibranch Pipeline

单击添加源按钮,选择要使用的存储库类型并填写详细信息。

输入您的 GitHub 存储库地址,然后单击验证。

https://github.com/meibutuoyaji/webapp.git

如果没有凭据,则显示正常,然后单击保存。
保存后,您可以在控制台上看到它。

转到您在前面步骤中放置的 GitHub 存储库并在那里创建新文件。

制作一个名为“jenkinsfile”的文件和里面

pipeline {
    agent { docker { image 'maven:3.8.4-openjdk-11-slim' } }
    stages {
        stage('build') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}

如果这篇文章对您有帮助,请点击下方的鼓掌👏按钮数次以表示您对作者的支持👇

原文:https://faun.pub/devops-create-your-first-ci-cd-pipeline-ed054ba1404f

本文:https://jiagoushi.pro/node/2052

SEO Title
[DevOps] Create your first CI/CD pipeline!!