요약

완료됨

이 모듈에서는 DevSecOps 원칙 및 사례를 통해 소프트웨어 개발 수명 주기의 모든 단계에 보안을 통합하는 방법을 알아봅니다. 릴리스 전에 보안을 최종 검사점으로 취급하는 기존의 접근 방식은 병목 상태를 만들고 비용을 증가시키고 프로덕션까지 중요한 취약성을 포착하지 못하는 경우가 많습니다. 조직은 보안을 그대로 두고 모든 사람의 책임으로 전환하여 개발 속도를 유지하면서 보안 상태를 크게 개선할 수 있습니다.

SQL 삽입 공격

SQL 삽입이 가장 위험하고 널리 퍼진 웹 애플리케이션 취약성 중 하나로 남아 있는 방법을 알아보았습니다.

  • 공격 메커니즘: 공격자는 애플리케이션 입력에 악성 SQL 코드를 삽입하여 데이터베이스 쿼리를 조작하기 위한 입력 유효성 검사가 부족합니다.
  • 잠재적 손상: 공격이 성공하면 인증을 바이패스하거나, 전체 데이터베이스 콘텐츠를 검색하거나, 레코드를 수정하거나 삭제하거나, 운영 체제 명령을 실행하거나, 서비스 거부를 일으킬 수 있습니다.
  • 광범위한 영향: SQL 삽입은 MySQL, Oracle Database, Microsoft SQL Server, PostgreSQL 및 SQLite를 비롯한 모든 주요 데이터베이스 시스템에 영향을 줍니다.
  • 방지 필수 사항: 매개 변수가 있는 쿼리를 사용하고, 입력의 유효성을 검사 및 삭제하고, 최소 권한 원칙을 적용하고, 정기적인 보안 테스트를 수행하고, 데이터베이스 활동을 모니터링하여 SQL 삽입으로부터 보호합니다.

DevSecOps 원칙

DevSecOps가 장애물에서 인에이블러로 보안을 변환하는 방법을 알아봅니다.

  • 클라우드 애플리케이션의 보안 격차: 많은 애플리케이션에는 미사용 데이터와 전송 중인 데이터에 대한 암호화 간격이 있으며 HTTP 보안 헤더와 같은 적절한 세션 보호 메커니즘이 부족합니다.
  • 전통적인 문제: 기존의 접근 방식은 개발 주기 종료 시 예기치 않은 작업을 만들어 내며, 고비용의 재작업, 릴리스 프로세스의 병목 현상 및 보안 우려 사항이 낮은 우선 순위를 갖게 되는 문제를 야기합니다.
  • DevSecOps 솔루션: 개발 초기부터 보안을 통합하여 개발, 운영 및 보안 팀 전체에서 공동의 책임을 맡게 합니다.
  • 확장된 보안 범위: 기존 액세스 제어 및 경계 보호 외에도 DevSecOps는 리포지토리, 빌드 서버, 아티팩트 스토리지, 배포 도구, 코드로서의 인프라, 구성 관리 및 비밀 관리를 비롯한 전체 파이프라인을 보호합니다.
  • 코드로서의 보안: 인프라 보안(IaC 검사, 코드별 정책, 규정 준수 검사) 및 애플리케이션 보안(SAST, DAST, SCA, 컨테이너 검사)을 모두 자동화하여 지속적인 보안 유효성 검사를 사용하도록 설정합니다.

DevOps 파이프라인 보안

보안 파이프라인이 중요한 보안 기능을 사용하여 표준 CI/CD를 확장하는 방법을 조사했습니다.

  • 보안 승인을 가진 패키지 관리: 타사 구성 요소를 코드베이스에 허용하기 전에 패키지를 검사하고, 라이선스를 검토하고, 종속성을 분석하고, 새로운 보안 문제를 지속적으로 모니터링하는 승인 워크플로를 구현합니다.
  • 소스 코드 보안 검사: SAST(정적 애플리케이션 보안 테스트)를 배포하여 코드를 실행하지 않고 분석하고, 자격 증명 노출을 방지하기 위한 비밀 검사 및 코드 품질 분석을 배포하여 취약성으로 이어지는 문제를 식별합니다.
  • 검색 타이밍: 빌드 완료 후와 테스트 및 배포 전에 보안 검사를 실행하여 수정 비용이 가장 낮은 경우 조기 검색을 제공합니다.
  • 도구 통합: 파이프라인에 직접 통합된 GitHub CodeQL, SonarQube, Checkmarx, Veracode 및 Microsoft 보안 코드 분석과 같은 도구를 사용합니다.

