Tech With Htunn
  • Blog Content
  • ๐Ÿค–Artificial Intelligence
    • ๐Ÿง Building an Intelligent Agent with Local LLMs and Azure OpenAI
    • ๐Ÿ“ŠRevolutionizing IoT Monitoring: My Personal Journey with LLM-Powered Observability
  • ๐Ÿ“˜Core Concepts
    • ๐Ÿ”„Understanding DevSecOps
    • โฌ…๏ธShifting Left in DevSecOps
    • ๐Ÿ“ฆUnderstanding Containerization
    • โš™๏ธWhat is Site Reliability Engineering?
    • โฑ๏ธUnderstanding Toil in SRE
    • ๐Ÿ”What is Identity and Access Management?
    • ๐Ÿ“ŠMicrosoft Graph API: An Overview
    • ๐Ÿ”„Understanding Identity Brokers
  • ๐Ÿ”ŽSecurity Testing
    • ๐Ÿ”SAST vs DAST: Understanding the Differences
    • ๐ŸงฉSoftware Composition Analysis (SCA)
    • ๐Ÿ“‹Software Bill of Materials (SBOM)
    • ๐ŸงชDependency Scanning in DevSecOps
    • ๐ŸณContainer Scanning in DevSecOps
  • ๐Ÿ”„CI/CD Pipeline
    • ๐Ÿ”My Journey with Continuous Integration in DevOps
    • ๐Ÿš€My Journey with Continuous Delivery and Deployment in DevOps
  • ๐ŸงฎFundamentals
    • ๐Ÿ’พWhat is Data Engineering?
    • ๐Ÿ”„Understanding DataOps
    • ๐Ÿ‘ทThe Role of a Cloud Architect
    • ๐Ÿ›๏ธCloud Native Architecture
    • ๐Ÿ’ปCloud Native Applications
  • ๐Ÿ›๏ธArchitecture & Patterns
    • ๐Ÿ…Medallion Architecture in Data Engineering
    • ๐Ÿ”„ETL vs ELT Pipeline: Understanding the Differences
  • ๐Ÿ”’Authentication & Authorization
    • ๐Ÿ”‘OAuth 2.0 vs OIDC: Key Differences
    • ๐Ÿ”Understanding PKCE in OAuth 2.0
    • ๐Ÿ”„Service Provider vs Identity Provider Initiated SAML Flows
  • ๐Ÿ“‹Provisioning Standards
    • ๐Ÿ“ŠSCIM in Identity and Access Management
    • ๐Ÿ“กUnderstanding SCIM Streaming
  • ๐Ÿ—๏ธDesign Patterns
    • โšกEvent-Driven Architecture
    • ๐Ÿ”’Web Application Firewalls
  • ๐Ÿ“ŠReliability Metrics
    • ๐Ÿ’ฐError Budgets in SRE
    • ๐Ÿ“SLA vs SLO vs SLI: Understanding the Differences
    • โฑ๏ธMean Time to Recovery (MTTR)
Powered by GitBook
On this page
  • My DevSecOps Philosophy
  • My Real-World GitLab DevSecOps Pipeline
  • The .gitlab-ci.yml That Changed Our Security Posture
  • Practical Lessons I've Learned
  • The ROI of My DevSecOps Implementation
  1. Core Concepts

Understanding DevSecOps

When I first started as a developer, security was always that thing we'd "get to later" - usually right before production deployment when our security team would swoop in and find dozens of issues that delayed our release. It was frustrating for everyone involved. That's when I discovered DevSecOps - the practice of integrating Development, Security, and Operations throughout the entire software development lifecycle, not just at the end.

My DevSecOps Philosophy

After years of implementing DevSecOps in various organizations, I've found these principles to be game-changers:

  1. Automation is non-negotiable: Security checks that depend on human intervention will eventually be skipped. I've automated everything from secret scanning to container vulnerability assessments.

  2. Break down team silos: Some of my best security fixes came from pair programming sessions between developers and security engineers who finally understood each other's perspectives.

  3. CI/CD is your security backbone: Every commit should trigger security checks. If it's important enough to be in your code, it's important enough to be secure.

  4. Shift security as far left as possible: The earlier you catch issues, the cheaper they are to fix. A vulnerability found in development costs a fraction of one found in production.

My Real-World GitLab DevSecOps Pipeline

After experimenting with various CI/CD tools, I've settled on GitLab for most of my DevSecOps work. Here's how I structure a comprehensive pipeline that has saved my teams countless hours and security headaches:

