From e5158ed234f6a1ef6f94e32a2e0685793db5c6b5 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Mon, 17 Feb 2025 11:15:03 -0800 Subject: [PATCH 01/68] added lessons --- .../topic-1-git/chapter-5-advanced-git-techniques/index.md | 0 .../topic-3-devsecops/chapter-3-security-frameworks/index.md | 0 docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md | 0 .../chapter-5-threat-modeling-and-risk-assessment/index.md | 0 .../chapter-6-secure-code-and-hardening/index.md | 0 .../labs/sql-injection-lab.md | 0 .../topic-3-devsecops/chapter-7-supply-chain-security/index.md | 0 .../labs/detecting-vulnerabilities-lab.md | 1 + 8 files changed, 1 insertion(+) create mode 100644 docs/course/topic-1-git/chapter-5-advanced-git-techniques/index.md create mode 100644 docs/course/topic-3-devsecops/chapter-3-security-frameworks/index.md create mode 100644 docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md create mode 100644 docs/course/topic-3-devsecops/chapter-5-threat-modeling-and-risk-assessment/index.md create mode 100644 docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/index.md create mode 100644 docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/sql-injection-lab.md create mode 100644 docs/course/topic-3-devsecops/chapter-7-supply-chain-security/index.md create mode 100644 docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md diff --git a/docs/course/topic-1-git/chapter-5-advanced-git-techniques/index.md b/docs/course/topic-1-git/chapter-5-advanced-git-techniques/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-3-security-frameworks/index.md b/docs/course/topic-3-devsecops/chapter-3-security-frameworks/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md b/docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-5-threat-modeling-and-risk-assessment/index.md b/docs/course/topic-3-devsecops/chapter-5-threat-modeling-and-risk-assessment/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/index.md b/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/sql-injection-lab.md b/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/sql-injection-lab.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/index.md b/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md b/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md new file mode 100644 index 0000000..66aef38 --- /dev/null +++ b/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md @@ -0,0 +1 @@ +detecting vulnerabilities in open source dependencies \ No newline at end of file From 1ec789c25248a1f46feee7e8a2eb9d780c0e788a Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Mon, 17 Feb 2025 11:17:56 -0800 Subject: [PATCH 02/68] added some labs --- .../labs/securing-a-vulnerable-web-app.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/securing-a-vulnerable-web-app.md diff --git a/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/securing-a-vulnerable-web-app.md b/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/securing-a-vulnerable-web-app.md new file mode 100644 index 0000000..e69de29 From 62d1914125dc88abea4e3f4d53cb60d783613cfe Mon Sep 17 00:00:00 2001 From: jsmargarones Date: Fri, 18 Apr 2025 15:26:47 -0700 Subject: [PATCH 03/68] Changes to structure of topics and chapters --- .../chapter-1-SDLC/index.md | 11 ++ .../chapter-2-version-control/index.md | 38 ++++++ .../chapter-3-intro-to-devOps}/index.md | 6 +- .../chapter-4-intro-to-cicd/index.md | 124 ++++++++++++++++++ .../chapter-5-intro-to-devsecops/index.md | 104 +++++++++++++++ .../index.md | 18 +++ .../review-and-knowledge-check/index.md | 9 ++ .../chapter-1-version-control/index.md | 4 +- .../chapter-2-understanding-git/Git.jpg | Bin .../chapter-2-understanding-git/index.md | 2 +- .../lab/csd-lab-1.md | 0 .../chapter-3-Intermediate-Concepts/index.md | 2 +- .../lab/git-lab-1.md | 2 +- .../chapter-4-git-best-practices/index.md | 2 +- .../index.md | 9 ++ .../{topic-1-git => Topic-2-Git}/index.md | 6 +- .../review-and-knowledge-check/index.md | 9 ++ .../chapter-1-cicd-core-concepts}/index.md | 6 +- .../chapter-2-webhooks}/index.md | 6 +- .../chapter-3-automated-testing}/index.md | 6 +- .../chapter-4-deployment}/index.md | 6 +- .../lab/deployment-lab-1.md | 4 +- .../lab/imgs/jenkins-login.png | Bin .../lab/imgs/wireguard.png | Bin .../chapter-4-deployment}/lab/overview.md | 4 +- .../chapter-5-containerization}/index.md | 6 +- .../lab/containerization-lab-1.md | 4 +- .../lab/containerization-lab-2.md | 4 +- .../lab/imgs/clone.png | Bin .../lab/imgs/dashboard.png | Bin .../lab/imgs/fork.png | Bin .../lab/imgs/wireguard.png | Bin .../lab/overview.md | 4 +- docs/course/Topic-3-CICD-Concepts/index.md | 13 ++ .../review-and-knowledge-check/index.md | 9 ++ .../chapter-1-devsecops/index.md | 2 +- .../labs/devsecops-lab-1.md | 0 .../index.md | 2 +- .../lab/devsecops-lab-1.md | 0 .../lab/overview.md | 0 .../index.md | 4 +- docs/course/Topic-5-Cloud/index.md | 15 +++ .../index.md | 0 docs/course/topic-2-DevOps/index.md | 19 --- .../chapter-3-security-frameworks/index.md | 0 .../chapter-4-cloud-security/index.md | 0 .../index.md | 0 .../index.md | 0 .../labs/securing-a-vulnerable-web-app.md | 0 .../labs/sql-injection-lab.md | 0 .../chapter-7-supply-chain-security/index.md | 0 .../labs/detecting-vulnerabilities-lab.md | 1 - docs/other/index.md | 2 +- index.md | 10 -- 54 files changed, 401 insertions(+), 72 deletions(-) create mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md create mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md rename docs/course/{topic-2-DevOps/chapter-1-intro-to-devops => Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps}/index.md (99%) create mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md create mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md create mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md create mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md rename docs/course/{topic-1-git => Topic-2-Git}/chapter-1-version-control/index.md (97%) rename docs/course/{topic-1-git => Topic-2-Git}/chapter-2-understanding-git/Git.jpg (100%) rename docs/course/{topic-1-git => Topic-2-Git}/chapter-2-understanding-git/index.md (99%) rename docs/course/{topic-1-git => Topic-2-Git}/chapter-2-understanding-git/lab/csd-lab-1.md (100%) rename docs/course/{topic-1-git => Topic-2-Git}/chapter-3-Intermediate-Concepts/index.md (99%) rename docs/course/{topic-1-git => Topic-2-Git}/chapter-3-Intermediate-Concepts/lab/git-lab-1.md (98%) rename docs/course/{topic-1-git => Topic-2-Git}/chapter-4-git-best-practices/index.md (99%) create mode 100644 docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md rename docs/course/{topic-1-git => Topic-2-Git}/index.md (95%) create mode 100644 docs/course/Topic-2-Git/review-and-knowledge-check/index.md rename docs/course/{topic-2-DevOps/chapter-2-intro-to-ci-cd => Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts}/index.md (98%) rename docs/course/{topic-2-DevOps/chapter-4-webhooks => Topic-3-CICD-Concepts/chapter-2-webhooks}/index.md (97%) rename docs/course/{topic-2-DevOps/chapter-5-automation => Topic-3-CICD-Concepts/chapter-3-automated-testing}/index.md (98%) rename docs/course/{topic-2-DevOps/chapter-6-deployment => Topic-3-CICD-Concepts/chapter-4-deployment}/index.md (99%) rename docs/course/{topic-2-DevOps/chapter-6-deployment => Topic-3-CICD-Concepts/chapter-4-deployment}/lab/deployment-lab-1.md (99%) rename docs/course/{topic-2-DevOps/chapter-6-deployment => Topic-3-CICD-Concepts/chapter-4-deployment}/lab/imgs/jenkins-login.png (100%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-4-deployment}/lab/imgs/wireguard.png (100%) rename docs/course/{topic-2-DevOps/chapter-6-deployment => Topic-3-CICD-Concepts/chapter-4-deployment}/lab/overview.md (96%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/index.md (99%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/containerization-lab-1.md (99%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/containerization-lab-2.md (98%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/imgs/clone.png (100%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/imgs/dashboard.png (100%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/imgs/fork.png (100%) rename docs/course/{topic-2-DevOps/chapter-6-deployment => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/imgs/wireguard.png (100%) rename docs/course/{topic-2-DevOps/chapter-3-containerization => Topic-3-CICD-Concepts/chapter-5-containerization}/lab/overview.md (96%) create mode 100644 docs/course/Topic-3-CICD-Concepts/index.md create mode 100644 docs/course/Topic-3-CICD-Concepts/review-and-knowledge-check/index.md rename docs/course/{topic-3-devsecops => Topic-4-Devsecops-Fundmentals}/chapter-1-devsecops/index.md (99%) rename docs/course/{topic-3-devsecops => Topic-4-Devsecops-Fundmentals}/chapter-1-devsecops/labs/devsecops-lab-1.md (100%) rename docs/course/{topic-3-devsecops => Topic-4-Devsecops-Fundmentals}/chapter-2-security-checks-in-CICD/index.md (99%) rename docs/course/{topic-3-devsecops => Topic-4-Devsecops-Fundmentals}/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md (100%) rename docs/course/{topic-3-devsecops => Topic-4-Devsecops-Fundmentals}/chapter-2-security-checks-in-CICD/lab/overview.md (100%) rename docs/course/{topic-3-devsecops => Topic-4-Devsecops-Fundmentals}/index.md (90%) create mode 100644 docs/course/Topic-5-Cloud/index.md delete mode 100644 docs/course/topic-1-git/chapter-5-advanced-git-techniques/index.md delete mode 100644 docs/course/topic-2-DevOps/index.md delete mode 100644 docs/course/topic-3-devsecops/chapter-3-security-frameworks/index.md delete mode 100644 docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md delete mode 100644 docs/course/topic-3-devsecops/chapter-5-threat-modeling-and-risk-assessment/index.md delete mode 100644 docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/index.md delete mode 100644 docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/securing-a-vulnerable-web-app.md delete mode 100644 docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/sql-injection-lab.md delete mode 100644 docs/course/topic-3-devsecops/chapter-7-supply-chain-security/index.md delete mode 100644 docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md new file mode 100644 index 0000000..0676e56 --- /dev/null +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md @@ -0,0 +1,11 @@ +--- +title: Chapter 1 - Introduction to SDLC +layout: custom +parent: Topic 1 - Introduction to SDLC and DevSecOps +has_children: false +has_toc: false +nav_order: 1 +--- + +# Chapter 1 - Introduction to SDLC +## What is the Software Development Lifecycle (SDLC)? diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md new file mode 100644 index 0000000..0f72ec8 --- /dev/null +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md @@ -0,0 +1,38 @@ +--- +title: Chapter 2 - Version Control +layout: custom +parent: Topic 1 - Introduction to SDLC and DevSecOps +has_children: false +has_toc: false +nav_order: 2 +--- + +# Chapter 1 - Introduction to Version Control +## What is version control? +Version control is **a system that records changes to a file or set of files over time** so that you can recall specific versions later. It's a critical tool in modern software development, allowing developers to work collaboratively, track every modification, and revert to previous states if necessary. + +> **Example Scenario** +> +> Armine and Tigran are part of a software development team tasked with creating a new mobile application. Armine is tasked with refining the user authentication system, while Tigran is implementing an innovative feature that allows users to share media within the app. +> +> **Without Version Control**: If Armine and Tigran are editing the same file, Tigran's latest upload could accidentally overwrite the changes Armine made, resulting in a loss of progress and potential conflicts in the code. +> +> **With Version Control**: Armine and Tigran can work on their updates concurrently without the risk of interfering with each other's contributions. Here's how it unfolds: +> +> - Independently, they make their changes and commit their updates to the version control system, each creating a new version in the repository. +> +> - The version control system alerts them to the presence of new, separate updates, signaling that a merge of changes is necessary. +> +> - Together, they examine the differences, carefully integrate their respective code changes, and commit the unified version to the repository. +> +> - Should an issue arise with the authentication update, Armine can revert her portion of the code to a previous state without disrupting Tigran's feature, thanks to the version history maintained by the system. + +A common tool for version control is GitHub. GitHub allows you acts as a central hub for all of the different versions of your code, kind of how in google docs you can see the history of your changes. Though there are many different systems for version control, we will be learning using GitHubs features. The syntax and user interface of different products are different, but the core elements are the same. + +### References +
+ Expand + 1. Atlassian. “What Is Version Control: Atlassian Git Tutorial.” Atlassian, www.atlassian.com/git/tutorials/what-is-version-control. Accessed 15 Apr. 2024.
+ 2. “1.1 Getting Started - about Version Control.” Git, git-scm.com/book/en/v2/Getting-Started-About-Version-Control. Accessed 15 Apr. 2024.
+ 3. “What Is Version Control?” GitLab, GitLab, 4 Apr. 2023, about.gitlab.com/topics/version-control/.
+
\ No newline at end of file diff --git a/docs/course/topic-2-DevOps/chapter-1-intro-to-devops/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md similarity index 99% rename from docs/course/topic-2-DevOps/chapter-1-intro-to-devops/index.md rename to docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md index 2632916..32c0965 100644 --- a/docs/course/topic-2-DevOps/chapter-1-intro-to-devops/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 1 - Intro to DevOps +title: Chapter 3 - Intro to DevOps layout: custom -parent: Topic 2 - DevOps +parent: Topic 1 - Introduction to SDLC and DevSecOps has_children: false has_toc: false -nav_order: 1 +nav_order: 3 --- # Introduction to DevOps ## Problem Space diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md new file mode 100644 index 0000000..8dd0a2d --- /dev/null +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md @@ -0,0 +1,124 @@ +--- +title: Chapter 4 - Intro to CI/CD +layout: custom +parent: Topic 1 - Introduction to SDLC and DevSecOps +has_children: false +has_toc: false +nav_order: 4 +--- + +# Introduction to CI/CD +

CI/CD, short for Continuous Integration and Continuous Delivery, is a part of the DevOps process. “It is a collection of principles and practices designed to help development teams ensure the reliable delivery of frequent code changes.”

+ +
+ CI/CD Lifecycle +

Source: Mind The Product

+ +
+ +## DevOps vs. CI/CD + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoryDevOpsCICD
PurposeFacilitate collaboration and efficiency across the development lifecycle.Automate testing to ensure code compatibility.Automate deployment for seamless software releases.
Methods +
    +
  • Implement automation to streamline collaboration between development and operations teams.
  • +
  • Use infrastructure as code (IaC) to provision and manage infrastructure.
  • +
  • Integrate continuous feedback loops to gather insights from stakeholders and improve processes iteratively.
  • +
+
+
    +
  • Automate the build and testing process for every code change.
  • +
  • Identify integration issues early in the development lifecycle.
  • +
  • Support the principle of "fail fast" by providing rapid feedback to developers.
  • +
+
+
    +
  • Encompass both Continuous Integration and Continuous Deployment.
  • +
  • Automate the deployment process to production environments.
  • +
  • Enable organizations to release software updates quickly and reliably while minimizing risks.
  • +
+
Key Benefits +
    +
  • Promotes a culture of shared responsibility and accountability.
  • +
  • Emphasizes the importance of automating repetitive tasks to reduce manual errors and increase efficiency.
  • +
  • Focuses on delivering value to customers through rapid and iterative development cycles.
  • +
+
+
    +
  • Increases code quality by identifying issues early in the development process.
  • +
  • Speeds up the development cycle by automating build and testing processes.
  • +
  • Enables rapid feedback to developers for quick iterations.
  • +
+
+
    +
  • Accelerates time to market by automating deployment processes.
  • +
  • Minimizes risks associated with manual deployments.
  • +
  • Enhances overall software reliability and stability.
  • +
+
+ +### References +
+ Expand + 1. Ashtari, Hossein et al. “Key Differences between CI/CD and DevOps.” Spiceworks, www.spiceworks.com/tech/devops/articles/cicd-vs-devops/. Accessed 20 Feb. 2024.
+ 2. Ferringer, Megan. “Here’s the Difference between CI/CD and Devops-and How They Work Together to Drive Innovation.” Navisite, 2 Mar. 2023, www.navisite.com/blog/insights/ci-cd-vs-devops/.
+ 3. “What the Hell Are CI/CD and DevOps? A Cheatsheet for the Rest of Us.” Mind the Product, www.mindtheproduct.com/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/. Accessed 20 Feb. 2024.
+ 4. “The IDEAL & Practical CI / CD Pipeline - Concepts Overview.” YouTube, 17 Feb. 2022, www.youtube.com/watch?v=OPwU3UWCxhw.
+ 5. Morg, Brad. “How to Design a Modern CI/CD Pipeline.” YouTube, 17 Oct. 2023, www.youtube.com/watch?v=KnSBNd3b0qI.
+ 6. Morg, Brad. “How to Design a Deployment Pipeline (GitOps).” YouTube, 30 Oct. 2023, www.youtube.com/watch?v=pJ9f7w4AxtU.
+
diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md new file mode 100644 index 0000000..7d641f7 --- /dev/null +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md @@ -0,0 +1,104 @@ +--- +title: Chapter 5 - Introduction to DevSecOps +layout: custom +parent: Topic 1 - Introduction to SDLC and DevSecOps +has_children: false +has_toc: false +nav_order: 5 +--- + + +# Chapter 5 - Introduction to DevSecOps + +## Defining DevSecOps +- Dev = Development +- Sec = Security +- Ops = Operations + +**DevSecOps is a methodology that integrates security practices within the DevOps process.** The main goal of DevSecOps is to embed security in every part of the development lifecycle, from initial design through integration, testing, deployment, and software delivery. + +Ok, now what? You just have to start integrating this into your coding practices? Actually yes, the whole reason this curriculum is applicable for every person working in IT is because it is best development practice to have a secure lifecycle throughout all of the processes IT goes through when developing a project. + +
+ DevSecOps +

Source: Red Hat

+
+ + + + +## Why Implement DevSecOps: + +**The Importance of Security in SDLC:** + +The software development lifecycle (SDLC) is a framework used to develop, deploy, and maintain software. A common problem in software development is that security related activities are deferred until the testing phase, which is late in the SDLC after most of the critical design and implementation has been completed. Missing a security related risk could be costly, set back progress, and go unnoticed causing room for further severe impact. + +**What is "Shift" Testing:** + +"Shift left" and "shift right" are terms that emphasize implementing security practices throughout the SDLC. By adopting shift left and shift right principles, teams are able to fix security flaws early on. They are meant to evaluate and ensure quality of the project by focusing on continuous testing methods. + +To **shift left** is to incorporate security testing as soon as possible to find vulnerabilities and fix defects as early as possible in development. + +To **shift right** is to monitor user behavior, usage, performance, and security metrics in the production stage to verify software operability. + +

Source: Red Hat

+ + + + +## Tools and technologies: + +
Infrastructure as code scanning +

+ +

  • DevSecOps teams use open source tools like Terraform to manage and provision infrastructure like networks, virtual machines, and load balancers through code rather than doing it manually
  • + +
  • Terraform helps ensure that infrastructure is set up and updated consistently across hundreds or thousands of servers
  • + +
  • Infrastructure as a code scanning tools automatically check the infrastructure at the code level for noncompliance with security policies and standards
  • +

    Source: Microsoft

    +

    +
    + + + +
    Dynamic and Static Application Security Testing +

    + +

  • Dynamic application security testing: This process of testing tests the methods a bad actor might use to attack an application. This testing occurs while the application is running and is based on predefined use cases.
  • + +
  • Static application security testing: Before their code compiles, DevSecOps developers begin testing their custom code for security vulnerabilities. Static application security testing tools make this process easier with automatic checks and real-time feedback, often specifying exactly where an vulnerability is
  • + +
  • +

    Source: Microsoft

    +

    +
    + + +
    Container Scanning +

    + +

  • Container: A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another
  • + +
  • Containers are widely used in DevSecOps because they help developers easily deploy self-contained units of code
  • + +
  • Container Image: Within a container is a container image, which is a executable software bundle that runs processes for the container. These images are often built using existing images or pulled from public repositories.
  • + +

    Source 1: Docker

    +

    Source 2: Microsoft

    +

    +
    + + + + +### References + +**1.** “What is DevSecOps?” *Red Hat*, [https://www.redhat.com/en/topics/devops/what-is-devsecops](https://www.redhat.com/en/topics/devops/what-is-devsecops). Accessed 8 Apr. 2024. + +**2.** “What is DevSecOps?” *Microsoft*, [https://www.microsoft.com/en-us/security/business/security-101/what-is-devsecops](https://www.microsoft.com/en-us/security/business/security-101/what-is-devsecops). Accessed 8 Apr. 2024. + +**3.** “Use containers to Build, Share and Run your applications” *Docker*, [https://www.docker.com/resources/what-container/](https://www.docker.com/resources/what-container/). Accessed 8 Apr. 2024. + +**4.** “Shift left vs. shift right” *Red Hat*, [https://www.redhat.com/en/topics/devops/shift-left-vs-shift-right](https://www.redhat.com/en/topics/devops/shift-left-vs-shift-right). Accessed 8 Apr. 2024. + diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md new file mode 100644 index 0000000..2bbd54b --- /dev/null +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md @@ -0,0 +1,18 @@ +--- +title: Topic 1 - Introduction to SDLC and DevSecOps +layout: custom +parent: +has_children: true +has_toc: false +nav_order: 3 +--- + +# Topic 1 - Introduction to the SDLC and DevSecOps + +| Chapter | Learning Objectives | Lab Description | +|---------|---------------------|-----------------| +| Chapter 1: Introduction to SDLC | - Define Software Development Lifecycle
    - Understand the basics of SDLC methodologies
    - Explore the benefits of using different methodologies
    | | +| Chapter 2: Intro to Version Control | - Define version control
    - Understand the basics of version control systems
    - Explore the benefits of using version control
    - Introduction to common version control tools| | +| Chapter 3: Introduction to DevOps | - Define DevOps
    | +| Chapter 4: Introduction to CI/CD | - Establish effective documentation habits
    - Discuss the importance of READMEs and wikis
    - Explore best practices for inline code commenting | +| Chapter 4: Securing SDLC with DevSecOps | - Define DevSecOps
    | | \ No newline at end of file diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md new file mode 100644 index 0000000..7ba6a92 --- /dev/null +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md @@ -0,0 +1,9 @@ +--- +title: Topic Review and Knowledge Check +layout: custom +parent: Topic 1 - Introduction to SDLC and DevSecOps +has_toc: false +nav_order: 6 +--- + +# Topic Review and Knowledge Check \ No newline at end of file diff --git a/docs/course/topic-1-git/chapter-1-version-control/index.md b/docs/course/Topic-2-Git/chapter-1-version-control/index.md similarity index 97% rename from docs/course/topic-1-git/chapter-1-version-control/index.md rename to docs/course/Topic-2-Git/chapter-1-version-control/index.md index 97e85f6..2d5aa6e 100644 --- a/docs/course/topic-1-git/chapter-1-version-control/index.md +++ b/docs/course/Topic-2-Git/chapter-1-version-control/index.md @@ -1,7 +1,7 @@ --- -title: Chapter 1 - Introduction to Version Control +title: Chapter 1 - Version Control layout: custom -parent: Topic 1 - Git +parent: Topic 2 - Git has_children: false has_toc: false nav_order: 1 diff --git a/docs/course/topic-1-git/chapter-2-understanding-git/Git.jpg b/docs/course/Topic-2-Git/chapter-2-understanding-git/Git.jpg similarity index 100% rename from docs/course/topic-1-git/chapter-2-understanding-git/Git.jpg rename to docs/course/Topic-2-Git/chapter-2-understanding-git/Git.jpg diff --git a/docs/course/topic-1-git/chapter-2-understanding-git/index.md b/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md similarity index 99% rename from docs/course/topic-1-git/chapter-2-understanding-git/index.md rename to docs/course/Topic-2-Git/chapter-2-understanding-git/index.md index bac5343..2410bc7 100644 --- a/docs/course/topic-1-git/chapter-2-understanding-git/index.md +++ b/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md @@ -1,7 +1,7 @@ --- title: Chapter 2 - Git Fundamentals layout: custom -parent: Topic 1 - Git +parent: Topic 2 - Git has_toc: false has_children: false nav_order: 2 diff --git a/docs/course/topic-1-git/chapter-2-understanding-git/lab/csd-lab-1.md b/docs/course/Topic-2-Git/chapter-2-understanding-git/lab/csd-lab-1.md similarity index 100% rename from docs/course/topic-1-git/chapter-2-understanding-git/lab/csd-lab-1.md rename to docs/course/Topic-2-Git/chapter-2-understanding-git/lab/csd-lab-1.md diff --git a/docs/course/topic-1-git/chapter-3-Intermediate-Concepts/index.md b/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md similarity index 99% rename from docs/course/topic-1-git/chapter-3-Intermediate-Concepts/index.md rename to docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md index 1929e27..dccd1bd 100644 --- a/docs/course/topic-1-git/chapter-3-Intermediate-Concepts/index.md +++ b/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md @@ -1,7 +1,7 @@ --- title: Chapter 3 - Git Intermediate Concepts layout: custom -parent: Topic 1 - Git +parent: Topic 2 - Git has_children: true has_toc: false nav_order: 3 diff --git a/docs/course/topic-1-git/chapter-3-Intermediate-Concepts/lab/git-lab-1.md b/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/lab/git-lab-1.md similarity index 98% rename from docs/course/topic-1-git/chapter-3-Intermediate-Concepts/lab/git-lab-1.md rename to docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/lab/git-lab-1.md index b30f237..b20615c 100644 --- a/docs/course/topic-1-git/chapter-3-Intermediate-Concepts/lab/git-lab-1.md +++ b/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/lab/git-lab-1.md @@ -1,7 +1,7 @@ --- layout: custom title: Lab 1. Version Control and Branching -grand_parent: Topic 1 - Git +grand_parent: Topic 2 - Git parent: Chapter 3 - Git Intermediate Concepts nav_order: 1 --- diff --git a/docs/course/topic-1-git/chapter-4-git-best-practices/index.md b/docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md similarity index 99% rename from docs/course/topic-1-git/chapter-4-git-best-practices/index.md rename to docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md index a505e2e..2001747 100644 --- a/docs/course/topic-1-git/chapter-4-git-best-practices/index.md +++ b/docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md @@ -1,7 +1,7 @@ --- title: Chapter 4 - Git Best Practices layout: custom -parent: Topic 1 - Git +parent: Topic 2 - Git has_toc: false nav_order: 4 --- diff --git a/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md b/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md new file mode 100644 index 0000000..123b55f --- /dev/null +++ b/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md @@ -0,0 +1,9 @@ +--- +title: Chapter 6 - Advanced Git Techniques +layout: custom +parent: Topic 2 - Git +has_toc: false +nav_order: 5 +--- + +# Chapter 6 - Advanced Git Techniques \ No newline at end of file diff --git a/docs/course/topic-1-git/index.md b/docs/course/Topic-2-Git/index.md similarity index 95% rename from docs/course/topic-1-git/index.md rename to docs/course/Topic-2-Git/index.md index f0867a1..51ac42e 100644 --- a/docs/course/topic-1-git/index.md +++ b/docs/course/Topic-2-Git/index.md @@ -1,12 +1,12 @@ --- -title: Topic 1 - Git +title: Topic 2 - Git layout: custom has_children: true has_toc: false -nav_order: 3 +nav_order: 4 --- -# Topic 1 - Git +# Topic 2 - Git | Chapter | Learning Objectives | Lab Description | |---------|---------------------|-----------------| diff --git a/docs/course/Topic-2-Git/review-and-knowledge-check/index.md b/docs/course/Topic-2-Git/review-and-knowledge-check/index.md new file mode 100644 index 0000000..69dd512 --- /dev/null +++ b/docs/course/Topic-2-Git/review-and-knowledge-check/index.md @@ -0,0 +1,9 @@ +--- +title: Topic Review and Knowledge Check +layout: custom +parent: Topic 2 - Git +has_toc: false +nav_order: 6 +--- + +# Topic Review and Knowledge Check \ No newline at end of file diff --git a/docs/course/topic-2-DevOps/chapter-2-intro-to-ci-cd/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts/index.md similarity index 98% rename from docs/course/topic-2-DevOps/chapter-2-intro-to-ci-cd/index.md rename to docs/course/Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts/index.md index dd063e7..3dc7f71 100644 --- a/docs/course/topic-2-DevOps/chapter-2-intro-to-ci-cd/index.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts/index.md @@ -1,13 +1,13 @@ --- -title: Chapter 2 - Intro to CI/CD +title: Chapter 1 - CI/CD Fundamentals layout: custom -parent: Topic 2 - DevOps +parent: Topic 3 - CI/CD Fundamentals has_children: false has_toc: false nav_order: 2 --- -# Introduction to CI/CD +# CI/CD Fundamentals

    CI/CD, short for Continuous Integration and Continuous Delivery, is a part of the DevOps process. “It is a collection of principles and practices designed to help development teams ensure the reliable delivery of frequent code changes.”

    diff --git a/docs/course/topic-2-DevOps/chapter-4-webhooks/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md similarity index 97% rename from docs/course/topic-2-DevOps/chapter-4-webhooks/index.md rename to docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md index 877ec53..32c0b09 100644 --- a/docs/course/topic-2-DevOps/chapter-4-webhooks/index.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md @@ -1,9 +1,9 @@ --- -title: Chapter 4 - Webhooks +title: Chapter 2 - Webhooks layout: custom -parent: Topic 2 - DevOps +parent: Topic 3 - CI/CD Fundamentals has_toc: false -nav_order: 4 +nav_order: 2 --- ## Utilizing Web Hooks for Continuous Integration diff --git a/docs/course/topic-2-DevOps/chapter-5-automation/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md similarity index 98% rename from docs/course/topic-2-DevOps/chapter-5-automation/index.md rename to docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md index 0979ccd..e22dc38 100644 --- a/docs/course/topic-2-DevOps/chapter-5-automation/index.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 5 - Automated Tests +title: Chapter 2 - Automated Tests layout: custom -parent: Topic 2 - DevOps +parent: Topic 3 - CI/CD Fundamentals has_children: false has_toc: false -nav_order: 5 +nav_order: 3 --- # Automated Testing in CI/CD diff --git a/docs/course/topic-2-DevOps/chapter-6-deployment/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md similarity index 99% rename from docs/course/topic-2-DevOps/chapter-6-deployment/index.md rename to docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md index ce4878a..f0bb9f9 100644 --- a/docs/course/topic-2-DevOps/chapter-6-deployment/index.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 6 - Deployment +title: Chapter 4 - Deployment layout: custom -parent: Topic 2 - DevOps +parent: Topic 3 - CI/CD Fundamentals has_toc: false has_children: true -nav_order: 6 +nav_order: 4 --- # Introduction to Deployment diff --git a/docs/course/topic-2-DevOps/chapter-6-deployment/lab/deployment-lab-1.md b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/deployment-lab-1.md similarity index 99% rename from docs/course/topic-2-DevOps/chapter-6-deployment/lab/deployment-lab-1.md rename to docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/deployment-lab-1.md index 5eda465..bacea92 100644 --- a/docs/course/topic-2-DevOps/chapter-6-deployment/lab/deployment-lab-1.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/deployment-lab-1.md @@ -1,8 +1,8 @@ --- title: Lab 1. Configuring a Simple CI/CD Pipeline layout: custom -grand_parent: Topic 2 - DevOps -parent: Chapter 6 - Deployment +grand_parent: Topic 3 - CI/CD Fundamentals +parent: Chapter 4 - Deployment nav_order: 2 --- **Estimated Time to Complete:** 60 minutes diff --git a/docs/course/topic-2-DevOps/chapter-6-deployment/lab/imgs/jenkins-login.png b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/jenkins-login.png similarity index 100% rename from docs/course/topic-2-DevOps/chapter-6-deployment/lab/imgs/jenkins-login.png rename to docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/jenkins-login.png diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/wireguard.png b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/wireguard.png similarity index 100% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/wireguard.png rename to docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/wireguard.png diff --git a/docs/course/topic-2-DevOps/chapter-6-deployment/lab/overview.md b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/overview.md similarity index 96% rename from docs/course/topic-2-DevOps/chapter-6-deployment/lab/overview.md rename to docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/overview.md index d2fb8e6..65f011e 100644 --- a/docs/course/topic-2-DevOps/chapter-6-deployment/lab/overview.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/overview.md @@ -1,8 +1,8 @@ --- title: Labs Overview layout: custom -grand_parent: Topic 2 - DevOps -parent: Chapter 6 - Deployment +grand_parent: Topic 3 - CI/CD Fundamentals +parent: Chapter 4 - Deployment nav_order: 1 --- diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md similarity index 99% rename from docs/course/topic-2-DevOps/chapter-3-containerization/index.md rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md index ffcd8ee..7b56cf1 100644 --- a/docs/course/topic-2-DevOps/chapter-3-containerization/index.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 3 - Containerization +title: Chapter 5 - Containerization layout: custom -parent: Topic 2 - DevOps +parent: Topic 3 - CI/CD Fundamentals has_children: true has_toc: false -nav_order: 3 +nav_order: 5 --- ## Definition of Containerization diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/containerization-lab-1.md b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-1.md similarity index 99% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/containerization-lab-1.md rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-1.md index 1662012..d84c734 100644 --- a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/containerization-lab-1.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-1.md @@ -1,8 +1,8 @@ --- layout: custom title: Lab 1. Containerizing a React Application -grand_parent: Topic 2 - DevOps -parent: Chapter 3 - Containerization +grand_parent: Topic 3 - CI/CD Fundamentals +parent: Chapter 5 - Containerization nav_order: 2 --- # Lab 1 - Containerizing a React Application diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/containerization-lab-2.md b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-2.md similarity index 98% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/containerization-lab-2.md rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-2.md index cf059df..7771157 100644 --- a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/containerization-lab-2.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-2.md @@ -1,8 +1,8 @@ --- layout: custom title: Lab 2. Accessing Corporate Network and AWS ECR -grand_parent: Topic 2 - DevOps -parent: Chapter 3 - Containerization +grand_parent: Topic 3 - CI/CD Fundamentals +parent: Chapter 5 - Containerization nav_order: 3 --- # Lab 2 - Accessing Corporate Network and AWS ECR diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/clone.png b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/clone.png similarity index 100% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/clone.png rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/clone.png diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/dashboard.png b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/dashboard.png similarity index 100% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/dashboard.png rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/dashboard.png diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/fork.png b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/fork.png similarity index 100% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/imgs/fork.png rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/fork.png diff --git a/docs/course/topic-2-DevOps/chapter-6-deployment/lab/imgs/wireguard.png b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/wireguard.png similarity index 100% rename from docs/course/topic-2-DevOps/chapter-6-deployment/lab/imgs/wireguard.png rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/wireguard.png diff --git a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/overview.md b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/overview.md similarity index 96% rename from docs/course/topic-2-DevOps/chapter-3-containerization/lab/overview.md rename to docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/overview.md index 8598680..f0cb904 100644 --- a/docs/course/topic-2-DevOps/chapter-3-containerization/lab/overview.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/overview.md @@ -1,8 +1,8 @@ --- title: Labs Overview layout: custom -grand_parent: Topic 2 - DevOps -parent: Chapter 3 - Containerization +grand_parent: Topic 3 - CI/CD Fundamentals +parent: Chapter 5 - Containerization nav_order: 1 --- diff --git a/docs/course/Topic-3-CICD-Concepts/index.md b/docs/course/Topic-3-CICD-Concepts/index.md new file mode 100644 index 0000000..07ffe84 --- /dev/null +++ b/docs/course/Topic-3-CICD-Concepts/index.md @@ -0,0 +1,13 @@ +--- +title: Topic 3 - CI/CD Fundamentals +layout: custom +has_children: true +has_toc: false +nav_order: 5 +--- + +# Topic 3 - CI/CD Fundamentals + +| Chapter | Learning Objectives | Lab Description | +|---------|---------------------|-----------------| + diff --git a/docs/course/Topic-3-CICD-Concepts/review-and-knowledge-check/index.md b/docs/course/Topic-3-CICD-Concepts/review-and-knowledge-check/index.md new file mode 100644 index 0000000..6801c83 --- /dev/null +++ b/docs/course/Topic-3-CICD-Concepts/review-and-knowledge-check/index.md @@ -0,0 +1,9 @@ +--- +title: Topic Review and Knowledge Check +layout: custom +parent: Topic 3 - CI/CD Fundamentals +has_toc: false +nav_order: 5 +--- + +# Topic Review and Knowledge Check \ No newline at end of file diff --git a/docs/course/topic-3-devsecops/chapter-1-devsecops/index.md b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/index.md similarity index 99% rename from docs/course/topic-3-devsecops/chapter-1-devsecops/index.md rename to docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/index.md index ccea82b..1499ad3 100644 --- a/docs/course/topic-3-devsecops/chapter-1-devsecops/index.md +++ b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/index.md @@ -1,7 +1,7 @@ --- title: Chapter 1 - DevSecOps layout: custom -parent: Topic 3 - DevSecOps +parent: Topic 4 - DevSecOps Fundamentals has_toc: false nav_order: 1 --- diff --git a/docs/course/topic-3-devsecops/chapter-1-devsecops/labs/devsecops-lab-1.md b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/labs/devsecops-lab-1.md similarity index 100% rename from docs/course/topic-3-devsecops/chapter-1-devsecops/labs/devsecops-lab-1.md rename to docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/labs/devsecops-lab-1.md diff --git a/docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/index.md b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/index.md similarity index 99% rename from docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/index.md rename to docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/index.md index cf2ce22..318e6ff 100644 --- a/docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/index.md +++ b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/index.md @@ -1,7 +1,7 @@ --- title: Chapter 2 - Security Checks in CI/CD layout: custom -parent: Topic 3 - DevSecOps +parent: Topic 4 - DevSecOps Fundamentals has_children: true has_toc: false nav_order: 2 diff --git a/docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md similarity index 100% rename from docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md rename to docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md diff --git a/docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/lab/overview.md b/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/overview.md similarity index 100% rename from docs/course/topic-3-devsecops/chapter-2-security-checks-in-CICD/lab/overview.md rename to docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/overview.md diff --git a/docs/course/topic-3-devsecops/index.md b/docs/course/Topic-4-Devsecops-Fundmentals/index.md similarity index 90% rename from docs/course/topic-3-devsecops/index.md rename to docs/course/Topic-4-Devsecops-Fundmentals/index.md index 91dad1d..db60ffc 100644 --- a/docs/course/topic-3-devsecops/index.md +++ b/docs/course/Topic-4-Devsecops-Fundmentals/index.md @@ -1,12 +1,12 @@ --- -title: Topic 3 - DevSecOps +title: Topic 4 - DevSecOps Fundamentals layout: custom has_children: true has_toc: false nav_order: 5 --- -# Topic 3 - DevSecOps +# Topic 4 - DevSecOps Fundamentals | Chapter | Learning Objectives | Lab Description | |---------|---------------------|-----------------| diff --git a/docs/course/Topic-5-Cloud/index.md b/docs/course/Topic-5-Cloud/index.md new file mode 100644 index 0000000..3e922b2 --- /dev/null +++ b/docs/course/Topic-5-Cloud/index.md @@ -0,0 +1,15 @@ +--- +title: Topic 5 - Cloud +layout: custom +has_children: true +has_toc: false +nav_order: 6 +--- + +# Topic 5 - Cloud + +| Chapter | Learning Objectives | Lab Description | +|---------|---------------------|-----------------| +| Chapter 1: Intro to Cloud | + + diff --git a/docs/course/topic-1-git/chapter-5-advanced-git-techniques/index.md b/docs/course/topic-1-git/chapter-5-advanced-git-techniques/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-2-DevOps/index.md b/docs/course/topic-2-DevOps/index.md deleted file mode 100644 index f740141..0000000 --- a/docs/course/topic-2-DevOps/index.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Topic 2 - DevOps -layout: custom -has_children: true -has_toc: false -nav_order: 4 ---- - -# Topic 2 - Development & Operations (DevOps) - -| Chapter | Learning Objectives | Lab Description | -|---------|---------------------|-----------------| -| Chapter 1: Intro to DevOps | - Define DevOps and explore its challenges and benefits
    - Discuss roles in Development and Operations and the DevOps lifecycle | | -| Chapter 2: Intro to CI/CD | - Explain CI/CD within the DevOps framework
    - Discuss CI/CD lifecycle, benefits, and methods | | -| Chapter 3: Containerization | - Define containerization and its advantages in cloud computing
    - Explore Kubernetes and microservices architectures
    - Learn about container application consistency | **Lab 1: Containerizing a React Application**
    - Create and run a Docker image of a React application
    - Interact with a running Docker container
    **Lab 2: Accessing Corporate Network and AWS ECR**
    - Establish a VPN and use AWS IAM credentials to authenticate and push Docker images to AWS ECR | -| Chapter 4: Webhooks | - Discuss the role and setup of webhooks in CI/CD automation
    - Explore webhook triggers and their applications | | -| Chapter 5: Automated Tests | - Outline the role of automated testing in CI/CD
    - Discuss strategies and integration into the pipeline | | -| Chapter 6: Deployment | - Define deployment environments and strategies
    - Explore deployment challenges in large-scale environments | **Lab: Configuring a Simple Jenkins Pipeline**
    - Automate a Dockerized application deployment using Jenkins
    - Create and configure a Jenkins pipeline with webhooks | - diff --git a/docs/course/topic-3-devsecops/chapter-3-security-frameworks/index.md b/docs/course/topic-3-devsecops/chapter-3-security-frameworks/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md b/docs/course/topic-3-devsecops/chapter-4-cloud-security/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-5-threat-modeling-and-risk-assessment/index.md b/docs/course/topic-3-devsecops/chapter-5-threat-modeling-and-risk-assessment/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/index.md b/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/securing-a-vulnerable-web-app.md b/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/securing-a-vulnerable-web-app.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/sql-injection-lab.md b/docs/course/topic-3-devsecops/chapter-6-secure-code-and-hardening/labs/sql-injection-lab.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/index.md b/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/index.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md b/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md deleted file mode 100644 index 66aef38..0000000 --- a/docs/course/topic-3-devsecops/chapter-7-supply-chain-security/labs/detecting-vulnerabilities-lab.md +++ /dev/null @@ -1 +0,0 @@ -detecting vulnerabilities in open source dependencies \ No newline at end of file diff --git a/docs/other/index.md b/docs/other/index.md index a4d252b..8f76555 100644 --- a/docs/other/index.md +++ b/docs/other/index.md @@ -3,5 +3,5 @@ title: Other Documents layout: custom has_children: true has_toc: false -nav_order: 6 +nav_order: 7 --- \ No newline at end of file diff --git a/index.md b/index.md index bbd553d..b42a6aa 100644 --- a/index.md +++ b/index.md @@ -4,9 +4,6 @@ layout: custom nav_order: 0 --- # DevSecOps Curriculum 💻 ->> Made by 2024 University of Washington Informatics Capstone Team Info Innovators - ->> Sponsored by Boeing Welcome to our open-source DevSecOps curriculum! @@ -37,10 +34,3 @@ To understand the skills gap that new graduates face, refer to our [User Researc ## Contributing to the Curriculum 🤝 Contributions are welcome! Help us keep the curriculum relevant and effective by updating content, adding new exercises, or providing feedback. - -### Connect with the Creators 🔗 -- [Sirena Akopyan](https://www.linkedin.com/in/sirena-akopyan/) -- [Bhavya Garlapati](https://www.linkedin.com/in/bhavya-garlapati-95ab46225/) -- [Eric Kim](https://www.linkedin.com/in/taehyunnkim/) -- [Mari Woodworth](https://www.linkedin.com/in/marikowoodworth/) -- [Brandon Mendoza](https://www.linkedin.com/in/bwmendo/) From c1ea00c99e7a0dcb9b199d38826796e07056e73d Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Tue, 22 Apr 2025 09:35:20 -0700 Subject: [PATCH 04/68] added images --- .../chapter-1-Intro-to-Cloud/index.md | 102 ++++++++++++++++++ .../Topic-6-DevSecOps-in-Industry/index.md | 0 images/introtocloudcapstone.png | Bin 0 -> 72713 bytes 3 files changed, 102 insertions(+) create mode 100644 docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md create mode 100644 docs/course/Topic-6-DevSecOps-in-Industry/index.md create mode 100644 images/introtocloudcapstone.png diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md new file mode 100644 index 0000000..09d728b --- /dev/null +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -0,0 +1,102 @@ +# Introduction to Cloud + +The cloud has become the foundation upon which DevSecOps practices are built. From scalable infrastructure to rapid deployment capabilities, understanding the cloud is key to implementing secure, efficient pipelines. + +--- + +## What is Cloud Computing? + +Imagine needing a powerful computer to test your code, store large amounts of data, or run an app for millions of users. Instead of buying expensive hardware, you rent what you need—on demand, from someone else’s infrastructure. That, in essence, is cloud computing. + +Cloud computing provides on-demand access to computing resources—like servers, storage, and networking—delivered over the internet. Instead of managing physical hardware, teams can scale up or down their computing needs quickly and cost-effectively. + +> **NIST Definition**: "Cloud computing is a model for enabling ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources." + +--- + +## Key Benefits + +- **Scalability**: Adjust resources based on demand +- **Cost efficiency**: Pay only for what you use +- **Speed**: Rapid provisioning of infrastructure +- **Accessibility**: Work from anywhere + +--- + +## Example Scenario + +Ani is building a web app that lets users upload and edit videos. She needs a way to store large video files, process them quickly, and make the app available globally. Instead of setting up servers herself, Ani uses Amazon Web Services (AWS) to host her application, run processing jobs, and store videos in the cloud. The cloud lets her focus on building features—not managing hardware. + +--- + +## Cloud Service Models + +Cloud services fall into three main categories. Think of them as layers of abstraction that handle more and more of the infrastructure for you: + +### 1. IaaS – Infrastructure as a Service +You rent virtual machines, storage, and networking. You manage the OS and software. +**Examples**: AWS EC2, Microsoft Azure Virtual Machines + +### 2. PaaS – Platform as a Service +You build apps on top of a managed platform. The provider handles the OS, runtime, and infrastructure. +**Examples**: Heroku, Google App Engine + +### 3. SaaS – Software as a Service +You use the software over the internet without worrying about how it runs. +**Examples**: Google Workspace, GitHub + +--- + +## Cloud Deployment Models + +Different organizations use the cloud in different ways depending on their needs, size, and security posture. + +- **Public Cloud** + Services offered over the internet and shared across organizations. + *Examples*: AWS, Azure, GCP + *Use Case*: Startups, scalable applications + +- **Private Cloud** + Cloud environment dedicated to a single organization. + *Use Case*: Healthcare, financial institutions + +- **Hybrid Cloud** + Mix of public and private clouds. + *Use Case*: Enterprises with legacy systems + +- **Multi-Cloud** + Using services from multiple cloud providers. + *Use Case*: Large enterprises avoiding vendor lock-in + +--- + +## Cloud Security Fundamentals + +Security in the cloud is a shared responsibility between the cloud provider and the customer. + +### Shared Responsibility Model + +- **Provider**: Security *of* the cloud (hardware, infrastructure, etc.) +- **Customer**: Security *in* the cloud (data, apps, IAM) + +### Key Concepts + +- **IAM (Identity & Access Management)**: Control who can access what, and what actions they can take +- **Encryption**: Protect data in transit and at rest +- **Logging & Monitoring**: Track system activity for threats and auditing + +--- + +## Summary + +Cloud computing is the backbone of modern DevSecOps. It allows teams to innovate quickly, deploy securely, and scale easily. From choosing the right service model to understanding your security responsibilities, cloud knowledge is essential for any DevSecOps practitioner. + +--- + +## Resources + +- [Google Cloud Security Overview](https://cloud.google.com/blog/topics/developers-practitioners/google-cloud-security-overview) +- [AWS Shared Responsibility Model](https://aws.amazon.com/compliance/shared-responsibility-model/) +- [Azure Cloud Adoption Framework](https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/) +- [NIST SP 800-145](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-145.pdf) +- [IBM – What is Cloud Computing](https://www.ibm.com/think/topics/cloud-computing) diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/index.md new file mode 100644 index 0000000..e69de29 diff --git a/images/introtocloudcapstone.png b/images/introtocloudcapstone.png new file mode 100644 index 0000000000000000000000000000000000000000..b6bd764cf7709a78140dcf92ddb5f3d4499cfbcd GIT binary patch literal 72713 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�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 Qi~}v!(wTo*)B3Of29wExf&c&j literal 0 HcmV?d00001 From 0b78e6bf25f8a95fad8f9d16d25c0a959ef01bcd Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Tue, 22 Apr 2025 09:40:57 -0700 Subject: [PATCH 05/68] added image to cloud lesson --- Gemfile.lock | 3 +++ docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 8a36229..f6e430e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -65,6 +65,8 @@ GEM safe_yaml (1.0.5) sass-embedded (1.69.5-arm64-darwin) google-protobuf (~> 3.23) + sass-embedded (1.69.5-x64-mingw-ucrt) + google-protobuf (~> 3.23) sass-embedded (1.69.5-x86_64-darwin) google-protobuf (~> 3.23) sass-embedded (1.69.5-x86_64-linux-gnu) @@ -76,6 +78,7 @@ GEM PLATFORMS arm64-darwin-23 + x64-mingw-ucrt x86_64-darwin-23 x86_64-linux diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md index 09d728b..0247881 100644 --- a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -45,6 +45,9 @@ You build apps on top of a managed platform. The provider handles the OS, runtim You use the software over the internet without worrying about how it runs. **Examples**: Google Workspace, GitHub +![Cloud Service Models](../../../../images/introtocloudcapstone.png) + + --- ## Cloud Deployment Models From 831f2a382f7a1de4216d433bb591080b1611eb54 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Tue, 22 Apr 2025 09:44:41 -0700 Subject: [PATCH 06/68] updated industry --- docs/course/Topic-6-DevSecOps-in-Industry/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/index.md index e69de29..3f98b31 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/index.md @@ -0,0 +1,7 @@ +--- +title: Topic 6 - Industry +layout: custom +has_children: true +has_toc: false +nav_order: 6 +--- \ No newline at end of file From f5f6c9ec5b4444bc74aa5a3c0ebacce112d23b5c Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Tue, 22 Apr 2025 09:47:51 -0700 Subject: [PATCH 07/68] fixed nav order --- docs/course/Topic-6-DevSecOps-in-Industry/index.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/index.md index 3f98b31..e63ce07 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/index.md @@ -1,7 +1,13 @@ --- -title: Topic 6 - Industry +title: Topic 6 - DevSecOps in Industry layout: custom has_children: true has_toc: false -nav_order: 6 ---- \ No newline at end of file +nav_order: 7 +--- +# Topic 5 - Cloud + +| Chapter | Learning Objectives | Lab Description | +|---------|---------------------|-----------------| +| Chapter 1: Use of DevSecOps in Industry | + From ee852418d0294b466861d0b382a1c42fc95215ef Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Tue, 22 Apr 2025 09:50:23 -0700 Subject: [PATCH 08/68] added cloud lesson in correct order --- .../course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md | 7 +++++++ docs/course/Topic-6-DevSecOps-in-Industry/index.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md index 0247881..3866906 100644 --- a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -1,3 +1,10 @@ +--- +title: Chapter 1 - Intro to Cloud +layout: custom +parent: Topic 5 - Cloud +has_toc: false +nav_order: 1 +--- # Introduction to Cloud The cloud has become the foundation upon which DevSecOps practices are built. From scalable infrastructure to rapid deployment capabilities, understanding the cloud is key to implementing secure, efficient pipelines. diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/index.md index e63ce07..a66435c 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/index.md @@ -5,7 +5,7 @@ has_children: true has_toc: false nav_order: 7 --- -# Topic 5 - Cloud +# Topic 6 - DevSecOps in Industry | Chapter | Learning Objectives | Lab Description | |---------|---------------------|-----------------| From 0c5e013995d255340a371ae8ee65e2549b9d0548 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Tue, 22 Apr 2025 09:55:25 -0700 Subject: [PATCH 09/68] added a few new lessons --- .../Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md | 7 +++++++ .../chapter-1-use-of-devsecops-in-industry/index.md | 7 +++++++ docs/other/index.md | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md create mode 100644 docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md diff --git a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md new file mode 100644 index 0000000..5aa9f42 --- /dev/null +++ b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md @@ -0,0 +1,7 @@ +--- +title: Chapter 2 - Cloud in DevSecOps +layout: custom +parent: Topic 5 - Cloud +has_toc: false +nav_order: 2 +--- \ No newline at end of file diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md new file mode 100644 index 0000000..9de3268 --- /dev/null +++ b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md @@ -0,0 +1,7 @@ +--- +title: Chapter 1 - Use of DevSecOps in Industry +layout: custom +parent: Topic 6 - DevSecOps in Industry +has_toc: false +nav_order: 1 +--- \ No newline at end of file diff --git a/docs/other/index.md b/docs/other/index.md index 8f76555..94d86af 100644 --- a/docs/other/index.md +++ b/docs/other/index.md @@ -3,5 +3,5 @@ title: Other Documents layout: custom has_children: true has_toc: false -nav_order: 7 +nav_order: 8 --- \ No newline at end of file From 86a58fa470f8b702479c18b8678c752e23224afe Mon Sep 17 00:00:00 2001 From: emilychoi Date: Tue, 22 Apr 2025 11:19:15 -0700 Subject: [PATCH 10/68] working quiz feature but on the old content architecture --- .DS_Store | Bin 0 -> 6148 bytes Gemfile | 5 ++ Gemfile.lock | 8 ++ _config.yml | 6 +- _data/quizzes/chapter1.yml | 44 +++++++++ _includes/head_custom.html | 1 + _includes/quiz.html | 29 ++++++ _layouts/custom.html | 9 ++ _sass/custom/custom.scss | 2 + _sass/custom/quiz.scss | 65 ++++++++++++++ assets/js/quiz-reset.js | 21 +++++ assets/js/quiz.js | 84 ++++++++++++++++++ .../chapter-1-version-control/index.md | 7 ++ 13 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 .DS_Store create mode 100644 _data/quizzes/chapter1.yml create mode 100644 _includes/quiz.html create mode 100644 _sass/custom/quiz.scss create mode 100644 assets/js/quiz-reset.js create mode 100644 assets/js/quiz.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dbba498b3185f51153f3c3170e9da0c4fdd26f54 GIT binary patch literal 6148 zcmeHKO>fgM7=GP#Yr2Be14z3dMdDhG7BoJ@rR!RuNx)%2Z~#=2ri^H5JT)z4sw(vi ze+7vve+2#uCwN}lo07C#*@XN`_TxCuwtCOsyV>#ZjJghAV~>j-{1H!mV+Rc0T|5MN80_Z0wtnN zs6z5-LVkhyt-!2;8KLz7#WaOxNNHXnZWR;`6fxR9!>Fd{p~(MI;PY5g@Y5CMueHnw zZ4UEeC>}rcBTK)j{>)hSxL;VFiz#!*NkTuykM4|8gIV`r*V`{n$4f0v{ByN zsyG#==DhVj$eB0sC)2d!k6-iE3n}B^yzB=rqv5Pyzi}Xwi614yu@Xe#5R^Bsq9l~F zj+`c8s!p51Mxui>h<;_MOK^{gZf<$j_J~ zLg34;;<~|e;Ae0#pO4-+iDkkbGQUDk;M+*8r?}`e@%qTRaxKrs{t+uTPx4Plt&*(H zQLBpA(C`pw>)QQ>7!czE53x23#{H zwQ{lwbb4uFo~%>5v=P{jtpnD9tLgxMA6z8Hw!x)F_31#SjsU(Riu%R#O zy#M$9e*Vvk?3H!EI`CgPAj(~@+rgB~-nue5-fLZ?cSsz}TWVAiWM(^71>TBxkW}EF Y%LQQD;8G)M5cWqv*<_`K>z>% literal 0 HcmV?d00001 diff --git a/Gemfile b/Gemfile index d5810e3..e82b3ad 100644 --- a/Gemfile +++ b/Gemfile @@ -5,3 +5,8 @@ gem "jekyll", "~> 4.3.3" # installed by `gem jekyll` gem "just-the-docs", "0.8.1" # pinned to the current release # gem "just-the-docs" # always download the latest release + +gem "csv" +gem "base64" +gem "logger" +gem "bigdecimal" \ No newline at end of file diff --git a/Gemfile.lock b/Gemfile.lock index 8a36229..0455425 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,8 +3,11 @@ GEM specs: addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) + base64 (0.2.0) + bigdecimal (3.1.9) colorator (1.1.0) concurrent-ruby (1.2.2) + csv (3.3.3) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) @@ -52,6 +55,7 @@ GEM listen (3.8.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) mercenary (0.4.0) pathutil (0.16.2) forwardable-extended (~> 2.6) @@ -80,8 +84,12 @@ PLATFORMS x86_64-linux DEPENDENCIES + base64 + bigdecimal + csv jekyll (~> 4.3.3) just-the-docs (= 0.8.1) + logger BUNDLED WITH 2.3.26 diff --git a/_config.yml b/_config.yml index a66183b..d2cb8a3 100644 --- a/_config.yml +++ b/_config.yml @@ -24,4 +24,8 @@ callouts: color: blue lab: title: Access The Lab - color: purple \ No newline at end of file + color: purple + +sass: + sass_dir: _sass + style: compressed diff --git a/_data/quizzes/chapter1.yml b/_data/quizzes/chapter1.yml new file mode 100644 index 0000000..2740540 --- /dev/null +++ b/_data/quizzes/chapter1.yml @@ -0,0 +1,44 @@ +questions: + - prompt: "What is the primary purpose of version control in software development?" + options: + - "It prevents unauthorized users from editing a file." + - "It allows developers to track changes, collaborate, and revert to previous versions of files if necessary." + - "It automates the process of building software from source code." + - "It helps manage user authentication systems in a project." + correct_index: 1 + explanation: "Version control allows developers to track changes, collaborate, and revert to previous versions of files if necessary. This helps maintain a history of changes and prevents conflicts when working collaboratively." + + - prompt: "What is one of the key advantages of using version control in the scenario where Armine and Tigran are working on the same project?" + options: + - "Version control allows them to share the same file without needing to merge their changes." + - "It ensures that both of their changes are automatically merged, without requiring them to review the changes." + - "It enables them to track their changes independently and merge their updates later, preventing conflicts." + - "It prevents them from making any changes to each other's files." + correct_index: 2 + explanation: "Version control enables Armine and Tigran to track their changes independently and merge their updates later, preventing conflicts. This process is essential when multiple developers are working on the same codebase." + + - prompt: "True or False: Version control systems, like GitHub, prevent all types of conflicts between developers working on the same project by automatically merging all changes." + options: + - "True" + - "False" + correct_index: 1 + explanation: "False. Version control systems help manage changes and alert developers to conflicts, but they do not automatically merge all changes. Developers must manually resolve conflicts." + + - prompt: "Which of the following is NOT true about version control systems?" + options: + - "They allow developers to view the history of changes made to files and revert to any previous state." + - "They can automatically detect and resolve any conflicts between different versions of a file." + - "They facilitate collaboration by allowing multiple developers to work on different parts of a project without interfering with each other." + - "They store different versions of files, enabling developers to work on multiple features simultaneously." + correct_index: 1 + explanation: "Version control systems help detect conflicts, but they do not automatically resolve them. Developers must review and merge conflicting changes manually." + + - prompt: "Which of the following best describes how GitHub helps in the version control process?" + options: + - "GitHub is used exclusively for backing up files and does not include version control features." + - "GitHub only serves as a cloud-based storage system for completed software projects and does not support versioning." + - "GitHub is a platform for organizing and managing tasks related to software development but does not play a role in version control." + - "GitHub integrates with version control systems to store files and track changes, while also providing a user interface for collaboration and version history." + correct_index: 3 + explanation: "GitHub is a version control platform that integrates with Git to store files, track changes, and provide collaboration features like issue tracking, pull requests, and version history." + diff --git a/_includes/head_custom.html b/_includes/head_custom.html index 3a75c49..543ff78 100644 --- a/_includes/head_custom.html +++ b/_includes/head_custom.html @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/_includes/quiz.html b/_includes/quiz.html new file mode 100644 index 0000000..552cccf --- /dev/null +++ b/_includes/quiz.html @@ -0,0 +1,29 @@ +

    🧠 Knowledge Check

    +

    Answer the questions below to test your knowledge!

    + +
    + {% for q in include.data.questions %} +
    +

    Q{{ forloop.index }}: {{ q.prompt }}

    + + {% for option in q.options %} + + {% endfor %} + + +
    + {% endfor %} + + + + + +
    + + + diff --git a/_layouts/custom.html b/_layouts/custom.html index 63d4e2d..37d9555 100644 --- a/_layouts/custom.html +++ b/_layouts/custom.html @@ -33,5 +33,14 @@ {% if site.mermaid %} {% include components/mermaid.html %} {% endif %} + + + + + + \ No newline at end of file diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss index 1cfb8b6..a6e542d 100644 --- a/_sass/custom/custom.scss +++ b/_sass/custom/custom.scss @@ -6,6 +6,8 @@ $code-dot-size: 0.6rem; $code-dot-gap: 0.5rem; $dot-margin: 0; +@import "quiz"; + @mixin light-syntax { --language-border-color: #ececec; --highlight-bg-color: #f6f8fa; diff --git a/_sass/custom/quiz.scss b/_sass/custom/quiz.scss new file mode 100644 index 0000000..24f28dd --- /dev/null +++ b/_sass/custom/quiz.scss @@ -0,0 +1,65 @@ +.quiz-form { + margin-top: 2rem; + padding: 1rem; + border: 2px solid #ccc; + border-radius: 10px; + background-color: #ffffff; + + .quiz-question { + margin-bottom: 1.5rem; + p { + font-weight: 600; + margin-bottom: 0.5rem; + } + + label { + display: block; + margin: 1rem; + cursor: pointer; + + input[type="radio"] { + margin-right: 0.5rem; + } + } + + .quiz-feedback { + padding: 0.5rem; + margin-top: 0.5rem; + border-radius: 0.5rem; + font-weight: bold; + + &.correct { + background-color: #d4edda; + color: #155724; + border: 1px solid #c3e6cb; + } + + &.incorrect { + background-color: #f8d7da; + color: #721c24; + border: 1px solid #f5c6cb; + } + } + } + + button { + margin-top: 0.5rem; + padding: 0.6rem 1.2rem; + background-color: #007acc; + color: white; + border: none; + border-radius: 6px; + cursor: pointer; + + &:hover { + background-color: #005fa3; + } + + &:disabled { + background-color: #cccccc; + color: #666666; + cursor: not-allowed; + opacity: 0.7; + } + } +} \ No newline at end of file diff --git a/assets/js/quiz-reset.js b/assets/js/quiz-reset.js new file mode 100644 index 0000000..0161904 --- /dev/null +++ b/assets/js/quiz-reset.js @@ -0,0 +1,21 @@ +function resetQuiz(quizId) { + const form = document.querySelector(`.quiz-form[data-quiz-id="${quizId}"]`); + const header = document.querySelector("#quiz-title"); + header.scrollIntoView({ behavior: "smooth", block: "start" }); + + const questions = form.querySelectorAll('.quiz-question'); + + questions.forEach((questionDiv) => { + const selected = questionDiv.querySelector('input[type="radio"]:checked'); + if (selected) selected.checked = false; + + const feedback = questionDiv.querySelector('.quiz-feedback'); + feedback.innerHTML = ''; + feedback.style.display = 'none'; + feedback.classList.remove('correct', 'incorrect'); + }); + + // Enable Submit button and hide Try Again button + form.querySelector('.submit-btn').disabled = false; + form.querySelector('.try-again-btn').style.display = 'none'; +} diff --git a/assets/js/quiz.js b/assets/js/quiz.js new file mode 100644 index 0000000..3a34dfe --- /dev/null +++ b/assets/js/quiz.js @@ -0,0 +1,84 @@ +function submitQuiz(quizId) { + const form = document.querySelector(`.quiz-form[data-quiz-id="${quizId}"]`); + const header = document.querySelector("#quiz-title"); + header.scrollIntoView({ behavior: "smooth", block: "start" }); + + const questions = form.querySelectorAll('.quiz-question'); + let allCorrect = true; + let allAnswered = true; + + questions.forEach((questionDiv, index) => { + const selected = questionDiv.querySelector('input[type="radio"]:checked'); + const feedback = questionDiv.querySelector('.quiz-feedback'); + + feedback.classList.remove('correct', 'incorrect'); + feedback.style.display = "none"; + + const correctIndex = window.quizData[quizId].questions[index].correct_index; + const explanation = window.quizData[quizId].questions[index].explanation; + const link = window.quizData[quizId].questions[index].link; + + if (!selected) { + feedback.innerHTML = `

    Please select an answer.

    `; + allAnswered = false; + allCorrect = false; + } else if (parseInt(selected.value) === correctIndex) { + feedback.innerHTML = `

    Correct! ✅

    ${explanation} See more

    `; + feedback.classList.add("correct"); + } else { + feedback.innerHTML = `

    Incorrect ❌

    ${explanation} Review here

    `; + feedback.classList.add("incorrect"); + allCorrect = false; + } + + feedback.style.display = "block"; + }); + + // Disable the Submit button and show Try Again button + form.querySelector('.submit-btn').disabled = true; + form.querySelector('.try-again-btn').style.display = 'inline-block'; + + if (allAnswered && allCorrect) { + triggerConfetti(); + } +} + +function triggerConfetti () { + var count = 200; + var defaults = { + origin: { y: 0.7 } + }; + + setTimeout(() => { + function fire(particleRatio, opts) { + confetti({ + ...defaults, + ...opts, + particleCount: Math.floor(count * particleRatio) + }); + } + + fire(0.25, { + spread: 26, + startVelocity: 55, + }); + fire(0.2, { + spread: 60, + }); + fire(0.35, { + spread: 100, + decay: 0.91, + scalar: 0.8 + }); + fire(0.1, { + spread: 120, + startVelocity: 25, + decay: 0.92, + scalar: 1.2 + }); + fire(0.1, { + spread: 120, + startVelocity: 45, + }); + }, 650); +} diff --git a/docs/course/topic-1-git/chapter-1-version-control/index.md b/docs/course/topic-1-git/chapter-1-version-control/index.md index 97e85f6..53453b3 100644 --- a/docs/course/topic-1-git/chapter-1-version-control/index.md +++ b/docs/course/topic-1-git/chapter-1-version-control/index.md @@ -29,6 +29,13 @@ Version control is **a system that records changes to a file or set of files ove A common tool for version control is GitHub. GitHub allows you acts as a central hub for all of the different versions of your code, kind of how in google docs you can see the history of your changes. Though there are many different systems for version control, we will be learning using GitHubs features. The syntax and user interface of different products are different, but the core elements are the same. +--- + +{% include quiz.html + id="chapter1" + data=site.data.quizzes.chapter1 +%} + ### References
    Expand From 95194a4fcc25a99fa4a32b7ed96b86242724c759 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Tue, 22 Apr 2025 15:13:48 -0700 Subject: [PATCH 11/68] add topic 2 chapter 1 and chapter 2 quizzes --- _data/quizzes/{ => topic2}/chapter1.yml | 0 _data/quizzes/topic2/chapter2.yml | 41 +++++++++++++++++++ _layouts/custom.html | 6 ++- assets/js/quiz.js | 5 +-- .../chapter-1-version-control/index.md | 7 +++- .../chapter-2-understanding-git/index.md | 8 ++++ 6 files changed, 61 insertions(+), 6 deletions(-) rename _data/quizzes/{ => topic2}/chapter1.yml (100%) create mode 100644 _data/quizzes/topic2/chapter2.yml diff --git a/_data/quizzes/chapter1.yml b/_data/quizzes/topic2/chapter1.yml similarity index 100% rename from _data/quizzes/chapter1.yml rename to _data/quizzes/topic2/chapter1.yml diff --git a/_data/quizzes/topic2/chapter2.yml b/_data/quizzes/topic2/chapter2.yml new file mode 100644 index 0000000..493a92e --- /dev/null +++ b/_data/quizzes/topic2/chapter2.yml @@ -0,0 +1,41 @@ +questions: + - prompt: "In Git, all changes in your working directory are committed to the repository when you run git commit, even if they haven't been added to the staging area." + options: + - "True" + - "False" + correct_index: 1 + explanation: "False — Only changes that have been added to the staging area using git add will be included in a commit. Unstaged changes in the working directory are not committed." + + - prompt: "What happens when you run the command git checkout <branch-name>?" + options: + - "It creates a new branch called <branch-name> but doesn't switch to it." + - "It deleted the <branch-name> branch from the respository." + - "It uploads your changes to the remote repository." + - "It switches your local branch to <branch-name> and updates the working directory with that branch's files." + correct_index: 3 + explanation: "git checkout <branch-name> switches to the specified branch and updates the working directory with that branch's contents." + + - prompt: "In Git, the term _________ refers to a snapshot of your project at a specific point in time, which is stored in the repository after running git commit." + options: + - "Working Directory" + - "Staging Area" + - "Commit" + - "Branch" + correct_index: 2 + explanation: "A commit in Git represents a snapshot of your project at a specific point in time." + + - prompt: "Which of the following statements is FALSE regarding Git branches?" + options: + - "A branch in Git does not copy files but simply creates a new pointer to them." + - "You can use branches to experiment with new features without affecting the main codebase." + - "Once a branch is created, it automatically merges into the main branch after a set period." + - "A branch isolates development work, enabling concurrent tasks without conflicts." + correct_index: 2 + explanation: "A branch does NOT automatically merge into the main branch; you have to do it manually using git merge." + + - prompt: "If you delete a branch using git branch -d <branch-name>, the branch is permanently deleted from both your local and remote repositories." + options: + - "True" + - "False" + correct_index: 1 + explanation: "git branch -d only deletes the LOCAL branch. To delete a branch from the remote, you would use git push origin --delete <branch-name>." diff --git a/_layouts/custom.html b/_layouts/custom.html index 37d9555..89b95cd 100644 --- a/_layouts/custom.html +++ b/_layouts/custom.html @@ -36,7 +36,11 @@ diff --git a/assets/js/quiz.js b/assets/js/quiz.js index 3a34dfe..d282bbb 100644 --- a/assets/js/quiz.js +++ b/assets/js/quiz.js @@ -16,17 +16,16 @@ function submitQuiz(quizId) { const correctIndex = window.quizData[quizId].questions[index].correct_index; const explanation = window.quizData[quizId].questions[index].explanation; - const link = window.quizData[quizId].questions[index].link; if (!selected) { feedback.innerHTML = `

    Please select an answer.

    `; allAnswered = false; allCorrect = false; } else if (parseInt(selected.value) === correctIndex) { - feedback.innerHTML = `

    Correct! ✅

    ${explanation} See more

    `; + feedback.innerHTML = `

    Correct! ✅

    ${explanation}`; feedback.classList.add("correct"); } else { - feedback.innerHTML = `

    Incorrect ❌

    ${explanation} Review here

    `; + feedback.innerHTML = `

    Incorrect ❌

    ${explanation}`; feedback.classList.add("incorrect"); allCorrect = false; } diff --git a/docs/course/Topic-2-Git/chapter-1-version-control/index.md b/docs/course/Topic-2-Git/chapter-1-version-control/index.md index 189c10b..cb9489c 100644 --- a/docs/course/Topic-2-Git/chapter-1-version-control/index.md +++ b/docs/course/Topic-2-Git/chapter-1-version-control/index.md @@ -5,6 +5,8 @@ parent: Topic 2 - Git has_children: false has_toc: false nav_order: 1 +topic: topic2 +chapter: chapter1 --- # Chapter 1 - Introduction to Version Control @@ -32,10 +34,11 @@ A common tool for version control is GitHub. GitHub allows you acts as a central --- {% include quiz.html - id="chapter1" - data=site.data.quizzes.chapter1 + id="topic2-chapter1" + data=site.data.quizzes.topic2.chapter1 %} + ### References

    Expand diff --git a/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md b/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md index 2410bc7..6dbbc81 100644 --- a/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md +++ b/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md @@ -5,6 +5,8 @@ parent: Topic 2 - Git has_toc: false has_children: false nav_order: 2 +topic: topic2 +chapter: chapter2 --- # Git Fundamentals @@ -78,6 +80,12 @@ Creating a branch in Git is a fast and simple operation because it doesn't copy By using branches, you can manage the development of new features, fixes, and updates in a structured and organized manner, allowing for a smoother and more controlled workflow. +--- + +{% include quiz.html + id="topic2-chapter2" + data=site.data.quizzes.topic2.chapter2 +%} ### References
    From dd15988b9f15a23632704344e9de683525e781f6 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Tue, 22 Apr 2025 16:49:52 -0700 Subject: [PATCH 12/68] fix padding on feedback popup --- _sass/custom/quiz.scss | 4 ++++ assets/js/quiz.js | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/_sass/custom/quiz.scss b/_sass/custom/quiz.scss index 24f28dd..ff34418 100644 --- a/_sass/custom/quiz.scss +++ b/_sass/custom/quiz.scss @@ -39,6 +39,10 @@ color: #721c24; border: 1px solid #f5c6cb; } + + p#feedback-title { + margin-top: 0.5rem; + } } } diff --git a/assets/js/quiz.js b/assets/js/quiz.js index d282bbb..386780a 100644 --- a/assets/js/quiz.js +++ b/assets/js/quiz.js @@ -22,10 +22,10 @@ function submitQuiz(quizId) { allAnswered = false; allCorrect = false; } else if (parseInt(selected.value) === correctIndex) { - feedback.innerHTML = `

    Correct! ✅

    ${explanation}`; + feedback.innerHTML = `

    Correct! ✅

    ${explanation}`; feedback.classList.add("correct"); } else { - feedback.innerHTML = `

    Incorrect ❌

    ${explanation}`; + feedback.innerHTML = `

    Incorrect ❌

    ${explanation}`; feedback.classList.add("incorrect"); allCorrect = false; } From d6fe924fe01fbef5b131bd62779d638cdf7fc9c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cmiraxnairgit=20config=20--global=20user=2Eemail?= =?UTF-8?q?=20=E2=80=9Cmiranair004=40gmail=2Ecom?= <“miranair004@gmail.com> Date: Wed, 23 Apr 2025 01:08:24 -0700 Subject: [PATCH 13/68] font slider done --- Gemfile.lock | 2 ++ _layouts/custom.html | 49 ++++++++++++++++++++++++++++++++++++++++ _sass/custom/custom.scss | 40 ++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) diff --git a/Gemfile.lock b/Gemfile.lock index 8a36229..fd71458 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -12,6 +12,7 @@ GEM ffi (1.16.3) forwardable-extended (2.6.0) google-protobuf (3.25.1) + google-protobuf (3.25.1-x86_64-darwin) http_parser.rb (0.8.0) i18n (1.14.1) concurrent-ruby (~> 1.0) @@ -76,6 +77,7 @@ GEM PLATFORMS arm64-darwin-23 + x86_64-darwin-22 x86_64-darwin-23 x86_64-linux diff --git a/_layouts/custom.html b/_layouts/custom.html index 63d4e2d..0e79cdc 100644 --- a/_layouts/custom.html +++ b/_layouts/custom.html @@ -19,6 +19,12 @@ {% include components/children_nav.html %} {% endif %} + +

    + + + +
    {% include components/footer.html %}
    @@ -33,5 +39,48 @@ {% if site.mermaid %} {% include components/mermaid.html %} {% endif %} + {% include footer_custom.html %} + + + \ No newline at end of file diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss index 1cfb8b6..6cb8fc7 100644 --- a/_sass/custom/custom.scss +++ b/_sass/custom/custom.scss @@ -19,6 +19,46 @@ $dot-margin: 0; --clipboard-checked-color: #43c743; } +/* font size slider*/ +/* Font size slider */ +html { + font-size: 16px; /* default font-size */ +} + +body { + font-size: 1rem; /* will scale with html's font-size */ +} + +h1 { + font-size: 2rem; /* relative to html font-size */ +} + +p { + font-size: 1rem; /* relative to html font-size */ +} + +#font-size-controls { + margin-top: 2rem; + text-align: center; + + button { + font-size: 1rem; + margin: 0 0.5rem; + padding: 0.5rem 1rem; + border: none; + border-radius: 5px; + background-color: #eee; + cursor: pointer; + transition: background-color 0.3s ease; + + &:hover { + background-color: #ddd; + } + } +} + + + .highlighter-rouge { @include light-syntax; From 41286f8e8a9e8e9e843059cb272b4d32c0992786 Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Thu, 24 Apr 2025 00:29:33 -0700 Subject: [PATCH 14/68] dark/light mode --- _includes/nav_footer_custom.html | 31 ++++++++++++++++++++++- _sass/custom/custom.scss | 43 -------------------------------- _sass/custom/dark.scss | 20 +++++++++++++++ _sass/custom/light.scss | 16 ++++++++++++ docs/course/index.md | 2 +- 5 files changed, 67 insertions(+), 45 deletions(-) create mode 100644 _sass/custom/dark.scss create mode 100644 _sass/custom/light.scss diff --git a/_includes/nav_footer_custom.html b/_includes/nav_footer_custom.html index c215dc8..1e8dcc9 100644 --- a/_includes/nav_footer_custom.html +++ b/_includes/nav_footer_custom.html @@ -1,3 +1,32 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss index c50d7b7..88d9a8c 100644 --- a/_sass/custom/custom.scss +++ b/_sass/custom/custom.scss @@ -6,8 +6,6 @@ $code-dot-size: 0.6rem; $code-dot-gap: 0.5rem; $dot-margin: 0; -@import "quiz"; - @mixin light-syntax { --language-border-color: #ececec; --highlight-bg-color: #f6f8fa; @@ -21,46 +19,6 @@ $dot-margin: 0; --clipboard-checked-color: #43c743; } -/* font size slider*/ -/* Font size slider */ -html { - font-size: 16px; /* default font-size */ -} - -body { - font-size: 1rem; /* will scale with html's font-size */ -} - -h1 { - font-size: 2rem; /* relative to html font-size */ -} - -p { - font-size: 1rem; /* relative to html font-size */ -} - -#font-size-controls { - margin-top: 2rem; - text-align: center; - - button { - font-size: 1rem; - margin: 0 0.5rem; - padding: 0.5rem 1rem; - border: none; - border-radius: 5px; - background-color: #eee; - cursor: pointer; - transition: background-color 0.3s ease; - - &:hover { - background-color: #ddd; - } - } -} - - - .highlighter-rouge { @include light-syntax; @@ -291,7 +249,6 @@ div.highlighter-rouge > button, div.listingblock > div.content > button, figure. padding-top: 64px; flex: 1; min-width: 300px; - background-color: #fbfbfb; border-left: 1px solid #eeebee; h2 { diff --git a/_sass/custom/dark.scss b/_sass/custom/dark.scss new file mode 100644 index 0000000..3ca510a --- /dev/null +++ b/_sass/custom/dark.scss @@ -0,0 +1,20 @@ +/* Dark Mode Colors */ +$color-scheme: dark; +$body-background-color: $grey-dk-300; +$body-heading-color: $grey-lt-000; +$body-text-color: $grey-lt-300; +$link-color: $blue-000; +$nav-child-link-color: $grey-dk-000; +$sidebar-color: $grey-dk-300; +$base-button-color: $grey-dk-250; +$btn-primary-color: $blue-200; +$code-background-color: #31343f; /* OneDarkJekyll default for syntax-one-dark-vivid */ +$code-linenumber-color: #dee2f7; /* OneDarkJekyll .nf for syntax-one-dark-vivid */ +$feedback-color: darken($sidebar-color, 3%); +$table-background-color: $grey-dk-250; +$search-background-color: $grey-dk-250; +$search-result-preview-color: $grey-dk-000; +$border-color: $grey-dk-200; + +/* Syntax highlighting for code */ +@import "./vendor/OneDarkJekyll/syntax"; /* This is the one-dark-vivid atom syntax theme */ diff --git a/_sass/custom/light.scss b/_sass/custom/light.scss new file mode 100644 index 0000000..a5f60c4 --- /dev/null +++ b/_sass/custom/light.scss @@ -0,0 +1,16 @@ +$color-scheme: light !default; +$body-background-color: $white !default; +$body-heading-color: $grey-dk-300 !default; +$body-text-color: $grey-dk-100 !default; +$link-color: $purple-000 !default; +$nav-child-link-color: $grey-dk-100 !default; +$sidebar-color: $grey-lt-000 !default; +$base-button-color: #f7f7f7 !default; +$btn-primary-color: $purple-100 !default; +$code-background-color: $grey-lt-000 !default; +$feedback-color: darken($sidebar-color, 3%) !default; +$table-background-color: $white !default; +$search-background-color: $white !default; +$search-result-preview-color: $grey-dk-000 !default; + +@import "./vendor/OneLightJekyll/syntax"; \ No newline at end of file diff --git a/docs/course/index.md b/docs/course/index.md index 85f5e33..9af2ebc 100644 --- a/docs/course/index.md +++ b/docs/course/index.md @@ -9,7 +9,7 @@ nav_order: 1 - + From 69a4b2c914481fe06fdeb534822a846b99b606d7 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Fri, 9 May 2025 00:00:15 -0700 Subject: [PATCH 15/68] change wording quiz question for 2.2 and add true or false --- _data/quizzes/topic2/chapter2.yml | 8 ++++---- _data/quizzes/topic5/chapter1.yml | 9 +++++++++ 2 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 _data/quizzes/topic5/chapter1.yml diff --git a/_data/quizzes/topic2/chapter2.yml b/_data/quizzes/topic2/chapter2.yml index 493a92e..6f9122f 100644 --- a/_data/quizzes/topic2/chapter2.yml +++ b/_data/quizzes/topic2/chapter2.yml @@ -1,5 +1,5 @@ questions: - - prompt: "In Git, all changes in your working directory are committed to the repository when you run git commit, even if they haven't been added to the staging area." + - prompt: "True or False: In Git, all changes in your working directory are committed to the repository when you run git commit, even if they haven't been added to the staging area." options: - "True" - "False" @@ -33,9 +33,9 @@ questions: correct_index: 2 explanation: "A branch does NOT automatically merge into the main branch; you have to do it manually using git merge." - - prompt: "If you delete a branch using git branch -d <branch-name>, the branch is permanently deleted from both your local and remote repositories." + - prompt: "True or False: If you delete a branch using git branch -d <branch-name>, the branch is permanently deleted from your local repository." options: - "True" - "False" - correct_index: 1 - explanation: "git branch -d only deletes the LOCAL branch. To delete a branch from the remote, you would use git push origin --delete <branch-name>." + correct_index: 0 + explanation: "True, git branch -d only deletes the LOCAL branch. To delete a branch from the REMOTE, you would use git push origin --delete <branch-name>." diff --git a/_data/quizzes/topic5/chapter1.yml b/_data/quizzes/topic5/chapter1.yml new file mode 100644 index 0000000..1267700 --- /dev/null +++ b/_data/quizzes/topic5/chapter1.yml @@ -0,0 +1,9 @@ +questions: + prompt: "adsjfa;" + options: + - "ajlfdsj" + - "adfafa" + - "asdfodf" + - "asdoifa" + correct_index: + explanation: \ No newline at end of file From e2de3c0459a38ef1a42648063c099908191c4c41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cmiraxnairgit=20config=20--global=20user=2Eemail?= =?UTF-8?q?=20=E2=80=9Cmiranair004=40gmail=2Ecom?= <“miranair004@gmail.com> Date: Wed, 14 May 2025 14:06:31 -0700 Subject: [PATCH 16/68] added topic 6 --- docs/.DS_Store | Bin 0 -> 6148 bytes .../index.md | 122 +++++++++++++++- .../chapter-2-industry-roles/index.md | 138 ++++++++++++++++++ .../Topic-6-DevSecOps-in-Industry/index.md | 3 +- 4 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 docs/.DS_Store create mode 100644 docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..aff98e650b00f6063bd3944c48a403c97d4055e0 GIT binary patch literal 6148 zcmeHKI|>3Z5S>vG!N$@uSMUZw^aOhWLB&QC6s@=NTprCgpGH?ZZR8D1UNV`NkXP*N zh=|TFo0-T&L`HB!x!KS)+c)o6FCz+si0p zwti-h{ zq5pp-aYY5Fz+Wk#gGIBL<4IXtJCCzkTi`3W<=o+Bm^%f7mt&xpV=Sy3PdzE}ip{ZK V6Wc(iBkpt{e+En!8Ws4p0uL **Example:** JPMorgan Chase uses DevSecOps pipelines to secure microservices and APIs in real-time, preventing threats without slowing down development. + +--- + +## 2. Tech & SaaS Companies: Securing CI/CD Pipelines + +**The Challenge:** +Startups and cloud-native companies rely heavily on fast deployment. However, fast releases can introduce unseen vulnerabilities if security isn’t embedded from the start. + +**DevSecOps Use Case:** +Companies like GitHub and Netflix use DevSecOps to integrate Static Application Security Testing (SAST) and Dynamic Analysis (DAST) tools into Git-based workflows. Every pull request is automatically scanned, and developers receive security alerts inline with their code reviews. + +**Key Benefits:** +- Eliminates “security bottleneck” by shifting left. +- Reduces post-production vulnerabilities. +- Encourages secure-by-design development culture. + +> **Example:** Netflix uses automated policy-as-code tools and secure infrastructure provisioning to safeguard its large-scale cloud environments. + +--- + +## 3. Healthcare: Protecting Patient Data (HIPAA Compliance) + +**The Challenge:** +Healthcare apps and devices manage highly sensitive patient data. They must comply with HIPAA regulations while still pushing updates quickly for bug fixes and new features. + +**DevSecOps Use Case:** +Hospitals and healthtech companies automate threat modeling, security testing, and incident response through DevSecOps. Security gates prevent non-compliant code from being deployed. + +**Key Benefits:** +- Ensures data encryption standards are maintained. +- Enables secure data transmission over APIs. +- Enhances auditability and traceability in logs. + +> **Example:** A telemedicine platform uses DevSecOps to automatically encrypt stored data and monitor for anomalous access patterns using tools like AWS GuardDuty. + +--- + +## 4. E-Commerce & Retail: Preventing Data Breaches at Scale + +**The Challenge:** +Retail companies collect customer PII, credit card info, and behavior data. These platforms are prime targets for attackers, especially during peak seasons like Black Friday. + +**DevSecOps Use Case:** +DevSecOps pipelines are used to scan containers and infrastructure code before deploying to production. Cloud Security Posture Management (CSPM) tools are integrated to enforce least-privilege access. + +**Key Benefits:** +- Real-time security alerts reduce Mean Time to Detect (MTTD). +- Helps maintain uptime by proactively identifying risks. +- Protects customer data and payment infrastructure. + +> **Example:** Walmart automates threat detection across multi-cloud environments and employs role-based access control (RBAC) policies using Infrastructure as Code (IaC). + +--- + +## 5. Government & Defense: Building Secure Software Supply Chains + +**The Challenge:** +Agencies and contractors must ensure software integrity due to nation-state threats and the need for secure communications and critical infrastructure. + +**DevSecOps Use Case:** +Government agencies apply DevSecOps to enforce software supply chain security using tools like Sigstore, SLSA, and in-toto. Every build artifact is signed and traceable. + +**Key Benefits:** +- Reduces risk of software tampering (e.g., SolarWinds-style attacks). +- Encourages end-to-end visibility across the SDLC. +- Improves security posture against zero-day exploits. + +> **Example:** The U.S. Department of Defense (DoD) incorporates DevSecOps practices in its Platform One initiative to build secure, scalable digital services. + +--- + +## 6. Pharmaceutical & R&D: Accelerating Secure Innovation + +**The Challenge:** +R&D departments in pharmaceutical companies rely on complex data pipelines and simulations. Intellectual property (IP) and patient trial data must be tightly secured. + +**DevSecOps Use Case:** +DevSecOps is applied to ensure that data pipelines, machine learning models, and simulation software are secure by design. Role-based secrets management and encrypted storage are enforced throughout. + +**Key Benefits:** +- Prevents IP theft by limiting insider and external threats. +- Reduces friction between compliance and innovation. +- Enables reproducible and verifiable research environments. + +> **Example:** A global biotech firm uses GitOps and DevSecOps tools to manage its infrastructure-as-code for automated, auditable experimentation environments. + +--- + +## Final Thoughts + +DevSecOps is not a tool or a product, but a philosophy—a cultural and technical shift that brings development, security, and operations together. + +These real-world use cases highlight how critical DevSecOps is for: +- Accelerating time-to-market +- Strengthening security posture +- Enabling regulatory compliance +- Reducing incident recovery times + +As you continue to learn DevSecOps, always think in terms of **automation**, **integration**, and **visibility**. And remember: security isn't a gate at the end—it's a thread that runs through every step. diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md new file mode 100644 index 0000000..a65876d --- /dev/null +++ b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md @@ -0,0 +1,138 @@ +--- +title: Chapter 2 - Common DevSecOps Industry Roles +layout: custom +parent: Topic 6 - DevSecOps in Industry +has_toc: false +nav_order: 2 +--- + +# 🔐 Common DevSecOps Roles in the Industry + +In this section, we’ll break down the most common DevSecOps roles in today’s tech landscape. You’ll learn what each role does, their core responsibilities, and the essential skills required. + +--- + +## 1. DevSecOps Engineer + +**What They Do:** +A DevSecOps Engineer embeds security throughout the software development lifecycle. They design secure pipelines, integrate security tools into CI/CD workflows, and help developers write safer code. + +**Key Responsibilities:** +- Automate security testing (SAST, DAST, SCA) in CI/CD pipelines +- Implement security as code using Infrastructure as Code (IaC) +- Monitor for vulnerabilities in code, containers, and dependencies +- Collaborate with developers, ops, and security teams + +**Essential Skills:** +- CI/CD tools (e.g., Jenkins, GitHub Actions, GitLab CI) +- Scripting (Bash, Python, Groovy) +- IaC tools (Terraform, CloudFormation) +- Security tools (Snyk, Checkov, Trivy, OWASP ZAP) + +--- + +## 2. Security Automation Engineer + +**What They Do:** +Focuses on scripting and tool creation to automate security tasks, reducing manual effort and ensuring consistent policy enforcement. + +**Key Responsibilities:** +- Develop custom tools for vulnerability scanning and reporting +- Automate access control and secrets management +- Integrate security alerts with monitoring and ticketing systems +- Build remediation playbooks using automation platforms + +**Essential Skills:** +- Programming (Python, Go, JavaScript) +- Automation tools (Ansible, Puppet, Chef) +- API integrations (e.g., GitHub + Slack + Jira) +- Knowledge of SIEM systems (Splunk, ELK, QRadar) + +--- + +## 3. Application Security Engineer (AppSec) + +**What They Do:** +Specializes in the security of application code, libraries, and frameworks. Often conducts code reviews and helps developers fix vulnerabilities. + +**Key Responsibilities:** +- Perform static and dynamic code analysis (SAST/DAST) +- Conduct threat modeling and security reviews +- Review open-source dependencies (SCA) +- Educate developers on secure coding practices + +**Essential Skills:** +- Secure coding in Java, Python, JavaScript, etc. +- Familiarity with tools like SonarQube, Veracode, Fortify +- Deep understanding of OWASP Top 10 +- Strong communication for developer collaboration + +--- + +## 4. Cloud Security Engineer + +**What They Do:** +Secures cloud-native infrastructure, ensuring cloud environments are safe and compliant with organizational policies. + +**Key Responsibilities:** +- Define IAM (Identity and Access Management) policies +- Monitor cloud misconfigurations and enforce guardrails +- Secure container orchestration (e.g., Kubernetes) +- Manage encryption, logging, and secrets + +**Essential Skills:** +- Cloud platforms (AWS, Azure, GCP) +- Tools like Prisma Cloud, AWS GuardDuty, Azure Security Center +- Container security (Falco, Aqua, Sysdig) +- Kubernetes security and RBAC + +--- + +## 5. Site Reliability Engineer (SRE) with Security Focus + +**What They Do:** +Ensures system reliability and performance while also focusing on threat detection, incident response, and reducing the attack surface. + +**Key Responsibilities:** +- Design secure and resilient systems +- Automate monitoring and alerts for suspicious activity +- Collaborate with SOC teams to resolve incidents +- Implement Zero Trust and defense-in-depth strategies + +**Essential Skills:** +- Systems architecture (Linux, networking, load balancing) +- Observability tools (Grafana, Prometheus, Datadog) +- Incident response frameworks +- Scripting and automation + +--- + +## 6. DevSecOps Architect + +**What They Do:** +A strategic leadership role responsible for designing and driving DevSecOps strategies across the organization. + +**Key Responsibilities:** +- Design secure DevOps workflows across teams and tools +- Choose and standardize CI/CD, IaC, and security toolchains +- Develop governance policies for compliance and risk +- Align technical and business goals with security practices + +**Essential Skills:** +- Deep understanding of DevOps principles and security frameworks +- Experience across cloud, CI/CD, containers, and automation +- Risk management and compliance (SOC2, HIPAA, NIST) +- Leadership and stakeholder communication + +--- + +## Other Supporting Roles in a DevSecOps Team + +In larger organizations, additional roles often support DevSecOps efforts: + +| Role | Description | +|----------------------------------|-------------------------------------------------------------| +| Product Manager (Security-focused) | Ensures security is prioritized in product roadmaps | +| Compliance Analyst | Helps teams meet regulatory standards | +| Penetration Tester | Simulates attacks and recommends security improvements | +| Security Champion | Promotes secure coding within development teams | diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/index.md index a66435c..3e462d3 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/index.md @@ -9,5 +9,6 @@ nav_order: 7 | Chapter | Learning Objectives | Lab Description | |---------|---------------------|-----------------| -| Chapter 1: Use of DevSecOps in Industry | +| Chapter 1: Use of DevSecOps in Industry | - Describe how DevSecOps is used across key industries.
    - Recognize unique security and compliance needs in each sector.
    - Identify tools and practices that enable secure, fast delivery.
    - Understand how DevSecOps protects data and IP.
    - Recall real-world examples of DevSecOps in action. | +| Chapter 2: Common DevSecOps Industry Roles | - Identify key DevSecOps roles and their focus areas.
    - Summarize each role’s responsibilities and impact on security.
    - Recognize essential tools and skills used across roles.
    - Understand the importance of cross-team collaboration.
    - Distinguish between core and supporting DevSecOps roles. | From d989a450f7f8ce90a7cd0eaac94a6a9f485fd972 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 16:36:06 -0700 Subject: [PATCH 17/68] Create CNAME --- CNAME | 1 + 1 file changed, 1 insertion(+) create mode 100644 CNAME diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..ab72b21 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +www.katieshi.com \ No newline at end of file From 43352372eac205480eddf3156d3cd28a0c7fe326 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 16:38:13 -0700 Subject: [PATCH 18/68] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index ab72b21..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -www.katieshi.com \ No newline at end of file From a432cfd38a964768fbbe090a1643849724caf771 Mon Sep 17 00:00:00 2001 From: MorVered7 <121904622+MorVered7@users.noreply.github.com> Date: Wed, 14 May 2025 16:46:36 -0700 Subject: [PATCH 19/68] Updated README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c881fb2..161ef45 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# open-devsecops Website \ No newline at end of file +# open-devsecops Website +If others want to continue contributing to this website, they should feel free to fork this repository and add more lessons/labs/concepts/quizzes. The coding languages used to create this website is Jekyll, Ruby, and Markdown. + +A presentation deck about this project can be found here: https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8K3o/edit?usp=sharing +Our final product: From e1c2c68226718642d2d378a0661a0f10a798a1b5 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 14 May 2025 17:00:53 -0700 Subject: [PATCH 20/68] adding cloud topics --- .../chapter-2-cloud-in-devsecops/index.md | 110 ++++++++++++- .../index.md | 0 docs/course/Topic-5-Cloud/index.md | 154 +++++++++++++++++- 3 files changed, 256 insertions(+), 8 deletions(-) create mode 100644 docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md diff --git a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md index 5aa9f42..24f916b 100644 --- a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md +++ b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md @@ -4,4 +4,112 @@ layout: custom parent: Topic 5 - Cloud has_toc: false nav_order: 2 ---- \ No newline at end of file +--- + +# Cloud-Native DevSecOps + +DevSecOps is about integrating security into every part of the software development lifecycle. When you move to the cloud, it transforms how you build, test, deploy, and secure applications. Cloud-native DevSecOps means adapting security practices to the flexibility, speed, and scale the cloud offers. + +Instead of securing systems after they're built, teams using the cloud embed security into their continuous integration and continuous delivery (CI/CD) pipelines. The cloud enables: + +- Faster feedback loops +- Automated security checks +- Easier compliance management + +--- + +## Key Cloud Concepts for DevSecOps + +Here are the fundamental concepts every DevSecOps engineer needs to understand when working with the cloud: + +### Infrastructure as Code (IaC) + +Instead of manually configuring servers and networks, you write code to provision and manage infrastructure. This makes it easier to review, audit, and secure environments. + +**Examples:** + +- AWS CloudFormation +- Terraform +- Azure Resource Manager (ARM) templates + +--- + +### Immutable Infrastructure + +In traditional systems, servers are updated and patched manually. In cloud DevSecOps, servers are often replaced instead of updated. This reduces configuration drift and security risks. + +**Example:** +Deploying new Amazon EC2 instances from an updated AMI rather than patching existing instances. + +--- + +### Security as Code + +Security policies (firewall rules, IAM permissions, encryption settings) are defined and managed as code. This allows you to version, review, and automate security just like application code. + +--- + +### Microservices and Serverless + +Cloud-native architectures break applications into small, independent services that communicate over APIs. Serverless computing lets you run functions without managing servers. + +**Security Implications:** + +- More endpoints to protect (API security is critical) +- Function isolation and permission scoping are necessary +- Identity and access management becomes even more important + +--- + +### The Shared Responsibility Model + +Understanding who is responsible for what is critical in cloud environments. +See: [AWS Shared Responsibility Model](https://aws.amazon.com/compliance/shared-responsibility-model/) + +--- + +## Common Cloud Security Practices in DevSecOps + +- **Use Identity Federation**: Centralize user access management through secure identity providers. +- **Encrypt Everything**: Encrypt data at rest and in transit by default. +- **Shift Security Left**: Integrate security testing (e.g., SAST, DAST) early in the development cycle. +- **Implement Zero Trust Principles**: Verify every access attempt, regardless of source. +- **Use Container Security Tools**: Scan container images before deployment (e.g., Trivy, AWS ECR scanning). +- **Continuous Compliance Monitoring**: Automate checks for frameworks like SOC2, GDPR, HIPAA using cloud-native tools (e.g., AWS Config, Azure Policy). + +--- + +## Example Scenario: DevSecOps in the Cloud + +**Pat is building a fintech app that processes sensitive financial data.** +She uses AWS to deploy her app and sets up the following: + +- **Infrastructure as Code** with Terraform +- **CI pipelines** that run security tests (SAST, dependency checks) +- **Encryption** for all stored data in Amazon S3 buckets +- **Fine-grained IAM Roles** for different microservices +- **Automated Compliance Reports** using AWS Security Hub + +Thanks to the cloud, Pat’s team can deploy updates daily, automate security, and scale globally—all while maintaining strong security standards. + +--- + +## Summary + +The cloud has revolutionized DevSecOps by making it easier to automate, secure, and scale applications. However, it introduces new challenges: + +- Shared responsibility +- Infrastructure complexity +- Constant vigilance required + +Mastering cloud-native DevSecOps practices ensures that security is not a bottleneck—but an enabler for innovation. + +--- + +## Resources + +- [NIST SP 800-210](https://csrc.nist.gov/pubs/sp/800/210/final) +- [AWS Shared Responsibility Model](https://aws.amazon.com/compliance/shared-responsibility-model/) +- [Microsoft Azure Security Documentation](https://learn.microsoft.com/en-us/azure/security/) +- [Google DevSecOps Toolkit](https://cloud.google.com/blog/products/networking/introducing-the-devsecops-toolkit) +- [HashiCorp Terraform Recommended Practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) diff --git a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/course/Topic-5-Cloud/index.md b/docs/course/Topic-5-Cloud/index.md index 3e922b2..e870ebb 100644 --- a/docs/course/Topic-5-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/index.md @@ -1,15 +1,155 @@ --- -title: Topic 5 - Cloud +title: Chapter 3 - Cloud Tools and Platforms layout: custom -has_children: true +parent: Topic 5 - Cloud has_toc: false -nav_order: 6 +nav_order: 3 --- -# Topic 5 - Cloud +# DevSecOps Cloud Tools and Platforms -| Chapter | Learning Objectives | Lab Description | -|---------|---------------------|-----------------| -| Chapter 1: Intro to Cloud | +DevSecOps isn’t just a set of principles—it’s enabled by a powerful ecosystem of tools and platforms that make cloud-native development, security, and operations possible. In this chapter, we’ll explore essential cloud tools across categories like automation, CI/CD, security scanning, monitoring, and compliance, tailored to a DevSecOps pipeline. +--- + +## Why Tooling Matters + +Without the right tools, DevSecOps in the cloud is nearly impossible to scale. Cloud tools let you: + +- Automate security testing and deployments +- Monitor for threats in real time +- Enforce policies across distributed infrastructure +- Shift security left without slowing down development + +Most tools are designed to integrate with cloud services (AWS, Azure, GCP) and provide API-driven, scalable automation—a must in any DevSecOps pipeline. + +--- + +## Categories of DevSecOps Tools in the Cloud + +### 1. CI/CD Orchestration Tools + +CI/CD tools automate code building, testing, and deployment—core to continuous integration and delivery. The best CI/CD tools support plugin architectures and security scanning hooks. + +**Popular Platforms:** + +- **GitHub Actions**: Native to GitHub. Easily integrates security checks (e.g., SAST, secrets scanning). +- **GitLab CI**: Built-in DevSecOps support including SAST, DAST, dependency scanning. +- **AWS CodePipeline / CodeBuild**: Integrates with AWS services for cloud-native CI/CD. +- **Azure DevOps**: Full lifecycle management with security scanning extensions. + +> Example: Add an `npm audit` step to a GitHub Actions workflow to scan for vulnerable dependencies every time code is pushed. + +--- + +### 2. Security Scanning Tools + +Security tools in the cloud should fit seamlessly into your CI/CD process and cover multiple layers: + +**SAST (Static Application Security Testing)**: Scans source code for vulnerabilities. +**Tools**: SonarQube, Semgrep, CodeQL (GitHub) + +**DAST (Dynamic Application Security Testing)**: Tests running applications. +**Tools**: OWASP ZAP, Burp Suite, StackHawk + +**SCA (Software Composition Analysis)**: Identifies vulnerable dependencies. +**Tools**: Snyk, Dependabot, WhiteSource + +> Integrate Semgrep or Snyk into your build pipeline to block insecure code from being deployed. +> For more information about this, check out Topic 4 Chapter 3! + +--- + +### 3. Secrets Management Tools + +Hardcoding secrets like API keys in your source code is a major security risk. Cloud-native secrets managers solve this by centralizing and encrypting credentials. + +**Popular Tools:** + +- **HashiCorp Vault**: Manages secrets across multi-cloud environments. +- **AWS Secrets Manager**: Native AWS integration, with auto-rotation support. +- **Azure Key Vault**: Protects credentials, keys, and certificates in Azure. +- **Google Secret Manager**: Fully managed, GCP-native secret storage. + +> Best practice: Inject secrets into your apps at runtime via environment variables or cloud SDKs—never hardcode them. + +--- + +### 4. Container & Kubernetes Security Tools + +Containers are everywhere in cloud DevSecOps—but they bring unique risks. Use purpose-built tools to scan images, enforce policies, and monitor runtime behavior. + +**Key Tools:** + +- **Trivy**: Lightweight vulnerability scanner for container images and Kubernetes. +- **Aqua Security / Prisma Cloud / Sysdig Secure**: Full-featured platforms for runtime protection. +- **OPA / Gatekeeper**: Policy-as-code for Kubernetes environments (e.g., disallow root containers). +- **Kube-bench**: Tests your clusters against the CIS Kubernetes Benchmark. + +> Use GitOps-style workflows to deploy Kubernetes manifests and scan them for misconfigurations. + +--- + +### 5. Monitoring, Logging & Threat Detection + +To detect and respond to incidents, you need visibility. Cloud providers offer native tools, but third-party platforms can centralize data from multi-cloud environments. + +**Logging & Monitoring Tools:** + +- AWS CloudWatch / GuardDuty +- Azure Monitor / Microsoft Defender for Cloud +- Google Cloud Operations Suite +- Datadog, Splunk, New Relic (cloud-agnostic options) + +**SIEM & Threat Detection:** + +- Elastic Security (ELK Stack) +- Falco (runtime security for containers) +- Wazuh (open-source threat detection) + +> Example: Set up GuardDuty to monitor for suspicious activity like unusual API calls or unauthorized access. + +--- + +### 6. Cloud Compliance Automation Tools + +For organizations in regulated industries, meeting compliance requirements (e.g., SOC2, HIPAA, PCI-DSS) in the cloud can be automated and integrated into the pipeline. + +**Notable Tools:** + +- AWS Config + Security Hub +- Azure Policy +- GCP Security Command Center +- Bridgecrew (IaC and cloud compliance scanning) +- OpenSCAP (Open-source compliance assessment) + +> Automate scanning of Terraform or CloudFormation templates for policy violations before deployment. + +--- + +## Summary + +DevSecOps in the cloud is powered by a rich ecosystem of specialized tools. From CI/CD to runtime protection and compliance monitoring, the right tools enable you to bake security into every stage of your development lifecycle—without slowing innovation. + +**Choose tools that:** + +- Integrate with your cloud provider +- Support automation +- Fit your team’s workflows +- Help you monitor, detect, and respond in real time + +> Remember: tools don’t replace strategy—but they do make secure development scalable and repeatable. + +--- + +## References +- [GitHub Actions Documentation](https://docs.github.com/en/actions) +- [Semgrep CI Integration](https://semgrep.dev/docs/deployment/add-semgrep-to-ci) +- [HashiCorp Vault](https://developer.hashicorp.com/vault) +- [Trivy Scanner](https://github.com/aquasecurity/trivy) +- [Falco](https://falco.org/) +- [AWS Config Guide](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) +- [AWS Marketplace Compliance Tools](https://aws.amazon.com/marketplace/pp/prodview-yfh7zy22jbbt2) +- [Azure Policy Overview](https://learn.microsoft.com/en-us/azure/governance/policy/overview) +- [Google Cloud Security Command Center](https://cloud.google.com/security/products/security-command-center?hl=en) From db17842e5350ebdf5a969bd4c432ad35c310badf Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 17:53:07 -0700 Subject: [PATCH 21/68] Update README.md --- README.md | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 161ef45..c86379d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,120 @@ -# open-devsecops Website -If others want to continue contributing to this website, they should feel free to fork this repository and add more lessons/labs/concepts/quizzes. The coding languages used to create this website is Jekyll, Ruby, and Markdown. + +[![contributors][contributors-shield]][contributors-url] +[![commits][commits-shield]][commits-url] -A presentation deck about this project can be found here: https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8K3o/edit?usp=sharing -Our final product: + +
    +
    + + open DevSecOps triangle logo + +

    Open DevSecOps v2

    +
    + + +
    + Table of Contents +
      +
    1. + About The Project + +
    2. +
    3. + Getting Started + +
    4. +
    5. Contact
    6. +
    +
    + + + +## About The Project + +Many students entering the software industry are unprepared for the newest expectations of entry-level roles, where understanding security and efficient operations are the bare-minimum at every phase of the software development lifecycle. The "Open-DevSecOps" project addresses this significant gap in education concerning DevSecOps and CI/CD principles. Our extensively researched online modules aim to offer a free educational service to enhance the understanding and application of these crucial skills. This project strives to provide essential up-to-date training, and shape the security industry's future for the better starting with every new-grad employee. + +### Final Website + +katieshi413.github.io/open-devsecops.github.io/ + +### Final Presentation + +https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8K3o/edit?usp=sharing + +### Built With + +* [![Jekyll][Jekyll]][Jekyll-url] +* [![Ruby][Ruby]][Ruby-url] + +

    (back to top)

    + + + +## Getting Started + + To get a local copy up and running follow these steps. + +### Prerequisites +- Ruby 3.4.1 +- [Bundler](https://bundler.io/) +- [Jekyll](https://jekyllrb.com/) + +### Installation + +1. Install Ruby and Bundler + + ```sh + # If you haven’t already, install Ruby (version 3.4.1), then install Bundler: + gem install bundler + ``` + +2. Navigate to the project directory + + ```sh + cd your-project-directory + ``` + +3. Install project dependencies + + ```sh + bundle install + ``` + +4. Serve the site locally + + ```sh + bundle exec jekyll serve + ``` +5. Open your browser and visit: + + ```sh + http://localhost:4000 + ``` + +

    (back to top)

    + + +## Contact + +

    Katie Shi - LinkedIn - katieshi413@gmail.com

    +

    Emily Choi - LinkedIn - eemilychoi@gmail.edu

    +

    Jocelyn Margarones - LinkedIn - katieshi@uw.edu

    +

    Mor Verdad - LinkedIn - katieshi@uw.edu

    +

    Mira Nair - LinkedIn - miranair@uw.edu

    + +

    (back to top)

    + + +[contributors-shield]: https://img.shields.io/github/contributors/katieshi413/open-devsecops.github.io?style=for-the-badge&color=rgb(68%2C%20204%2C%2017) +[contributors-url]: https://github.com/katieshi413/open-devsecops.github.io/graphs/contributors +[commits-shield]: https://img.shields.io/github/commit-activity/t/katieshi413/open-devsecops.github.io?style=for-the-badge +[commits-url]: https://github.com/katieshi413/open-devsecops.github.io/commits/main/ +[Jekyll]: https://img.shields.io/static/v1?style=for-the-badge&message=Jekyll&color=CC0000&logo=Jekyll&logoColor=FFFFFF&label= +[Jekyll-url]: https://jekyllrb.com/ +[Ruby]: https://img.shields.io/badge/Ruby-CC342D?logo=Ruby&logoColor=white +[Ruby-url]: https://www.ruby-lang.org/en/ From 1541f63af6bf29d8eb85be466e777de3f8a1d7c3 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 17:57:57 -0700 Subject: [PATCH 22/68] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c86379d..d61dd20 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8 * [![Jekyll][Jekyll]][Jekyll-url] * [![Ruby][Ruby]][Ruby-url] +* [![Markdown][Markdown]][Markdown-url] +

    (back to top)

    @@ -118,3 +120,5 @@ https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8 [Jekyll-url]: https://jekyllrb.com/ [Ruby]: https://img.shields.io/badge/Ruby-CC342D?logo=Ruby&logoColor=white [Ruby-url]: https://www.ruby-lang.org/en/ +[Markdown]: https://img.shields.io/badge/markdown-%23000000.svg?style=for-the-badge&logo=markdown&logoColor=white +[Markdown-url]: https://www.markdownguide.org/ From 74a3b33ef19e11a35610c6d3bd5915b46ca98eb6 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 17:59:13 -0700 Subject: [PATCH 23/68] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d61dd20..088953b 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ Many students entering the software industry are unprepared for the newest expec ### Final Website -katieshi413.github.io/open-devsecops.github.io/ +www.katieshi413.github.io/open-devsecops.github.io/ ### Final Presentation From 1fd13d34bd4f3c3ee3441d30abb0beb61c9c1212 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 14 May 2025 18:01:19 -0700 Subject: [PATCH 24/68] done adding cloud --- .../index.md | 155 +++++++++++++++++ docs/course/Topic-5-Cloud/index.md | 160 +----------------- 2 files changed, 161 insertions(+), 154 deletions(-) diff --git a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md index e69de29..e870ebb 100644 --- a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md +++ b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md @@ -0,0 +1,155 @@ +--- +title: Chapter 3 - Cloud Tools and Platforms +layout: custom +parent: Topic 5 - Cloud +has_toc: false +nav_order: 3 +--- + +# DevSecOps Cloud Tools and Platforms + +DevSecOps isn’t just a set of principles—it’s enabled by a powerful ecosystem of tools and platforms that make cloud-native development, security, and operations possible. In this chapter, we’ll explore essential cloud tools across categories like automation, CI/CD, security scanning, monitoring, and compliance, tailored to a DevSecOps pipeline. + +--- + +## Why Tooling Matters + +Without the right tools, DevSecOps in the cloud is nearly impossible to scale. Cloud tools let you: + +- Automate security testing and deployments +- Monitor for threats in real time +- Enforce policies across distributed infrastructure +- Shift security left without slowing down development + +Most tools are designed to integrate with cloud services (AWS, Azure, GCP) and provide API-driven, scalable automation—a must in any DevSecOps pipeline. + +--- + +## Categories of DevSecOps Tools in the Cloud + +### 1. CI/CD Orchestration Tools + +CI/CD tools automate code building, testing, and deployment—core to continuous integration and delivery. The best CI/CD tools support plugin architectures and security scanning hooks. + +**Popular Platforms:** + +- **GitHub Actions**: Native to GitHub. Easily integrates security checks (e.g., SAST, secrets scanning). +- **GitLab CI**: Built-in DevSecOps support including SAST, DAST, dependency scanning. +- **AWS CodePipeline / CodeBuild**: Integrates with AWS services for cloud-native CI/CD. +- **Azure DevOps**: Full lifecycle management with security scanning extensions. + +> Example: Add an `npm audit` step to a GitHub Actions workflow to scan for vulnerable dependencies every time code is pushed. + +--- + +### 2. Security Scanning Tools + +Security tools in the cloud should fit seamlessly into your CI/CD process and cover multiple layers: + +**SAST (Static Application Security Testing)**: Scans source code for vulnerabilities. +**Tools**: SonarQube, Semgrep, CodeQL (GitHub) + +**DAST (Dynamic Application Security Testing)**: Tests running applications. +**Tools**: OWASP ZAP, Burp Suite, StackHawk + +**SCA (Software Composition Analysis)**: Identifies vulnerable dependencies. +**Tools**: Snyk, Dependabot, WhiteSource + +> Integrate Semgrep or Snyk into your build pipeline to block insecure code from being deployed. +> For more information about this, check out Topic 4 Chapter 3! + +--- + +### 3. Secrets Management Tools + +Hardcoding secrets like API keys in your source code is a major security risk. Cloud-native secrets managers solve this by centralizing and encrypting credentials. + +**Popular Tools:** + +- **HashiCorp Vault**: Manages secrets across multi-cloud environments. +- **AWS Secrets Manager**: Native AWS integration, with auto-rotation support. +- **Azure Key Vault**: Protects credentials, keys, and certificates in Azure. +- **Google Secret Manager**: Fully managed, GCP-native secret storage. + +> Best practice: Inject secrets into your apps at runtime via environment variables or cloud SDKs—never hardcode them. + +--- + +### 4. Container & Kubernetes Security Tools + +Containers are everywhere in cloud DevSecOps—but they bring unique risks. Use purpose-built tools to scan images, enforce policies, and monitor runtime behavior. + +**Key Tools:** + +- **Trivy**: Lightweight vulnerability scanner for container images and Kubernetes. +- **Aqua Security / Prisma Cloud / Sysdig Secure**: Full-featured platforms for runtime protection. +- **OPA / Gatekeeper**: Policy-as-code for Kubernetes environments (e.g., disallow root containers). +- **Kube-bench**: Tests your clusters against the CIS Kubernetes Benchmark. + +> Use GitOps-style workflows to deploy Kubernetes manifests and scan them for misconfigurations. + +--- + +### 5. Monitoring, Logging & Threat Detection + +To detect and respond to incidents, you need visibility. Cloud providers offer native tools, but third-party platforms can centralize data from multi-cloud environments. + +**Logging & Monitoring Tools:** + +- AWS CloudWatch / GuardDuty +- Azure Monitor / Microsoft Defender for Cloud +- Google Cloud Operations Suite +- Datadog, Splunk, New Relic (cloud-agnostic options) + +**SIEM & Threat Detection:** + +- Elastic Security (ELK Stack) +- Falco (runtime security for containers) +- Wazuh (open-source threat detection) + +> Example: Set up GuardDuty to monitor for suspicious activity like unusual API calls or unauthorized access. + +--- + +### 6. Cloud Compliance Automation Tools + +For organizations in regulated industries, meeting compliance requirements (e.g., SOC2, HIPAA, PCI-DSS) in the cloud can be automated and integrated into the pipeline. + +**Notable Tools:** + +- AWS Config + Security Hub +- Azure Policy +- GCP Security Command Center +- Bridgecrew (IaC and cloud compliance scanning) +- OpenSCAP (Open-source compliance assessment) + +> Automate scanning of Terraform or CloudFormation templates for policy violations before deployment. + +--- + +## Summary + +DevSecOps in the cloud is powered by a rich ecosystem of specialized tools. From CI/CD to runtime protection and compliance monitoring, the right tools enable you to bake security into every stage of your development lifecycle—without slowing innovation. + +**Choose tools that:** + +- Integrate with your cloud provider +- Support automation +- Fit your team’s workflows +- Help you monitor, detect, and respond in real time + +> Remember: tools don’t replace strategy—but they do make secure development scalable and repeatable. + +--- + +## References + +- [GitHub Actions Documentation](https://docs.github.com/en/actions) +- [Semgrep CI Integration](https://semgrep.dev/docs/deployment/add-semgrep-to-ci) +- [HashiCorp Vault](https://developer.hashicorp.com/vault) +- [Trivy Scanner](https://github.com/aquasecurity/trivy) +- [Falco](https://falco.org/) +- [AWS Config Guide](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) +- [AWS Marketplace Compliance Tools](https://aws.amazon.com/marketplace/pp/prodview-yfh7zy22jbbt2) +- [Azure Policy Overview](https://learn.microsoft.com/en-us/azure/governance/policy/overview) +- [Google Cloud Security Command Center](https://cloud.google.com/security/products/security-command-center?hl=en) diff --git a/docs/course/Topic-5-Cloud/index.md b/docs/course/Topic-5-Cloud/index.md index e870ebb..7208434 100644 --- a/docs/course/Topic-5-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/index.md @@ -1,155 +1,7 @@ ---- -title: Chapter 3 - Cloud Tools and Platforms -layout: custom -parent: Topic 5 - Cloud -has_toc: false -nav_order: 3 ---- +# Topic 5 – Cloud in DevSecOps -# DevSecOps Cloud Tools and Platforms - -DevSecOps isn’t just a set of principles—it’s enabled by a powerful ecosystem of tools and platforms that make cloud-native development, security, and operations possible. In this chapter, we’ll explore essential cloud tools across categories like automation, CI/CD, security scanning, monitoring, and compliance, tailored to a DevSecOps pipeline. - ---- - -## Why Tooling Matters - -Without the right tools, DevSecOps in the cloud is nearly impossible to scale. Cloud tools let you: - -- Automate security testing and deployments -- Monitor for threats in real time -- Enforce policies across distributed infrastructure -- Shift security left without slowing down development - -Most tools are designed to integrate with cloud services (AWS, Azure, GCP) and provide API-driven, scalable automation—a must in any DevSecOps pipeline. - ---- - -## Categories of DevSecOps Tools in the Cloud - -### 1. CI/CD Orchestration Tools - -CI/CD tools automate code building, testing, and deployment—core to continuous integration and delivery. The best CI/CD tools support plugin architectures and security scanning hooks. - -**Popular Platforms:** - -- **GitHub Actions**: Native to GitHub. Easily integrates security checks (e.g., SAST, secrets scanning). -- **GitLab CI**: Built-in DevSecOps support including SAST, DAST, dependency scanning. -- **AWS CodePipeline / CodeBuild**: Integrates with AWS services for cloud-native CI/CD. -- **Azure DevOps**: Full lifecycle management with security scanning extensions. - -> Example: Add an `npm audit` step to a GitHub Actions workflow to scan for vulnerable dependencies every time code is pushed. - ---- - -### 2. Security Scanning Tools - -Security tools in the cloud should fit seamlessly into your CI/CD process and cover multiple layers: - -**SAST (Static Application Security Testing)**: Scans source code for vulnerabilities. -**Tools**: SonarQube, Semgrep, CodeQL (GitHub) - -**DAST (Dynamic Application Security Testing)**: Tests running applications. -**Tools**: OWASP ZAP, Burp Suite, StackHawk - -**SCA (Software Composition Analysis)**: Identifies vulnerable dependencies. -**Tools**: Snyk, Dependabot, WhiteSource - -> Integrate Semgrep or Snyk into your build pipeline to block insecure code from being deployed. -> For more information about this, check out Topic 4 Chapter 3! - ---- - -### 3. Secrets Management Tools - -Hardcoding secrets like API keys in your source code is a major security risk. Cloud-native secrets managers solve this by centralizing and encrypting credentials. - -**Popular Tools:** - -- **HashiCorp Vault**: Manages secrets across multi-cloud environments. -- **AWS Secrets Manager**: Native AWS integration, with auto-rotation support. -- **Azure Key Vault**: Protects credentials, keys, and certificates in Azure. -- **Google Secret Manager**: Fully managed, GCP-native secret storage. - -> Best practice: Inject secrets into your apps at runtime via environment variables or cloud SDKs—never hardcode them. - ---- - -### 4. Container & Kubernetes Security Tools - -Containers are everywhere in cloud DevSecOps—but they bring unique risks. Use purpose-built tools to scan images, enforce policies, and monitor runtime behavior. - -**Key Tools:** - -- **Trivy**: Lightweight vulnerability scanner for container images and Kubernetes. -- **Aqua Security / Prisma Cloud / Sysdig Secure**: Full-featured platforms for runtime protection. -- **OPA / Gatekeeper**: Policy-as-code for Kubernetes environments (e.g., disallow root containers). -- **Kube-bench**: Tests your clusters against the CIS Kubernetes Benchmark. - -> Use GitOps-style workflows to deploy Kubernetes manifests and scan them for misconfigurations. - ---- - -### 5. Monitoring, Logging & Threat Detection - -To detect and respond to incidents, you need visibility. Cloud providers offer native tools, but third-party platforms can centralize data from multi-cloud environments. - -**Logging & Monitoring Tools:** - -- AWS CloudWatch / GuardDuty -- Azure Monitor / Microsoft Defender for Cloud -- Google Cloud Operations Suite -- Datadog, Splunk, New Relic (cloud-agnostic options) - -**SIEM & Threat Detection:** - -- Elastic Security (ELK Stack) -- Falco (runtime security for containers) -- Wazuh (open-source threat detection) - -> Example: Set up GuardDuty to monitor for suspicious activity like unusual API calls or unauthorized access. - ---- - -### 6. Cloud Compliance Automation Tools - -For organizations in regulated industries, meeting compliance requirements (e.g., SOC2, HIPAA, PCI-DSS) in the cloud can be automated and integrated into the pipeline. - -**Notable Tools:** - -- AWS Config + Security Hub -- Azure Policy -- GCP Security Command Center -- Bridgecrew (IaC and cloud compliance scanning) -- OpenSCAP (Open-source compliance assessment) - -> Automate scanning of Terraform or CloudFormation templates for policy violations before deployment. - ---- - -## Summary - -DevSecOps in the cloud is powered by a rich ecosystem of specialized tools. From CI/CD to runtime protection and compliance monitoring, the right tools enable you to bake security into every stage of your development lifecycle—without slowing innovation. - -**Choose tools that:** - -- Integrate with your cloud provider -- Support automation -- Fit your team’s workflows -- Help you monitor, detect, and respond in real time - -> Remember: tools don’t replace strategy—but they do make secure development scalable and repeatable. - ---- - -## References - -- [GitHub Actions Documentation](https://docs.github.com/en/actions) -- [Semgrep CI Integration](https://semgrep.dev/docs/deployment/add-semgrep-to-ci) -- [HashiCorp Vault](https://developer.hashicorp.com/vault) -- [Trivy Scanner](https://github.com/aquasecurity/trivy) -- [Falco](https://falco.org/) -- [AWS Config Guide](https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html) -- [AWS Marketplace Compliance Tools](https://aws.amazon.com/marketplace/pp/prodview-yfh7zy22jbbt2) -- [Azure Policy Overview](https://learn.microsoft.com/en-us/azure/governance/policy/overview) -- [Google Cloud Security Command Center](https://cloud.google.com/security/products/security-command-center?hl=en) +| Chapter | Learning Objectives | +|---------|---------------------| +| Chapter 1: Introduction to Cloud | - Define cloud computing and its benefits for scalability and speed.
    - Distinguish between IaaS, PaaS, and SaaS service models.
    - Compare public, private, hybrid, and multi-cloud deployments.
    - Understand the shared responsibility model and key cloud security concepts. | +| Chapter 2: The Role of Cloud in DevSecOps | - Explain how cloud-native practices transform DevSecOps workflows.
    - Describe core concepts like Infrastructure as Code and immutable infrastructure.
    - Identify best practices such as Zero Trust, security as code, and continuous compliance.
    - Apply DevSecOps principles to cloud-native architectures including microservices and serverless. | +| Chapter 3: Cloud Tools and Platforms | - Identify essential DevSecOps tools for CI/CD, scanning, monitoring, and compliance.
    - Match cloud-native tools to stages of the DevSecOps lifecycle.
    - Understand how secrets management and container security tools reduce risk.
    - Recognize how automation supports scalable, secure cloud operations. | From aaca2d78697d62b752d0d40b4baafb6804bf9ea2 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 18:03:18 -0700 Subject: [PATCH 25/68] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 088953b..c7c27a2 100644 --- a/README.md +++ b/README.md @@ -104,10 +104,10 @@ https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8 ## Contact

    Katie Shi - LinkedIn - katieshi413@gmail.com

    -

    Emily Choi - LinkedIn - eemilychoi@gmail.edu

    +

    Emily Choi - LinkedIn - eemilychoi@gmail.com

    Jocelyn Margarones - LinkedIn - katieshi@uw.edu

    -

    Mor Verdad - LinkedIn - katieshi@uw.edu

    -

    Mira Nair - LinkedIn - miranair@uw.edu

    +

    Mor Vered - LinkedIn - katieshi@uw.edu

    +

    Mira Nair - LinkedIn - katieshi@uw.edu

    (back to top)

    From d399c78d6c0d9b5091febff8a83e31f45378ea18 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Wed, 14 May 2025 18:04:29 -0700 Subject: [PATCH 26/68] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c7c27a2..d2dc09a 100644 --- a/README.md +++ b/README.md @@ -106,8 +106,8 @@ https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8

    Katie Shi - LinkedIn - katieshi413@gmail.com

    Emily Choi - LinkedIn - eemilychoi@gmail.com

    Jocelyn Margarones - LinkedIn - katieshi@uw.edu

    -

    Mor Vered - LinkedIn - katieshi@uw.edu

    -

    Mira Nair - LinkedIn - katieshi@uw.edu

    +

    Mor Vered - LinkedIn - mvered9@gmail.com

    +

    Mira Nair - LinkedIn - miranair004@gmail.com

    (back to top)

    From 88a66a002bbe72cac861ea113084d5607350f1cf Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 14 May 2025 18:06:26 -0700 Subject: [PATCH 27/68] fixed cloud topics --- docs/course/Topic-5-Cloud/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/course/Topic-5-Cloud/index.md b/docs/course/Topic-5-Cloud/index.md index 7208434..1e8a5ec 100644 --- a/docs/course/Topic-5-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/index.md @@ -1,3 +1,10 @@ +--- +title: Topic 5 - Cloud in DevSecOps +layout: custom +has_children: true +has_toc: false +nav_order: 6 +--- # Topic 5 – Cloud in DevSecOps | Chapter | Learning Objectives | From 3a8074ad4223609e798d108397be9d8c357485c5 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 14 May 2025 18:12:45 -0700 Subject: [PATCH 28/68] trying to fix cloud --- docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md index 3866906..5633aeb 100644 --- a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -1,7 +1,7 @@ --- title: Chapter 1 - Intro to Cloud layout: custom -parent: Topic 5 - Cloud +parent: Topic 5 - Cloud in DevSecOps has_toc: false nav_order: 1 --- From cbebfe1679d7996972b8a948367904f1af729b0b Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 14 May 2025 18:15:13 -0700 Subject: [PATCH 29/68] fixed cloud topic --- docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md | 2 +- docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md | 2 +- docs/course/Topic-5-Cloud/index.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md index 5633aeb..2713c6e 100644 --- a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -1,7 +1,7 @@ --- title: Chapter 1 - Intro to Cloud layout: custom -parent: Topic 5 - Cloud in DevSecOps +parent: Topic 5 - Cloud has_toc: false nav_order: 1 --- diff --git a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md index 24f916b..8b5220b 100644 --- a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md +++ b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md @@ -1,7 +1,7 @@ --- title: Chapter 2 - Cloud in DevSecOps layout: custom -parent: Topic 5 - Cloud +parent: Topic 5 - Cloud has_toc: false nav_order: 2 --- diff --git a/docs/course/Topic-5-Cloud/index.md b/docs/course/Topic-5-Cloud/index.md index 1e8a5ec..30ee2f9 100644 --- a/docs/course/Topic-5-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/index.md @@ -1,5 +1,5 @@ --- -title: Topic 5 - Cloud in DevSecOps +title: Topic 5 - Cloud layout: custom has_children: true has_toc: false From 4e5ecd30b52faf998dcb7443e6dc216135f6608f Mon Sep 17 00:00:00 2001 From: emilychoi Date: Wed, 14 May 2025 18:22:08 -0700 Subject: [PATCH 30/68] add quiz for topic 5 chapter 1 intro to cloud --- _data/quizzes/topic5/chapter1.yml | 50 ++++++++++++++++--- .../chapter-1-Intro-to-Cloud/index.md | 9 ++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/_data/quizzes/topic5/chapter1.yml b/_data/quizzes/topic5/chapter1.yml index 1267700..9a5c43d 100644 --- a/_data/quizzes/topic5/chapter1.yml +++ b/_data/quizzes/topic5/chapter1.yml @@ -1,9 +1,43 @@ questions: - prompt: "adsjfa;" - options: - - "ajlfdsj" - - "adfafa" - - "asdfodf" - - "asdoifa" - correct_index: - explanation: \ No newline at end of file + - prompt: "True or False: Cloud computing requires teams to purchase and manage their own physical servers." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Cloud computing provides on-demand access to resources, removing the need for physical hardware management." + + - prompt: "Which of the following best describes the NIST definition of cloud computing?" + options: + - "A model for facilitating periodic, physical access to enterprise-owned computing hardware." + - "A framework for enabling offline, manual deployment of preconfigured hardware and network resources." + - "A model for enabling ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources." + - "A method for securing user authentication through identity verification across distributed networks." + correct_index: 2 + explanation: "According to NIST, cloud computing is about network access to shared, configurable computing resources." + + - prompt: "Which cloud service model provides full applications over the internet, abstracting away infrastructure and platforms?" + options: + - "IaaS" + - "Hybrid" + - "PaaS" + - "SaaS" + correct_index: 3 + explanation: "SaaS delivers complete applications, requiring no concern for the underlying systems." + + - prompt: "Which of the following is a key feature of Platform as a Service (PaaS)?" + options: + - "You manage the hardware and operating system yourself." + - "You build apps while the provider handles the OS and infrastructure." + - "You install your own operating system and runtime." + - "You use software via the internet without hosting it." + correct_index: 1 + explanation: "For PaaS, the provider handles the OS, runtime, and infrastructure while you build apps." + + - prompt: "Fill in the blank: _________ is a method for controlling who can access what, and what actions they can take." + options: + - "IAM (Identity & Access Management)" + - "Encryption" + - "Logging & Monitoring" + - "Scalability" + correct_index: 0 + explanation: "IAM (Identity & Access Management) is responsible for managing access permissions and user roles in the cloud." \ No newline at end of file diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md index 3866906..accc3e4 100644 --- a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 5 - Cloud has_toc: false nav_order: 1 +topic: topic5 +chapter: chapter1 --- # Introduction to Cloud @@ -103,6 +105,13 @@ Cloud computing is the backbone of modern DevSecOps. It allows teams to innovate --- +{% include quiz.html + id="topic5-chapter1" + data=site.data.quizzes.topic5.chapter1 +%} + +--- + ## Resources - [Google Cloud Security Overview](https://cloud.google.com/blog/topics/developers-practitioners/google-cloud-security-overview) From 7d4571f35829db4c414a3c335a2b445848a18dbe Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Wed, 14 May 2025 19:02:04 -0700 Subject: [PATCH 31/68] finished light/dark mode and font slider --- Gemfile.lock | 4 +- _includes/nav_footer_custom.html | 132 +++++++++++++++++++++++++------ _layouts/custom.html | 69 +++------------- _sass/custom/custom.scss | 20 ++++- _sass/custom/quiz.scss | 1 - assets/images/font-size.svg | 2 + 6 files changed, 139 insertions(+), 89 deletions(-) create mode 100644 assets/images/font-size.svg diff --git a/Gemfile.lock b/Gemfile.lock index 9583550..f8d100a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,6 +15,7 @@ GEM ffi (1.16.3) forwardable-extended (2.6.0) google-protobuf (3.25.1) + google-protobuf (3.25.1-arm64-darwin) google-protobuf (3.25.1-x86_64-darwin) http_parser.rb (0.8.0) i18n (1.14.1) @@ -83,6 +84,7 @@ GEM PLATFORMS arm64-darwin-23 + arm64-darwin-24 x64-mingw-ucrt x86_64-darwin-22 x86_64-darwin-23 @@ -97,4 +99,4 @@ DEPENDENCIES logger BUNDLED WITH - 2.3.26 + 2.6.8 diff --git a/_includes/nav_footer_custom.html b/_includes/nav_footer_custom.html index 1e8dcc9..91f8058 100644 --- a/_includes/nav_footer_custom.html +++ b/_includes/nav_footer_custom.html @@ -1,32 +1,112 @@
    + +
    - -
    - This site uses a custom theme based on Just the Docs. + + + +
    + +
    +
    + + + + + +
    +
    + This site uses a custom theme based on + Just the Docs. +
    + + + + \ No newline at end of file + } + + // Reset font size + resetButton.addEventListener("click", () => { + applyFontSize(defaultFontSize); + fontSizeSlider.value = parseInt(defaultFontSize); + localStorage.removeItem("fontSize"); + }); + + // Toggle font size panel + button content + toggleButton.addEventListener("click", () => { + const isVisible = fontSizePanel.style.display === "block"; + + fontSizePanel.style.display = isVisible ? "none" : "block"; + + // Toggle image and styled text + if (isVisible) { + toggleButton.innerHTML = `Font Size`; + } else { + toggleButton.innerHTML = `Hide`; + } +}); + + diff --git a/_layouts/custom.html b/_layouts/custom.html index 0aea4dd..10baff5 100644 --- a/_layouts/custom.html +++ b/_layouts/custom.html @@ -19,12 +19,6 @@ {% include components/children_nav.html %} {% endif %} - -
    - - - -
    {% include components/footer.html %} @@ -40,60 +34,17 @@ {% include components/mermaid.html %} {% endif %} - - - - - - {% include footer_custom.html %} - - - - // Reset font size - resetBtn.addEventListener("click", () => { - currentSize = defaultSize; // Reset to the initial font size - root.style.setProperty('font-size', `${defaultSize}px`, 'important'); // Apply with !important - console.log(`Font size reset: ${defaultSize}px`); - }); - } else { - console.error("Font size buttons not found in the DOM."); - } -}); + + - \ No newline at end of file diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss index 88d9a8c..4580cc4 100644 --- a/_sass/custom/custom.scss +++ b/_sass/custom/custom.scss @@ -6,6 +6,10 @@ $code-dot-size: 0.6rem; $code-dot-gap: 0.5rem; $dot-margin: 0; +@import "quiz"; +@import "dark"; +@import "light"; + @mixin light-syntax { --language-border-color: #ececec; --highlight-bg-color: #f6f8fa; @@ -19,7 +23,6 @@ $dot-margin: 0; --clipboard-checked-color: #43c743; } - .highlighter-rouge { @include light-syntax; color: var(--highlighter-rouge-color); @@ -415,4 +418,17 @@ div.highlighter-rouge > button, div.listingblock > div.content > button, figure. font-weight: bold; font-size: 16px; } -} \ No newline at end of file +} + +// FONT SIZE ADJUSTER +.slider-container { + display: flex; + padding-top: 3rem; + justify-content: center; + align-items: center; +} + +.display-text { + text-align: center; + padding-top: 2rem; +} diff --git a/_sass/custom/quiz.scss b/_sass/custom/quiz.scss index ff34418..f4b911f 100644 --- a/_sass/custom/quiz.scss +++ b/_sass/custom/quiz.scss @@ -3,7 +3,6 @@ padding: 1rem; border: 2px solid #ccc; border-radius: 10px; - background-color: #ffffff; .quiz-question { margin-bottom: 1.5rem; diff --git a/assets/images/font-size.svg b/assets/images/font-size.svg new file mode 100644 index 0000000..3176482 --- /dev/null +++ b/assets/images/font-size.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file From 02534c0a1e47550936cb7058f303dfaaff3c3182 Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Wed, 14 May 2025 19:37:31 -0700 Subject: [PATCH 32/68] fixed hamburger in light mode --- _sass/custom/custom.scss | 1 - assets/images/dark-font-size.png | Bin 0 -> 23960 bytes assets/images/light-font-size.svg | 2 ++ 3 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 assets/images/dark-font-size.png create mode 100644 assets/images/light-font-size.svg diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss index 4580cc4..01559f2 100644 --- a/_sass/custom/custom.scss +++ b/_sass/custom/custom.scss @@ -7,7 +7,6 @@ $code-dot-gap: 0.5rem; $dot-margin: 0; @import "quiz"; -@import "dark"; @import "light"; @mixin light-syntax { diff --git a/assets/images/dark-font-size.png b/assets/images/dark-font-size.png new file mode 100644 index 0000000000000000000000000000000000000000..95aaec9b52cc4c52b3e90044e10140955cd82a72 GIT binary patch literal 23960 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 + \ No newline at end of file From 299a75086d2be3a8a8efab169c11b1b48022203b Mon Sep 17 00:00:00 2001 From: emilychoi Date: Wed, 14 May 2025 20:12:15 -0700 Subject: [PATCH 33/68] add quiz for topic 2 ch3 and ch4 --- Gemfile.lock | 6 ++- _data/quizzes/topic2/chapter3.yml | 48 +++++++++++++++++++ _data/quizzes/topic2/chapter4.yml | 43 +++++++++++++++++ .../chapter-3-Intermediate-Concepts/index.md | 9 ++++ .../chapter-4-git-best-practices/index.md | 8 ++++ 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 _data/quizzes/topic2/chapter3.yml create mode 100644 _data/quizzes/topic2/chapter4.yml diff --git a/Gemfile.lock b/Gemfile.lock index f8d100a..f30c68b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -69,6 +69,9 @@ GEM rexml (3.2.6) rouge (4.2.0) safe_yaml (1.0.5) + sass-embedded (1.69.5) + google-protobuf (~> 3.23) + rake (>= 13.0.0) sass-embedded (1.69.5-arm64-darwin) google-protobuf (~> 3.23) sass-embedded (1.69.5-x64-mingw-ucrt) @@ -85,6 +88,7 @@ GEM PLATFORMS arm64-darwin-23 arm64-darwin-24 + ruby x64-mingw-ucrt x86_64-darwin-22 x86_64-darwin-23 @@ -99,4 +103,4 @@ DEPENDENCIES logger BUNDLED WITH - 2.6.8 + 2.6.7 diff --git a/_data/quizzes/topic2/chapter3.yml b/_data/quizzes/topic2/chapter3.yml new file mode 100644 index 0000000..a9f4e3c --- /dev/null +++ b/_data/quizzes/topic2/chapter3.yml @@ -0,0 +1,48 @@ +questions: + - prompt: "What is the primary purpose of feature branching in Git?" + options: + - "To fix urgent bugs directly in production" + - "To keep changes isolated for each new feature" + - "To maintain separate branches for release candidates" + - "To rewrite commit history into a linear progression" + correct_index: 1 + explanation: "Feature branching is used to create separate branches for each new feature, keeping changes isolated from the main codebase." + + - prompt: "True or False: Hotfix branches are typically maintained separately for long periods, similar to release branches." + options: + - "True" + - "False" + correct_index: 1 + explanation: "False. Hotfix branches are short-lived branches created quickly to fix urgent bugs, unlike release branches that may be maintained longer." + + - prompt: "What is the role of Pull Requests (PRs) in Git workflows?" + options: + - To directly commit changes to the main branch + - To merge branches automatically without review + - To notify others of pushed changes and facilitate review + - To stash uncommitted changes before switching branches + correct_index: 2 + explanation: "Pull Requests allow developers to tell others about changes pushed to a branch, enabling code review and collaboration." + + - prompt: "In Git, the process of temporarily saving uncommitted changes so you can switch branches without losing your work is called ________." + options: + - "Stashing" + - "Squashing" + - "Fast-Forwarding" + - "Rebasing" + correct_index: 0 + explanation: "Stashing. Stashing allows you to save your changes to a stack so you can safely switch branches." + + - prompt: | + A critical bug was discovered in the production environment. The team needs to fix it immediately without affecting ongoing development work on the main and feature branches. + After the fix is complete, it should be merged into both the main and the release branches. What is the most appropriate approach? + options: + - "Create a feature branch and squash merge it into main" + - "Rebase the main branch on top of the fix" + - "Cherry-pick the fix into all branches" + - "Create a hotfix branch and use a three-way merge into both main and release" + correct_index: 3 + explanation: | + A three-way merge is used when two branches have diverged. In this case, both main and release may have different changes. By creating a hotfix branch and merging it into both using + a three-way merge, Git compares the common ancestor, the hotfix, and the target branch to create a new commit that safely integrates the fix without overwriting existing work. This + ensures stability and preserves history in both branches. \ No newline at end of file diff --git a/_data/quizzes/topic2/chapter4.yml b/_data/quizzes/topic2/chapter4.yml new file mode 100644 index 0000000..e390884 --- /dev/null +++ b/_data/quizzes/topic2/chapter4.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "Which of the following should NOT typically be included in a README file?" + options: + - "Project title" + - "Full API documentation" + - "Installation instructions" + - "Contributing guidelines" + correct_index: 1 + explanation: "Full API documentation is better suited for a wiki or dedicated documentation file. A README should stay concise and high-level." + + - prompt: "True or False: Code comments should explain what the code is doing line by line to ensure full clarity." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Comments should focus on explaining why the code exists or the reasoning behind complex logic — not what the code does line by line." + + - prompt: "A project's __________ is the best place to store tutorials, extended documentation, and design notes." + options: + - "Installation guidelines" + - "Code comments" + - "READMEs" + - "Wiki" + correct_index: 3 + explanation: "Wikis are ideal for more detailed content like tutorials and design notes that don't fit in a README." + + - prompt: "When documenting your code, what should you aim to explain?" + options: + - "Why key decisions were made in the implementation" + - "How to install the program" + - "Each variable used in the program" + - "Syntax of the programming language used" + correct_index: 0 + explanation: "Good inline comments focus on why the code exists or how it solves a problem, not basic syntax or details already obvious from the code." + + - prompt: "You're wrapping up your work on a team project and may be leaving soon. You want to ensure others can continue where you left off. What combination of documentation should you focus on?" + options: + - "A short README and daily status updates via chat" + - "A detailed README and clear, explanatory code comments" + - "Extensive code comments and commit messages only" + - "Use a wiki with technical documentation" + correct_index: 1 + explanation: "A clear README helps new users understand the project, and explanatory code comments clarify decisions within the code. This combo ensures others can continue without needing to ask questions." \ No newline at end of file diff --git a/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md b/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md index dccd1bd..2271f94 100644 --- a/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md +++ b/docs/course/Topic-2-Git/chapter-3-Intermediate-Concepts/index.md @@ -5,6 +5,8 @@ parent: Topic 2 - Git has_children: true has_toc: false nav_order: 3 +topic: topic2 +chapter: chapter3 --- # Chapter 3 - Git Intermediate Concepts @@ -39,6 +41,13 @@ Other intermediate concepts of version control include: By mastering these concepts, developers can collaborate more effectively and maintain a clean, functional codebase. +--- + +{% include quiz.html + id="topic2-chapter3" + data=site.data.quizzes.topic2.chapter3 +%} + ### References
    Expand diff --git a/docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md b/docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md index 2001747..eabd13a 100644 --- a/docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md +++ b/docs/course/Topic-2-Git/chapter-4-git-best-practices/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 2 - Git has_toc: false nav_order: 4 +topic: topic2 +chapter: chapter4 --- # Chapter 4 - Git Best Practices @@ -22,6 +24,12 @@ Proper documentation is key to the longevity and maintainability of software. Yo - Well-placed comments within the code can clarify complex algorithms, decision-making, or reasons for significant changes. - Use comments to explain the *why*, not the *what* — the code speaks for itself on the latter. +--- + +{% include quiz.html + id="topic2-chapter4" + data=site.data.quizzes.topic2.chapter4 +%} ### References
    From 0979a8aa06be346cc9e86c4bf088ce5bdd3f4fa8 Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Thu, 15 May 2025 03:12:42 -0700 Subject: [PATCH 34/68] changed to remote theme for testing --- _config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index d2cb8a3..f22d3ef 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,8 @@ title: open-devsecops description: 'From Classroom to Industry: Bridging the DevSecOps Knowledge Gap with Open, Practical Learning.' -theme: just-the-docs +remote_theme: pmarsceill/just-the-docs +plugins: + - jekyll-remote-theme logo: "/assets/images/opendevsecops-transparent.png" favicon_ico: "/assets/images/opendevsecops-favicon.ico" From d98be314d61d76de738e33b5005edf4c9e1c115a Mon Sep 17 00:00:00 2001 From: jsmargarones Date: Fri, 16 May 2025 09:20:42 -0700 Subject: [PATCH 35/68] Intro to SDLC lesson --- .../chapter-1-SDLC/index.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md index 0676e56..f6625f1 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md @@ -9,3 +9,49 @@ nav_order: 1 # Chapter 1 - Introduction to SDLC ## What is the Software Development Lifecycle (SDLC)? + +The **Software Development Life Cycle (SDLC)** is a structured process used by software developers to build high-quality software applications and manage projects efficiently. It divides software development and maintenance into distinct phases, providing a clear roadmap for teams to follow. + +![SDLC Phases](https://k21academy.com/wp-content/uploads/2021/08/Six-Stages-of-DevOps-Lifecycle.jpg) +*A circular loop outlining the 6 common phases of the Software Development Cycle* + +## SDLC Phases + +### 1. Planning +Define the project scope, technical and business needs, and any constraints. + +### 2. Design +Analyze the requirements to create practical solutions to solve the defined problems. + +### 3. Implement +Developers write code to achieve the project’s design goals. + +### 4. Test +Use automated and manual testing methods to identify bugs or errors in the software. + +### 5. Deploy +Release the completed software into a production environment for user access. + +### 6. Maintain +Continuously update and support the software to address issues and improvements. + +--- + +## Benefits of SDLC + +- Structured project management aligned to product goals +- Improved communication and collaboration between teams +- Built-in risk mitigation throughout each phase +- Reduces human error through rigorous testing +- Enables faster, more secure, and reliable software delivery + +--- + +## Common SDLC Methodologies + +| Methodology | Description | Use Cases | +|------------|-------------|-----------| +| **Waterfall** | A linear approach where each phase must be completed before moving to the next. | Ideal for small, well-defined projects with fixed requirements. | +| **Iterative** | Builds software in small parts, allowing feedback and revisions after each iteration. | Useful when early versions are expected to evolve based on user feedback. | +| **Agile** | A flexible, iterative approach that emphasizes collaboration, customer feedback, and frequent updates. | Best for dynamic, fast-paced projects with evolving requirements. | +| **Scrum** | A subset of Agile, focusing on time-boxed iterations called sprints and daily stand-up meetings. | Great for product-based development with frequent releases and tight deadlines. | From 3823e241f9f77544d315c0561dae322b1db1e210 Mon Sep 17 00:00:00 2001 From: jsmargarones Date: Fri, 16 May 2025 09:32:23 -0700 Subject: [PATCH 36/68] Cybersecurity topic + intro to security lesson --- .../chapter-3-automated-testing/index.md | 102 +++++++++++++++ .../chapter-4-deployment/index.md | 120 ++++++++++++++++++ .../chapter-5-webhooks/index.md | 37 ++++++ .../chapter-6-containerization/index.md | 94 ++++++++++++++ .../Topic-3-DevSecOp-Fundamentals/index.md | 16 +++ .../chapter-1-intro-to-cybersecurity/index.md | 60 +++++++++ docs/course/Topic-4-Security/index.md | 17 +++ 7 files changed, 446 insertions(+) create mode 100644 docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md create mode 100644 docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md create mode 100644 docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md create mode 100644 docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md create mode 100644 docs/course/Topic-3-DevSecOp-Fundamentals/index.md create mode 100644 docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md create mode 100644 docs/course/Topic-4-Security/index.md diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md new file mode 100644 index 0000000..ac70e85 --- /dev/null +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md @@ -0,0 +1,102 @@ +--- +title: Chapter 2 - Automated Tests +layout: custom +parent: Topic 3 - CI/CD Fundamentals +has_children: false +has_toc: false +nav_order: 4 +--- + +# Automated Testing in CI/CD +## Importance of Automation in Testing + +🧐 Imagine you are developing rapidly evolving software. As your product becomes more complex, ensuring that new features work correctly without breaking existing functionalities becomes challenging. + +**Challenge:** With each addition to the software, manual testing becomes more cumbersome and less effective, making it difficult to maintain high-quality standards in your releases. + +> Automated testing in CI/CD processes helps overcome these challenges by enabling teams to deliver software more frequently and with higher quality. It integrates testing into the development process, ensuring that every change is verified automatically before it is integrated into the main codebase. + +--- +## Evolution of Automated Testing + +From manual testing to fully automated suites, testing has evolved to become a crucial part of the development process. Automated testing not only speeds up the development cycle but also enhances the reliability of software releases. + +| Development with Manual Testing | Development with Automated Testing | +|---------------------------------------|--------------------------------------| +| - Slow and error-prone. | - Fast and consistent. | +| - Involves repetitive manual work. | - Utilizes scripts to automate tests.| +| - Difficult to scale with complexity. | - Scales efficiently with complexity. | + +--- +## Benefits of Automated Testing + +### Why Automated Testing? +Automated testing provides several key benefits that manual testing cannot offer: + +**🧠 Big Idea:** Automated testing transforms the tedious aspects of manual testing into an efficient and error-reducing process. + +- **Faster Feedback:** Automated tests run quickly and provide immediate feedback on the changes made, speeding up the development cycle and reducing the time to market. +- **Higher Accuracy:** Reduces the chances of human error in repetitive tasks, providing more accurate results. +- **Better Coverage:** Enables thorough testing that can cover more aspects and features of the software, ensuring a more robust final product. +- **Continuous Integration:** Facilitates the practice of continuous integration by automatically testing every change made to the codebase, ensuring that the software is always in a releasable state. + +--- +## From Unit Tests to Integration Tests + +### Overview of Testing Types +Automated testing encompasses a range from simple unit tests that check individual components to complex integration tests that ensure different parts of the application work together seamlessly. + +- **Unit Tests:** Quick and focused tests that validate individual functions or components. +- **Integration Tests:** Ensure that different modules or services work together as expected, highlighting interface issues between components. +- **End-to-End Tests:** Mimic real-world usage scenarios to verify the complete system's behavior, from the front end to the back end and everything in between. + +--- +## Challenges in Automated Testing + +### Addressing Common Obstacles +While automated testing brings numerous benefits, it also comes with its own set of challenges: + +- **Initial Setup Cost:** Setting up an automated testing environment can be resource-intensive. +- **Maintenance Overhead:** Keeping tests up-to-date with new system requirements and functionalities can require significant ongoing effort. +- **Complexity:** Designing tests for complex systems can be challenging and requires detailed planning and execution. + +--- +## The Role of CI/CD in Automated Testing + +### How CI/CD Facilitates Automated Testing +CI/CD pipelines are central to implementing effective automated testing strategies, allowing for seamless integration and delivery processes. + +- **Integration with CI Tools:** Automated tests are integrated into the CI pipeline, which helps detect issues early and often, before they reach production. +- **Deployment Automation:** Ensures that every approved change is automatically deployed to production, which is stable and predictable, reducing manual errors and deployment issues. +- **Feedback Loops:** Provides developers with immediate feedback on their code changes, enabling quick corrections and adaptations based on real-world usage and test results. + +--- +## Building a Robust Automated Testing Framework + +### Key Steps to Developing an Effective Framework +Creating a robust automated testing framework involves several critical steps: + +- **Define Clear Objectives:** Understand what you need to test and why. Set clear goals for what each test should achieve. +- **Choose the Right Tools:** Select testing tools that best fit the technology stack and testing needs of your project. +- **Write Effective Tests:** Develop tests that are not only effective but also maintainable and scalable. +- **Integrate into CI/CD:** Fully integrate your testing framework into your CI/CD pipeline to automate the execution of tests at various stages of the software delivery process. +- **Monitor and Improve:** Continuously monitor the effectiveness of your tests and make improvements as necessary. Use feedback to refine and optimize your testing processes. + +--- +## Conclusion + +Automated testing is a cornerstone of modern software development. By integrating effective automated tests into the CI/CD pipeline, teams can ensure that their software is not only functional but also meets quality standards before it reaches the end-user. Embracing these practices not only enhances product reliability but also empowers teams to innovate rapidly with confidence. + + +### References +
    + Expand + 1. “Automated Testing for CI/CD: Teamcity CI/CD Guide.” JetBrains, https://www.jetbrains.com/teamcity/ci-cd-guide/automated-testing/. Accessed 1 May 2024.
    + 2. “Role of Automation Testing in CI/CD.” BrowserStack, 22 Nov. 2022, https://www.browserstack.com/guide/role-of-automation-testing-in-ci-cd.
    + 3. “Automated Testing: The Cornerstone of CI/CD.” Written by Ferdinando Santacroce. Semaphore, 16 Mar. 2022, https://semaphoreci.com/blog/automated-testing-cicd.
    +
    + + + + + diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md new file mode 100644 index 0000000..31dbaee --- /dev/null +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md @@ -0,0 +1,120 @@ +--- +title: Chapter 4 - Deployment +layout: custom +parent: Topic 3 - CI/CD Fundamentals +has_toc: false +has_children: true +nav_order: 5 +--- + +# Introduction to Deployment +Transitioning from the exploration of DevOps and CI/CD, we now turn our attention to the critical phase of deployment. Deployment is where coding efforts from developers merge, and attempt to integrate into the existing software. With so many people making changes to the same product, there are bound to be inconsistencies and issues when pushing code. That is where deployment best practices within CI/CD come in. + +> **Problem Space** +> +> 🧐 Imagine two developers are both working on projects for several months in a large organization. Ani is working on changing the current API used in the product, and Mariam is pulling from the current state of that API for her code. After working to get their projects working, they both push at the same time. +> +> Narek, a long time user of their site, is looking to buy pants. All of a sudden, the site is down! This was because when Ani and Mariam pushed there was no automatic testing and there were several integration issues: +> - **Endpoint Mismatch**: Mariam's new features expect certain responses from the API that Ani has since altered or deprecated, leading to unexpected behavior and failures in feature operation. +> - **Database Schema Changes**: Ani's API update included modifications to the database schema that Mariam's code was not designed to accommodate, resulting in broken database queries and data consistency issues. +> +> It might seem as though it was Ani and Mariam's lack of communication before building and deploying at fault, but imagine they are working in a company as large as Amazon or Boeing. It would be impractical and redundant to expect to know every developer's job. + + +## Deployment Environments + +- **💻 Development Environment:** + - **Purpose:** Initial coding and testing by developers. + - **Characteristics:** Runs on local machines or dev server, frequent changes and updates, connected to a test database, debugging tools are enabled. + - **CI/CD Role:** Starting point in CI/CD process, triggers initial build and unit tests. + +- **🚦 Staging Environment:** + - **Purpose:** Final testing before going live. Acts as a pre-production replica. + - **Characteristics:** Mimics production environment, stable and isolated for testing, hosts release candidate version. + - **CI/CD Role:** Used for performance, integration, and user acceptance testing, final checks before production. + +- **🌐 Production Environment:** + - **Purpose:** The live environment used by end-users. + - **Characteristics:** Most stable and secure, contains real user data and faces the internet, performance monitoring and error logging. + - **CI/CD Role:** Final stage of the pipeline, code is deployed if all checks pass. + +
    + +![image](https://github.com/open-devsecops/open-devsecops.github.io/assets/35845527/6c306e97-b563-4cc7-baff-8d79ddc45bdf) +_Source: [DevOps.com](/https://devops.com/i-want-to-do-continuous-deployment/)_ + +{: .lab} +[Lab 1 - Configuring a Simple CI/CD Pipeline](./lab/deployment-lab-1){: .btn .btn-purple .btn-fill } + +## Deployment Strategies +Deployment strategies are crucial for managing the transition of code from development through to production. Choosing the right strategy ensures that deployments are smooth, risks are minimized, and the user experience remains uninterrupted. Here are some common deployment strategies used in modern software development: + +1. 🔄 **Blue-Green Deployment**: Alternating between two identical environments to switch versions. + + | Pros | Cons | + |-------------------|----------------------| + | Easy rollback | Resource intensive | + | Minimal downtime | Complex setup | + + **Use Case**: Ideal for critical applications where zero downtime is essential. + + +2. 🐦 **Canary Deployment**: Gradually rolling out changes to a small subset of users first. + + | Pros | Cons | + |-----------------------------------|-----------------------------------| + | Low risk with smaller user impact | Requires monitoring and analytics | + | Real user feedback | More complex release process | + + **Use Case**: Best suited for applications with a large user base to gauge the impact of new changes. + +3. 🌊 **Rolling Deployment**: Updating application instances in phases, without taking down the entire app. + + | Pros | Cons | + |----------------------------|--------------------------------------| + | High availability | Not suitable for database changes | + | No need for additional infrastructure | Potential for brief inconsistency | + + **Use Case**: Services requiring constant availability and those with enough instances to support a phased rollout. + +4. 🚦 **Feature Toggles**: Releasing features hidden behind toggles, which can be enabled conditionally. + + | Pros | Cons | + |-------------------------------|-----------------------------------| + | Flexible control over features | Complexity in managing toggles | + | Easy rollback of features | Risk of technical debt | + + **Use Case**: Testing new features in live environments or rolling out features gradually. + +5. 🔀 **A/B Testing Deployment**: Deploying two versions to compare which performs better based on specific metrics. + + | Pros | Cons | + |---------------------------------|----------------------------------| + | Data-driven decision making | Requires traffic segmentation | + | Clear insight into user preferences | Increased complexity | + + **Use Case**: Optimizing user experience and validating hypotheses about user behavior. + +6. 🆕 **Immutable Deployments**: Every deployment creates a new environment, and traffic is switched over once ready. + + | Pros | Cons | + |------------------------------------|---------------------------------------| + | Consistency and reliability | Higher infrastructure costs | + | Simplifies rollback | Requires automation for efficiency | + + **Use Case**: Suitable for cloud-native applications where infrastructure can be easily replicated and managed as code. + + + + + +### References +
    + Expand + 1. “CI/CD Process: Flow, Stages, and Critical Best Practices.” Codefresh, 26 July 2023, https://codefresh.io/learn/ci-cd-pipelines/ci-cd-process-flow-stages-and-critical-best-practices/#:~:text=The%20deploy%20stage%20is%20the,it%20accessible%20to%20end%2Dusers.
    + 2. Deployment Strategies - Introduction to Devops on AWS, Amazon Web Services, https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/deployment-strategies.html. Accessed 12 Apr. 2024.
    + 3. “Flow Modeling: How Work Moves through the Enterprise.” Plutora, https://www.plutora.com/blog/deployment-strategies-6-explained-in-depth. Accessed 11 Apr. 2024.
    + 4. Riley, Chris, et al. “‘I Want to Do Continuous Deployment.’” DevOps.Com, 5 Dec. 2016, https://devops.com/i-want-to-do-continuous-deployment/.
    + 5. Tremel, Etienne. “Six Strategies for Application Deployment.” The New Stack, 25 Mar. 2021, https://thenewstack.io/deployment-strategies/.
    + 6. Using Blue-Green Deployment to Reduce Downtime | Cloud Foundry Docs, https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html. Accessed 12 Apr. 2024.
    +
    diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md new file mode 100644 index 0000000..986a0b9 --- /dev/null +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md @@ -0,0 +1,37 @@ +--- +title: Chapter 2 - Webhooks +layout: custom +parent: Topic 3 - CI/CD Fundamentals +has_toc: false +nav_order: 3 +--- + +## Utilizing Web Hooks for Continuous Integration +### What is a Web Hook? +When deploying code, you want to make sure it is automatically running through several relevant tests without you triggering them every single time. A webhook is like a notification for your CI/CD tests, that you have done something with your code. To set up a webhook, you first need to define rules that it follows: + +1. **Choose Trigger Events:** During the webhook setup process in GitHub, you specify which events will trigger the webhook. This could be a variety of actions, such as: +- **Pushes:** Every time someone pushes code to the repository. +- **Pull Requests:** When a new pull request is opened, closed, or merged. +- **Releases:** When a new release is created. +- **Branch or Tag Creation:** When a new branch or tag is created. + +2. **Set the Payload URL:** This is where you want GitHub to send the notification. The URL is provided by the service you want to notify (your CI/CD platform, for example). + +3. **Configure Content Type:** This determines how the data is formatted when sent to the receiver. JSON is a common format. + +4. **Determine Security Options:** If your receiving service requires it, you might also set up a secret token that GitHub will use to sign the data, adding a layer of security to ensure the data is only accepted if it’s verified as coming from GitHub. + +Then, once you want to make a change, the following happens: +1. **You push code to GitHub** - This is you updating your repository with new changes. +2. **GitHub sends a webhook** - Because of the rule you set up, GitHub notifies your CI/CD tool that something happened (like a code push). +3. **CI/CD tool starts tests** - The CI/CD tool, now informed by the webhook, starts running the tests or actions you've configured it to perform upon receiving such a notification. + +### References +
    + Expand + 1. “About Webhooks.” GitHub Docs, https://docs.github.com/en/webhooks/about-webhooks. Accessed 11 Apr. 2024.
    + 2. “What Are Webhooks and How Do They Work.” What Are Webhooks And How Do They Work, 14 Aug. 2021, https://hookdeck.com/webhooks/guides/what-are-webhooks-how-they-work.
    + 3. “What Is a Webhook? Webhooks for Beginners.” YouTube, YouTube, 30 Nov. 2021, https://www.youtube.com/watch?v=mrkQ5iLb4DM.
    + 4. “What Is a Webhook?” Red Hat - We Make Open Source Technologies for the Enterprise, https://www.redhat.com/en/topics/automation/what-is-a-webhook. Accessed 11 Apr. 2024.
    +
    diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md new file mode 100644 index 0000000..4987dd1 --- /dev/null +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md @@ -0,0 +1,94 @@ +--- +title: Chapter 5 - Containerization +layout: custom +parent: Topic 3 - CI/CD Fundamentals +has_children: true +has_toc: false +nav_order: 6 +--- + +## Definition of Containerization + +**Containerization in cloud computing is a method of packaging, distributing, and running applications using containers. A *container* is a:** +- Standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably in different computing environments +- Unlike virtual machines that require an entire virtual operating system, **containers** share the machine's OS kernel and do not require the overhead of starting an OS, booting up, and then running the application. +- Pros: This makes them lightweight, allowing a server to host more containers than if using virtual machines. +- Containerization ensures that software runs reliably when moved from one computing environment to another. This is because the container encapsulates everything the software needs to run: the application itself, along with its runtime, libraries, and system settings. + +The standardized packaging of containers, managed by orchestration tools like **Kubernetes**, allows for automation in deploying, managing, scaling, and networking of containers. This brings about a high level of efficiency and scalability for applications, especially in cloud computing environments where resources need to be allocated and managed dynamically. + + + +
    + Kubernetes Dashboard +

    Example of Functioning Kubernetes Dashboard

    +

    Source: ikarus

    +
    + + +Containerization also supports microservices architectures, allowing for the segmentation of parts of a large application into small, independent services that are easier to develop, deploy, and maintain. This approach improves system resilience and scalability. In the cloud, these benefits are enhanced due to the inherent elasticity and resource management capabilities of cloud services. Overall, containerization is a crucial aspect of modern software development and deployment, enabling more efficient use of resources, faster deployment times, and greater consistency across environments. + + +## Use Cases + +- Cloud Migration: Cloud migration is a software strategy that involves encapsulating legacy applications in containers and deploying them in a cloud computing environment. Organizations can modernize their applications without rewriting the entire software code. +- Microservices Architecture: The microservice architecture is a software development approach that uses multiple, interdependent software components to deliver a functional application. Each microservice has a unique and specific function. A modern cloud application consists of multiple microservices, containerization provides the software tool to pack microservices as deployable programs on different platforms. +- IoT Devices: Internet of Things (IoT) devices contain limited computing resources, making manual software updating a complex process. Containerization allows developers to deploy and update applications across IoT devices easily. + + +## Advantages + +**Benefits of Containerization** + +- Isolation of Applications - Each container acts like a small, self-contained unit where a specific application and all its dependencies (libraries, frameworks, etc.) are packaged together. Applications in the container can run reliably and consistently across different computing environments because it has everything it needs to work/access within the container. +- Portability - Software developers can use containerization to deploy applications in multiple environments now without re-writing the program code. A single application can be deployed into multiple operating systems. +- Scalability - Can easily handle various technologies, packages, and containers on a single virtual machine. The container cluster can use computing resources from the a shared operating system, but one container doesn't interfere with the operation of other containers. +- Fault Tolerance - A single faulty container does not affect the other containers. This allows multiple containers to run micro-services on the cloud, increasing the resilience and availability of the application. +- Agility - Software developers can use this isolated environment to troubleshoot and change the application code without interfering with the operating system, hardware, and other services. This can shorten software release cycles and work on updates quicker. + + +{: .lab} +[Lab 1 - Containerizing a React Application](./lab/containerization-lab-1.html){: .btn .btn-purple .btn-fill } + +## Artifact vs. Artifactory + +### Artifact: + An "artifact" typically refers to a container image. This image is a read-only template that contains a snapshot of an application and its dependencies at a specific point in time. It's essentially a lightweight, portable, and reproducible package that can be used to create multiple containers with identical configurations. This image includes all necessary files, libraries, and configurations required to run an application. Container images are often built using a set of instructions that specify the software and configuration needed to create them. These images adhere to the Open Container Initiative (OCI) image specification, providing a standardized format for creating container images. Once created, these images can be stored and distributed in a registry, facilitating easy sharing across different environments. + +In simpler terms, think of an artifact like a recipe for an app. This recipe includes everything the app needs to work (like code, tools, and settings). But it's just a set of instructions, not the running app itself. When you want to run the app, you use this recipe to create a "container," which is like a mini-computer inside your main computer. It has everything the app needs to run, based on the recipe. This container is isolated, meaning it doesn't interfere with other things on your computer. So, an artifact in containerization is basically the recipe or blueprint for creating a container that can run an app + +This concept of container images as artifacts is fundamental in containerization, enabling the portability, agility, and scalability of applications within the cloud computing and DevOps landscapes + +### Artifactory: + +A repository manager developed by JFrog that supports software packages created by different languages and technologies. It integrates seamlessly with various build tools and CI/CD pipelines, Artifactory is crucial for automating software development and deployment processes. It accommodates multiple package formats like Maven, NuGet, and Docker, providing a unified platform for artifact management. Additionally, it offers version control and secure storage for these artifacts. With its scalability and reliability, Artifactory is designed to meet the demands of both small and large-scale software development projects + +### Summary of Differences + +An "artifact" refers to any file or collection of files that are produced as a result of a software development process. These can include compiled source code, libraries, executables, configuration files, and even Docker images. Artifacts are essentially the tangible outputs of your software development lifecycle, crucial for the functioning of the software project. + +On the other hand, "Artifactory" is a product developed by JFrog. It functions as a universal repository manager, capable of handling various types of artifacts. Artifactory provides a centralized solution for storing and distributing different types of artifacts, including container images, software packages, binaries, and more. It supports a wide range of package formats. Artifactory also offers integration with various build tools, CI/CD pipelines, and development environments, making it a versatile tool for managing artifacts in a software development process. + +So, while an "artifact" is a product of the software development process, "Artifactory" is a tool for managing these products. It's a repository where various artifacts, including those from containerization processes, can be stored, managed, and distributed efficiently + + +{: .lab} +[Lab 2 - Accessing Corporate Network and AWS ECR](./lab/containerization-lab-2.html){: .btn .btn-purple .btn-fill } + + + + + +### References + +**1.** "What is Containerization?" *AWS*, [https://aws.amazon.com/what-is/containerization/#:~:text=Containerization%20involves%20building%20self%2Dsufficient,to%20run%20a%20containerized%20application](https://aws.amazon.com/what-is/containerization/#:~:text=Containerization%20involves%20building%20self%2Dsufficient,to%20run%20a%20containerized%20application). Accessed 20 Feb. 2024. + +**2.** "What is containerization? Overview, definition, benefits, and tools", *Log Rocket*, [https://blog.logrocket.com/product-management/what-is-containerization-definition-benefits-tools/](https://blog.logrocket.com/product-management/what-is-containerization-definition-benefits-tools/). Accessed 20 Feb. 2024. + +**3.** "What is containerization?", *Red Hat*, [https://www.redhat.com/en/topics/cloud-native-apps/what-is-containerization](https://www.redhat.com/en/topics/cloud-native-apps/what-is-containerization). Accessed 20 Feb. 2024. + +**4.** "Decoding the Difference: Artifacts vs Packages in Software Development", *cloudsmith*, [https://cloudsmith.com/blog/artifacts-vs-packages-what-is-the-difference](https://cloudsmith.com/blog/artifacts-vs-packages-what-is-the-difference). Accessed 20 Feb. 2024. + +**5.** "Azure Container Registry between Artifactory: Exploring the Differences", *LevInfo*, [https://ievinfo.com/azure-container-registry-between-artifactory-differenc/](https://ievinfo.com/azure-container-registry-between-artifactory-differenc/). Accessed 20 Feb. 2024. + + diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/index.md new file mode 100644 index 0000000..db60ffc --- /dev/null +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/index.md @@ -0,0 +1,16 @@ +--- +title: Topic 4 - DevSecOps Fundamentals +layout: custom +has_children: true +has_toc: false +nav_order: 5 +--- + +# Topic 4 - DevSecOps Fundamentals + +| Chapter | Learning Objectives | Lab Description | +|---------|---------------------|-----------------| +| Chapter 1: DevSecOps | - Define DevSecOps
    - Understand Why Implement
    - Understand Shift Left/Right Testing
    - Learn about Related Tools and Technologies | | +| Chapter 2: Security Checks in CI/CD | - Understand important of security checks in each stage of the pipeline
    - Discuss SAST vs DAST and their pros/cons
    - Learn about vulnerability scanning and prominent tools in industry today | **Lab: Securing a vulnerable application
    - Fix security vulnerabilities flagged by security checkpoints within a CI/CD pipeline. | + + diff --git a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md new file mode 100644 index 0000000..b498d28 --- /dev/null +++ b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md @@ -0,0 +1,60 @@ +--- +title: Chapter 1 - Intro to Cybersecurity +layout: custom +parent: Topic 4 - Cybersecurity +has_toc: false +nav_order: 3 +--- + +# Cybersecurity Fundamentals + +In today’s world, software is constantly exposed to threats that can cause: + +- System downtime +- Data theft +- Business operation disruptions + +**Cybersecurity** is the practice of protecting digital assets—such as systems, networks, and applications—from malicious cyberattacks. + +--- + +## The CIA Triad + +The **CIA Triad** is a foundational model used to evaluate risks and protect assets. + +**CIA = Confidentiality, Integrity, Availability** + +- **Confidentiality**: Ensures only authorized users can access data or systems +- **Integrity**: Ensures data is accurate and hasn't been modified by unauthorized users +- **Availability**: Ensures information and systems are accessible when needed + +*Alt text: Image of triangle with the words "Confidentiality," "Integrity," and "Availability" in each corner* + +--- + +## Key Cybersecurity Terms + +| Term | Definition | Example | +|-----------------|-------------------------------------------------------------|-----------------------------------------------------------------| +| **Vulnerability** | A flaw or weakness in software, hardware, or systems | A spare key hidden under a doormat | +| **Threat Actor** | An individual or group that intentionally exploits weaknesses | A burglar trying to break into a house | +| **Exploit** | The method used to take advantage of a vulnerability | The burglar uses the spare key to open the door | +| **Payload** | The malicious code or executable used in the attack | The burglar enters and steals valuables | +| **Risk** | The likelihood and severity of a bad event occurring | The chance the burglar finds the key, breaks in, and steals valuables | + +*Alt text: Image showing "Probability of Occurrence × Severity = Risk"* +[Source: Koven Innovation Blog](https://www.koveninnovation.com/blog/iso14971-the-ultimate-guide-to-risk-management-in-medical-devices.html) + +--- + +## Summary + +A company with poor security practices is at **greater risk** of: + +- A **threat actor** finding a **vulnerability** +- Using an **exploit** +- Delivering a **malicious payload** + +These actions can result in **unauthorized access**, data breaches, or serious damage to systems and business operations. + +Protect your systems by understanding and addressing these cybersecurity fundamentals. \ No newline at end of file diff --git a/docs/course/Topic-4-Security/index.md b/docs/course/Topic-4-Security/index.md new file mode 100644 index 0000000..1d6c61e --- /dev/null +++ b/docs/course/Topic-4-Security/index.md @@ -0,0 +1,17 @@ +--- +title: Topic 4 - Cybersecurity +layout: custom +has_children: true +has_toc: false +nav_order: 5 +--- + +# Topic 4 - Cybersecurity + +| Chapter | Learning Objectives | Lab Description | +|---------|---------------------|-----------------| +| Chapter 1: Intro to Cybersecurity | - Understand what cybersecurity is
    - Define key terms related to cybersecurity
    Know what the cybersecurity CIA triad is
    | | +| Chapter 2: Vulnerabilities and Risk | - Understand common vulnerabilities in the SDLC
    || +| Chapter 3: Security Checks in CI/CD | - Understand important of security checks in each stage of the pipeline
    - Discuss SAST vs DAST and their pros/cons
    - Learn about vulnerability scanning and prominent tools in industry today | **Lab: Securing a vulnerable application
    - Fix security vulnerabilities flagged by security checkpoints within a CI/CD pipeline. | + + From 8e1ae02eb4331eedeb914161ad7917f3ba2a65a0 Mon Sep 17 00:00:00 2001 From: jsmargarones Date: Fri, 16 May 2025 09:36:58 -0700 Subject: [PATCH 37/68] cybersecurity topic --- .../chapter-2-webhooks/index.md | 37 ------ .../chapter-3-automated-testing/index.md | 102 --------------- .../chapter-4-deployment/index.md | 120 ------------------ .../chapter-5-containerization/index.md | 94 -------------- docs/course/Topic-3-CICD-Concepts/index.md | 13 -- .../chapter-1-devsecops/index.md | 0 .../labs/devsecops-lab-1.md | 0 .../chapter-2-cicd-core-concepts}/index.md | 0 .../lab/deployment-lab-1.md | 0 .../lab/imgs/jenkins-login.png | Bin .../lab/imgs/wireguard.png | Bin .../chapter-4-deployment/lab/overview.md | 0 .../lab/containerization-lab-1.md | 0 .../lab/containerization-lab-2.md | 0 .../lab/imgs/clone.png | Bin .../lab/imgs/dashboard.png | Bin .../lab/imgs/fork.png | Bin .../lab/imgs/wireguard.png | Bin .../lab/overview.md | 0 .../review-and-knowledge-check/index.md | 0 .../Topic-4-Devsecops-Fundmentals/index.md | 16 --- .../chapter-1-intro-to-cybersecurity/index.md | 2 +- .../index.md | 41 ++++++ .../index.md | 0 .../lab/devsecops-lab-1.md | 6 +- .../lab/overview.md | 0 26 files changed, 45 insertions(+), 386 deletions(-) delete mode 100644 docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md delete mode 100644 docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md delete mode 100644 docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md delete mode 100644 docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md delete mode 100644 docs/course/Topic-3-CICD-Concepts/index.md rename docs/course/{Topic-4-Devsecops-Fundmentals => Topic-3-DevSecOp-Fundamentals}/chapter-1-devsecops/index.md (100%) rename docs/course/{Topic-4-Devsecops-Fundmentals => Topic-3-DevSecOp-Fundamentals}/chapter-1-devsecops/labs/devsecops-lab-1.md (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts => Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts}/index.md (100%) rename docs/course/{Topic-3-CICD-Concepts => Topic-3-DevSecOp-Fundamentals}/chapter-4-deployment/lab/deployment-lab-1.md (100%) rename docs/course/{Topic-3-CICD-Concepts => Topic-3-DevSecOp-Fundamentals}/chapter-4-deployment/lab/imgs/jenkins-login.png (100%) rename docs/course/{Topic-3-CICD-Concepts => Topic-3-DevSecOp-Fundamentals}/chapter-4-deployment/lab/imgs/wireguard.png (100%) rename docs/course/{Topic-3-CICD-Concepts => Topic-3-DevSecOp-Fundamentals}/chapter-4-deployment/lab/overview.md (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/containerization-lab-1.md (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/containerization-lab-2.md (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/imgs/clone.png (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/imgs/dashboard.png (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/imgs/fork.png (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/imgs/wireguard.png (100%) rename docs/course/{Topic-3-CICD-Concepts/chapter-5-containerization => Topic-3-DevSecOp-Fundamentals/chapter-6-containerization}/lab/overview.md (100%) rename docs/course/{Topic-3-CICD-Concepts => Topic-3-DevSecOp-Fundamentals}/review-and-knowledge-check/index.md (100%) delete mode 100644 docs/course/Topic-4-Devsecops-Fundmentals/index.md create mode 100644 docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md rename docs/course/{Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD => Topic-4-Security/chapter-3-security-checks-in-CICD}/index.md (100%) rename docs/course/{Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD => Topic-4-Security/chapter-3-security-checks-in-CICD}/lab/devsecops-lab-1.md (69%) rename docs/course/{Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD => Topic-4-Security/chapter-3-security-checks-in-CICD}/lab/overview.md (100%) diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md deleted file mode 100644 index 32c0b09..0000000 --- a/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Chapter 2 - Webhooks -layout: custom -parent: Topic 3 - CI/CD Fundamentals -has_toc: false -nav_order: 2 ---- - -## Utilizing Web Hooks for Continuous Integration -### What is a Web Hook? -When deploying code, you want to make sure it is automatically running through several relevant tests without you triggering them every single time. A webhook is like a notification for your CI/CD tests, that you have done something with your code. To set up a webhook, you first need to define rules that it follows: - -1. **Choose Trigger Events:** During the webhook setup process in GitHub, you specify which events will trigger the webhook. This could be a variety of actions, such as: -- **Pushes:** Every time someone pushes code to the repository. -- **Pull Requests:** When a new pull request is opened, closed, or merged. -- **Releases:** When a new release is created. -- **Branch or Tag Creation:** When a new branch or tag is created. - -2. **Set the Payload URL:** This is where you want GitHub to send the notification. The URL is provided by the service you want to notify (your CI/CD platform, for example). - -3. **Configure Content Type:** This determines how the data is formatted when sent to the receiver. JSON is a common format. - -4. **Determine Security Options:** If your receiving service requires it, you might also set up a secret token that GitHub will use to sign the data, adding a layer of security to ensure the data is only accepted if it’s verified as coming from GitHub. - -Then, once you want to make a change, the following happens: -1. **You push code to GitHub** - This is you updating your repository with new changes. -2. **GitHub sends a webhook** - Because of the rule you set up, GitHub notifies your CI/CD tool that something happened (like a code push). -3. **CI/CD tool starts tests** - The CI/CD tool, now informed by the webhook, starts running the tests or actions you've configured it to perform upon receiving such a notification. - -### References -
    - Expand - 1. “About Webhooks.” GitHub Docs, https://docs.github.com/en/webhooks/about-webhooks. Accessed 11 Apr. 2024.
    - 2. “What Are Webhooks and How Do They Work.” What Are Webhooks And How Do They Work, 14 Aug. 2021, https://hookdeck.com/webhooks/guides/what-are-webhooks-how-they-work.
    - 3. “What Is a Webhook? Webhooks for Beginners.” YouTube, YouTube, 30 Nov. 2021, https://www.youtube.com/watch?v=mrkQ5iLb4DM.
    - 4. “What Is a Webhook?” Red Hat - We Make Open Source Technologies for the Enterprise, https://www.redhat.com/en/topics/automation/what-is-a-webhook. Accessed 11 Apr. 2024.
    -
    diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md deleted file mode 100644 index e22dc38..0000000 --- a/docs/course/Topic-3-CICD-Concepts/chapter-3-automated-testing/index.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Chapter 2 - Automated Tests -layout: custom -parent: Topic 3 - CI/CD Fundamentals -has_children: false -has_toc: false -nav_order: 3 ---- - -# Automated Testing in CI/CD -## Importance of Automation in Testing - -🧐 Imagine you are developing rapidly evolving software. As your product becomes more complex, ensuring that new features work correctly without breaking existing functionalities becomes challenging. - -**Challenge:** With each addition to the software, manual testing becomes more cumbersome and less effective, making it difficult to maintain high-quality standards in your releases. - -> Automated testing in CI/CD processes helps overcome these challenges by enabling teams to deliver software more frequently and with higher quality. It integrates testing into the development process, ensuring that every change is verified automatically before it is integrated into the main codebase. - ---- -## Evolution of Automated Testing - -From manual testing to fully automated suites, testing has evolved to become a crucial part of the development process. Automated testing not only speeds up the development cycle but also enhances the reliability of software releases. - -| Development with Manual Testing | Development with Automated Testing | -|---------------------------------------|--------------------------------------| -| - Slow and error-prone. | - Fast and consistent. | -| - Involves repetitive manual work. | - Utilizes scripts to automate tests.| -| - Difficult to scale with complexity. | - Scales efficiently with complexity. | - ---- -## Benefits of Automated Testing - -### Why Automated Testing? -Automated testing provides several key benefits that manual testing cannot offer: - -**🧠 Big Idea:** Automated testing transforms the tedious aspects of manual testing into an efficient and error-reducing process. - -- **Faster Feedback:** Automated tests run quickly and provide immediate feedback on the changes made, speeding up the development cycle and reducing the time to market. -- **Higher Accuracy:** Reduces the chances of human error in repetitive tasks, providing more accurate results. -- **Better Coverage:** Enables thorough testing that can cover more aspects and features of the software, ensuring a more robust final product. -- **Continuous Integration:** Facilitates the practice of continuous integration by automatically testing every change made to the codebase, ensuring that the software is always in a releasable state. - ---- -## From Unit Tests to Integration Tests - -### Overview of Testing Types -Automated testing encompasses a range from simple unit tests that check individual components to complex integration tests that ensure different parts of the application work together seamlessly. - -- **Unit Tests:** Quick and focused tests that validate individual functions or components. -- **Integration Tests:** Ensure that different modules or services work together as expected, highlighting interface issues between components. -- **End-to-End Tests:** Mimic real-world usage scenarios to verify the complete system's behavior, from the front end to the back end and everything in between. - ---- -## Challenges in Automated Testing - -### Addressing Common Obstacles -While automated testing brings numerous benefits, it also comes with its own set of challenges: - -- **Initial Setup Cost:** Setting up an automated testing environment can be resource-intensive. -- **Maintenance Overhead:** Keeping tests up-to-date with new system requirements and functionalities can require significant ongoing effort. -- **Complexity:** Designing tests for complex systems can be challenging and requires detailed planning and execution. - ---- -## The Role of CI/CD in Automated Testing - -### How CI/CD Facilitates Automated Testing -CI/CD pipelines are central to implementing effective automated testing strategies, allowing for seamless integration and delivery processes. - -- **Integration with CI Tools:** Automated tests are integrated into the CI pipeline, which helps detect issues early and often, before they reach production. -- **Deployment Automation:** Ensures that every approved change is automatically deployed to production, which is stable and predictable, reducing manual errors and deployment issues. -- **Feedback Loops:** Provides developers with immediate feedback on their code changes, enabling quick corrections and adaptations based on real-world usage and test results. - ---- -## Building a Robust Automated Testing Framework - -### Key Steps to Developing an Effective Framework -Creating a robust automated testing framework involves several critical steps: - -- **Define Clear Objectives:** Understand what you need to test and why. Set clear goals for what each test should achieve. -- **Choose the Right Tools:** Select testing tools that best fit the technology stack and testing needs of your project. -- **Write Effective Tests:** Develop tests that are not only effective but also maintainable and scalable. -- **Integrate into CI/CD:** Fully integrate your testing framework into your CI/CD pipeline to automate the execution of tests at various stages of the software delivery process. -- **Monitor and Improve:** Continuously monitor the effectiveness of your tests and make improvements as necessary. Use feedback to refine and optimize your testing processes. - ---- -## Conclusion - -Automated testing is a cornerstone of modern software development. By integrating effective automated tests into the CI/CD pipeline, teams can ensure that their software is not only functional but also meets quality standards before it reaches the end-user. Embracing these practices not only enhances product reliability but also empowers teams to innovate rapidly with confidence. - - -### References -
    - Expand - 1. “Automated Testing for CI/CD: Teamcity CI/CD Guide.” JetBrains, https://www.jetbrains.com/teamcity/ci-cd-guide/automated-testing/. Accessed 1 May 2024.
    - 2. “Role of Automation Testing in CI/CD.” BrowserStack, 22 Nov. 2022, https://www.browserstack.com/guide/role-of-automation-testing-in-ci-cd.
    - 3. “Automated Testing: The Cornerstone of CI/CD.” Written by Ferdinando Santacroce. Semaphore, 16 Mar. 2022, https://semaphoreci.com/blog/automated-testing-cicd.
    -
    - - - - - diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md deleted file mode 100644 index f0bb9f9..0000000 --- a/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/index.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: Chapter 4 - Deployment -layout: custom -parent: Topic 3 - CI/CD Fundamentals -has_toc: false -has_children: true -nav_order: 4 ---- - -# Introduction to Deployment -Transitioning from the exploration of DevOps and CI/CD, we now turn our attention to the critical phase of deployment. Deployment is where coding efforts from developers merge, and attempt to integrate into the existing software. With so many people making changes to the same product, there are bound to be inconsistencies and issues when pushing code. That is where deployment best practices within CI/CD come in. - -> **Problem Space** -> -> 🧐 Imagine two developers are both working on projects for several months in a large organization. Ani is working on changing the current API used in the product, and Mariam is pulling from the current state of that API for her code. After working to get their projects working, they both push at the same time. -> -> Narek, a long time user of their site, is looking to buy pants. All of a sudden, the site is down! This was because when Ani and Mariam pushed there was no automatic testing and there were several integration issues: -> - **Endpoint Mismatch**: Mariam's new features expect certain responses from the API that Ani has since altered or deprecated, leading to unexpected behavior and failures in feature operation. -> - **Database Schema Changes**: Ani's API update included modifications to the database schema that Mariam's code was not designed to accommodate, resulting in broken database queries and data consistency issues. -> -> It might seem as though it was Ani and Mariam's lack of communication before building and deploying at fault, but imagine they are working in a company as large as Amazon or Boeing. It would be impractical and redundant to expect to know every developer's job. - - -## Deployment Environments - -- **💻 Development Environment:** - - **Purpose:** Initial coding and testing by developers. - - **Characteristics:** Runs on local machines or dev server, frequent changes and updates, connected to a test database, debugging tools are enabled. - - **CI/CD Role:** Starting point in CI/CD process, triggers initial build and unit tests. - -- **🚦 Staging Environment:** - - **Purpose:** Final testing before going live. Acts as a pre-production replica. - - **Characteristics:** Mimics production environment, stable and isolated for testing, hosts release candidate version. - - **CI/CD Role:** Used for performance, integration, and user acceptance testing, final checks before production. - -- **🌐 Production Environment:** - - **Purpose:** The live environment used by end-users. - - **Characteristics:** Most stable and secure, contains real user data and faces the internet, performance monitoring and error logging. - - **CI/CD Role:** Final stage of the pipeline, code is deployed if all checks pass. - -
    - -![image](https://github.com/open-devsecops/open-devsecops.github.io/assets/35845527/6c306e97-b563-4cc7-baff-8d79ddc45bdf) -_Source: [DevOps.com](/https://devops.com/i-want-to-do-continuous-deployment/)_ - -{: .lab} -[Lab 1 - Configuring a Simple CI/CD Pipeline](./lab/deployment-lab-1){: .btn .btn-purple .btn-fill } - -## Deployment Strategies -Deployment strategies are crucial for managing the transition of code from development through to production. Choosing the right strategy ensures that deployments are smooth, risks are minimized, and the user experience remains uninterrupted. Here are some common deployment strategies used in modern software development: - -1. 🔄 **Blue-Green Deployment**: Alternating between two identical environments to switch versions. - - | Pros | Cons | - |-------------------|----------------------| - | Easy rollback | Resource intensive | - | Minimal downtime | Complex setup | - - **Use Case**: Ideal for critical applications where zero downtime is essential. - - -2. 🐦 **Canary Deployment**: Gradually rolling out changes to a small subset of users first. - - | Pros | Cons | - |-----------------------------------|-----------------------------------| - | Low risk with smaller user impact | Requires monitoring and analytics | - | Real user feedback | More complex release process | - - **Use Case**: Best suited for applications with a large user base to gauge the impact of new changes. - -3. 🌊 **Rolling Deployment**: Updating application instances in phases, without taking down the entire app. - - | Pros | Cons | - |----------------------------|--------------------------------------| - | High availability | Not suitable for database changes | - | No need for additional infrastructure | Potential for brief inconsistency | - - **Use Case**: Services requiring constant availability and those with enough instances to support a phased rollout. - -4. 🚦 **Feature Toggles**: Releasing features hidden behind toggles, which can be enabled conditionally. - - | Pros | Cons | - |-------------------------------|-----------------------------------| - | Flexible control over features | Complexity in managing toggles | - | Easy rollback of features | Risk of technical debt | - - **Use Case**: Testing new features in live environments or rolling out features gradually. - -5. 🔀 **A/B Testing Deployment**: Deploying two versions to compare which performs better based on specific metrics. - - | Pros | Cons | - |---------------------------------|----------------------------------| - | Data-driven decision making | Requires traffic segmentation | - | Clear insight into user preferences | Increased complexity | - - **Use Case**: Optimizing user experience and validating hypotheses about user behavior. - -6. 🆕 **Immutable Deployments**: Every deployment creates a new environment, and traffic is switched over once ready. - - | Pros | Cons | - |------------------------------------|---------------------------------------| - | Consistency and reliability | Higher infrastructure costs | - | Simplifies rollback | Requires automation for efficiency | - - **Use Case**: Suitable for cloud-native applications where infrastructure can be easily replicated and managed as code. - - - - - -### References -
    - Expand - 1. “CI/CD Process: Flow, Stages, and Critical Best Practices.” Codefresh, 26 July 2023, https://codefresh.io/learn/ci-cd-pipelines/ci-cd-process-flow-stages-and-critical-best-practices/#:~:text=The%20deploy%20stage%20is%20the,it%20accessible%20to%20end%2Dusers.
    - 2. Deployment Strategies - Introduction to Devops on AWS, Amazon Web Services, https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/deployment-strategies.html. Accessed 12 Apr. 2024.
    - 3. “Flow Modeling: How Work Moves through the Enterprise.” Plutora, https://www.plutora.com/blog/deployment-strategies-6-explained-in-depth. Accessed 11 Apr. 2024.
    - 4. Riley, Chris, et al. “‘I Want to Do Continuous Deployment.’” DevOps.Com, 5 Dec. 2016, https://devops.com/i-want-to-do-continuous-deployment/.
    - 5. Tremel, Etienne. “Six Strategies for Application Deployment.” The New Stack, 25 Mar. 2021, https://thenewstack.io/deployment-strategies/.
    - 6. Using Blue-Green Deployment to Reduce Downtime | Cloud Foundry Docs, https://docs.cloudfoundry.org/devguide/deploy-apps/blue-green.html. Accessed 12 Apr. 2024.
    -
    diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md deleted file mode 100644 index 7b56cf1..0000000 --- a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/index.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -title: Chapter 5 - Containerization -layout: custom -parent: Topic 3 - CI/CD Fundamentals -has_children: true -has_toc: false -nav_order: 5 ---- - -## Definition of Containerization - -**Containerization in cloud computing is a method of packaging, distributing, and running applications using containers. A *container* is a:** -- Standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably in different computing environments -- Unlike virtual machines that require an entire virtual operating system, **containers** share the machine's OS kernel and do not require the overhead of starting an OS, booting up, and then running the application. -- Pros: This makes them lightweight, allowing a server to host more containers than if using virtual machines. -- Containerization ensures that software runs reliably when moved from one computing environment to another. This is because the container encapsulates everything the software needs to run: the application itself, along with its runtime, libraries, and system settings. - -The standardized packaging of containers, managed by orchestration tools like **Kubernetes**, allows for automation in deploying, managing, scaling, and networking of containers. This brings about a high level of efficiency and scalability for applications, especially in cloud computing environments where resources need to be allocated and managed dynamically. - - - -
    - Kubernetes Dashboard -

    Example of Functioning Kubernetes Dashboard

    -

    Source: ikarus

    -
    - - -Containerization also supports microservices architectures, allowing for the segmentation of parts of a large application into small, independent services that are easier to develop, deploy, and maintain. This approach improves system resilience and scalability. In the cloud, these benefits are enhanced due to the inherent elasticity and resource management capabilities of cloud services. Overall, containerization is a crucial aspect of modern software development and deployment, enabling more efficient use of resources, faster deployment times, and greater consistency across environments. - - -## Use Cases - -- Cloud Migration: Cloud migration is a software strategy that involves encapsulating legacy applications in containers and deploying them in a cloud computing environment. Organizations can modernize their applications without rewriting the entire software code. -- Microservices Architecture: The microservice architecture is a software development approach that uses multiple, interdependent software components to deliver a functional application. Each microservice has a unique and specific function. A modern cloud application consists of multiple microservices, containerization provides the software tool to pack microservices as deployable programs on different platforms. -- IoT Devices: Internet of Things (IoT) devices contain limited computing resources, making manual software updating a complex process. Containerization allows developers to deploy and update applications across IoT devices easily. - - -## Advantages - -**Benefits of Containerization** - -- Isolation of Applications - Each container acts like a small, self-contained unit where a specific application and all its dependencies (libraries, frameworks, etc.) are packaged together. Applications in the container can run reliably and consistently across different computing environments because it has everything it needs to work/access within the container. -- Portability - Software developers can use containerization to deploy applications in multiple environments now without re-writing the program code. A single application can be deployed into multiple operating systems. -- Scalability - Can easily handle various technologies, packages, and containers on a single virtual machine. The container cluster can use computing resources from the a shared operating system, but one container doesn't interfere with the operation of other containers. -- Fault Tolerance - A single faulty container does not affect the other containers. This allows multiple containers to run micro-services on the cloud, increasing the resilience and availability of the application. -- Agility - Software developers can use this isolated environment to troubleshoot and change the application code without interfering with the operating system, hardware, and other services. This can shorten software release cycles and work on updates quicker. - - -{: .lab} -[Lab 1 - Containerizing a React Application](./lab/containerization-lab-1.html){: .btn .btn-purple .btn-fill } - -## Artifact vs. Artifactory - -### Artifact: - An "artifact" typically refers to a container image. This image is a read-only template that contains a snapshot of an application and its dependencies at a specific point in time. It's essentially a lightweight, portable, and reproducible package that can be used to create multiple containers with identical configurations. This image includes all necessary files, libraries, and configurations required to run an application. Container images are often built using a set of instructions that specify the software and configuration needed to create them. These images adhere to the Open Container Initiative (OCI) image specification, providing a standardized format for creating container images. Once created, these images can be stored and distributed in a registry, facilitating easy sharing across different environments. - -In simpler terms, think of an artifact like a recipe for an app. This recipe includes everything the app needs to work (like code, tools, and settings). But it's just a set of instructions, not the running app itself. When you want to run the app, you use this recipe to create a "container," which is like a mini-computer inside your main computer. It has everything the app needs to run, based on the recipe. This container is isolated, meaning it doesn't interfere with other things on your computer. So, an artifact in containerization is basically the recipe or blueprint for creating a container that can run an app - -This concept of container images as artifacts is fundamental in containerization, enabling the portability, agility, and scalability of applications within the cloud computing and DevOps landscapes - -### Artifactory: - -A repository manager developed by JFrog that supports software packages created by different languages and technologies. It integrates seamlessly with various build tools and CI/CD pipelines, Artifactory is crucial for automating software development and deployment processes. It accommodates multiple package formats like Maven, NuGet, and Docker, providing a unified platform for artifact management. Additionally, it offers version control and secure storage for these artifacts. With its scalability and reliability, Artifactory is designed to meet the demands of both small and large-scale software development projects - -### Summary of Differences - -An "artifact" refers to any file or collection of files that are produced as a result of a software development process. These can include compiled source code, libraries, executables, configuration files, and even Docker images. Artifacts are essentially the tangible outputs of your software development lifecycle, crucial for the functioning of the software project. - -On the other hand, "Artifactory" is a product developed by JFrog. It functions as a universal repository manager, capable of handling various types of artifacts. Artifactory provides a centralized solution for storing and distributing different types of artifacts, including container images, software packages, binaries, and more. It supports a wide range of package formats. Artifactory also offers integration with various build tools, CI/CD pipelines, and development environments, making it a versatile tool for managing artifacts in a software development process. - -So, while an "artifact" is a product of the software development process, "Artifactory" is a tool for managing these products. It's a repository where various artifacts, including those from containerization processes, can be stored, managed, and distributed efficiently - - -{: .lab} -[Lab 2 - Accessing Corporate Network and AWS ECR](./lab/containerization-lab-2.html){: .btn .btn-purple .btn-fill } - - - - - -### References - -**1.** "What is Containerization?" *AWS*, [https://aws.amazon.com/what-is/containerization/#:~:text=Containerization%20involves%20building%20self%2Dsufficient,to%20run%20a%20containerized%20application](https://aws.amazon.com/what-is/containerization/#:~:text=Containerization%20involves%20building%20self%2Dsufficient,to%20run%20a%20containerized%20application). Accessed 20 Feb. 2024. - -**2.** "What is containerization? Overview, definition, benefits, and tools", *Log Rocket*, [https://blog.logrocket.com/product-management/what-is-containerization-definition-benefits-tools/](https://blog.logrocket.com/product-management/what-is-containerization-definition-benefits-tools/). Accessed 20 Feb. 2024. - -**3.** "What is containerization?", *Red Hat*, [https://www.redhat.com/en/topics/cloud-native-apps/what-is-containerization](https://www.redhat.com/en/topics/cloud-native-apps/what-is-containerization). Accessed 20 Feb. 2024. - -**4.** "Decoding the Difference: Artifacts vs Packages in Software Development", *cloudsmith*, [https://cloudsmith.com/blog/artifacts-vs-packages-what-is-the-difference](https://cloudsmith.com/blog/artifacts-vs-packages-what-is-the-difference). Accessed 20 Feb. 2024. - -**5.** "Azure Container Registry between Artifactory: Exploring the Differences", *LevInfo*, [https://ievinfo.com/azure-container-registry-between-artifactory-differenc/](https://ievinfo.com/azure-container-registry-between-artifactory-differenc/). Accessed 20 Feb. 2024. - - diff --git a/docs/course/Topic-3-CICD-Concepts/index.md b/docs/course/Topic-3-CICD-Concepts/index.md deleted file mode 100644 index 07ffe84..0000000 --- a/docs/course/Topic-3-CICD-Concepts/index.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Topic 3 - CI/CD Fundamentals -layout: custom -has_children: true -has_toc: false -nav_order: 5 ---- - -# Topic 3 - CI/CD Fundamentals - -| Chapter | Learning Objectives | Lab Description | -|---------|---------------------|-----------------| - diff --git a/docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md similarity index 100% rename from docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/index.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md diff --git a/docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/labs/devsecops-lab-1.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/labs/devsecops-lab-1.md similarity index 100% rename from docs/course/Topic-4-Devsecops-Fundmentals/chapter-1-devsecops/labs/devsecops-lab-1.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/labs/devsecops-lab-1.md diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-1-cicd-core-concepts/index.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/deployment-lab-1.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/deployment-lab-1.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/deployment-lab-1.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/deployment-lab-1.md diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/jenkins-login.png b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/imgs/jenkins-login.png similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/jenkins-login.png rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/imgs/jenkins-login.png diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/wireguard.png b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/imgs/wireguard.png similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/imgs/wireguard.png rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/imgs/wireguard.png diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/overview.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/overview.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-4-deployment/lab/overview.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/overview.md diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-1.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-1.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-1.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-1.md diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-2.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-2.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/containerization-lab-2.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-2.md diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/clone.png b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/clone.png similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/clone.png rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/clone.png diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/dashboard.png b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/dashboard.png similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/dashboard.png rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/dashboard.png diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/fork.png b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/fork.png similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/fork.png rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/fork.png diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/wireguard.png b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/wireguard.png similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/imgs/wireguard.png rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/imgs/wireguard.png diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/overview.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/overview.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/chapter-5-containerization/lab/overview.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/overview.md diff --git a/docs/course/Topic-3-CICD-Concepts/review-and-knowledge-check/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/review-and-knowledge-check/index.md similarity index 100% rename from docs/course/Topic-3-CICD-Concepts/review-and-knowledge-check/index.md rename to docs/course/Topic-3-DevSecOp-Fundamentals/review-and-knowledge-check/index.md diff --git a/docs/course/Topic-4-Devsecops-Fundmentals/index.md b/docs/course/Topic-4-Devsecops-Fundmentals/index.md deleted file mode 100644 index db60ffc..0000000 --- a/docs/course/Topic-4-Devsecops-Fundmentals/index.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Topic 4 - DevSecOps Fundamentals -layout: custom -has_children: true -has_toc: false -nav_order: 5 ---- - -# Topic 4 - DevSecOps Fundamentals - -| Chapter | Learning Objectives | Lab Description | -|---------|---------------------|-----------------| -| Chapter 1: DevSecOps | - Define DevSecOps
    - Understand Why Implement
    - Understand Shift Left/Right Testing
    - Learn about Related Tools and Technologies | | -| Chapter 2: Security Checks in CI/CD | - Understand important of security checks in each stage of the pipeline
    - Discuss SAST vs DAST and their pros/cons
    - Learn about vulnerability scanning and prominent tools in industry today | **Lab: Securing a vulnerable application
    - Fix security vulnerabilities flagged by security checkpoints within a CI/CD pipeline. | - - diff --git a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md index b498d28..bae1e5f 100644 --- a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md +++ b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md @@ -3,7 +3,7 @@ title: Chapter 1 - Intro to Cybersecurity layout: custom parent: Topic 4 - Cybersecurity has_toc: false -nav_order: 3 +nav_order: 2 --- # Cybersecurity Fundamentals diff --git a/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md b/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md new file mode 100644 index 0000000..cc96461 --- /dev/null +++ b/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md @@ -0,0 +1,41 @@ +--- +title: Chapter 2 - Security Risks and Vulnerabilities in the SDLC +layout: custom +parent: Topic 4 - Cybersecurity +has_toc: false +nav_order: 2 +--- + +# Understanding Software Vulnerabilities in the SDLC + +To understand how to protect software by integrating security into every step of the SDLC, it is vital to first understand what makes software vulnerable. + +--- + +## Causes of Common Vulnerabilities + +| **Risk** | **Definition** | **Example Mitigation Strategy** | +|----------------------------------|--------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| +| **Improper Access Control** | Users can access data or systems they shouldn’t be allowed to | Role Based Access Controls | +| **Injections** | User input sends malicious code into system | Sanitize user input | +| **SQL Injections** | User inputted malicious SQL queries that are used to gain manipulate the database | Parameterized queries and prepared statements to validate user input | +| **Cross-Site Scripting (XSS)** | Injection of malicious scripts into websites usually using JavaScript | Use output encoding when displaying user input on a web page | +| **Cryptographic Risks** | Weak or outdated data encryption | Modern encryption methods | +| **Improper Authentication** | Weak or outdated login systems | Requiring Multi-factor Authentication (MFA) | +| **Insufficient Logging and Monitoring** | Weak identification and alerting of suspicious activity in a system | Regular log reviews and real-time alerts of suspicious network and system activity | +| **Misconfiguration** | Systems are set up incorrectly | Automated scanning and testing tools and have a separate dev and production project to ensure no misconfigurations are live | + +--- + +## Resources for Further Information + +- **OWASP Top Ten**: List of the ten most critical security risks to a web application + [https://owasp.org/www-project-top-ten/](https://owasp.org/www-project-top-ten/) + +- **Common Vulnerabilities and Exposures (CVE)**: Public database of all known software vulnerabilities + [https://www.cve.org/](https://www.cve.org/) + +- **CISA’s Known Exploited Vulnerabilities**: The US government catalog of real-world cyber attacks + [https://www.cisa.gov/known-exploited-vulnerabilities-catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) + +--- \ No newline at end of file diff --git a/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/index.md b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md similarity index 100% rename from docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/index.md rename to docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md diff --git a/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/lab/devsecops-lab-1.md similarity index 69% rename from docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md rename to docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/lab/devsecops-lab-1.md index f047f05..53aa5ca 100644 --- a/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/devsecops-lab-1.md +++ b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/lab/devsecops-lab-1.md @@ -1,9 +1,9 @@ --- layout: custom title: Lab 1. Securing a Vulnerable Application -grand_parent: Topic 3 - DevSecOps -parent: Chapter 2 - Security Checks in CI/CD -nav_order: 2 +grand_parent: Topic 4 - Cybersecurity +parent: Chapter 3 - Security Checks in CI/CD +nav_order: --- # Lab - Securing a Vulnerable Application **Estimated Time to Complete:** 30-45 minutes diff --git a/docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/overview.md b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/lab/overview.md similarity index 100% rename from docs/course/Topic-4-Devsecops-Fundmentals/chapter-2-security-checks-in-CICD/lab/overview.md rename to docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/lab/overview.md From f1839a63029db490dc638e49a6f72dfdd2716350 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Fri, 16 May 2025 13:48:58 -0700 Subject: [PATCH 38/68] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d2dc09a..5990ca8 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ https://docs.google.com/presentation/d/1ESrzQka0eZ1L1KLqiXgI0yj2_FuhhFSfokiGwJE8

    Katie Shi - LinkedIn - katieshi413@gmail.com

    Emily Choi - LinkedIn - eemilychoi@gmail.com

    -

    Jocelyn Margarones - LinkedIn - katieshi@uw.edu

    +

    Jocelyn Margarones - LinkedIn - jsmargarones@gmail.com

    Mor Vered - LinkedIn - mvered9@gmail.com

    Mira Nair - LinkedIn - miranair004@gmail.com

    From 10f73ee0bc57828feca47dbefb4963356896ae51 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Fri, 16 May 2025 14:00:41 -0700 Subject: [PATCH 39/68] quiz for topic 3 ch 2 --- _data/quizzes/topic3/chapter2.yml | 43 +++++++++++++++++++ .../chapter-2-webhooks/index.md | 9 ++++ 2 files changed, 52 insertions(+) create mode 100644 _data/quizzes/topic3/chapter2.yml diff --git a/_data/quizzes/topic3/chapter2.yml b/_data/quizzes/topic3/chapter2.yml new file mode 100644 index 0000000..ee2cae2 --- /dev/null +++ b/_data/quizzes/topic3/chapter2.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the main purpose of a webhook in a CI/CD workflow?" + options: + - "To host your application on a server" + - "To notify an external service that an event has occurred in your repository" + - "To merge code automatically into the main branch" + - "To track version history of your project" + correct_index: 1 + explanation: "A webhook sends a notification to an external service (like a CI/CD tool) when a specified event happens in your repo." + + - prompt: "Which content type is commonly used to send data in a webhook request?" + options: + - "XML" + - "YAML" + - "JSON" + - "HTML" + correct_index: 2 + explanation: "JSON is the most commonly used format for webhook payloads due to its wide support and readability." + + - prompt: "Which of the following is a common event that can trigger a webhook in GitHub?" + options: + - "Creating a README file" + - "Cloning a repository" + - "Creating a release" + - "Viewing a pull request" + correct_index: 2 + explanation: "Webhooks can be triggered by events like releases, pushes, and pull request changes." + + - prompt: "True or False: Once a webhook is set up, CI/CD tools automatically trigger based on the rules you define, such as pushes or pull requests." + options: + - "True" + - "False" + correct_index: 0 + explanation: "True. Webhooks notify CI/CD tools automatically based on configured triggers, reducing manual intervention." + + - prompt: "After you push code to GitHub, what is the next step in the webhook workflow?" + options: + - "You manually trigger the test suite" + - "GitHub runs the tests itself" + - "The pull request is automatically merged" + - "GitHub sends a webhook to the CI/CD tool" + correct_index: 3 + explanation: "GitHub sends a webhook to notify the CI/CD system, which then takes the appropriate action." \ No newline at end of file diff --git a/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md b/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md index 32c0b09..3919cd9 100644 --- a/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md +++ b/docs/course/Topic-3-CICD-Concepts/chapter-2-webhooks/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 3 - CI/CD Fundamentals has_toc: false nav_order: 2 +topic: topic3 +chapter: chapter2 --- ## Utilizing Web Hooks for Continuous Integration @@ -27,6 +29,13 @@ Then, once you want to make a change, the following happens: 2. **GitHub sends a webhook** - Because of the rule you set up, GitHub notifies your CI/CD tool that something happened (like a code push). 3. **CI/CD tool starts tests** - The CI/CD tool, now informed by the webhook, starts running the tests or actions you've configured it to perform upon receiving such a notification. +--- + +{% include quiz.html + id="topic3-chapter2" + data=site.data.quizzes.topic3.chapter2 +%} + ### References
    Expand From 49735f980d0251ddb2e0f5394500402d2b986a75 Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Fri, 16 May 2025 15:02:56 -0700 Subject: [PATCH 40/68] changed remote theme to just-the-docs/just-the-docs --- Gemfile.lock | 2 ++ _config.yml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9583550..1cadd50 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,6 +15,7 @@ GEM ffi (1.16.3) forwardable-extended (2.6.0) google-protobuf (3.25.1) + google-protobuf (3.25.1-arm64-darwin) google-protobuf (3.25.1-x86_64-darwin) http_parser.rb (0.8.0) i18n (1.14.1) @@ -83,6 +84,7 @@ GEM PLATFORMS arm64-darwin-23 + arm64-darwin-24 x64-mingw-ucrt x86_64-darwin-22 x86_64-darwin-23 diff --git a/_config.yml b/_config.yml index f22d3ef..ddd636b 100644 --- a/_config.yml +++ b/_config.yml @@ -1,6 +1,6 @@ title: open-devsecops description: 'From Classroom to Industry: Bridging the DevSecOps Knowledge Gap with Open, Practical Learning.' -remote_theme: pmarsceill/just-the-docs +remote_theme: just-the-docs/just-the-docs plugins: - jekyll-remote-theme From 852ec29f6051afcc3f1e5e8c195bb9e801145d87 Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Fri, 16 May 2025 15:14:59 -0700 Subject: [PATCH 41/68] changing back to original theme --- _config.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/_config.yml b/_config.yml index ddd636b..d2cb8a3 100644 --- a/_config.yml +++ b/_config.yml @@ -1,8 +1,6 @@ title: open-devsecops description: 'From Classroom to Industry: Bridging the DevSecOps Knowledge Gap with Open, Practical Learning.' -remote_theme: just-the-docs/just-the-docs -plugins: - - jekyll-remote-theme +theme: just-the-docs logo: "/assets/images/opendevsecops-transparent.png" favicon_ico: "/assets/images/opendevsecops-favicon.ico" From 583cb2f472b62d25a008b1c6bc5b1a7c4019a8dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cmiraxnairgit=20config=20--global=20user=2Eemail?= =?UTF-8?q?=20=E2=80=9Cmiranair004=40gmail=2Ecom?= <“miranair004@gmail.com> Date: Mon, 19 May 2025 16:59:05 -0700 Subject: [PATCH 42/68] git advanced chapter --- docs/course/.DS_Store | Bin 0 -> 6148 bytes .../index.md | 177 +++++++++++++++++- docs/course/Topic-2-Git/index.md | 1 + 3 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 docs/course/.DS_Store diff --git a/docs/course/.DS_Store b/docs/course/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bdeffd7f84fc788cb26af48dc1be7f2b02052197 GIT binary patch literal 6148 zcmeHKyH3ME5S)b+k!V~}-VadFP+L(bsQCdz+#p355mL~(;=A}XW*?1Zs3MwZR@$4p zy`4MV6kaa?+Z=~mpaZa`JL1cSrTM=5!Y(ReL^{vd;Rbi~2fQw_e-Ajf!v{vZ;bq1j zaKwQ-@Aw=JyZ!Sx?mby11*Cu!kOERb3Y?@smDBarNvDV`1*E_^D&XITMtAHBr^NVl zaEKOwxMDbr^XMgr%>%@~a7tu^W=SO`)vCp?q%+YulMbuq!|GKJ1*8@ +``` + +**Use cases:** +- Hotfix a bug from `dev` to `main` +- Re-use a feature commit without bringing in unrelated changes + +🔍 *Tip:* Use `git log` or `gitk` to find commit hashes. + +--- + +## 🕰️ 4. Git Reflog + +Lost a branch? Accidentally deleted commits? `git reflog` is your time machine. + +```bash +git reflog +``` + +It shows a history of your Git HEAD movements—every checkout, commit, rebase, etc. + +To recover lost commits: + +```bash +git checkout +``` + +🚨 *Life-saver tip:* If you've ever thought “Oh no, I lost my work!”, check the reflog before panicking. + +--- + +## 🕵️ 5. Git Bisect + +Tracking down a bug introduced in one of many commits? Use `git bisect` to automate binary search through your history. + +```bash +git bisect start +git bisect bad +git bisect good +``` + +Git will now walk you through testing commits one-by-one until it finds the culprit. + +🐛 *DevSecOps use case:* Find out exactly which commit introduced a security vulnerability. + +--- + +## 🌐 6. Submodules + +Sometimes you want to include one Git repository inside another (e.g., pulling in a shared library). That’s where Git submodules come in. + +```bash +git submodule add https://github.com/other/repo.git path/to/repo +git submodule init +git submodule update +``` + +**Use submodules with caution**—they can be tricky to manage. Prefer them only when: +- You need strict control over an external dependency +- You want to keep separate version control histories + +--- + +## 🔑 7. Git Hooks + +Git hooks are scripts that run automatically at certain points in your Git workflow, such as before a commit or after a push. + +**Examples:** +- `pre-commit`: Run linters or security checks before committing +- `pre-push`: Enforce test passing before pushing to remote +- `commit-msg`: Validate commit message formatting + +Git stores hooks in the `.git/hooks/` directory. You can write them in shell, Python, etc. + +🛡️ *Security use case:* Add a `pre-commit` hook to scan for secrets using `git-secrets` or `truffleHog`. + +--- + +## 👥 8. Forks vs Clones (In Open Source) + +When contributing to open-source projects or working on team repos: + +- **Clone**: Copying a repo you have access to directly. +- **Fork**: Copying someone else’s repo into your own account to contribute. + +**Typical workflow for external contributions:** +1. Fork the repo +2. Clone your fork +3. Create a feature branch +4. Push and open a Pull Request (PR) + +🤝 *Collaboration tip:* Always work on a separate branch, even in your fork, to keep your main branch clean. + +--- + +## 📦 9. Git Tags + +Tags are used to mark specific commits as important, usually for releases. + +```bash +git tag v1.0.0 +git push origin v1.0.0 +``` + +- **Lightweight tags**: Simple labels +- **Annotated tags**: Include metadata (author, date, message) + +🏷️ *Tags are essential in CI/CD pipelines for deploying stable versions.* + +--- + +## 🧩 Summary: Why These Topics Matter in the Industry + +Advanced Git knowledge is highly valued in DevSecOps, open-source, and enterprise environments. Whether you're a junior developer or aspiring DevSecOps engineer, understanding these concepts will save you time, prevent mistakes, and help you collaborate like a pro. + +--- + +### References +
    + Expand + 1. “Advanced Git Tutorials.” Atlassian Git Tutorials, atlassian.com/git/tutorials/advanced-overview. Accessed 14 May 2025. +
    \ No newline at end of file diff --git a/docs/course/Topic-2-Git/index.md b/docs/course/Topic-2-Git/index.md index 51ac42e..0515e27 100644 --- a/docs/course/Topic-2-Git/index.md +++ b/docs/course/Topic-2-Git/index.md @@ -14,3 +14,4 @@ nav_order: 4 | Chapter 2: Git Fundamentals | - Explain the structure of repositories
    - Discuss the role of the staging area and commit history
    - Cover key Git commands and their uses | | | Chapter 3: Git Intermediate Concepts | - Define and utilize branching and merging strategies
    - Understand different types of merges
    - Discuss the importance of pull requests and rebasing | **Lab: Version Control & Branching**
    - Clone a repository
    - Create and switch branches
    - Understand basic Git commands like `git add`, `git commit`, `git push`
    - Make and commit changes to a repository | | Chapter 4: Git Best Practices | - Establish effective documentation habits
    - Discuss the importance of READMEs and wikis
    - Explore best practices for inline code commenting | | +| Chapter 5: Git Advanced Concepts | - Learn advanced Git commands to manage commit history, troubleshoot issues, and automate workflows
    - Understand how to collaborate effectively using forks, submodules, and selective commit strategies
    - Explore tools like git stash, git reflog, and git bisect to safely experiment and recover work| | From 8748ba3ca09a3e7aa58ba887a12305334d1009d9 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Mon, 19 May 2025 22:39:12 -0700 Subject: [PATCH 43/68] fix the page architecture, pages in the right order now --- .../course/Topic-1-Software-Dev-and-DevSecOps/index.md | 10 +++++----- .../review-and-knowledge-check/index.md | 9 --------- .../Topic-2-Git/review-and-knowledge-check/index.md | 9 --------- .../chapter-1-devsecops/index.md | 2 +- .../chapter-2-cicd-core-concepts/index.md | 6 +++--- .../chapter-3-automated-testing/index.md | 8 ++++---- .../chapter-4-deployment/index.md | 6 +++--- .../chapter-4-deployment/lab/deployment-lab-1.md | 2 +- .../chapter-4-deployment/lab/overview.md | 2 +- .../chapter-5-webhooks/index.md | 10 +++++----- .../chapter-6-containerization/index.md | 6 +++--- .../lab/containerization-lab-1.md | 4 ++-- .../lab/containerization-lab-2.md | 4 ++-- .../chapter-6-containerization/lab/overview.md | 4 ++-- docs/course/Topic-3-DevSecOp-Fundamentals/index.md | 10 +++++++--- .../review-and-knowledge-check/index.md | 9 --------- .../chapter-1-intro-to-cybersecurity/index.md | 4 ++-- .../index.md | 3 ++- .../chapter-3-security-checks-in-CICD/index.md | 8 ++++---- docs/course/Topic-4-Security/index.md | 4 ++-- docs/course/Topic-5-Cloud/index.md | 2 +- docs/course/Topic-6-DevSecOps-in-Industry/index.md | 6 +++--- docs/other/index.md | 2 +- 23 files changed, 54 insertions(+), 76 deletions(-) delete mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md delete mode 100644 docs/course/Topic-2-Git/review-and-knowledge-check/index.md delete mode 100644 docs/course/Topic-3-DevSecOp-Fundamentals/review-and-knowledge-check/index.md diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md index 2bbd54b..40fe464 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md @@ -9,10 +9,10 @@ nav_order: 3 # Topic 1 - Introduction to the SDLC and DevSecOps -| Chapter | Learning Objectives | Lab Description | -|---------|---------------------|-----------------| -| Chapter 1: Introduction to SDLC | - Define Software Development Lifecycle
    - Understand the basics of SDLC methodologies
    - Explore the benefits of using different methodologies
    | | -| Chapter 2: Intro to Version Control | - Define version control
    - Understand the basics of version control systems
    - Explore the benefits of using version control
    - Introduction to common version control tools| | +| Chapter | Learning Objectives | +|---------|---------------------| +| Chapter 1: Introduction to SDLC | - Define Software Development Lifecycle
    - Understand the basics of SDLC methodologies
    - Explore the benefits of using different methodologies
    | +| Chapter 2: Intro to Version Control | - Define version control
    - Understand the basics of version control systems
    - Explore the benefits of using version control
    - Introduction to common version control tools| | Chapter 3: Introduction to DevOps | - Define DevOps
    | | Chapter 4: Introduction to CI/CD | - Establish effective documentation habits
    - Discuss the importance of READMEs and wikis
    - Explore best practices for inline code commenting | -| Chapter 4: Securing SDLC with DevSecOps | - Define DevSecOps
    | | \ No newline at end of file +| Chapter 4: Securing SDLC with DevSecOps | - Define DevSecOps
    | \ No newline at end of file diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md deleted file mode 100644 index 7ba6a92..0000000 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/review-and-knowledge-check/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Topic Review and Knowledge Check -layout: custom -parent: Topic 1 - Introduction to SDLC and DevSecOps -has_toc: false -nav_order: 6 ---- - -# Topic Review and Knowledge Check \ No newline at end of file diff --git a/docs/course/Topic-2-Git/review-and-knowledge-check/index.md b/docs/course/Topic-2-Git/review-and-knowledge-check/index.md deleted file mode 100644 index 69dd512..0000000 --- a/docs/course/Topic-2-Git/review-and-knowledge-check/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Topic Review and Knowledge Check -layout: custom -parent: Topic 2 - Git -has_toc: false -nav_order: 6 ---- - -# Topic Review and Knowledge Check \ No newline at end of file diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md index 1499ad3..c7be795 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md @@ -1,7 +1,7 @@ --- title: Chapter 1 - DevSecOps layout: custom -parent: Topic 4 - DevSecOps Fundamentals +parent: Topic 3 - DevSecOps Fundamentals has_toc: false nav_order: 1 --- diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md index 3dc7f71..d33d089 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md @@ -1,13 +1,13 @@ --- -title: Chapter 1 - CI/CD Fundamentals +title: Chapter 2 - CI/CD Fundamentals layout: custom -parent: Topic 3 - CI/CD Fundamentals +parent: Topic 3 - DevSecOps Fundamentals has_children: false has_toc: false nav_order: 2 --- -# CI/CD Fundamentals +# Chapter 2 - CI/CD Fundamentals

    CI/CD, short for Continuous Integration and Continuous Delivery, is a part of the DevOps process. “It is a collection of principles and practices designed to help development teams ensure the reliable delivery of frequent code changes.”

    diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md index ac70e85..c1f46f5 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md @@ -1,13 +1,13 @@ --- -title: Chapter 2 - Automated Tests +title: Chapter 3 - Automated Tests layout: custom -parent: Topic 3 - CI/CD Fundamentals +parent: Topic 3 - DevSecOps Fundamentals has_children: false has_toc: false -nav_order: 4 +nav_order: 3 --- -# Automated Testing in CI/CD +# Chapter 3 - Automated Testing in CI/CD ## Importance of Automation in Testing 🧐 Imagine you are developing rapidly evolving software. As your product becomes more complex, ensuring that new features work correctly without breaking existing functionalities becomes challenging. diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md index 31dbaee..9f6a3c1 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md @@ -1,13 +1,13 @@ --- title: Chapter 4 - Deployment layout: custom -parent: Topic 3 - CI/CD Fundamentals +parent: Topic 3 - DevSecOps Fundamentals has_toc: false has_children: true -nav_order: 5 +nav_order: 4 --- -# Introduction to Deployment +# Chapter 4 - Introduction to Deployment Transitioning from the exploration of DevOps and CI/CD, we now turn our attention to the critical phase of deployment. Deployment is where coding efforts from developers merge, and attempt to integrate into the existing software. With so many people making changes to the same product, there are bound to be inconsistencies and issues when pushing code. That is where deployment best practices within CI/CD come in. > **Problem Space** diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/deployment-lab-1.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/deployment-lab-1.md index bacea92..04d14ee 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/deployment-lab-1.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/deployment-lab-1.md @@ -1,7 +1,7 @@ --- title: Lab 1. Configuring a Simple CI/CD Pipeline layout: custom -grand_parent: Topic 3 - CI/CD Fundamentals +grand_parent: Topic 3 - DevSecOps Fundamentals parent: Chapter 4 - Deployment nav_order: 2 --- diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/overview.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/overview.md index 65f011e..0c98071 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/overview.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/lab/overview.md @@ -1,7 +1,7 @@ --- title: Labs Overview layout: custom -grand_parent: Topic 3 - CI/CD Fundamentals +grand_parent: Topic 3 - DevSecOps Fundamentals parent: Chapter 4 - Deployment nav_order: 1 --- diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md index a03764f..f25e397 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md @@ -1,13 +1,13 @@ --- -title: Chapter 2 - Webhooks +title: Chapter 5 - Webhooks layout: custom -parent: Topic 3 - CI/CD Fundamentals +parent: Topic 3 - DevSecOps Fundamentals has_toc: false -nav_order: 3 +nav_order: 5 --- -## Utilizing Web Hooks for Continuous Integration -### What is a Web Hook? +# Chapter 5 - Utilizing Web Hooks for Continuous Integration +## What is a Web Hook? When deploying code, you want to make sure it is automatically running through several relevant tests without you triggering them every single time. A webhook is like a notification for your CI/CD tests, that you have done something with your code. To set up a webhook, you first need to define rules that it follows: 1. **Choose Trigger Events:** During the webhook setup process in GitHub, you specify which events will trigger the webhook. This could be a variety of actions, such as: diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md index 4987dd1..9d3c2a9 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md @@ -1,13 +1,13 @@ --- -title: Chapter 5 - Containerization +title: Chapter 6 - Containerization layout: custom -parent: Topic 3 - CI/CD Fundamentals +parent: Topic 3 - DevSecOps Fundamentals has_children: true has_toc: false nav_order: 6 --- -## Definition of Containerization +# Chapter 6 - Definition of Containerization **Containerization in cloud computing is a method of packaging, distributing, and running applications using containers. A *container* is a:** - Standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably in different computing environments diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-1.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-1.md index d84c734..52bec37 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-1.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-1.md @@ -1,8 +1,8 @@ --- layout: custom title: Lab 1. Containerizing a React Application -grand_parent: Topic 3 - CI/CD Fundamentals -parent: Chapter 5 - Containerization +grand_parent: Topic 3 - DevSecOps Fundamentals +parent: Chapter 6 - Containerization nav_order: 2 --- # Lab 1 - Containerizing a React Application diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-2.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-2.md index 7771157..ce4e75e 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-2.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/containerization-lab-2.md @@ -1,8 +1,8 @@ --- layout: custom title: Lab 2. Accessing Corporate Network and AWS ECR -grand_parent: Topic 3 - CI/CD Fundamentals -parent: Chapter 5 - Containerization +grand_parent: Topic 3 - DevSecOps Fundamentals +parent: Chapter 6 - Containerization nav_order: 3 --- # Lab 2 - Accessing Corporate Network and AWS ECR diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/overview.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/overview.md index f0cb904..879d2b2 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/overview.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/lab/overview.md @@ -1,8 +1,8 @@ --- title: Labs Overview layout: custom -grand_parent: Topic 3 - CI/CD Fundamentals -parent: Chapter 5 - Containerization +grand_parent: Topic 3 - DevSecOps Fundamentals +parent: Chapter 6 - Containerization nav_order: 1 --- diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/index.md index db60ffc..38b4562 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/index.md @@ -1,16 +1,20 @@ --- -title: Topic 4 - DevSecOps Fundamentals +title: Topic 3 - DevSecOps Fundamentals layout: custom has_children: true has_toc: false nav_order: 5 --- -# Topic 4 - DevSecOps Fundamentals +# Topic 3 - DevSecOps Fundamentals | Chapter | Learning Objectives | Lab Description | |---------|---------------------|-----------------| | Chapter 1: DevSecOps | - Define DevSecOps
    - Understand Why Implement
    - Understand Shift Left/Right Testing
    - Learn about Related Tools and Technologies | | -| Chapter 2: Security Checks in CI/CD | - Understand important of security checks in each stage of the pipeline
    - Discuss SAST vs DAST and their pros/cons
    - Learn about vulnerability scanning and prominent tools in industry today | **Lab: Securing a vulnerable application
    - Fix security vulnerabilities flagged by security checkpoints within a CI/CD pipeline. | +| Chapter 2: CI/CID Fundamentals | - Explain CI/CD within the DevOps framework
    - Discuss CI/CD lifecycle, benefits, and methods | | +| Chapter 3: Automated Tests | - Outline the role of automated testing in CI/CD
    - Discuss strategies and integration into the pipeline | | +| Chapter 4: Deployment | - Define deployment environments and strategies
    - Explore deployment challenges in large-scale environments | **Lab: Configuring a Simple Jenkins Pipeline**
    - Automate a Dockerized application deployment using Jenkins
    - Create and configure a Jenkins pipeline with webhooks | +| Chapter 5: Webhooks | - Discuss the role and setup of webhooks in CI/CD automation
    - Explore webhook triggers and their applications | | +| Chapter 6: Containerization | - Define containerization and its advantages in cloud computing
    - Explore Kubernetes and microservices architectures
    - Learn about container application consistency | **Lab 1: Containerizing a React Application**
    - Create and run a Docker image of a React application
    - Interact with a running Docker container
    **Lab 2: Accessing Corporate Network and AWS ECR**
    - Establish a VPN and use AWS IAM credentials to authenticate and push Docker images to AWS ECR | diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/review-and-knowledge-check/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/review-and-knowledge-check/index.md deleted file mode 100644 index 6801c83..0000000 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/review-and-knowledge-check/index.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Topic Review and Knowledge Check -layout: custom -parent: Topic 3 - CI/CD Fundamentals -has_toc: false -nav_order: 5 ---- - -# Topic Review and Knowledge Check \ No newline at end of file diff --git a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md index bae1e5f..275c58c 100644 --- a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md +++ b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md @@ -3,10 +3,10 @@ title: Chapter 1 - Intro to Cybersecurity layout: custom parent: Topic 4 - Cybersecurity has_toc: false -nav_order: 2 +nav_order: 1 --- -# Cybersecurity Fundamentals +# Chapter 1 - Cybersecurity Fundamentals In today’s world, software is constantly exposed to threats that can cause: diff --git a/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md b/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md index cc96461..e8431c4 100644 --- a/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md +++ b/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md @@ -6,7 +6,8 @@ has_toc: false nav_order: 2 --- -# Understanding Software Vulnerabilities in the SDLC +# Chapter 2 - Security Risks and Vulnerabilities in the SDLC +## Understanding Software Vulnerabilities in the SDLC To understand how to protect software by integrating security into every step of the SDLC, it is vital to first understand what makes software vulnerable. diff --git a/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md index 318e6ff..0b161ad 100644 --- a/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md +++ b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md @@ -1,13 +1,13 @@ --- -title: Chapter 2 - Security Checks in CI/CD +title: Chapter 3 - Security Checks in CI/CD layout: custom -parent: Topic 4 - DevSecOps Fundamentals +parent: Topic 4 - Cybersecurity has_children: true has_toc: false -nav_order: 2 +nav_order: 3 --- -# Chapter 2 - Security Checks in CD/CD +# Chapter 3 - Security Checks in CD/CD ## The Importance of Security Checks in Each Stage of The Pipeline diff --git a/docs/course/Topic-4-Security/index.md b/docs/course/Topic-4-Security/index.md index 1d6c61e..eb77b59 100644 --- a/docs/course/Topic-4-Security/index.md +++ b/docs/course/Topic-4-Security/index.md @@ -3,7 +3,7 @@ title: Topic 4 - Cybersecurity layout: custom has_children: true has_toc: false -nav_order: 5 +nav_order: 6 --- # Topic 4 - Cybersecurity @@ -12,6 +12,6 @@ nav_order: 5 |---------|---------------------|-----------------| | Chapter 1: Intro to Cybersecurity | - Understand what cybersecurity is
    - Define key terms related to cybersecurity
    Know what the cybersecurity CIA triad is
    | | | Chapter 2: Vulnerabilities and Risk | - Understand common vulnerabilities in the SDLC
    || -| Chapter 3: Security Checks in CI/CD | - Understand important of security checks in each stage of the pipeline
    - Discuss SAST vs DAST and their pros/cons
    - Learn about vulnerability scanning and prominent tools in industry today | **Lab: Securing a vulnerable application
    - Fix security vulnerabilities flagged by security checkpoints within a CI/CD pipeline. | +| Chapter 3: Security Checks in CI/CD | - Understand important of security checks in each stage of the pipeline
    - Discuss SAST vs DAST and their pros/cons
    - Learn about vulnerability scanning and prominent tools in industry today | **Lab: Securing a Vulnerable Application**
    - Fix security vulnerabilities flagged by security checkpoints within a CI/CD pipeline. | diff --git a/docs/course/Topic-5-Cloud/index.md b/docs/course/Topic-5-Cloud/index.md index 30ee2f9..e33fb8b 100644 --- a/docs/course/Topic-5-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/index.md @@ -3,7 +3,7 @@ title: Topic 5 - Cloud layout: custom has_children: true has_toc: false -nav_order: 6 +nav_order: 7 --- # Topic 5 – Cloud in DevSecOps diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/index.md index 3e462d3..a7a8d34 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/index.md @@ -3,12 +3,12 @@ title: Topic 6 - DevSecOps in Industry layout: custom has_children: true has_toc: false -nav_order: 7 +nav_order: 8 --- # Topic 6 - DevSecOps in Industry -| Chapter | Learning Objectives | Lab Description | -|---------|---------------------|-----------------| +| Chapter | Learning Objectives | +|---------|---------------------| | Chapter 1: Use of DevSecOps in Industry | - Describe how DevSecOps is used across key industries.
    - Recognize unique security and compliance needs in each sector.
    - Identify tools and practices that enable secure, fast delivery.
    - Understand how DevSecOps protects data and IP.
    - Recall real-world examples of DevSecOps in action. | | Chapter 2: Common DevSecOps Industry Roles | - Identify key DevSecOps roles and their focus areas.
    - Summarize each role’s responsibilities and impact on security.
    - Recognize essential tools and skills used across roles.
    - Understand the importance of cross-team collaboration.
    - Distinguish between core and supporting DevSecOps roles. | diff --git a/docs/other/index.md b/docs/other/index.md index 94d86af..ff2224b 100644 --- a/docs/other/index.md +++ b/docs/other/index.md @@ -3,5 +3,5 @@ title: Other Documents layout: custom has_children: true has_toc: false -nav_order: 8 +nav_order: 9 --- \ No newline at end of file From 527dc9805d0669ad161aaa0a1fc3cebc7b76169e Mon Sep 17 00:00:00 2001 From: emilychoi Date: Mon, 19 May 2025 23:16:57 -0700 Subject: [PATCH 44/68] update course overview page --- docs/course/index.md | 76 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/docs/course/index.md b/docs/course/index.md index 9af2ebc..d87b7ab 100644 --- a/docs/course/index.md +++ b/docs/course/index.md @@ -17,7 +17,28 @@ nav_order: 1
    - + + + + + + + + + + + + + + + + + + + + + + @@ -34,37 +55,68 @@ nav_order: 1 - - + - + + - + + + + + + + + + - + - + + + + + + - + + + + + - - + + + - - + + + + + + + + + + + + + + +
    Topic Chapter and Title Interactive Lab
    GitIntroduction to
    SDLC and
    DevSecOps
    Chapter 1: Introduction to SDLC
    Chapter 2: Version Control
    Chapter 3: Introduction to DevOps
    Chapter 4: Introduction to CI/CD
    Chapter 5: Introduction to DevSecOps
    Git Chapter 1: Version Control
    DevOpsChapter 1: Intro to DevOpsChapter 5: Advanced Git Techniques
    Chapter 2: Intro to CI/CDDevSecOps
    Fundamentals
    Chapter 1: DevSecOps
    Chapter 3: ContainerizationChapter 2: CI/CD Fundamentals
    Chapter 3: Automated Tests
    Chapter 4: Deployment Yes
    Chapter 4: WebhooksChapter 5: Webhooks
    Chapter 5: Automated TestsChapter 6: ContainerizationYes
    CybersecurityChapter 1: Intro to Cybersecurity
    Chapter 6: DeploymentChapter 2: Security Risks and Vulnerabilities in the SDLC
    Chapter 3: Security Checks in CI/CD Yes
    DevSecOpsChapter 1: DevSecOpsCloudChapter 1: Intro to Cloud
    Chapter 2: Security Checks in CI/CDYesChapter 2: Cloud in DevSecOps
    Chapter 3: Cloud Tools and Platforms
    DevSecOps in
    Industry
    Chapter 1: Use of DevSecOps in Industry
    Chapter 2: Common DevSecOps Industry Roles
    From 25e4f48687e92fec54adbdd53b2a497e3691a85d Mon Sep 17 00:00:00 2001 From: emilychoi Date: Mon, 19 May 2025 23:33:53 -0700 Subject: [PATCH 45/68] update images to working links --- .../chapter-1-SDLC/index.md | 6 ++++-- .../chapter-3-intro-to-devOps/index.md | 2 +- .../chapter-5-intro-to-devsecops/index.md | 2 +- .../chapter-1-devsecops/index.md | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md index f6625f1..bd9db82 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md @@ -12,8 +12,10 @@ nav_order: 1 The **Software Development Life Cycle (SDLC)** is a structured process used by software developers to build high-quality software applications and manage projects efficiently. It divides software development and maintenance into distinct phases, providing a clear roadmap for teams to follow. -![SDLC Phases](https://k21academy.com/wp-content/uploads/2021/08/Six-Stages-of-DevOps-Lifecycle.jpg) -*A circular loop outlining the 6 common phases of the Software Development Cycle* +
    + A circular loop outlining the 6 common phases of the Software Development Cycle +

    Source: K21Academy

    +
    ## SDLC Phases diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md index 32c0965..b377e30 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md @@ -213,7 +213,7 @@ In many companies, Development and Operations teams work independently, leading

    DevOps, short for Development & Operations, is a term that describes a collection of different practices, ideas, and frameworks that streamline the development and collaboration process for a product.

    - DevOps Lifecycle + DevOps Lifecycle

    Source: Orange Matter

    diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md index 7d641f7..d584750 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md @@ -20,7 +20,7 @@ nav_order: 5 Ok, now what? You just have to start integrating this into your coding practices? Actually yes, the whole reason this curriculum is applicable for every person working in IT is because it is best development practice to have a secure lifecycle throughout all of the processes IT goes through when developing a project.
    - DevSecOps + DevSecOps

    Source: Red Hat

    diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md index c7be795..f4e6e95 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md @@ -18,7 +18,7 @@ nav_order: 1 Ok, now what? You just have to start integrating this into your coding practices? Actually yes, the whole reason this curriculum is applicable for every person working in IT is because it is best development practice to have a secure lifecycle throughout all of the processes IT goes through when developing a project.
    - DevSecOps + DevSecOps

    Source: Red Hat

    From e86d24063daf23f85ea2b6958bc5b5e18b18d68f Mon Sep 17 00:00:00 2001 From: emilychoi Date: Mon, 19 May 2025 23:54:07 -0700 Subject: [PATCH 46/68] quiz for topic 2 chapter 5 --- _data/quizzes/topic2/chapter5.yml | 43 +++++++++++++++++++ .../index.md | 7 +++ 2 files changed, 50 insertions(+) create mode 100644 _data/quizzes/topic2/chapter5.yml diff --git a/_data/quizzes/topic2/chapter5.yml b/_data/quizzes/topic2/chapter5.yml new file mode 100644 index 0000000..112b2dd --- /dev/null +++ b/_data/quizzes/topic2/chapter5.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "Which Git command lets you temporarily save your work and switch branches?" + options: + - "git cherry-pick" + - "git save" + - "git stash" + - "git reset" + correct_index: 2 + explanation: "git stash stores your changes temporarily so you can work on something else." + + - prompt: "Which Git hook would you use to run a linter before committing?" + options: + - "pre-commit" + - "post-merge" + - "pre-push" + - "commit-msg" + correct_index: 0 + explanation: "pre-commit runs before a commit is finalized and is commonly used for linting and checks." + + - prompt: "True or False: Forking a repository is the same as cloning it." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Forking creates a copy under your own GitHub account, while cloning makes a local copy of a repo." + + - prompt: "What type of Git tag includes metadata like author and message?" + options: + - Lightweight tag + - Remote tag + - Annotated tag + - Branch tag + correct_index: 2 + explanation: "Annotated tags include metadata and are better suited for release tagging." + + - prompt: "What is the purpose of git bisect?" + options: + - Rewriting commit history + - Running linters before pushing code + - Creating tags for stable releases + - Finding the commit that introduced a bug + correct_index: 3 + explanation: "git bisect helps you find the commit that introduced a bug using binary search." diff --git a/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md b/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md index 839bdba..0aaffb8 100644 --- a/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md +++ b/docs/course/Topic-2-Git/chapter-5-advanced-git-techniques/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 2 - Git has_toc: false nav_order: 5 +topic: topic2 +chapter: chapter5 --- # Chapter 5 - Advanced Git Techniques @@ -175,6 +177,11 @@ Advanced Git knowledge is highly valued in DevSecOps, open-source, and enterpris --- +{% include quiz.html + id="topic2-chapter5" + data=site.data.quizzes.topic2.chapter5 +%} + ### References
    Expand From 667dae41c59502f27d57a1574c9cc155edce0e96 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Tue, 20 May 2025 01:22:31 -0700 Subject: [PATCH 47/68] add more quizzes --- _data/quizzes/topic3/chapter1.yml | 45 +++++++++++++ _data/quizzes/topic3/chapter2.yml | 65 ++++++++++--------- _data/quizzes/topic3/chapter3.yml | 49 ++++++++++++++ _data/quizzes/topic3/chapter5.yml | 43 ++++++++++++ .../chapter-1-devsecops/index.md | 8 +++ .../chapter-2-cicd-core-concepts/index.md | 11 ++++ .../chapter-3-automated-testing/index.md | 10 +++ .../chapter-4-deployment/index.md | 9 +++ .../chapter-5-webhooks/index.md | 6 +- .../chapter-6-containerization/index.md | 8 +++ 10 files changed, 220 insertions(+), 34 deletions(-) create mode 100644 _data/quizzes/topic3/chapter1.yml create mode 100644 _data/quizzes/topic3/chapter3.yml create mode 100644 _data/quizzes/topic3/chapter5.yml diff --git a/_data/quizzes/topic3/chapter1.yml b/_data/quizzes/topic3/chapter1.yml new file mode 100644 index 0000000..ce74730 --- /dev/null +++ b/_data/quizzes/topic3/chapter1.yml @@ -0,0 +1,45 @@ +questions: + - prompt: "Which three fields does DevSecOps bring together?" + options: + - "Design, Security, Testing" + - "Development, Security, Operations" + - "Data, Security, Development" + - "DevOps, QA, Security" + correct_index: 1 + explanation: "DevSecOps combines Development, Security, and Operations into a unified approach." + + - prompt: "What is the main purpose of shift left testing?" + options: + - "Monitor user behavior in production" + - "Fix bugs after release" + - "Improve infrastructure automation" + - "Implement security testing early in development" + correct_index: 3 + explanation: | + Shift left testing is about catching security vulnerabilities early in the development process, allowing developers to identify and fix + vulnerabilities during design and coding phases, rather than discovering them late in testing or production (where fixes are costlier and riskier). + + - prompt: "True or False: Static Application Security Testing (SAST) occurs while the application is running." + options: + - "True" + - "False" + correct_index: 1 + explanation: "SAST happens before the application compiles. DAST happens during runtime." + + - prompt: "Fill in the blank: In the SDLC, a common issue is that security activities are deferred until the ________ phase." + options: + - "planning" + - "deployment" + - "testing" + - "maintenance" + correct_index: 2 + explanation: "Security is often left until the testing phase, which is too late to catch design-related issues. Addressing security earlier in the SDLC helps reduce the risk of vulnerabilities slipping through." + + - prompt: "Which type of security testing simulates real-world attacks while the app is running?" + options: + - Static testing + - Container scanning + - Dynamic testing + - Code linting + correct_index: 2 + explanation: "Dynamic testing checks for vulnerabilities by simulating attacks while the application runs." \ No newline at end of file diff --git a/_data/quizzes/topic3/chapter2.yml b/_data/quizzes/topic3/chapter2.yml index ee2cae2..a2c18db 100644 --- a/_data/quizzes/topic3/chapter2.yml +++ b/_data/quizzes/topic3/chapter2.yml @@ -1,43 +1,44 @@ questions: - - prompt: "What is the main purpose of a webhook in a CI/CD workflow?" + - prompt: "True or False: CI/CD stands for Continuous Improvement and Continuous Development." options: - - "To host your application on a server" - - "To notify an external service that an event has occurred in your repository" - - "To merge code automatically into the main branch" - - "To track version history of your project" + - "True" + - "False" correct_index: 1 - explanation: "A webhook sends a notification to an external service (like a CI/CD tool) when a specified event happens in your repo." + explanation: "CI/CD stands for Continuous Integration and Continuous Delivery. It is a set of DevOps practices that help deliver frequent code changes reliably." - - prompt: "Which content type is commonly used to send data in a webhook request?" + - prompt: "What is the primary difference between Continuous Integration (CI) and Continuous Delivery (CD)?" options: - - "XML" - - "YAML" - - "JSON" - - "HTML" + - "CI focuses on automating deployment; CD focuses on testing code changes." + - "CI is used only by operations teams; CD is used only by developers." + - "CI ensures code changes are automatically tested; CD ensures those changes are automatically deployed." + - "CI happens after CD in the software development lifecycle." correct_index: 2 - explanation: "JSON is the most commonly used format for webhook payloads due to its wide support and readability." + explanation: "Continuous Integration (CI) automates the testing of code changes while Continuous Delivery (CD) automates the deployment of those changes to production environments." - - prompt: "Which of the following is a common event that can trigger a webhook in GitHub?" + - prompt: "Which of the following best describes the relationship between DevOps and CI/CD?" options: - - "Creating a README file" - - "Cloning a repository" - - "Creating a release" - - "Viewing a pull request" - correct_index: 2 - explanation: "Webhooks can be triggered by events like releases, pushes, and pull request changes." - - - prompt: "True or False: Once a webhook is set up, CI/CD tools automatically trigger based on the rules you define, such as pushes or pull requests." + - "CI/CD is a broader methodology that includes DevOps as a component." + - "CI/CD refers to specific automation practices that are part of the broader DevOps methodology." + - "DevOps and CI/CD are completely unrelated practices." + - "DevOps only applies to development teams, while CI/CD is for operations teams." + correct_index: 1 + explanation: | + DevOps is a broad cultural and technical approach focused on collaboration and automation across the software lifecycle. + CI/CD refers to specific practices within DevOps that automate integration, testing, and deployment. + + - prompt: "Which of the following is NOT a method commonly associated with CI?" options: - - "True" - - "False" - correct_index: 0 - explanation: "True. Webhooks notify CI/CD tools automatically based on configured triggers, reducing manual intervention." + - "Automating the build and test process" + - "Supporting 'fail fast' principles with quick feedback" + - "Automating deployment to production" + - "Identifying integration issues early" + correct_index: 2 + explanation: "Automating deployment is a key part of Continuous Delivery (CD), not CI." - - prompt: "After you push code to GitHub, what is the next step in the webhook workflow?" + - prompt: "Fill in the blank: The method that enables organizations to release software updates quickly and reliably while minimizing risks is ________." options: - - "You manually trigger the test suite" - - "GitHub runs the tests itself" - - "The pull request is automatically merged" - - "GitHub sends a webhook to the CI/CD tool" - correct_index: 3 - explanation: "GitHub sends a webhook to notify the CI/CD system, which then takes the appropriate action." \ No newline at end of file + - DevOps + - Continuous Integration (CI) + - Continuous Delivery (CD) + correct_index: 2 + explanation: "Continuous Delivery (CD) automates the deployment process, allowing fast and reliable releases with minimized risks." \ No newline at end of file diff --git a/_data/quizzes/topic3/chapter3.yml b/_data/quizzes/topic3/chapter3.yml new file mode 100644 index 0000000..cfc21b6 --- /dev/null +++ b/_data/quizzes/topic3/chapter3.yml @@ -0,0 +1,49 @@ +questions: + - prompt: "True or False: Automated testing reduces the chances of human error by automating repetitive tasks." + options: + - "True" + - "False" + correct_index: 0 + explanation: "Automated testing increases accuracy by minimizing human error in repetitive testing." + + + - prompt: "Which type of automated test checks individual functions or components?" + options: + - "Unit tests" + - "Integration tests" + - "End-to-End tests" + - "Manual tests" + correct_index: 0 + explanation: "Unit tests focus on testing single components or functions in isolation." + + - prompt: "What is a common challenge of automated testing?" + options: + - "It eliminates the need for developers." + - "It requires significant initial setup and ongoing maintenance." + - "It makes manual testing obsolete overnight." + - "It requires no maintenance once setup." + correct_index: 1 + explanation: "Automated testing requires resources to set up and maintain tests as the system evolves." + + - prompt: "Which of the following is NOT a step in building a robust automated testing framework?" + options: + - Define clear objectives + - Hire more manual testers + - Choose the right tools + - Integrate into CI/CD + correct_index: 1 + explanation: "Building an automated framework focuses on objectives, tools, integration, and monitoring, not on hiring + more manual testers." + + + - prompt: "Fill in the blank: One key benefit of automated testing is faster ______, providing immediate insights on code changes." + options: + - feedback + - deployment + - documentation + - debugging + correct_index: 0 + explanation: "Automated tests provide quick feedback, accelerating development cycles." + + + diff --git a/_data/quizzes/topic3/chapter5.yml b/_data/quizzes/topic3/chapter5.yml new file mode 100644 index 0000000..ee2cae2 --- /dev/null +++ b/_data/quizzes/topic3/chapter5.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the main purpose of a webhook in a CI/CD workflow?" + options: + - "To host your application on a server" + - "To notify an external service that an event has occurred in your repository" + - "To merge code automatically into the main branch" + - "To track version history of your project" + correct_index: 1 + explanation: "A webhook sends a notification to an external service (like a CI/CD tool) when a specified event happens in your repo." + + - prompt: "Which content type is commonly used to send data in a webhook request?" + options: + - "XML" + - "YAML" + - "JSON" + - "HTML" + correct_index: 2 + explanation: "JSON is the most commonly used format for webhook payloads due to its wide support and readability." + + - prompt: "Which of the following is a common event that can trigger a webhook in GitHub?" + options: + - "Creating a README file" + - "Cloning a repository" + - "Creating a release" + - "Viewing a pull request" + correct_index: 2 + explanation: "Webhooks can be triggered by events like releases, pushes, and pull request changes." + + - prompt: "True or False: Once a webhook is set up, CI/CD tools automatically trigger based on the rules you define, such as pushes or pull requests." + options: + - "True" + - "False" + correct_index: 0 + explanation: "True. Webhooks notify CI/CD tools automatically based on configured triggers, reducing manual intervention." + + - prompt: "After you push code to GitHub, what is the next step in the webhook workflow?" + options: + - "You manually trigger the test suite" + - "GitHub runs the tests itself" + - "The pull request is automatically merged" + - "GitHub sends a webhook to the CI/CD tool" + correct_index: 3 + explanation: "GitHub sends a webhook to notify the CI/CD system, which then takes the appropriate action." \ No newline at end of file diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md index f4e6e95..c3b2a8e 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-1-devsecops/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 3 - DevSecOps Fundamentals has_toc: false nav_order: 1 +topic: topic3 +chapter: chapter1 --- # Chapter 1 - DevSecOps @@ -87,8 +89,14 @@ To **shift right** is to monitor user behavior, usage, performance, and security

    +--- +{% include quiz.html + id="topic3-chapter1" + data=site.data.quizzes.topic3.chapter1 +%} +--- ### References diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md index d33d089..7d5b3b8 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-2-cicd-core-concepts/index.md @@ -5,6 +5,8 @@ parent: Topic 3 - DevSecOps Fundamentals has_children: false has_toc: false nav_order: 2 +topic: topic3 +chapter: chapter2 --- # Chapter 2 - CI/CD Fundamentals @@ -112,6 +114,15 @@ nav_order: 2 +--- + +{% include quiz.html + id="topic3-chapter2" + data=site.data.quizzes.topic3.chapter2 +%} + +--- + ### References
    Expand diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md index c1f46f5..6e8e5bf 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-3-automated-testing/index.md @@ -5,6 +5,8 @@ parent: Topic 3 - DevSecOps Fundamentals has_children: false has_toc: false nav_order: 3 +topic: topic3 +chapter: chapter3 --- # Chapter 3 - Automated Testing in CI/CD @@ -87,6 +89,14 @@ Creating a robust automated testing framework involves several critical steps: Automated testing is a cornerstone of modern software development. By integrating effective automated tests into the CI/CD pipeline, teams can ensure that their software is not only functional but also meets quality standards before it reaches the end-user. Embracing these practices not only enhances product reliability but also empowers teams to innovate rapidly with confidence. +--- + +{% include quiz.html + id="topic3-chapter3" + data=site.data.quizzes.topic3.chapter3 +%} + +--- ### References
    diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md index 9f6a3c1..b7bb47a 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-4-deployment/index.md @@ -5,6 +5,8 @@ parent: Topic 3 - DevSecOps Fundamentals has_toc: false has_children: true nav_order: 4 +topic: topic3 +chapter: chapter4 --- # Chapter 4 - Introduction to Deployment @@ -104,7 +106,14 @@ Deployment strategies are crucial for managing the transition of code from devel **Use Case**: Suitable for cloud-native applications where infrastructure can be easily replicated and managed as code. +--- + +{% include quiz.html + id="topic3-chapter4" + data=site.data.quizzes.topic3.chapter4 +%} +--- diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md index f25e397..df915f6 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-5-webhooks/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 3 - DevSecOps Fundamentals has_toc: false nav_order: 5 +topic: topic3 +chapter: chapter5 --- # Chapter 5 - Utilizing Web Hooks for Continuous Integration @@ -30,8 +32,8 @@ Then, once you want to make a change, the following happens: --- {% include quiz.html - id="topic3-chapter2" - data=site.data.quizzes.topic3.chapter2 + id="topic3-chapter5" + data=site.data.quizzes.topic3.chapter5 %} ### References diff --git a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md index 9d3c2a9..2619152 100644 --- a/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md +++ b/docs/course/Topic-3-DevSecOp-Fundamentals/chapter-6-containerization/index.md @@ -5,6 +5,8 @@ parent: Topic 3 - DevSecOps Fundamentals has_children: true has_toc: false nav_order: 6 +topic: topic3 +chapter: chapter6 --- # Chapter 6 - Definition of Containerization @@ -75,7 +77,13 @@ So, while an "artifact" is a product of the software development process, "Artif {: .lab} [Lab 2 - Accessing Corporate Network and AWS ECR](./lab/containerization-lab-2.html){: .btn .btn-purple .btn-fill } +--- +{% include quiz.html + id="topic3-chapter6" + data=site.data.quizzes.topic3.chapter6 +%} +--- From 8977ddc5358d4d7b68c1758f21654a1552d2010a Mon Sep 17 00:00:00 2001 From: emilychoi Date: Tue, 20 May 2025 02:11:05 -0700 Subject: [PATCH 48/68] finish topic 3 quizzes, prep other topics for quizzes --- _data/quizzes/topic3/chapter4.yml | 43 ++++++++++++++++++ _data/quizzes/topic3/chapter6.yml | 45 +++++++++++++++++++ .../chapter-1-intro-to-cybersecurity/index.md | 13 +++++- .../index.md | 9 ++++ .../index.md | 11 +++++ .../chapter-2-cloud-in-devsecops/index.md | 9 ++++ .../index.md | 9 ++++ .../index.md | 11 +++++ .../chapter-2-industry-roles/index.md | 11 +++++ 9 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 _data/quizzes/topic3/chapter4.yml create mode 100644 _data/quizzes/topic3/chapter6.yml diff --git a/_data/quizzes/topic3/chapter4.yml b/_data/quizzes/topic3/chapter4.yml new file mode 100644 index 0000000..ce360b2 --- /dev/null +++ b/_data/quizzes/topic3/chapter4.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "Fill in the blank: The ______ environment is the live environment used by end users." + options: + - "Production" + - "Staging" + - "Development" + - "Testing" + correct_index: 0 + explanation: "Production is the live environment with real user data and traffic." + + - prompt: "What deployment strategy involves switching traffic between two identical environments to achieve zero downtime?" + options: + - "Canary Deployment" + - "Blue-Green Deployment" + - "Rolling Deployment" + - "Feature Toggles" + correct_index: 1 + explanation: "Blue-Green deployment alternates between two identical environments for easy rollback and minimal downtime." + + - prompt: "True or False: Canary Deployment releases new changes gradually to a small subset of users to gather real user feedback." + options: + - "True" + - "False" + correct_index: 0 + explanation: "Canary Deployment minimizes risk by rolling out changes to a limited audience first." + + - prompt: "Which deployment strategy updates application instances in phases without taking down the entire application?" + options: + - "Immutable Deployment" + - "Blue-Green Deployment" + - "A/B Testing Deployment" + - "Rolling Deployment" + correct_index: 3 + explanation: "Rolling deployment updates in phases, maintaining high availability." + + - prompt: "Fill in the blank: A/B Testing Deployment compares two versions based on ______ to optimize user experience." + options: + - "code quality" + - "deployment speed" + - "specific metrics" + - "database schema" + correct_index: 2 + explanation: "A/B Testing uses traffic segmentation and metrics to validate hypotheses about user behavior." \ No newline at end of file diff --git a/_data/quizzes/topic3/chapter6.yml b/_data/quizzes/topic3/chapter6.yml new file mode 100644 index 0000000..a5f4876 --- /dev/null +++ b/_data/quizzes/topic3/chapter6.yml @@ -0,0 +1,45 @@ +questions: + - prompt: "What is a container in cloud computing?" + options: + - A virtual machine with its own operating system + - A standardized unit of software packaging code and dependencies to run reliably across environments + - A cloud storage bucket for applications + - A physical server hosting multiple applications + correct_index: 1 + explanation: "Containers package code and all dependencies without the overhead of a full OS, unlike virtual machines." + + - prompt: "Which of the following is NOT a benefit of containerization?" + options: + - Portability across environments + - Isolation of applications + - Requires full OS boot per container + - Scalability within a shared OS + correct_index: 2 + explanation: "Containers do not require booting a full OS for each instance, which makes them lightweight." + + - prompt: "An artifact in containerization typically refers to a ______." + options: + - Container image + - Virtual machine + - Source code repository + - Running container + correct_index: 0 + explanation: "An artifact is the container image, a read-only snapshot used to create containers." + + - prompt: "Which use case is NOT typically associated with containerization?" + options: + - Cloud migration of legacy apps + - Manual updating of IoT devices without containers + - Microservices architecture deployment + - Dynamic scaling of applications + correct_index: 1 + explanation: "Manual updates without containers are complex; containerization simplifies deployment and updates." + + - prompt: "Which of the following best describes fault tolerance in containerization?" + options: + - Fault tolerance is not possible in containers + - One faulty container does not affect others running on the same host + - Containers share faults between them + - All containers stop when one container fails + correct_index: 1 + explanation: "Containers are isolated, so faults in one do not impact others, improving application resilience." \ No newline at end of file diff --git a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md index 275c58c..72fa33b 100644 --- a/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md +++ b/docs/course/Topic-4-Security/chapter-1-intro-to-cybersecurity/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 4 - Cybersecurity has_toc: false nav_order: 1 +topic: topic4 +chapter: chapter1 --- # Chapter 1 - Cybersecurity Fundamentals @@ -57,4 +59,13 @@ A company with poor security practices is at **greater risk** of: These actions can result in **unauthorized access**, data breaches, or serious damage to systems and business operations. -Protect your systems by understanding and addressing these cybersecurity fundamentals. \ No newline at end of file +Protect your systems by understanding and addressing these cybersecurity fundamentals. + +--- + +{% include quiz.html + id="topic4-chapter1" + data=site.data.quizzes.topic4.chapter1 +%} + +--- \ No newline at end of file diff --git a/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md b/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md index e8431c4..5e7df26 100644 --- a/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md +++ b/docs/course/Topic-4-Security/chapter-2-security-risks-and-vulnerabilities/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 4 - Cybersecurity has_toc: false nav_order: 2 +topic: topic4 +chapter: chapter2 --- # Chapter 2 - Security Risks and Vulnerabilities in the SDLC @@ -28,6 +30,13 @@ To understand how to protect software by integrating security into every step of --- +{% include quiz.html + id="topic4-chapter2" + data=site.data.quizzes.topic4.chapter2 +%} + +--- + ## Resources for Further Information - **OWASP Top Ten**: List of the ten most critical security risks to a web application diff --git a/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md index 0b161ad..57ace77 100644 --- a/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md +++ b/docs/course/Topic-4-Security/chapter-3-security-checks-in-CICD/index.md @@ -5,6 +5,8 @@ parent: Topic 4 - Cybersecurity has_children: true has_toc: false nav_order: 3 +topic: topic4 +chapter: chapter3 --- # Chapter 3 - Security Checks in CD/CD @@ -137,6 +139,15 @@ Vulnerability scanning in a CI/CD pipeline refers to the automated process of id There are countless variations of vulnerability scanners out there and are constantly being innovated. Every software team should take throrough time to research and test as many tools as possible within their budget and timeline to ensure their pipeline is fully covered. +--- + +{% include quiz.html + id="topic4-chapter3" + data=site.data.quizzes.topic4.chapter3 +%} + +--- + ### References diff --git a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md index 8b5220b..d502e17 100644 --- a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md +++ b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 5 - Cloud has_toc: false nav_order: 2 +topic: topic5 +chapter: chapter2 --- # Cloud-Native DevSecOps @@ -106,6 +108,13 @@ Mastering cloud-native DevSecOps practices ensures that security is not a bottle --- +{% include quiz.html + id="topic5-chapter2" + data=site.data.quizzes.topic5.chapter2 +%} + +--- + ## Resources - [NIST SP 800-210](https://csrc.nist.gov/pubs/sp/800/210/final) diff --git a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md index e870ebb..fa62bde 100644 --- a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md +++ b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 5 - Cloud has_toc: false nav_order: 3 +topic: topic5 +chapter: chapter3 --- # DevSecOps Cloud Tools and Platforms @@ -142,6 +144,13 @@ DevSecOps in the cloud is powered by a rich ecosystem of specialized tools. From --- +{% include quiz.html + id="topic5-chapter3" + data=site.data.quizzes.topic5.chapter3 +%} + +--- + ## References - [GitHub Actions Documentation](https://docs.github.com/en/actions) diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md index 4dbf2e0..1f11467 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 6 - DevSecOps in Industry has_toc: false nav_order: 1 +topic: topic6 +chapter: chapter1 --- # Chapter 6 - DevSecOps Use Cases Across Industries @@ -125,3 +127,12 @@ These real-world use cases highlight how critical DevSecOps is for: - Reducing incident recovery times As you continue to learn DevSecOps, always think in terms of **automation**, **integration**, and **visibility**. And remember: security isn't a gate at the end—it's a thread that runs through every step. + +--- + +{% include quiz.html + id="topic6-chapter1" + data=site.data.quizzes.topic6.chapter1 +%} + +--- \ No newline at end of file diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md index a65876d..99b9b19 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md @@ -4,6 +4,8 @@ layout: custom parent: Topic 6 - DevSecOps in Industry has_toc: false nav_order: 2 +topic: topic6 +chapter: chapter2 --- # 🔐 Common DevSecOps Roles in the Industry @@ -136,3 +138,12 @@ In larger organizations, additional roles often support DevSecOps efforts: | Compliance Analyst | Helps teams meet regulatory standards | | Penetration Tester | Simulates attacks and recommends security improvements | | Security Champion | Promotes secure coding within development teams | + +--- + +{% include quiz.html + id="topic6-chapter2" + data=site.data.quizzes.topic6.chapter2 +%} + +--- \ No newline at end of file From ff0a8a3847c0da7d121d166644967b4d4353cab6 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Tue, 20 May 2025 02:52:03 -0700 Subject: [PATCH 49/68] add modal popup showing quiz score --- _includes/quiz.html | 8 ++++++++ _sass/custom/quiz.scss | 36 ++++++++++++++++++++++++++++++++++++ assets/js/quiz.js | 35 ++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/_includes/quiz.html b/_includes/quiz.html index 552cccf..2364d45 100644 --- a/_includes/quiz.html +++ b/_includes/quiz.html @@ -1,6 +1,14 @@

    🧠 Knowledge Check

    Answer the questions below to test your knowledge!

    + + +
    {% for q in include.data.questions %}
    diff --git a/_sass/custom/quiz.scss b/_sass/custom/quiz.scss index f4b911f..c3ad1eb 100644 --- a/_sass/custom/quiz.scss +++ b/_sass/custom/quiz.scss @@ -65,4 +65,40 @@ opacity: 0.7; } } +} + +.modal { + position: fixed; + z-index: 1000; + left: 0; + top: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + justify-content: center; + align-items: center; +} + +.modal-content { + background: white; + padding: 20px 30px; + border-radius: 8px; + width: 300px; + max-width: 90%; + text-align: center; + position: relative; +} + +.close { + position: absolute; + right: 10px; + top: 5px; + font-size: 24px; + cursor: pointer; + color: #555; +} + +.close:hover { + color: black; } \ No newline at end of file diff --git a/assets/js/quiz.js b/assets/js/quiz.js index 386780a..6d56173 100644 --- a/assets/js/quiz.js +++ b/assets/js/quiz.js @@ -6,6 +6,7 @@ function submitQuiz(quizId) { const questions = form.querySelectorAll('.quiz-question'); let allCorrect = true; let allAnswered = true; + let score = 0; questions.forEach((questionDiv, index) => { const selected = questionDiv.querySelector('input[type="radio"]:checked'); @@ -24,6 +25,7 @@ function submitQuiz(quizId) { } else if (parseInt(selected.value) === correctIndex) { feedback.innerHTML = `

    Correct! ✅

    ${explanation}`; feedback.classList.add("correct"); + score++; } else { feedback.innerHTML = `

    Incorrect ❌

    ${explanation}`; feedback.classList.add("incorrect"); @@ -40,6 +42,10 @@ function submitQuiz(quizId) { if (allAnswered && allCorrect) { triggerConfetti(); } + + if (allAnswered) { + showScoreModal(score); + } } function triggerConfetti () { @@ -79,5 +85,32 @@ function triggerConfetti () { spread: 120, startVelocity: 45, }); - }, 650); + }, 700); +} + + +function showScoreModal(score) { + const modal = document.getElementById('scoreModal'); + const message = document.getElementById('scoreMessage'); + + if (score === 5) { + message.innerHTML = `

    🎉

    Perfect score! 💯
    You got 5/5 questions right!`; + } else if (score === 4) { + message.innerHTML = `

    🤓

    You scored ${score}/5. Almost there!`; + } else { + message.innerHTML = `

    📚

    You scored ${score}/5. Keep practicing!`; + } + + modal.style.display = 'flex'; } + +document.getElementById('closeScoreModal').addEventListener('click', () => { + document.getElementById('scoreModal').style.display = 'none'; +}); + +window.addEventListener('click', (event) => { + const modal = document.getElementById('scoreModal'); + if (event.target === modal) { + modal.style.display = 'none'; + } +}); \ No newline at end of file From 01e9e896057029a9271bd105d368ec1879b754ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cmiraxnairgit=20config=20--global=20user=2Eemail?= =?UTF-8?q?=20=E2=80=9Cmiranair004=40gmail=2Ecom?= <“miranair004@gmail.com> Date: Wed, 21 May 2025 18:35:53 -0700 Subject: [PATCH 50/68] updated arch to remove duplicate vc --- .../index.md | 4 +- .../chapter-2-version-control/index.md | 38 ------------------- .../index.md | 4 +- .../index.md | 4 +- .../index.md | 5 +-- 5 files changed, 8 insertions(+), 47 deletions(-) rename docs/course/Topic-1-Software-Dev-and-DevSecOps/{chapter-3-intro-to-devOps => chapter-2-intro-to-devOps}/index.md (99%) delete mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md rename docs/course/Topic-1-Software-Dev-and-DevSecOps/{chapter-4-intro-to-cicd => chapter-3-intro-to-cicd}/index.md (99%) rename docs/course/Topic-1-Software-Dev-and-DevSecOps/{chapter-5-intro-to-devsecops => chapter-4-intro-to-devsecops}/index.md (99%) diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-intro-to-devOps/index.md similarity index 99% rename from docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md rename to docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-intro-to-devOps/index.md index b377e30..cd9c8df 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-devOps/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-intro-to-devOps/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 3 - Intro to DevOps +title: Chapter 2 - Intro to DevOps layout: custom parent: Topic 1 - Introduction to SDLC and DevSecOps has_children: false has_toc: false -nav_order: 3 +nav_order: 2 --- # Introduction to DevOps ## Problem Space diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md deleted file mode 100644 index 0f72ec8..0000000 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-version-control/index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Chapter 2 - Version Control -layout: custom -parent: Topic 1 - Introduction to SDLC and DevSecOps -has_children: false -has_toc: false -nav_order: 2 ---- - -# Chapter 1 - Introduction to Version Control -## What is version control? -Version control is **a system that records changes to a file or set of files over time** so that you can recall specific versions later. It's a critical tool in modern software development, allowing developers to work collaboratively, track every modification, and revert to previous states if necessary. - -> **Example Scenario** -> -> Armine and Tigran are part of a software development team tasked with creating a new mobile application. Armine is tasked with refining the user authentication system, while Tigran is implementing an innovative feature that allows users to share media within the app. -> -> **Without Version Control**: If Armine and Tigran are editing the same file, Tigran's latest upload could accidentally overwrite the changes Armine made, resulting in a loss of progress and potential conflicts in the code. -> -> **With Version Control**: Armine and Tigran can work on their updates concurrently without the risk of interfering with each other's contributions. Here's how it unfolds: -> -> - Independently, they make their changes and commit their updates to the version control system, each creating a new version in the repository. -> -> - The version control system alerts them to the presence of new, separate updates, signaling that a merge of changes is necessary. -> -> - Together, they examine the differences, carefully integrate their respective code changes, and commit the unified version to the repository. -> -> - Should an issue arise with the authentication update, Armine can revert her portion of the code to a previous state without disrupting Tigran's feature, thanks to the version history maintained by the system. - -A common tool for version control is GitHub. GitHub allows you acts as a central hub for all of the different versions of your code, kind of how in google docs you can see the history of your changes. Though there are many different systems for version control, we will be learning using GitHubs features. The syntax and user interface of different products are different, but the core elements are the same. - -### References -
    - Expand - 1. Atlassian. “What Is Version Control: Atlassian Git Tutorial.” Atlassian, www.atlassian.com/git/tutorials/what-is-version-control. Accessed 15 Apr. 2024.
    - 2. “1.1 Getting Started - about Version Control.” Git, git-scm.com/book/en/v2/Getting-Started-About-Version-Control. Accessed 15 Apr. 2024.
    - 3. “What Is Version Control?” GitLab, GitLab, 4 Apr. 2023, about.gitlab.com/topics/version-control/.
    -
    \ No newline at end of file diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md similarity index 99% rename from docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md rename to docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md index 8dd0a2d..6d8c16f 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-cicd/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 4 - Intro to CI/CD +title: Chapter 3 - Intro to CI/CD layout: custom parent: Topic 1 - Introduction to SDLC and DevSecOps has_children: false has_toc: false -nav_order: 4 +nav_order: 3 --- # Introduction to CI/CD diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md similarity index 99% rename from docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md rename to docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md index d584750..bb3da1b 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-5-intro-to-devsecops/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md @@ -1,10 +1,10 @@ --- -title: Chapter 5 - Introduction to DevSecOps +title: Chapter 4 - Introduction to DevSecOps layout: custom parent: Topic 1 - Introduction to SDLC and DevSecOps has_children: false has_toc: false -nav_order: 5 +nav_order: 4 --- diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md index 40fe464..fee241b 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md @@ -12,7 +12,6 @@ nav_order: 3 | Chapter | Learning Objectives | |---------|---------------------| | Chapter 1: Introduction to SDLC | - Define Software Development Lifecycle
    - Understand the basics of SDLC methodologies
    - Explore the benefits of using different methodologies
    | -| Chapter 2: Intro to Version Control | - Define version control
    - Understand the basics of version control systems
    - Explore the benefits of using version control
    - Introduction to common version control tools| -| Chapter 3: Introduction to DevOps | - Define DevOps
    | -| Chapter 4: Introduction to CI/CD | - Establish effective documentation habits
    - Discuss the importance of READMEs and wikis
    - Explore best practices for inline code commenting | +| Chapter 2: Introduction to DevOps | - Define DevOps
    | +| Chapter 3: Introduction to CI/CD | - Establish effective documentation habits
    - Discuss the importance of READMEs and wikis
    - Explore best practices for inline code commenting | | Chapter 4: Securing SDLC with DevSecOps | - Define DevSecOps
    | \ No newline at end of file From 3b24b6934359f3c60e4bc3d0eb8eab69b12e821c Mon Sep 17 00:00:00 2001 From: emilychoi Date: Wed, 21 May 2025 22:22:44 -0700 Subject: [PATCH 51/68] add quizzes for topic 4, 5, 6 --- _data/quizzes/topic4/chapter1.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic4/chapter2.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic4/chapter3.yml | 44 +++++++++++++++++++++++++++++++ _data/quizzes/topic5/chapter2.yml | 41 ++++++++++++++++++++++++++++ _data/quizzes/topic5/chapter3.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic6/chapter1.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic6/chapter2.yml | 43 ++++++++++++++++++++++++++++++ 7 files changed, 300 insertions(+) create mode 100644 _data/quizzes/topic4/chapter1.yml create mode 100644 _data/quizzes/topic4/chapter2.yml create mode 100644 _data/quizzes/topic4/chapter3.yml create mode 100644 _data/quizzes/topic5/chapter2.yml create mode 100644 _data/quizzes/topic5/chapter3.yml create mode 100644 _data/quizzes/topic6/chapter1.yml create mode 100644 _data/quizzes/topic6/chapter2.yml diff --git a/_data/quizzes/topic4/chapter1.yml b/_data/quizzes/topic4/chapter1.yml new file mode 100644 index 0000000..cae382c --- /dev/null +++ b/_data/quizzes/topic4/chapter1.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What does the CIA Triad represent in cybersecurity?" + options: + - "Compliance, Identity, Access" + - "Confidentiality, Integrity, Availability" + - "Cybersecurity, Infrastructure, Authentication" + - "Confidentiality, Information, Authentication" + correct_index: 1 + explanation: "The CIA Triad stands for Confidentiality, Integrity, and Availability, all key principles in cybersecurity." + + - prompt: "What is a vulnerability in the context of cybersecurity?" + options: + - "A malicious code used in an attack" + - "A person attempting to hack a system" + - "A flaw or weakness in a system that can be exploited" + - "The risk of unauthorized access to data" + correct_index: 2 + explanation: "A vulnerability is a flaw or weakness in software, hardware, or systems that can be exploited." + + - prompt: "True or False: A 'risk' is determined by the probability and severity of a cybersecurity incident." + options: + - "True" + - "False" + correct_index: 0 + explanation: "Risk = Probability of Occurrence x Severity. It's a measure of potential impact." + + - prompt: "Which of the following is an example of an exploit being used?" + options: + - "A patch being applied to software" + - "A hacker finds a password in a config file and uses it to access a server" + - "A backup system running hourly" + - "Antivirus software updating signatures" + correct_index: 1 + explanation: "Using a found password to gain unauthorized access is an example of exploiting a vulnerability." + + - prompt: "Fill in the blank: The ________ is the malicious code or action used in a cyberattack." + options: + - "Payload" + - "Threat actor" + - "Vulnerability" + - "Exploit" + correct_index: 0 + explanation: "The payload is the part of the attack that causes harm, like malicious code." \ No newline at end of file diff --git a/_data/quizzes/topic4/chapter2.yml b/_data/quizzes/topic4/chapter2.yml new file mode 100644 index 0000000..7fc474a --- /dev/null +++ b/_data/quizzes/topic4/chapter2.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the main risk when users can access data or systems they shouldn’t be allowed to?" + options: + - "Improper Access Control" + - "Misconfiguration" + - "Cross-Site Scripting (XSS)" + - "Cryptographic Risks" + correct_index: 0 + explanation: "Improper Access Control occurs when users can access unauthorized systems or data." + + - prompt: "Which mitigation strategy is most effective against injection attacks?" + options: + - "Role Based Access Controls" + - "Require MFA" + - "Encrypt database backups" + - "Sanitize user input" + correct_index: 3 + explanation: "Sanitizing user input helps prevent injection attacks by ensuring that only valid data is processed." + + - prompt: "What kind of attack involves injecting malicious SQL queries into a system?" + options: + - "Cross-Site Scripting (XSS)" + - "SQL Injection" + - "Improper Authentication" + - "Logging Failure" + correct_index: 1 + explanation: "SQL Injection involves inserting malicious SQL queries to manipulate or access a database." + + - prompt: "True or False: Output encoding helps prevent SQL injections by restricting unauthorized queries." + options: + - "True" + - "False" + correct_index: 1 + explanation: "False. Output encoding helps prevent XSS attacks. SQL Injection should be mitigated using parameterized queries." + + - prompt: "Fill in the blank: __________ is a technique to limit what actions users can perform based on their role in an organization." + options: + - "Access logs" + - "Parameterized queries" + - "Role Based Access Control" + - "Prepared statements" + correct_index: 2 + explanation: "Role Based Access Control ensures that users only access information and systems needed for their role." diff --git a/_data/quizzes/topic4/chapter3.yml b/_data/quizzes/topic4/chapter3.yml new file mode 100644 index 0000000..f587a77 --- /dev/null +++ b/_data/quizzes/topic4/chapter3.yml @@ -0,0 +1,44 @@ +questions: + - prompt: "What is the main purpose of integrating security checks in each stage of the CI/CD pipeline?" + options: + - "To slow down development" + - "To ensure only DevOps engineers manage security" + - "To automate deployments without review" + - "To embed security early and ensure vulnerabilities are caught throughout development" + correct_index: 3 + explanation: "The key goal is to proactively embed security checks early in the development process and throughout the lifecycle." + + - prompt: "Fill in the blank: The _________ phase includes threat modeling to identify potential vulnerabilities before coding begins." + options: + - "Testing" + - "Planning" + - "Release" + - "Build" + correct_index: 1 + explanation: "The Planning phase includes threat modeling to predict and mitigate future security risks." + + - prompt: "Which of the following best describes DAST?" + options: + - "Analyzes code before it is compiled" + - "Checks application behavior while running" + - "Ensures business logic is documented" + - "Analyzes test scripts in the CI environment" + correct_index: 1 + explanation: "DAST tests the running application to identify vulnerabilities during runtime." + + - prompt: "True or False: The CI/CD pipeline should only have security checks during the testing stage." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Security checks should be embedded into every stage of the pipeline, not just testing." + + - prompt: "Which of the following is NOT a benefit of combining SAST and DAST?" + options: + - "Improves detection coverage of security vulnerabilities" + - "Provides both code-level and runtime insights" + - "Replaces the need for security experts" + - "Strengthens application security across the SDLC" + correct_index: 2 + explanation: "While SAST and DAST improve coverage, they do not eliminate the need for security professionals." + \ No newline at end of file diff --git a/_data/quizzes/topic5/chapter2.yml b/_data/quizzes/topic5/chapter2.yml new file mode 100644 index 0000000..89de789 --- /dev/null +++ b/_data/quizzes/topic5/chapter2.yml @@ -0,0 +1,41 @@ +questions: + - prompt: "True or False: Cloud-native DevSecOps emphasizes integrating security after the application has been deployed." + options: + - "True" + - "False" + correct_index: 1 + explanation: False. Cloud-native DevSecOps integrates security throughout the development process, not afterward. + + - prompt: "Which of the following is not a benefit of cloud-native DevSecOps?" + options: + - "Faster feedback loops" + - "Manual server patching" + - "Automated security checks" + - "Easier compliance management" + correct_index: 1 + explanation: "Cloud-native DevSecOps discourages manual server patching in favor of immutable infrastructure." + + - prompt: "Fill in the blank: ________ allows infrastructure to be defined and managed using code." + options: + - "Immutable Infrastructure" + - "Continuous Deployment (CD)" + - "Infrastructure as Code (IaC)" + - "Serverless Architecture" + correct_index: 2 + explanation: "IaC refers to defining infrastructure setup and management using code." + + - prompt: "True or False: Microservices and serverless architectures reduce the number of endpoints, making applications easier to secure." + options: + - "True" + - "False" + correct_index: 1 + explanation: "These architectures increase the number of endpoints, making API security more important." + + - prompt: "What does the Shared Responsibility Model emphasize in cloud security?" + options: + - "Users are responsible for everything" + - "Cloud providers handle all security" + - "Only compliance officers manage security" + - "Responsibilities are split between cloud users and providers" + correct_index: 3 + explanation: Security is a shared responsibility between the cloud provider and the customer. \ No newline at end of file diff --git a/_data/quizzes/topic5/chapter3.yml b/_data/quizzes/topic5/chapter3.yml new file mode 100644 index 0000000..67f49c7 --- /dev/null +++ b/_data/quizzes/topic5/chapter3.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "Why are tools essential for DevSecOps in the cloud?" + options: + - "They eliminate the need for developers" + - "They simplify only post-deployment monitoring" + - "They enable scalable, automated security across the SDLC" + - "They are required only for compliance audits" + correct_index: 2 + explanation: "Tools automate testing, policy enforcement, and monitoring, making DevSecOps scalable and effective." + + - prompt: "Which tool would you use for managing secrets in a multi-cloud environment?" + options: + - "Trivy" + - "OWASP ZAP" + - "GitHub Actions" + - "HashiCorp Vault" + correct_index: 3 + explanation: "HashiCorp Vault is designed for secure secrets management across multi-cloud setups." + + - prompt: "True or False: Hardcoding secrets in your source code is a recommended best practice." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Hardcoding secrets is a major security risk. Secrets should be injected securely at runtime." + + - prompt: "What is the purpose of tools like OPA or Gatekeeper?" + options: + - "Secrets management" + - "Code compilation" + - "Policy enforcement in Kubernetes" + - "Logging configuration" + correct_index: 2 + explanation: "OPA and Gatekeeper are used to define and enforce security policies in Kubernetes environments." + + - prompt: "Which of the following tools provides runtime threat detection for containers?" + options: + - "Falco" + - "SonarQube" + - "Kube-bench" + - "Dependabot" + correct_index: 0 + explanation: "Falco provides runtime threat detection specifically for containers." \ No newline at end of file diff --git a/_data/quizzes/topic6/chapter1.yml b/_data/quizzes/topic6/chapter1.yml new file mode 100644 index 0000000..75ed5a7 --- /dev/null +++ b/_data/quizzes/topic6/chapter1.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is one major DevSecOps benefit for financial institutions?" + options: + - "Slower software releases for compliance checks" + - "Manual auditing of infrastructure" + - "Avoiding use of cloud environments" + - "Automated compliance reporting and early misconfiguration detection" + correct_index: 3 + explanation: "DevSecOps enables automated compliance reporting and early detection of misconfigured services in finance." + + - prompt: "How does DevSecOps benefit Tech & SaaS companies like GitHub and Netflix?" + options: + - "It reduces their need to monitor deployments" + - "It automates inline security scans during pull requests" + - "It allows skipping code reviews" + - "It replaces CI/CD pipelines with manual deployment" + correct_index: 1 + explanation: "DevSecOps allows automated security scanning on pull requests, supporting fast and secure deployments." + + - prompt: "True or False: DevSecOps helps healthtech apps encrypt data and monitor access patterns." + options: + - "True" + - "False" + correct_index: 0 + explanation: "True. DevSecOps practices in healthcare include automatic encryption and anomaly detection to secure patient data." + + - prompt: "What challenge does DevSecOps address in the retail industry?" + options: + - "Overstaffing during peak seasons" + - "Manual software patching" + - "Preventing data breaches during high-traffic events" + - "Avoiding cloud usage" + correct_index: 2 + explanation: "Retailers use DevSecOps to proactively scan for risks and prevent breaches, especially during peak traffic." + + - prompt: "What is a major DevSecOps benefit in pharmaceutical and R&D industries?" + options: + - "Securing data pipelines and enforcing role-based secrets management" + - "Rapid drug manufacturing" + - "Bypassing compliance to speed up innovation" + - "Avoiding use of encrypted storage" + correct_index: 0 + explanation: "DevSecOps helps secure sensitive IP and research data through secrets management and encryption." \ No newline at end of file diff --git a/_data/quizzes/topic6/chapter2.yml b/_data/quizzes/topic6/chapter2.yml new file mode 100644 index 0000000..3dc9a3e --- /dev/null +++ b/_data/quizzes/topic6/chapter2.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the primary responsibility of a DevSecOps Engineer?" + options: + - "Manage customer support and incident tickets" + - "Handle only traditional IT operations" + - "Embed security into CI/CD workflows and help write secure code" + - "Develop mobile applications for enterprise use" + correct_index: 2 + explanation: "DevSecOps Engineers focus on embedding security throughout the SDLC, especially in CI/CD pipelines." + + - prompt: "Which skill is most relevant for a Security Automation Engineer?" + options: + - "Designing user interfaces" + - "Writing marketing content" + - "Automating access control and integrating with SIEM systems" + - "Building sales dashboards" + correct_index: 2 + explanation: "Security Automation Engineers automate tasks like access control and integrate security tools with SIEMs." + + - prompt: "True or False: Application Security Engineers are primarily focused on securing infrastructure, not code." + options: + - "True" + - "False" + correct_index: 1 + explanation: "AppSec Engineers focus on the security of application code, performing code reviews and vulnerability scans." + + - prompt: "Which of the following is NOT typically a responsibility of an Application Security Engineer?" + options: + - "Conducting threat modeling" + - "Performing SAST and DAST" + - "Educating developers on secure coding" + - "Managing cloud IAM policies" + correct_index: 3 + explanation: "Managing IAM policies is a responsibility of Cloud Security Engineers, not AppSec Engineers." + + - prompt: "What tool might a Cloud Security Engineer use to monitor for misconfigurations?" + options: + - "GitHub Copilot" + - "AWS GuardDuty" + - "Google Docs" + - "Wireshark" + correct_index: 1 + explanation: "AWS GuardDuty is used to detect threats and misconfigurations in AWS cloud environments." \ No newline at end of file From 43ec029d41b9ce965ccbe99c81c3fb92fb9be01b Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 21 May 2025 22:25:51 -0700 Subject: [PATCH 52/68] removed duplicates from topic 1 --- .../chapter-3-intro-to-cicd/index.md | 124 ------------------ .../chapter-4-intro-to-devsecops/index.md | 104 --------------- .../index.md | 4 +- 3 files changed, 1 insertion(+), 231 deletions(-) delete mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md delete mode 100644 docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md deleted file mode 100644 index 6d8c16f..0000000 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-3-intro-to-cicd/index.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Chapter 3 - Intro to CI/CD -layout: custom -parent: Topic 1 - Introduction to SDLC and DevSecOps -has_children: false -has_toc: false -nav_order: 3 ---- - -# Introduction to CI/CD -

    CI/CD, short for Continuous Integration and Continuous Delivery, is a part of the DevOps process. “It is a collection of principles and practices designed to help development teams ensure the reliable delivery of frequent code changes.”

    - -
    - CI/CD Lifecycle -

    Source: Mind The Product

    - -
    - -## DevOps vs. CI/CD - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CategoryDevOpsCICD
    PurposeFacilitate collaboration and efficiency across the development lifecycle.Automate testing to ensure code compatibility.Automate deployment for seamless software releases.
    Methods -
      -
    • Implement automation to streamline collaboration between development and operations teams.
    • -
    • Use infrastructure as code (IaC) to provision and manage infrastructure.
    • -
    • Integrate continuous feedback loops to gather insights from stakeholders and improve processes iteratively.
    • -
    -
    -
      -
    • Automate the build and testing process for every code change.
    • -
    • Identify integration issues early in the development lifecycle.
    • -
    • Support the principle of "fail fast" by providing rapid feedback to developers.
    • -
    -
    -
      -
    • Encompass both Continuous Integration and Continuous Deployment.
    • -
    • Automate the deployment process to production environments.
    • -
    • Enable organizations to release software updates quickly and reliably while minimizing risks.
    • -
    -
    Key Benefits -
      -
    • Promotes a culture of shared responsibility and accountability.
    • -
    • Emphasizes the importance of automating repetitive tasks to reduce manual errors and increase efficiency.
    • -
    • Focuses on delivering value to customers through rapid and iterative development cycles.
    • -
    -
    -
      -
    • Increases code quality by identifying issues early in the development process.
    • -
    • Speeds up the development cycle by automating build and testing processes.
    • -
    • Enables rapid feedback to developers for quick iterations.
    • -
    -
    -
      -
    • Accelerates time to market by automating deployment processes.
    • -
    • Minimizes risks associated with manual deployments.
    • -
    • Enhances overall software reliability and stability.
    • -
    -
    - -### References -
    - Expand - 1. Ashtari, Hossein et al. “Key Differences between CI/CD and DevOps.” Spiceworks, www.spiceworks.com/tech/devops/articles/cicd-vs-devops/. Accessed 20 Feb. 2024.
    - 2. Ferringer, Megan. “Here’s the Difference between CI/CD and Devops-and How They Work Together to Drive Innovation.” Navisite, 2 Mar. 2023, www.navisite.com/blog/insights/ci-cd-vs-devops/.
    - 3. “What the Hell Are CI/CD and DevOps? A Cheatsheet for the Rest of Us.” Mind the Product, www.mindtheproduct.com/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/. Accessed 20 Feb. 2024.
    - 4. “The IDEAL & Practical CI / CD Pipeline - Concepts Overview.” YouTube, 17 Feb. 2022, www.youtube.com/watch?v=OPwU3UWCxhw.
    - 5. Morg, Brad. “How to Design a Modern CI/CD Pipeline.” YouTube, 17 Oct. 2023, www.youtube.com/watch?v=KnSBNd3b0qI.
    - 6. Morg, Brad. “How to Design a Deployment Pipeline (GitOps).” YouTube, 30 Oct. 2023, www.youtube.com/watch?v=pJ9f7w4AxtU.
    -
    diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md deleted file mode 100644 index bb3da1b..0000000 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-4-intro-to-devsecops/index.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Chapter 4 - Introduction to DevSecOps -layout: custom -parent: Topic 1 - Introduction to SDLC and DevSecOps -has_children: false -has_toc: false -nav_order: 4 ---- - - -# Chapter 5 - Introduction to DevSecOps - -## Defining DevSecOps -- Dev = Development -- Sec = Security -- Ops = Operations - -**DevSecOps is a methodology that integrates security practices within the DevOps process.** The main goal of DevSecOps is to embed security in every part of the development lifecycle, from initial design through integration, testing, deployment, and software delivery. - -Ok, now what? You just have to start integrating this into your coding practices? Actually yes, the whole reason this curriculum is applicable for every person working in IT is because it is best development practice to have a secure lifecycle throughout all of the processes IT goes through when developing a project. - -
    - DevSecOps -

    Source: Red Hat

    -
    - - - - -## Why Implement DevSecOps: - -**The Importance of Security in SDLC:** - -The software development lifecycle (SDLC) is a framework used to develop, deploy, and maintain software. A common problem in software development is that security related activities are deferred until the testing phase, which is late in the SDLC after most of the critical design and implementation has been completed. Missing a security related risk could be costly, set back progress, and go unnoticed causing room for further severe impact. - -**What is "Shift" Testing:** - -"Shift left" and "shift right" are terms that emphasize implementing security practices throughout the SDLC. By adopting shift left and shift right principles, teams are able to fix security flaws early on. They are meant to evaluate and ensure quality of the project by focusing on continuous testing methods. - -To **shift left** is to incorporate security testing as soon as possible to find vulnerabilities and fix defects as early as possible in development. - -To **shift right** is to monitor user behavior, usage, performance, and security metrics in the production stage to verify software operability. - -

    Source: Red Hat

    - - - - -## Tools and technologies: - -
    Infrastructure as code scanning -

    - -

  • DevSecOps teams use open source tools like Terraform to manage and provision infrastructure like networks, virtual machines, and load balancers through code rather than doing it manually
  • - -
  • Terraform helps ensure that infrastructure is set up and updated consistently across hundreds or thousands of servers
  • - -
  • Infrastructure as a code scanning tools automatically check the infrastructure at the code level for noncompliance with security policies and standards
  • -

    Source: Microsoft

    -

    -
    - - - -
    Dynamic and Static Application Security Testing -

    - -

  • Dynamic application security testing: This process of testing tests the methods a bad actor might use to attack an application. This testing occurs while the application is running and is based on predefined use cases.
  • - -
  • Static application security testing: Before their code compiles, DevSecOps developers begin testing their custom code for security vulnerabilities. Static application security testing tools make this process easier with automatic checks and real-time feedback, often specifying exactly where an vulnerability is
  • - -
  • -

    Source: Microsoft

    -

    -
    - - -
    Container Scanning -

    - -

  • Container: A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another
  • - -
  • Containers are widely used in DevSecOps because they help developers easily deploy self-contained units of code
  • - -
  • Container Image: Within a container is a container image, which is a executable software bundle that runs processes for the container. These images are often built using existing images or pulled from public repositories.
  • - -

    Source 1: Docker

    -

    Source 2: Microsoft

    -

    -
    - - - - -### References - -**1.** “What is DevSecOps?” *Red Hat*, [https://www.redhat.com/en/topics/devops/what-is-devsecops](https://www.redhat.com/en/topics/devops/what-is-devsecops). Accessed 8 Apr. 2024. - -**2.** “What is DevSecOps?” *Microsoft*, [https://www.microsoft.com/en-us/security/business/security-101/what-is-devsecops](https://www.microsoft.com/en-us/security/business/security-101/what-is-devsecops). Accessed 8 Apr. 2024. - -**3.** “Use containers to Build, Share and Run your applications” *Docker*, [https://www.docker.com/resources/what-container/](https://www.docker.com/resources/what-container/). Accessed 8 Apr. 2024. - -**4.** “Shift left vs. shift right” *Red Hat*, [https://www.redhat.com/en/topics/devops/shift-left-vs-shift-right](https://www.redhat.com/en/topics/devops/shift-left-vs-shift-right). Accessed 8 Apr. 2024. - diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md index fee241b..165af25 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md +++ b/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md @@ -12,6 +12,4 @@ nav_order: 3 | Chapter | Learning Objectives | |---------|---------------------| | Chapter 1: Introduction to SDLC | - Define Software Development Lifecycle
    - Understand the basics of SDLC methodologies
    - Explore the benefits of using different methodologies
    | -| Chapter 2: Introduction to DevOps | - Define DevOps
    | -| Chapter 3: Introduction to CI/CD | - Establish effective documentation habits
    - Discuss the importance of READMEs and wikis
    - Explore best practices for inline code commenting | -| Chapter 4: Securing SDLC with DevSecOps | - Define DevSecOps
    | \ No newline at end of file +| Chapter 2: Introduction to DevOps | - Define DevOps
    | \ No newline at end of file From a4ec795a3dbd3ffa997242db2af92433211b5a8d Mon Sep 17 00:00:00 2001 From: emilychoi Date: Wed, 21 May 2025 22:22:44 -0700 Subject: [PATCH 53/68] add quizzes for topic 4, 5, 6 --- _data/quizzes/topic4/chapter1.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic4/chapter2.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic4/chapter3.yml | 44 +++++++++++++++++++++++++++++++ _data/quizzes/topic5/chapter2.yml | 41 ++++++++++++++++++++++++++++ _data/quizzes/topic5/chapter3.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic6/chapter1.yml | 43 ++++++++++++++++++++++++++++++ _data/quizzes/topic6/chapter2.yml | 43 ++++++++++++++++++++++++++++++ 7 files changed, 300 insertions(+) create mode 100644 _data/quizzes/topic4/chapter1.yml create mode 100644 _data/quizzes/topic4/chapter2.yml create mode 100644 _data/quizzes/topic4/chapter3.yml create mode 100644 _data/quizzes/topic5/chapter2.yml create mode 100644 _data/quizzes/topic5/chapter3.yml create mode 100644 _data/quizzes/topic6/chapter1.yml create mode 100644 _data/quizzes/topic6/chapter2.yml diff --git a/_data/quizzes/topic4/chapter1.yml b/_data/quizzes/topic4/chapter1.yml new file mode 100644 index 0000000..cae382c --- /dev/null +++ b/_data/quizzes/topic4/chapter1.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What does the CIA Triad represent in cybersecurity?" + options: + - "Compliance, Identity, Access" + - "Confidentiality, Integrity, Availability" + - "Cybersecurity, Infrastructure, Authentication" + - "Confidentiality, Information, Authentication" + correct_index: 1 + explanation: "The CIA Triad stands for Confidentiality, Integrity, and Availability, all key principles in cybersecurity." + + - prompt: "What is a vulnerability in the context of cybersecurity?" + options: + - "A malicious code used in an attack" + - "A person attempting to hack a system" + - "A flaw or weakness in a system that can be exploited" + - "The risk of unauthorized access to data" + correct_index: 2 + explanation: "A vulnerability is a flaw or weakness in software, hardware, or systems that can be exploited." + + - prompt: "True or False: A 'risk' is determined by the probability and severity of a cybersecurity incident." + options: + - "True" + - "False" + correct_index: 0 + explanation: "Risk = Probability of Occurrence x Severity. It's a measure of potential impact." + + - prompt: "Which of the following is an example of an exploit being used?" + options: + - "A patch being applied to software" + - "A hacker finds a password in a config file and uses it to access a server" + - "A backup system running hourly" + - "Antivirus software updating signatures" + correct_index: 1 + explanation: "Using a found password to gain unauthorized access is an example of exploiting a vulnerability." + + - prompt: "Fill in the blank: The ________ is the malicious code or action used in a cyberattack." + options: + - "Payload" + - "Threat actor" + - "Vulnerability" + - "Exploit" + correct_index: 0 + explanation: "The payload is the part of the attack that causes harm, like malicious code." \ No newline at end of file diff --git a/_data/quizzes/topic4/chapter2.yml b/_data/quizzes/topic4/chapter2.yml new file mode 100644 index 0000000..7fc474a --- /dev/null +++ b/_data/quizzes/topic4/chapter2.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the main risk when users can access data or systems they shouldn’t be allowed to?" + options: + - "Improper Access Control" + - "Misconfiguration" + - "Cross-Site Scripting (XSS)" + - "Cryptographic Risks" + correct_index: 0 + explanation: "Improper Access Control occurs when users can access unauthorized systems or data." + + - prompt: "Which mitigation strategy is most effective against injection attacks?" + options: + - "Role Based Access Controls" + - "Require MFA" + - "Encrypt database backups" + - "Sanitize user input" + correct_index: 3 + explanation: "Sanitizing user input helps prevent injection attacks by ensuring that only valid data is processed." + + - prompt: "What kind of attack involves injecting malicious SQL queries into a system?" + options: + - "Cross-Site Scripting (XSS)" + - "SQL Injection" + - "Improper Authentication" + - "Logging Failure" + correct_index: 1 + explanation: "SQL Injection involves inserting malicious SQL queries to manipulate or access a database." + + - prompt: "True or False: Output encoding helps prevent SQL injections by restricting unauthorized queries." + options: + - "True" + - "False" + correct_index: 1 + explanation: "False. Output encoding helps prevent XSS attacks. SQL Injection should be mitigated using parameterized queries." + + - prompt: "Fill in the blank: __________ is a technique to limit what actions users can perform based on their role in an organization." + options: + - "Access logs" + - "Parameterized queries" + - "Role Based Access Control" + - "Prepared statements" + correct_index: 2 + explanation: "Role Based Access Control ensures that users only access information and systems needed for their role." diff --git a/_data/quizzes/topic4/chapter3.yml b/_data/quizzes/topic4/chapter3.yml new file mode 100644 index 0000000..f587a77 --- /dev/null +++ b/_data/quizzes/topic4/chapter3.yml @@ -0,0 +1,44 @@ +questions: + - prompt: "What is the main purpose of integrating security checks in each stage of the CI/CD pipeline?" + options: + - "To slow down development" + - "To ensure only DevOps engineers manage security" + - "To automate deployments without review" + - "To embed security early and ensure vulnerabilities are caught throughout development" + correct_index: 3 + explanation: "The key goal is to proactively embed security checks early in the development process and throughout the lifecycle." + + - prompt: "Fill in the blank: The _________ phase includes threat modeling to identify potential vulnerabilities before coding begins." + options: + - "Testing" + - "Planning" + - "Release" + - "Build" + correct_index: 1 + explanation: "The Planning phase includes threat modeling to predict and mitigate future security risks." + + - prompt: "Which of the following best describes DAST?" + options: + - "Analyzes code before it is compiled" + - "Checks application behavior while running" + - "Ensures business logic is documented" + - "Analyzes test scripts in the CI environment" + correct_index: 1 + explanation: "DAST tests the running application to identify vulnerabilities during runtime." + + - prompt: "True or False: The CI/CD pipeline should only have security checks during the testing stage." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Security checks should be embedded into every stage of the pipeline, not just testing." + + - prompt: "Which of the following is NOT a benefit of combining SAST and DAST?" + options: + - "Improves detection coverage of security vulnerabilities" + - "Provides both code-level and runtime insights" + - "Replaces the need for security experts" + - "Strengthens application security across the SDLC" + correct_index: 2 + explanation: "While SAST and DAST improve coverage, they do not eliminate the need for security professionals." + \ No newline at end of file diff --git a/_data/quizzes/topic5/chapter2.yml b/_data/quizzes/topic5/chapter2.yml new file mode 100644 index 0000000..89de789 --- /dev/null +++ b/_data/quizzes/topic5/chapter2.yml @@ -0,0 +1,41 @@ +questions: + - prompt: "True or False: Cloud-native DevSecOps emphasizes integrating security after the application has been deployed." + options: + - "True" + - "False" + correct_index: 1 + explanation: False. Cloud-native DevSecOps integrates security throughout the development process, not afterward. + + - prompt: "Which of the following is not a benefit of cloud-native DevSecOps?" + options: + - "Faster feedback loops" + - "Manual server patching" + - "Automated security checks" + - "Easier compliance management" + correct_index: 1 + explanation: "Cloud-native DevSecOps discourages manual server patching in favor of immutable infrastructure." + + - prompt: "Fill in the blank: ________ allows infrastructure to be defined and managed using code." + options: + - "Immutable Infrastructure" + - "Continuous Deployment (CD)" + - "Infrastructure as Code (IaC)" + - "Serverless Architecture" + correct_index: 2 + explanation: "IaC refers to defining infrastructure setup and management using code." + + - prompt: "True or False: Microservices and serverless architectures reduce the number of endpoints, making applications easier to secure." + options: + - "True" + - "False" + correct_index: 1 + explanation: "These architectures increase the number of endpoints, making API security more important." + + - prompt: "What does the Shared Responsibility Model emphasize in cloud security?" + options: + - "Users are responsible for everything" + - "Cloud providers handle all security" + - "Only compliance officers manage security" + - "Responsibilities are split between cloud users and providers" + correct_index: 3 + explanation: Security is a shared responsibility between the cloud provider and the customer. \ No newline at end of file diff --git a/_data/quizzes/topic5/chapter3.yml b/_data/quizzes/topic5/chapter3.yml new file mode 100644 index 0000000..67f49c7 --- /dev/null +++ b/_data/quizzes/topic5/chapter3.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "Why are tools essential for DevSecOps in the cloud?" + options: + - "They eliminate the need for developers" + - "They simplify only post-deployment monitoring" + - "They enable scalable, automated security across the SDLC" + - "They are required only for compliance audits" + correct_index: 2 + explanation: "Tools automate testing, policy enforcement, and monitoring, making DevSecOps scalable and effective." + + - prompt: "Which tool would you use for managing secrets in a multi-cloud environment?" + options: + - "Trivy" + - "OWASP ZAP" + - "GitHub Actions" + - "HashiCorp Vault" + correct_index: 3 + explanation: "HashiCorp Vault is designed for secure secrets management across multi-cloud setups." + + - prompt: "True or False: Hardcoding secrets in your source code is a recommended best practice." + options: + - "True" + - "False" + correct_index: 1 + explanation: "Hardcoding secrets is a major security risk. Secrets should be injected securely at runtime." + + - prompt: "What is the purpose of tools like OPA or Gatekeeper?" + options: + - "Secrets management" + - "Code compilation" + - "Policy enforcement in Kubernetes" + - "Logging configuration" + correct_index: 2 + explanation: "OPA and Gatekeeper are used to define and enforce security policies in Kubernetes environments." + + - prompt: "Which of the following tools provides runtime threat detection for containers?" + options: + - "Falco" + - "SonarQube" + - "Kube-bench" + - "Dependabot" + correct_index: 0 + explanation: "Falco provides runtime threat detection specifically for containers." \ No newline at end of file diff --git a/_data/quizzes/topic6/chapter1.yml b/_data/quizzes/topic6/chapter1.yml new file mode 100644 index 0000000..75ed5a7 --- /dev/null +++ b/_data/quizzes/topic6/chapter1.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is one major DevSecOps benefit for financial institutions?" + options: + - "Slower software releases for compliance checks" + - "Manual auditing of infrastructure" + - "Avoiding use of cloud environments" + - "Automated compliance reporting and early misconfiguration detection" + correct_index: 3 + explanation: "DevSecOps enables automated compliance reporting and early detection of misconfigured services in finance." + + - prompt: "How does DevSecOps benefit Tech & SaaS companies like GitHub and Netflix?" + options: + - "It reduces their need to monitor deployments" + - "It automates inline security scans during pull requests" + - "It allows skipping code reviews" + - "It replaces CI/CD pipelines with manual deployment" + correct_index: 1 + explanation: "DevSecOps allows automated security scanning on pull requests, supporting fast and secure deployments." + + - prompt: "True or False: DevSecOps helps healthtech apps encrypt data and monitor access patterns." + options: + - "True" + - "False" + correct_index: 0 + explanation: "True. DevSecOps practices in healthcare include automatic encryption and anomaly detection to secure patient data." + + - prompt: "What challenge does DevSecOps address in the retail industry?" + options: + - "Overstaffing during peak seasons" + - "Manual software patching" + - "Preventing data breaches during high-traffic events" + - "Avoiding cloud usage" + correct_index: 2 + explanation: "Retailers use DevSecOps to proactively scan for risks and prevent breaches, especially during peak traffic." + + - prompt: "What is a major DevSecOps benefit in pharmaceutical and R&D industries?" + options: + - "Securing data pipelines and enforcing role-based secrets management" + - "Rapid drug manufacturing" + - "Bypassing compliance to speed up innovation" + - "Avoiding use of encrypted storage" + correct_index: 0 + explanation: "DevSecOps helps secure sensitive IP and research data through secrets management and encryption." \ No newline at end of file diff --git a/_data/quizzes/topic6/chapter2.yml b/_data/quizzes/topic6/chapter2.yml new file mode 100644 index 0000000..3dc9a3e --- /dev/null +++ b/_data/quizzes/topic6/chapter2.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the primary responsibility of a DevSecOps Engineer?" + options: + - "Manage customer support and incident tickets" + - "Handle only traditional IT operations" + - "Embed security into CI/CD workflows and help write secure code" + - "Develop mobile applications for enterprise use" + correct_index: 2 + explanation: "DevSecOps Engineers focus on embedding security throughout the SDLC, especially in CI/CD pipelines." + + - prompt: "Which skill is most relevant for a Security Automation Engineer?" + options: + - "Designing user interfaces" + - "Writing marketing content" + - "Automating access control and integrating with SIEM systems" + - "Building sales dashboards" + correct_index: 2 + explanation: "Security Automation Engineers automate tasks like access control and integrate security tools with SIEMs." + + - prompt: "True or False: Application Security Engineers are primarily focused on securing infrastructure, not code." + options: + - "True" + - "False" + correct_index: 1 + explanation: "AppSec Engineers focus on the security of application code, performing code reviews and vulnerability scans." + + - prompt: "Which of the following is NOT typically a responsibility of an Application Security Engineer?" + options: + - "Conducting threat modeling" + - "Performing SAST and DAST" + - "Educating developers on secure coding" + - "Managing cloud IAM policies" + correct_index: 3 + explanation: "Managing IAM policies is a responsibility of Cloud Security Engineers, not AppSec Engineers." + + - prompt: "What tool might a Cloud Security Engineer use to monitor for misconfigurations?" + options: + - "GitHub Copilot" + - "AWS GuardDuty" + - "Google Docs" + - "Wireshark" + correct_index: 1 + explanation: "AWS GuardDuty is used to detect threats and misconfigurations in AWS cloud environments." \ No newline at end of file From b9d544816e2a8c7620c360f6549e987a30e87d10 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Wed, 21 May 2025 23:06:43 -0700 Subject: [PATCH 54/68] fix topic 1 title, add missing chapter titles --- .../chapter-1-SDLC/index.md | 2 +- .../chapter-2-intro-to-devOps/index.md | 6 +++--- .../index.md | 4 ++-- .../chapter-2-understanding-git/index.md | 2 +- .../chapter-1-Intro-to-Cloud/index.md | 2 +- .../chapter-2-cloud-in-devsecops/index.md | 2 +- .../chapter-3-cloud-tools-and-platforms/index.md | 2 +- .../index.md | 2 +- .../chapter-2-industry-roles/index.md | 4 ++-- docs/course/index.md | 16 ++-------------- 10 files changed, 15 insertions(+), 27 deletions(-) rename docs/course/{Topic-1-Software-Dev-and-DevSecOps => Topic-1-SDLC-and-DevOps}/chapter-1-SDLC/index.md (98%) rename docs/course/{Topic-1-Software-Dev-and-DevSecOps => Topic-1-SDLC-and-DevOps}/chapter-2-intro-to-devOps/index.md (99%) rename docs/course/{Topic-1-Software-Dev-and-DevSecOps => Topic-1-SDLC-and-DevOps}/index.md (79%) diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md b/docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md similarity index 98% rename from docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md rename to docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md index bd9db82..374fc32 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-1-SDLC/index.md +++ b/docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md @@ -1,7 +1,7 @@ --- title: Chapter 1 - Introduction to SDLC layout: custom -parent: Topic 1 - Introduction to SDLC and DevSecOps +parent: Topic 1 - SDLC and DevOps has_children: false has_toc: false nav_order: 1 diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-intro-to-devOps/index.md b/docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md similarity index 99% rename from docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-intro-to-devOps/index.md rename to docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md index cd9c8df..ef9716e 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/chapter-2-intro-to-devOps/index.md +++ b/docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md @@ -1,12 +1,12 @@ --- -title: Chapter 2 - Intro to DevOps +title: Chapter 2 - Introduction to DevOps layout: custom -parent: Topic 1 - Introduction to SDLC and DevSecOps +parent: Topic 1 - SDLC and DevOps has_children: false has_toc: false nav_order: 2 --- -# Introduction to DevOps +# Chapter 2 - Introduction to DevOps ## Problem Space 🧐 Imagine you are writing code for a project idea you have yourself. As your project begins to grow, you hire more developers. diff --git a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md b/docs/course/Topic-1-SDLC-and-DevOps/index.md similarity index 79% rename from docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md rename to docs/course/Topic-1-SDLC-and-DevOps/index.md index 165af25..cbfe58a 100644 --- a/docs/course/Topic-1-Software-Dev-and-DevSecOps/index.md +++ b/docs/course/Topic-1-SDLC-and-DevOps/index.md @@ -1,5 +1,5 @@ --- -title: Topic 1 - Introduction to SDLC and DevSecOps +title: Topic 1 - SDLC and DevOps layout: custom parent: has_children: true @@ -7,7 +7,7 @@ has_toc: false nav_order: 3 --- -# Topic 1 - Introduction to the SDLC and DevSecOps +# Topic 1 - SDLC and DevOps | Chapter | Learning Objectives | |---------|---------------------| diff --git a/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md b/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md index 6dbbc81..3ce8884 100644 --- a/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md +++ b/docs/course/Topic-2-Git/chapter-2-understanding-git/index.md @@ -9,7 +9,7 @@ topic: topic2 chapter: chapter2 --- -# Git Fundamentals +# Chapter 2 - Git Fundamentals ## What is a repository? {: .definition } diff --git a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md index d075e0b..10764dd 100644 --- a/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md +++ b/docs/course/Topic-5-Cloud/chapter-1-Intro-to-Cloud/index.md @@ -7,7 +7,7 @@ nav_order: 1 topic: topic5 chapter: chapter1 --- -# Introduction to Cloud +# Chapter 1 - Introduction to Cloud The cloud has become the foundation upon which DevSecOps practices are built. From scalable infrastructure to rapid deployment capabilities, understanding the cloud is key to implementing secure, efficient pipelines. diff --git a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md index d502e17..9d375ec 100644 --- a/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md +++ b/docs/course/Topic-5-Cloud/chapter-2-cloud-in-devsecops/index.md @@ -8,7 +8,7 @@ topic: topic5 chapter: chapter2 --- -# Cloud-Native DevSecOps +# Chapter 2 - Cloud-Native DevSecOps DevSecOps is about integrating security into every part of the software development lifecycle. When you move to the cloud, it transforms how you build, test, deploy, and secure applications. Cloud-native DevSecOps means adapting security practices to the flexibility, speed, and scale the cloud offers. diff --git a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md index fa62bde..773588d 100644 --- a/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md +++ b/docs/course/Topic-5-Cloud/chapter-3-cloud-tools-and-platforms/index.md @@ -8,7 +8,7 @@ topic: topic5 chapter: chapter3 --- -# DevSecOps Cloud Tools and Platforms +# Chapter 3 - DevSecOps Cloud Tools and Platforms DevSecOps isn’t just a set of principles—it’s enabled by a powerful ecosystem of tools and platforms that make cloud-native development, security, and operations possible. In this chapter, we’ll explore essential cloud tools across categories like automation, CI/CD, security scanning, monitoring, and compliance, tailored to a DevSecOps pipeline. diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md index 1f11467..4eb2697 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-1-use-of-devsecops-in-industry/index.md @@ -8,7 +8,7 @@ topic: topic6 chapter: chapter1 --- -# Chapter 6 - DevSecOps Use Cases Across Industries +# Chapter 1 - DevSecOps Use Cases Across Industries Now, we have laid out 6 Use Cases and Industries where the skills and information you have learned will be useful. They are as follows: diff --git a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md index 99b9b19..f3c1f98 100644 --- a/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md +++ b/docs/course/Topic-6-DevSecOps-in-Industry/chapter-2-industry-roles/index.md @@ -8,9 +8,9 @@ topic: topic6 chapter: chapter2 --- -# 🔐 Common DevSecOps Roles in the Industry +# Chapter 2 - Common DevSecOps Roles in the Industry -In this section, we’ll break down the most common DevSecOps roles in today’s tech landscape. You’ll learn what each role does, their core responsibilities, and the essential skills required. +In this section, we’ll break down the most common DevSecOps roles in today’s tech landscape. You’ll learn what each role does, their core responsibilities, and the essential skills required. 🔐 --- diff --git a/docs/course/index.md b/docs/course/index.md index d87b7ab..40e1fde 100644 --- a/docs/course/index.md +++ b/docs/course/index.md @@ -17,24 +17,12 @@ nav_order: 1 - Introduction to
    SDLC and
    DevSecOps + Introduction to
    SDLC and
    DevSecOps Chapter 1: Introduction to SDLC - Chapter 2: Version Control - - - - Chapter 3: Introduction to DevOps - - - - Chapter 4: Introduction to CI/CD - - - - Chapter 5: Introduction to DevSecOps + Chapter 2: Introduction to DevOps From 77cb199934bf34491a1ee1ad230f77d67b923e21 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Wed, 21 May 2025 23:28:41 -0700 Subject: [PATCH 55/68] add topic 1 ch 1 quiz --- _data/quizzes/topic1/chapter1.yml | 43 +++++++++++++++++++ .../chapter-1-SDLC/index.md | 11 +++++ .../chapter-2-intro-to-devOps/index.md | 11 +++++ .../chapter-1-version-control/index.md | 2 + 4 files changed, 67 insertions(+) create mode 100644 _data/quizzes/topic1/chapter1.yml diff --git a/_data/quizzes/topic1/chapter1.yml b/_data/quizzes/topic1/chapter1.yml new file mode 100644 index 0000000..f58574a --- /dev/null +++ b/_data/quizzes/topic1/chapter1.yml @@ -0,0 +1,43 @@ +questions: + - prompt: "What is the primary purpose of the Software Development Life Cycle (SDLC)?" + options: + - "To design user interfaces for software applications" + - "To manage and structure software development and maintenance through distinct phases" + - "To write code in a specific programming language" + - "To automate deployment using CI/CD tools" + correct_index: 1 + explanation: "The SDLC is a structured process that helps manage and guide software development and maintenance through specific phases." + + - prompt: "Which of the following is NOT one of the phases in the traditional SDLC?" + options: + - "Design" + - "Test" + - "Automate" + - "Deploy" + correct_index: 2 + explanation: "Automate is not a standard SDLC phase; the typical phases include Planning, Design, Implement, Test, Deploy, and Maintain." + + - prompt: "True or False: The Maintain phase in SDLC focuses on releasing software into production." + options: + - "True" + - "False" + correct_index: 1 + explanation: "The Deploy phase handles release into production, while the Maintain phase involves ongoing updates and support." + + - prompt: "What is a key benefit of following a structured SDLC process?" + options: + - "Faster typing speed for developers" + - "Reduces testing requirements" + - "Ensures secure and reliable software delivery" + - "Eliminates the need for project planning" + correct_index: 2 + explanation: "One of the main benefits of SDLC is enabling faster, more secure, and reliable delivery of software through structured processes." + + - prompt: "Which SDLC methodology is best suited for projects with fixed, well-defined requirements?" + options: + - "Waterfall" + - "Agile" + - "Scrum" + - "Iterative" + correct_index: 0 + explanation: "Waterfall is ideal for projects where requirements are fixed and unlikely to change." diff --git a/docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md b/docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md index 374fc32..31e65e3 100644 --- a/docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md +++ b/docs/course/Topic-1-SDLC-and-DevOps/chapter-1-SDLC/index.md @@ -5,6 +5,8 @@ parent: Topic 1 - SDLC and DevOps has_children: false has_toc: false nav_order: 1 +topic: topic1 +chapter: chapter1 --- # Chapter 1 - Introduction to SDLC @@ -57,3 +59,12 @@ Continuously update and support the software to address issues and improvements. | **Iterative** | Builds software in small parts, allowing feedback and revisions after each iteration. | Useful when early versions are expected to evolve based on user feedback. | | **Agile** | A flexible, iterative approach that emphasizes collaboration, customer feedback, and frequent updates. | Best for dynamic, fast-paced projects with evolving requirements. | | **Scrum** | A subset of Agile, focusing on time-boxed iterations called sprints and daily stand-up meetings. | Great for product-based development with frequent releases and tight deadlines. | + +--- + +{% include quiz.html + id="topic1-chapter1" + data=site.data.quizzes.topic1.chapter1 +%} + +--- \ No newline at end of file diff --git a/docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md b/docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md index ef9716e..04141fb 100644 --- a/docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md +++ b/docs/course/Topic-1-SDLC-and-DevOps/chapter-2-intro-to-devOps/index.md @@ -5,6 +5,8 @@ parent: Topic 1 - SDLC and DevOps has_children: false has_toc: false nav_order: 2 +topic: topic1 +chapter: chapter2 --- # Chapter 2 - Introduction to DevOps ## Problem Space @@ -227,6 +229,15 @@ In many companies, Development and Operations teams work independently, leading - **Collecting & Measuring Data** - **Continuous Feedback** +--- + +{% include quiz.html + id="topic1-chapter2" + data=site.data.quizzes.topic1.chapter2 +%} + +--- + ### References
    Expand diff --git a/docs/course/Topic-2-Git/chapter-1-version-control/index.md b/docs/course/Topic-2-Git/chapter-1-version-control/index.md index cb9489c..447d73c 100644 --- a/docs/course/Topic-2-Git/chapter-1-version-control/index.md +++ b/docs/course/Topic-2-Git/chapter-1-version-control/index.md @@ -38,6 +38,8 @@ A common tool for version control is GitHub. GitHub allows you acts as a central data=site.data.quizzes.topic2.chapter1 %} +--- + ### References
    From f93fd2457e4372abe14b3bb2a5cfdc4c95a94a86 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 21 May 2025 23:43:37 -0700 Subject: [PATCH 56/68] changed logo --- _config.yml | 2 +- assets/images/2.0logo.png | Bin 0 -> 11648 bytes assets/images/2.0logobig.png | Bin 0 -> 17657 bytes assets/images/favicon.png | Bin 0 -> 17017 bytes 4 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/images/2.0logo.png create mode 100644 assets/images/2.0logobig.png create mode 100644 assets/images/favicon.png diff --git a/_config.yml b/_config.yml index d2cb8a3..a3dd41f 100644 --- a/_config.yml +++ b/_config.yml @@ -2,7 +2,7 @@ title: open-devsecops description: 'From Classroom to Industry: Bridging the DevSecOps Knowledge Gap with Open, Practical Learning.' theme: just-the-docs -logo: "/assets/images/opendevsecops-transparent.png" +logo: "/assets/images/2.0logobig.png" favicon_ico: "/assets/images/opendevsecops-favicon.ico" url: https://open-devsecops.github.io diff --git a/assets/images/2.0logo.png b/assets/images/2.0logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f965f8db6663379cdfd7861a43da11d250676f GIT binary patch literal 11648 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 OVx(`T_d>_<+W!IK$tVQ? literal 0 HcmV?d00001 diff --git a/assets/images/2.0logobig.png b/assets/images/2.0logobig.png new file mode 100644 index 0000000000000000000000000000000000000000..3086f8315dd18042d94a28be599dc07250493da0 GIT binary patch literal 17657 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 I3q9!n07n_69{>OV literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..172da5bdb10aa60794da6f9ab1a0b5d98419b5a5 GIT binary patch literal 17017 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 R{R4K?BN|85Gt{iE{2$^Y93lV! literal 0 HcmV?d00001 From 97ad6274c2dfc5319a02884dd9b2531f4f01872c Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Wed, 21 May 2025 23:49:06 -0700 Subject: [PATCH 57/68] changed height/width of logo --- _sass/custom/custom.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_sass/custom/custom.scss b/_sass/custom/custom.scss index 01559f2..bb7dfb1 100644 --- a/_sass/custom/custom.scss +++ b/_sass/custom/custom.scss @@ -404,8 +404,8 @@ div.highlighter-rouge > button, div.listingblock > div.content > button, figure. } .site-logo { - width: 30px; - height: 30px; + width: 60px; + height: 55px; } .site-nav-header { From eb0bf7b604407fd0c1ca5276dbe935bc894c4b20 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 00:09:23 -0700 Subject: [PATCH 58/68] quiz for topic 1 ch 2 --- _data/quizzes/topic1/chapter2.yml | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 _data/quizzes/topic1/chapter2.yml diff --git a/_data/quizzes/topic1/chapter2.yml b/_data/quizzes/topic1/chapter2.yml new file mode 100644 index 0000000..22a2017 --- /dev/null +++ b/_data/quizzes/topic1/chapter2.yml @@ -0,0 +1,41 @@ +questions: + - prompt: "What is one key issue that arises when development and operations teams work in isolation?" + options: + - "Decreased development speed" + - "Better coordination between teams" + - "Conflicting goals and communication gaps" + - "More secure deployment pipelines" + correct_index: 2 + explanation: "Isolated Dev and Ops teams often face communication gaps and misaligned objectives, leading to inefficiencies." + + - prompt: "True or False: Manual testing and deployment processes often result in slower release cycles and delayed feedback." + options: + - "True" + - "False" + correct_index: 0 + explanation: "Manual processes slow down software delivery, making it harder to respond quickly to feedback." + + - prompt: "Which of the following best explains the 'But it works on my machine' syndrome?" + options: + - "A feature passes QA but fails in production due to network issues" + - "Code behaves inconsistently across environments due to configuration mismatches" + - "A user reports a bug that developers can’t reproduce" + - "Developers forget to merge the correct branch" + correct_index: 1 + explanation: "Environment inconsistencies lead to unexpected behavior that doesn't match the developer’s local setup." + + - prompt: "Fill in the blank: Manual infrastructure scaling increases the risk of __________ due to human error and slow responsiveness." + options: + - "Bugs" + - "Data corruption" + - "Deployment automation" + - "System instability" + correct_index: 3 + explanation: "Manual processes are more prone to mistakes and can't respond quickly to load changes, causing instability." + + - prompt: "True or False: DevOps is only about automation tools and does not affect team culture or communication." + options: + - "True" + - "False" + correct_index: 1 + explanation: "DevOps promotes collaboration and culture change, not just tool adoption." \ No newline at end of file From be6da2e73e35bf934926134bb1ef07653869b515 Mon Sep 17 00:00:00 2001 From: MorVered7 Date: Thu, 22 May 2025 00:14:31 -0700 Subject: [PATCH 59/68] fixed favicon --- _config.yml | 2 +- assets/images/favicon-32x32.png | Bin 0 -> 1526 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/images/favicon-32x32.png diff --git a/_config.yml b/_config.yml index a3dd41f..1cb3b45 100644 --- a/_config.yml +++ b/_config.yml @@ -3,7 +3,7 @@ description: 'From Classroom to Industry: Bridging the DevSecOps Knowledge Gap w theme: just-the-docs logo: "/assets/images/2.0logobig.png" -favicon_ico: "/assets/images/opendevsecops-favicon.ico" +favicon_ico: "/assets/images/2.0logobig.png" url: https://open-devsecops.github.io search_enabled: false diff --git a/assets/images/favicon-32x32.png b/assets/images/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..03ca37355e7cf300a1597ce88339300a453e6fee GIT binary patch literal 1526 zcmVPx)ut`KgR9HuimU~Q7XBfuMcR4*RAQT0~3vE$Km4Vm-rHqS1pyehAbKGPyhnLM| zk>c0_hMTv{><^7*F2l{}mbq+ZSvHM$*KFAq4b$nyw&;j)Bp5)1K`HIId}jfb%}Kwr z^H0k?_Zi%lQic;##Us z62`%VAbp9agmvI0c`L$O4`1`uDQ$C7&|e- z^Qizl?*y6p#tattT~umHh;%&Bly^df{63;PCAuHL4`!z4Zg4{YAWiFbj~0VWUDHMu za_=hvh(vrR$yDG{Ax#@~v53$$FRi~gR6F;UQcu^&P#nnCweCg`Hz6t9*#%}Emg zR{;YPX-#EWmV4Yc14}K3fUOzDdq@-oK z6(WFfd0g4m^~vW!w!W1hfF~o_*F$7+S5j1=gb~+F(}_g5qDvcCH&Yw-tJ0|M5BEfF zYRc;dIfk9Gl90dwq01 zW8zqKJ#|zPf2piCe#In!!?0rrFhJ|8K$d0cp66CjiTTYDz(6XfR~TIpSD@OAF}s=` zR{Y@#XMD{=2Mld}kU_J31CYDX5!NiNI{dcMt_*qpjIb5WInH7>feIjan=0xOc0P1K zA&6v|TsB8$@6xb==cpMV6XEii*Zp4IxAz`KIE1Dh_qf+o)h8W$Gy-}Q%S1d9Zz}kX zLz+X>1(d~Z&-~NoBy;Wv!%(l986F*cwx;p9A09i<0f6t9kwnB6n`tG7k-Cwd0sQ#| zsUvkE!830vjjHF~&tbK@EBhW_!4U{?wXY(Pc&n2ampCv~RVo0q8?!wp{nY_q(@#}& zmu@lpKh`MzArYjp^pxn*JqW0h>6<;?@JtRf#&O(!dRU2FrM2dme*nT;UqJ}J=c~vg z^o6I#)Lcb?ol9%%701eA^MFmos-0A)MBzl4(^5DEkP+VK;E>562T@G5}>C&aFH zF#u3EYh--DYAv48fRU=0euBdOiaN`dDS%X+b726S)jeGiA=2%rg|@;_^@87&7OVR~ zXGnf!?0JmXWmKnlkF#=X;=U;WhGC#xzug4^)cm)Q5b>trT^@Iay3${ED8Pyw40Z4pnywQ;h0k@Jq0&>`pGJ3<`UppDEz8*rz;HKuR cC;nCc4UbJg5#gXmg8%>k07*qoM6N<$f}OR}m;e9( literal 0 HcmV?d00001 From c394434eb250f04808675b0d7c9db03a608a9bc3 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 00:32:53 -0700 Subject: [PATCH 60/68] deployment - changing url and baseurl --- _config.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 1cb3b45..1a93f5a 100644 --- a/_config.yml +++ b/_config.yml @@ -5,7 +5,9 @@ theme: just-the-docs logo: "/assets/images/2.0logobig.png" favicon_ico: "/assets/images/2.0logobig.png" -url: https://open-devsecops.github.io +# url: https://open-devsecops.github.io +url: "https://katieshi413.github.io" +baseurl: "/open-devsecops.github.io" search_enabled: false aux_links: From 9284a359b66b4f335abc0d2bf96bc2a33941222c Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 01:09:08 -0700 Subject: [PATCH 61/68] deployment - changed pages.yml --- .github/workflows/pages.yml | 67 +++++++++++-------------------------- 1 file changed, 20 insertions(+), 47 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 6564156..2d5d7cf 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,62 +1,35 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# Sample workflow for building and deploying a Jekyll site to GitHub Pages -name: Deploy Jekyll site to Pages +name: Build and Deploy Jekyll site to GitHub Pages on: push: - branches: ["main"] - - # Allows you to run this workflow manually from the Actions tab + branches: + - main workflow_dispatch: -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: true - jobs: - # Build job - build: + build-deploy: runs-on: ubuntu-latest + steps: - - name: Checkout + - name: Checkout repository uses: actions/checkout@v3 - - name: Setup Ruby + + - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.1' # Not needed with a .ruby-version file - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - cache-version: 0 # Increment this number if you need to re-download cached gems - - name: Setup Pages - id: pages - uses: actions/configure-pages@v3 - - name: Build with Jekyll - # Outputs to the './_site' directory by default - run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" + ruby-version: '3.1' # Match your Ruby version + bundler-cache: true # Runs bundle install and caches gems + + - name: Build site with Jekyll + run: bundle exec jekyll build env: JEKYLL_ENV: production - - name: Upload artifact - # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v1 - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v2 + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./_site + # If your site is published at username.github.io/repository, + # set `publish_branch: gh-pages` or your branch, default is gh-pages + # publish_branch: gh-pages From 7958475a9bfe4e9a77e9fd963d71e1eebadf33f8 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 01:20:34 -0700 Subject: [PATCH 62/68] deployment - go back to og pages.yml --- .github/workflows/pages.yml | 67 ++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 2d5d7cf..9b2bf65 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,35 +1,62 @@ -name: Build and Deploy Jekyll site to GitHub Pages +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll site to Pages on: push: - branches: - - main + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab workflow_dispatch: +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true + jobs: - build-deploy: + # Build job + build: runs-on: ubuntu-latest - steps: - - name: Checkout repository + - name: Checkout uses: actions/checkout@v3 - - - name: Set up Ruby + - name: Setup Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.1' # Match your Ruby version - bundler-cache: true # Runs bundle install and caches gems - - - name: Build site with Jekyll - run: bundle exec jekyll build + ruby-version: '3.1' # Not needed with a .ruby-version file + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + cache-version: 0 # Increment this number if you need to re-download cached gems + - name: Setup Pages + id: pages + uses: actions/configure-pages@v3 + - name: Build with Jekyll + # Outputs to the './_site' directory by default + run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" env: JEKYLL_ENV: production + - name: Upload artifact + # Automatically uploads an artifact from the './_site' directory by default + uses: actions/upload-pages-artifact@v1 + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: - name: Deploy to GitHub Pages - uses: peaceiris/actions-gh-pages@v3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./_site - # If your site is published at username.github.io/repository, - # set `publish_branch: gh-pages` or your branch, default is gh-pages - # publish_branch: gh-pages + id: deployment + uses: actions/deploy-pages@v2 \ No newline at end of file From 82b2ee9cf4ccd7997beed317d731a14bd99e2110 Mon Sep 17 00:00:00 2001 From: Katie Shi <61104082+katieshi413@users.noreply.github.com> Date: Thu, 22 May 2025 01:28:32 -0700 Subject: [PATCH 63/68] deployment - change to deploy from github workflow --- .github/workflows/jekyll.yml | 65 ++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 .github/workflows/jekyll.yml diff --git a/.github/workflows/jekyll.yml b/.github/workflows/jekyll.yml new file mode 100644 index 0000000..61f2d80 --- /dev/null +++ b/.github/workflows/jekyll.yml @@ -0,0 +1,65 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# Sample workflow for building and deploying a Jekyll site to GitHub Pages +name: Deploy Jekyll site to Pages + +on: + # Runs on pushes targeting the default branch + push: + branches: ["main"] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. +# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + # Build job + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Ruby + # https://github.com/ruby/setup-ruby/releases/tag/v1.207.0 + uses: ruby/setup-ruby@4a9ddd6f338a97768b8006bf671dfbad383215f4 + with: + ruby-version: '3.1' # Not needed with a .ruby-version file + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + cache-version: 0 # Increment this number if you need to re-download cached gems + - name: Setup Pages + id: pages + uses: actions/configure-pages@v5 + - name: Build with Jekyll + # Outputs to the './_site' directory by default + run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: Upload artifact + # Automatically uploads an artifact from the './_site' directory by default + uses: actions/upload-pages-artifact@v3 + + # Deployment job + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 From 2b5589664908948fac1b4fd1ffa59839618c2216 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 01:32:50 -0700 Subject: [PATCH 64/68] deployment - delete pages.yml page, add in jekyll.yml page --- .github/workflows/pages.yml | 62 ------------------------------------- 1 file changed, 62 deletions(-) delete mode 100644 .github/workflows/pages.yml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml deleted file mode 100644 index 9b2bf65..0000000 --- a/.github/workflows/pages.yml +++ /dev/null @@ -1,62 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# Sample workflow for building and deploying a Jekyll site to GitHub Pages -name: Deploy Jekyll site to Pages - -on: - push: - branches: ["main"] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: true - -jobs: - # Build job - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: - ruby-version: '3.1' # Not needed with a .ruby-version file - bundler-cache: true # runs 'bundle install' and caches installed gems automatically - cache-version: 0 # Increment this number if you need to re-download cached gems - - name: Setup Pages - id: pages - uses: actions/configure-pages@v3 - - name: Build with Jekyll - # Outputs to the './_site' directory by default - run: bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" - env: - JEKYLL_ENV: production - - name: Upload artifact - # Automatically uploads an artifact from the './_site' directory by default - uses: actions/upload-pages-artifact@v1 - - # Deployment job - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v2 \ No newline at end of file From 95f4892bc661b9d0f4248a9b8179bc07f83af72d Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 01:52:51 -0700 Subject: [PATCH 65/68] fix the quiz submit and try again buttons --- _config.yml | 4 ++++ _layouts/custom.html | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index 1a93f5a..0e8a76c 100644 --- a/_config.yml +++ b/_config.yml @@ -10,6 +10,10 @@ url: "https://katieshi413.github.io" baseurl: "/open-devsecops.github.io" search_enabled: false +include: + - assets/js/quiz.js + - assets/js/quiz-reset.js + aux_links: Github: https://github.com/open-devsecops Contribute: https://github.com/open-devsecops/open-devsecops.github.io diff --git a/_layouts/custom.html b/_layouts/custom.html index 10baff5..c338f65 100644 --- a/_layouts/custom.html +++ b/_layouts/custom.html @@ -39,12 +39,12 @@ {% if page.topic and page.chapter %} window.quizData["{{ page.topic }}-{{ page.chapter }}"] = {{ site.data.quizzes[page.topic][page.chapter] | jsonify }}; {% endif %} - // window.quizData["topic2-chapter1"] = {{ site.data.quizzes.topic2.chapter1 | jsonify }}; - // window.quizData["topic2-chapter2"] = {{ site.data.quizzes.topic2.chapter2 | jsonify }}; - - + + + + \ No newline at end of file From 96a3b70f041db6cdf339c525a014ba4f35b6998f Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 02:07:58 -0700 Subject: [PATCH 66/68] fix font slider button to appear on load --- _includes/nav_footer_custom.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/_includes/nav_footer_custom.html b/_includes/nav_footer_custom.html index 91f8058..019be17 100644 --- a/_includes/nav_footer_custom.html +++ b/_includes/nav_footer_custom.html @@ -7,7 +7,7 @@
    @@ -103,10 +103,11 @@ // Toggle image and styled text if (isVisible) { - toggleButton.innerHTML = `Font Size`; + toggleButton.innerHTML = `font size icon`; } else { toggleButton.innerHTML = `Hide`; } }); + From 98561f84c340bcc9708061f5a32b6b86b999fca4 Mon Sep 17 00:00:00 2001 From: emilychoi Date: Thu, 22 May 2025 02:15:00 -0700 Subject: [PATCH 67/68] trying to fix light/dark mode button --- _includes/nav_footer_custom.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/nav_footer_custom.html b/_includes/nav_footer_custom.html index 019be17..b4019d3 100644 --- a/_includes/nav_footer_custom.html +++ b/_includes/nav_footer_custom.html @@ -2,7 +2,7 @@
    - +
    From cabac788a07a2af8be3dd904675d8d3947a1d41d Mon Sep 17 00:00:00 2001 From: Katie Shi Date: Thu, 22 May 2025 05:02:32 -0700 Subject: [PATCH 68/68] added prev/next buttons --- _includes/nav_buttons.html | 20 + _sass/custom/layout.scss | 225 +++++++ assets/images/light-font-size.png | Bin 0 -> 23960 bytes assets/js/just-the-docs.js | 618 ++++++++++++++++++ .../chapter-1-SDLC/index.md | 6 + .../chapter-2-intro-to-devOps/index.md | 7 +- .../chapter-3-intro-to-cicd/index.md | 5 + .../chapter-4-intro-to-devsecops/index.md | 4 + .../index.md | 7 +- .../chapter-1-version-control/index.md | 7 +- .../chapter-2-understanding-git/index.md | 7 +- .../chapter-3-Intermediate-Concepts/index.md | 7 +- .../lab/git-lab-1.md | 7 +- .../chapter-4-git-best-practices/index.md | 7 +- .../index.md | 7 +- docs/course/Topic-2-Git/index.md | 5 + .../chapter-1-devsecops/index.md | 4 + .../chapter-2-cicd-core-concepts/index.md | 5 + .../chapter-3-automated-testing/index.md | 8 +- .../chapter-4-deployment/index.md | 5 + .../lab/deployment-lab-1.md | 7 +- .../chapter-4-deployment/lab/overview.md | 5 + .../chapter-5-webhooks/index.md | 5 + .../chapter-6-containerization/index.md | 5 +- .../lab/containerization-lab-1.md | 7 +- .../lab/containerization-lab-2.md | 7 +- .../lab/overview.md | 5 + .../Topic-3-DevSecOp-Fundamentals/index.md | 5 +- .../chapter-1-intro-to-cybersecurity/index.md | 7 +- .../index.md | 7 +- .../index.md | 6 +- .../lab/overview.md | 4 +- docs/course/Topic-4-Security/index.md | 5 +- .../chapter-1-Intro-to-Cloud/index.md | 5 + .../chapter-2-cloud-in-devsecops/index.md | 5 + .../index.md | 5 + docs/course/Topic-5-Cloud/index.md | 5 + .../index.md | 7 +- .../chapter-2-industry-roles/index.md | 7 +- .../Topic-6-DevSecOps-in-Industry/index.md | 4 + docs/course/index.md | 7 +- docs/lab-setup-guide/index.md | 7 +- .../topic-2-devops-lab/aws/index.md | 8 +- .../topic-2-devops-lab/index.md | 7 +- .../topic-3-devsecops-lab/aws/index.md | 7 +- .../topic-3-devsecops-lab/index.md | 7 +- docs/other/index.md | 19 +- docs/other/research/references.md | 5 +- docs/other/research/user-research.md | 5 + index.md | 6 + 50 files changed, 1119 insertions(+), 33 deletions(-) create mode 100644 _includes/nav_buttons.html create mode 100644 _sass/custom/layout.scss create mode 100644 assets/images/light-font-size.png create mode 100644 assets/js/just-the-docs.js diff --git a/_includes/nav_buttons.html b/_includes/nav_buttons.html new file mode 100644 index 0000000..dfa8932 --- /dev/null +++ b/_includes/nav_buttons.html @@ -0,0 +1,20 @@ +{% assign nav = site.data.navigation %} +{% assign current = nil %} +{% assign index = 0 %} + +{% for item in nav %} + {% if page.url == item.url %} + {% assign current = item %} + {% assign index = forloop.index0 %} + {% endif %} +{% endfor %} + +
    + {% if nav[index-1] %} + ← {{ nav[index-1].title }} + {% endif %} + + {% if nav[index+1] %} + {{ nav[index+1].title }} → + {% endif %} +
    diff --git a/_sass/custom/layout.scss b/_sass/custom/layout.scss new file mode 100644 index 0000000..66fb821 --- /dev/null +++ b/_sass/custom/layout.scss @@ -0,0 +1,225 @@ +// The basic two column layout + +.side-bar { + z-index: 0; + display: flex; + flex-wrap: wrap; + background-color: $sidebar-color; + + @include mq(md) { + flex-flow: column nowrap; + position: fixed; + width: $nav-width-md; + height: 100%; + border-right: $border $border-color; + align-items: flex-end; + } + + @include mq(lg) { + width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width}); + min-width: $nav-width; + } + + & + .main { + @include mq(md) { + margin-left: $nav-width-md; + } + + @include mq(lg) { + // stylelint-disable function-name-case + // disable for Max(), we want to use the CSS max() function + margin-left: Max( + #{$nav-width}, + calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width}) + ); + // stylelint-enable function-name-case + } + + .main-header { + display: none; + background-color: $sidebar-color; + + @include mq(md) { + display: flex; + background-color: $body-background-color; + } + + &.nav-open { + display: block; + + @include mq(md) { + display: flex; + } + } + } + } + } + + .main { + margin: auto; + + @include mq(md) { + position: relative; + max-width: $content-width; + } + } + + .main-content-wrap { + padding-top: $gutter-spacing-sm; + padding-bottom: $gutter-spacing-sm; + + @include container; + + @include mq(md) { + padding-top: $gutter-spacing; + padding-bottom: $gutter-spacing; + } + } + + .main-header { + z-index: 0; + border-bottom: $border $border-color; + + @include mq(md) { + display: flex; + justify-content: space-between; + height: $header-height; + } + } + + .site-nav, + .site-header, + .site-footer { + width: 100%; + + @include mq(lg) { + width: $nav-width; + } + } + + .site-nav { + display: none; + + &.nav-open { + display: block; + } + + @include mq(md) { + display: block; + padding-top: $sp-8; + padding-bottom: $gutter-spacing-sm; + overflow-y: auto; + flex: 1 1 auto; + } + } + + .site-header { + display: flex; + min-height: $header-height; + align-items: center; + + @include mq(md) { + height: $header-height; + max-height: $header-height; + border-bottom: $border $border-color; + } + } + + .site-title { + flex-grow: 1; + display: flex; + height: 100%; + align-items: center; + padding-top: $sp-3; + padding-bottom: $sp-3; + color: $body-heading-color; + + @include container; + + @include fs-6; + + @include mq(md) { + padding-top: $sp-2; + padding-bottom: $sp-2; + } + } + + @if variable-exists(logo) { + .site-logo { + width: 100%; + height: 100%; + background-image: url($logo); + background-repeat: no-repeat; + background-position: left center; + background-size: contain; + } + } + + .site-button { + display: flex; + height: 100%; + padding: $gutter-spacing-sm; + align-items: center; + } + + @include mq(md) { + .site-header .site-button { + display: none; + } + } + + .site-title:hover { + background-image: linear-gradient( + -90deg, + rgba($feedback-color, 1) 0%, + rgba($feedback-color, 0.8) 80%, + rgba($feedback-color, 0) 100% + ); + } + + .site-button:hover { + background-image: linear-gradient( + -90deg, + rgba($feedback-color, 1) 0%, + rgba($feedback-color, 0.8) 100% + ); + } + + // stylelint-disable selector-max-type + + body { + position: relative; + padding-bottom: $sp-10; + overflow-y: scroll; + + @include mq(md) { + position: static; + padding-bottom: 0; + } + } + + // stylelint-enable selector-max-type + + .site-footer { + position: absolute; + bottom: 0; + left: 0; + padding-top: $sp-4; + padding-bottom: $sp-4; + color: $grey-dk-000; + + @include container; + + @include fs-2; + + @include mq(md) { + position: static; + justify-self: end; + } + } + + .icon { + width: $sp-5; + height: $sp-5; + color: $link-color; + } \ No newline at end of file diff --git a/assets/images/light-font-size.png b/assets/images/light-font-size.png new file mode 100644 index 0000000000000000000000000000000000000000..95aaec9b52cc4c52b3e90044e10140955cd82a72 GIT binary patch literal 23960 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 element is assumed to include the following stylesheets: +// - a to /assets/css/just-the-docs-head-nav.css, +// with id 'jtd-head-nav-stylesheet' +// - a