주요 검증 포인트

개발 프로세스 전체에서 중요한 보안 검사점을 발견했습니다.

  • IDE 수준 보안 검사: 코드 작성 중에 실시간 피드백, 즉각적인 학습 기회 및 커밋 전 수정으로 취약성을 파악하여 피드백 루프를 초로 줄입니다.
  • 리포지토리 커밋 컨트롤: 변경 내용을 병합하기 전에 코드 검토, 감사 내역에 대한 작업 항목 링크 및 성공적인 CI 빌드가 필요한 Git 분기 정책을 구현합니다.
  • 코드 검토 요구 사항: 입력 유효성 검사, 인증 및 권한 부여 메커니즘, 중요한 데이터 처리, 보안 라이브러리 사용 및 하드 코딩된 비밀이 없는 등의 보안 문제를 수동으로 확인합니다.
  • 끌어오기 요청에서 자동화된 검사: 끌어오기 요청 인터페이스에 직접 표시되는 결과를 사용하여 정적 분석, 종속성 취약성 검사, 비밀 검색 및 코드 품질 분석을 실행합니다.
  • 점진적 구현: 완성도 높은 제품의 경우 유효성 검사점을 점진적으로 채택하여 영향력이 높은 검사점의 우선 순위를 지정하고 시간이 지남에 따라 보안 문화를 구축합니다.

지속적인 보안 유효성 검사

지속적인 유효성 검사에서 소프트웨어 수명 주기 동안 보안을 유지하는 방법을 알아보았습니다.

  • 타사 구성 요소 위험: 최신 애플리케이션은 오픈 소스 및 타사 패키지에 크게 의존하여 보안 취약성, 라이선스 준수 문제 및 공급망 공격 벡터를 도입합니다.
  • 조기 검색 값: 개발 중에 취약성을 찾는 데는 프로덕션 환경에서 수정하는 것보다 10-100배 적은 비용이 들기 때문에 자동화된 스캔이 경제적으로 중요합니다.
  • 정적 코드 분석: SonarQube, Visual Studio Code Analysis, Checkmarx, BinSkim 및 언어별 분석기와 같은 도구를 사용하여 코드가 보안 및 유지 관리 규칙을 따르도록 합니다.
  • 취약성 검사: Mend(WhiteSource), GitHub Dependabot, Snyk 및 Azure Artifacts와 같은 도구를 사용하여 종속성에서 알려진 취약성을 자동으로 검색하여 위험을 지속적으로 모니터링하고 우선 순위를 지정하며 수정 지침을 제공합니다.
  • 소프트웨어 컴퍼지션 분석 이점: 모든 종속성에 대한 포괄적인 가시성을 확보하고, 버전을 추적하고, 연결되지 않은 패키지를 식별하고, CVSS 점수로 위험 우선 순위를 지정하고, 지속적인 모니터링을 유지하고, 규정 준수 설명서를 생성합니다.

위협 모델링 방법론