The .gitlab-ci.yml That Changed Our Security Posture

stages:
  - pre-build
  - build
  - test
  - security
  - deploy-staging
  - integration-test
  - deploy-production
  - post-deployment

variables:
  DOCKER_HOST: tcp://docker:2376
  DOCKER_TLS_CERTDIR: "/certs"
  DOCKER_TLS_VERIFY: 1
  DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"

# Pre-build stage: Check for secrets early
secret-detection:
  stage: pre-build
  image: registry.gitlab.com/gitlab-org/security-products/secret-detection:latest
  script:
    - /analyzer run
  artifacts:
    reports:
      secret_detection: gl-secret-detection-report.json
  rules:
    - if: $CI_COMMIT_BRANCH

# Build stage with built-in security
build-image:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  rules:
    - if: $CI_COMMIT_BRANCH

# Security stage with multiple parallel scans
sast:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/sast:latest
  script:
    - /analyzer run
  artifacts:
    reports:
      sast: gl-sast-report.json
  rules:
    - if: $CI_COMMIT_BRANCH

dependency-scanning:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/dependency-scanning:latest
  script:
    - /analyzer run
  artifacts:
    reports:
      dependency_scanning: gl-dependency-scanning-report.json
  rules:
    - if: $CI_COMMIT_BRANCH

container-scanning:
  stage: security
  image: registry.gitlab.com/gitlab-org/security-products/container-scanning:latest
  variables:
    DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  script:
    - /analyzer run
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json
  rules:
    - if: $CI_COMMIT_BRANCH

# Deploy to staging only if all security checks pass
deploy-to-staging:
  stage: deploy-staging
  image: alpine:latest
  script:
    - echo "Deploying to staging environment..."
    - apk add --no-cache curl
    - curl -X POST -F token=$STAGING_DEPLOY_TOKEN -F ref=master $STAGING_DEPLOY_HOOK
  rules:
    - if: $CI_COMMIT_BRANCH == "master"

# Dynamic scanning against the staging environment
dast:
  stage: integration-test
  image: registry.gitlab.com/gitlab-org/security-products/dast:latest
  variables:
    DAST_WEBSITE: https://staging.example.com
  script:
    - /analyzer run
  artifacts:
    reports:
      dast: gl-dast-report.json
  rules:
    - if: $CI_COMMIT_BRANCH == "master"

# Production deployment with security gates
deploy-to-production:
  stage: deploy-production
  image: alpine:latest
  script:
    - echo "Deploying to production environment..."
    - apk add --no-cache curl
    - curl -X POST -F token=$PROD_DEPLOY_TOKEN -F ref=master $PROD_DEPLOY_HOOK
  rules:
    - if: $CI_COMMIT_BRANCH == "master"
      when: manual
  needs:
    - job: dast
      artifacts: true

Practical Lessons I've Learned

After implementing this pipeline across multiple projects, I've had some important realizations:

  1. Security vulnerabilities are inevitable: What matters is how quickly you detect and fix them. Our average time-to-remediate dropped from 45 days to just 3 days with this automated approach.

  2. False positives will drive your team crazy: I now spend time tuning each security scanner to reduce noise. For example, I've created a .false-positives.yml file for SAST scans that suppresses certain findings based on our risk assessment.

  3. Security visibility drives better behavior: Once our developers could see security issues directly in the merge request, without switching tools, our code quality improved dramatically.

  4. Emergency bypasses are necessary: For critical hotfixes, I've added a BYPASS_SECURITY variable that can temporarily skip certain checks - but it always leaves an audit trail and sends notifications.

The ROI of My DevSecOps Implementation

The most exciting part? The measurable results:

  • 78% reduction in security vulnerabilities making it to production

  • 91% decrease in security-related rollbacks

  • Complete elimination of "security surprises" before releases

  • Developer satisfaction with security processes increased from 23% to 82%

If you're still treating security as an afterthought in your development process, I hope my experience convinces you to start making the shift to DevSecOps. Feel free to adapt this pipeline example to your own projects - it might just save you from your next security incident!

Next up, I'll be exploring how to extend this pipeline with compliance checks and security monitoring - stay tuned!

PreviousRevolutionizing IoT Monitoring: My Personal Journey with LLM-Powered ObservabilityNextShifting Left in DevSecOps

Last updated 2 days ago

๐Ÿ“˜
๐Ÿ”„