보안 위험을 이해하기 위한 구조적 접근 방법으로 위협 모델링 을 살펴보했습니다.

  • 5단계 프로세스: 보안 요구 사항(기밀성, 무결성, 가용성, 규정 준수)을 정의하고, 애플리케이션 다이어그램(구성 요소, 데이터 흐름, 보안 경계)을 만들고, STRIDE 방법론을 사용하여 위협을 식별하고, 완화 전략(제거, 방지, 감지, 대응)을 개발하고, 완화가 효과적인지 확인합니다.
  • STRIDE 방법론: ID 스푸핑, 데이터 변조, 작업 거부, 정보 공개, 서비스 거부, 권한 상승 등 6가지 범주의 위협을 체계적으로 고려합니다.
  • 일반적인 위협 및 완화: 매개 변수가 있는 쿼리 및 입력 유효성 검사를 사용하여 SQL 삽입을 처리하고, 보안 세션 관리 및 HTTPS를 사용하여 세션 하이재킹을 방지하고, TLS 및 인증서 고정을 통한 중간 공격으로부터 보호하고, 클라우드 보호 서비스 및 속도 제한으로 DDoS를 완화합니다.
  • 수명 주기 통합: 초기 디자인 중에 포괄적인 위협 모델링을 수행하고, 중요한 새 기능을 반복하고, 주요 변경 없이도 정기적인 검토를 수행하고, 보안 인시던트 후 업데이트하고, 시간이 지남에 따라 위험을 점진적으로 줄입니다.
  • Microsoft 위협 모델링 도구: 이 무료 도구를 사용하여 표준 표기법으로 시스템 구성 요소를 시각화하고, 시스템 구조를 기반으로 잠재적 위협을 자동으로 생성하고, 완화 결정을 문서화하고, 구현 상태를 추적하고, Azure DevOps와 통합할 수 있습니다.

CodeQL 자동화된 보안 분석

GitHub CodeQL을 통해 정교한 자동화된 보안 분석을 가능하게 하는 방법을 알아보았습니다.

  • 의미 체계 코드 분석: CodeQL은 구문 트리, 제어 흐름 그래프 및 데이터 흐름 경로를 캡처하는 쿼리 가능한 데이터베이스로 변환하여 코드를 데이터로 처리합니다. 이를 통해 패턴 일치가 아닌 코드 컨텍스트를 이해하는 정확한 취약성 검색이 가능합니다.
  • 3단계 분석: 코드의 구조를 나타내는 CodeQL 데이터베이스를 만들고, 데이터베이스에 대한 쿼리를 실행하여 보안 문제를 찾고, 우선 순위 지정, 컨텍스트 정보 및 수정 지침으로 결과를 해석합니다.
  • CodeQL 쿼리 언어: OWASP 상위 10개 취약성 및 CWE 범주에 대한 광범위한 표준 쿼리 라이브러리를 사용하여 찾는 방법 대신 찾을 항목을 설명하는 개체 지향 논리 프로그래밍을 사용하여 선언적 쿼리를 작성합니다.
  • GitHub 통합: 한 번의 클릭으로 코드 검색을 사용하도록 설정하고, 취약한 코드 줄을 표시하는 끌어오기 요청에서 인라인 주석을 수신하고, 병합하기 전에 통과해야 하는 필수 검사로 CodeQL을 구성하고, 자세한 설명이 포함된 보안 탭에서 모든 결과를 확인합니다.
  • CI/CD 파이프라인 통합: 명령줄 인터페이스를 통해 GitHub Actions, Azure Pipelines, Jenkins, GitLab CI/CD, CircleCI 및 사용자 지정 시스템에서 CodeQL을 사용하여 심각도가 높은 취약성이 검색될 때 빌드에 실패하는 보안 게이트를 구성합니다.
  • 개발 도구: 구문 강조 표시, 자동 완성, 로컬 분석 및 디버깅 지원을 제공하는 CodeQL 확장을 사용하여 Visual Studio Code에서 쿼리를 작성하고 테스트합니다.

주요 내용

조직에서 DevSecOps를 구현할 때 다음 필수 원칙을 기억하세요.

보안은 모든 사람의 책임입니다. 보안이 전적으로 보안 팀에 속한다는 사고 방식을 넘어선다. 개발자, 운영 엔지니어, 테스터 및 비즈니스 관련자는 모두 애플리케이션 보안에 기여합니다. 보안이 별도의 함수가 아닌 모든 사람의 일상 업무의 일부가 되면 보안 관행이 기본값인 문화권을 만듭니다.

보안을 왼쪽으로 이동: 가능한 한 초기 단계에서 보안 문제를 해결합니다. 개발 중에 취약성을 찾고 수정하는 데 드는 비용은 프로덕션 환경에서 수정하는 것보다 훨씬 적으며, 종종 10~100배 더 적습니다. 보안 검사를 IDE, 코드 검토 프로세스 및 CI 파이프라인에 통합하면 가장 쉽고 저렴한 문제를 해결할 수 있습니다.

보안 유효성 검사 자동화: 수동 보안 검토는 최신 릴리스 주기로 확장되지 않습니다. 정적 코드 분석, 종속성 취약성 검사, 비밀 검색 및 코드 품질에 대한 보안 검사를 자동화합니다. Automation은 개발 속도를 늦추지 않고 모든 커밋에 대해 일관된 보안 유효성 검사를 제공합니다.

지속적으로 유효성을 검사합니다. 보안은 릴리스 전에 일회성 게이트가 아닙니다. 개발자의 IDE, 코드 검토 중, CI 빌드, 배포 전, 프로덕션 등 여러 단계에서 보안 유효성 검사를 구현합니다. 지속적인 유효성 검사는 문제를 발견할 수 있는 여러 기회를 제공하고 심층 방어를 제공합니다.

위협 모델링을 사전에 사용합니다. 보안 인시던트가 위협에 대해 생각할 때까지 기다리지 마세요. 초기 디자인 중 및 중요한 기능을 추가할 때 구조적 위협 모델링을 사용합니다. STRIDE 방법론은 비보안 전문가가 코드를 작성하기 전에 위협을 식별하고 완화를 계획하기 위해 적용할 수 있는 체계적인 접근 방식을 제공합니다.

자동화된 분석 도구 활용: CodeQL, SonarQube 및 Snyk와 같은 도구를 사용하면 수동으로 수행하는 것이 실용적이지 않은 정교한 보안 분석을 사용할 수 있습니다. 이러한 도구는 코드 의미 체계를 이해하고, 데이터 흐름을 추적하고, 큰 코드베이스에서 복잡한 취약성을 찾습니다. 이를 파이프라인에 통합하여 고급 보안 분석 루틴을 만듭니다.

종속성 추적 및 관리: 최신 애플리케이션은 타사 구성 요소에 크게 의존합니다. 자동화된 종속성 검사는 종속성의 알려진 취약성 및 라이선스 준수 문제를 식별합니다. 소프트웨어 컴퍼지션 분석은 공급망에 대한 가시성을 제공하고 새로운 취약성이 공개될 때 신속하게 대응하는 데 도움이 됩니다.

문서 보안 결정: 위협 모델링 설명서, 보안 요구 사항 및 자동화된 도구 출력을 사용하여 보안 문제를 해결하는 방법을 보여 주는 감사 내역을 만듭니다. 이 설명서는 실사를 보여 주며, 새 팀 구성원이 보안 컨텍스트를 이해하는 데 도움이 되며, 규정 준수 요구 사항에 대한 증거를 제공합니다.

속도 및 보안 균형: DevSecOps는 보안 검사를 추가하기 위해 개발 속도를 늦추는 것이 아니라 보안을 매우 효율적으로 통합하여 속도를 저해하지 않습니다. 자동화된 도구, 명확한 정책 및 일반 워크플로에 기본 제공되는 보안을 통해 팀은 보안을 손상시키지 않고 빠르게 이동할 수 있습니다.

반복 및 개선: 강력한 보안 사례부터 시작하여 시간이 지남에 따라 확장합니다. 모든 보안 제어를 즉시 구현할 필요는 없습니다. 자동화된 종속성 검사로 시작하거나 요청 보안 검사를 끌어오고, 값을 시연하고, 점점 더 정교한 유효성 검사 지점을 추가합니다. 보안의 지속적인 개선은 DevOps 자체의 반복적인 접근 방식을 반영합니다.

이러한 DevSecOps 사례를 적용하여 설계에 따라 신속하게 전달되고 안전한 소프트웨어를 만듭니다. 보안은 장애물이 아닌 인에이블러가 되므로 조직에서 자신 있게 혁신할 수 있습니다.

자세히 알아보기