Microservices Security in Action [마이크로서비스 아키텍처 보안 설계와 구현]
- 원서명Microservices Security in Action: Design secure network and API endpoint security for Microservices applications, with examples using Java, Kubernetes, and Istio (ISBN 9781617295959)
- 지은이프라바스 시리와데나(Prabath Siriwardena), 누완 디아스(Nuwan Dias)
- 옮긴이박상영
- ISBN : 9791161755670
- 48,000원
- 2021년 09월 29일 펴냄
- 페이퍼백 | 788쪽 | 188*235mm
- 시리즈 : 해킹과 보안
책 소개
요약
마이크로서비스 아키텍처에서 발생할 수 있는 다양한 보안 이슈를 살펴보고 예제 코드와 실습을 활용해 해당 이슈를 해결하는 데 필요한 지식을 전달한다. 책을 다 읽을 때쯤이면 마이크로서비스 보안을 이해하고 안전한 설계와 구현에 필요한 지식까지 습득할 수 있을 것이다.
추천의 글
"마이크로서비스 아키텍처 보안 과제와 해결 방안에 대한 완벽한 가이드를 제공한다."
“이해하기 쉬운 내용은 아니지만, 적절한 주제를 순서에 맞게 다루는 필수적인 지침이다.”
“인터넷에 연결된 서비스를 보호하는데 도움을 줄 수 있는 보안 관련 예제 코드와 상세한 설명이 가득하다.”
“마이크로서비스 아키텍처 패턴을 사용해 소프트웨어를 개발하는 모든 개발자와 설계자의 책상에 있어야 할 책이다.”
이 책에서 다루는 내용
◆ 마이크로서비스 보안 개념
◆ API 게이트웨이로 경계 지점 보호
◆ 도커, 쿠버네티스, 이스티오 사용과 배포
◆ 코드 수준의 보안 점검
◆ HTTP, gRPC, 카프카 통신
이 책의 대상 독자
마이크로서비스 설계 원칙에 정통하고 자바에 대한 기본 지식이 있는 개발자를 위한 책이다. 자바 개발자가 아니더라도 C++나 C# 같은 객체지향 프로그래밍 언어에 익숙하고 기본적인 프로그래밍 구조를 이해하고 있다면 이 책에서 많은 것을 얻을 수 있다. 온라인상에 일부 관련 문서와 블로그 게시물이 존재하지만 이 책은 모든 걸 명확하고 따르기 쉬운 형식으로 모아뒀기 때문에 마이크로서비스 보안을 이해하려는 모든 사람에게 도움을 줄 수 있다.
이 책의 구성
이 책은 5부 13장으로 구성돼 있다. 1부는 마이크로서비스 보안의 기본사항을 설명한다.
◆ 1장은 마이크로서비스 보안이 어려운 이유와 마이크로서비스 환경을 보호하기 위한 핵심 원칙을 설명한다.
◆ 2장은 스프링 부트로 첫 번째 마이크로서비스를 빌드하고 OAuth 2.0으로 보호하는 방법을 설명하며 OAuth 2.0 토큰 발급자를 설정하는 방법까지 다룬다.
2부는 일반적인 마이크로서비스 환경의 경계 지점이나 진입점에서 마이크로서비스를 보호하는 방법을 설명한다.
◆ 3장은 마이크로서비스 소비자 환경을 살펴보고 Zuul API 게이트웨이 뒷단의 스프링 부트 마이크로서비스를 배포하는 방법을 설명하며 Zuul API 게이트웨이에 OAuth 2.0 기반 보안을 적용하는 방법까지 다룬다.
◆ 4장은 앵귤러(Angular)로 단일 페이지 애플리케이션(SPA)를 개발하는 방법을 설명하며 OIDC(OpenID Connect)로 단일 페이지 애플리케이션을 보호하는 방법까지 다룬다.
◆ 5장은 Zuul API 게이트웨이에 트래픽 제한, 모니터링 및 접근 제어를 적용해 4장에서 구축한 사례를 확장하는 방법을 설명한다.
3부는 클라이언트 애플리케이션의 요청이 경계 지점의 보안 정책을 통과해 마이크로서비스 그룹 내부로 들어간 다음 마이크로서비스 간의 상호작용을 보호하는 프로세스를 설명한다.
◆ 6장은 mTLS(상호 TLS)로 HTTP 프로토콜 기반 마이크로서비스 간 통신을 보호하는 방법을 설명한다.
◆ 7장은 JWT(JSON Web Token)를 사용해 마이크로서비스 간 컨텍스트 데이터(예: 최종 사용자 컨텍스트)를 공유하는 방법을 설명한다.
◆ 8장은 mTLS와 JWT를 사용하는 gRPC 프레임워크 기반 마이크로서비스 간 통신을 보호하는 방법을 설명한다.
◆ 9장은 반응형 마이크로서비스를 보호하는 방법을 설명하며 카프카를 메시지 브로커로 설치하는 방법과 카프카 토픽에 접근 제어 정책을 적용하는 방법까지 다룬다.
4부는 컨테이너화한 환경에서 마이크로서비스를 배포하고 보호하는 방법을 설명한다.
◆ 10장은 도커에 마이크로서비스를 배포하고 mTLS와 JWT로 마이크로서비스 간 상호작용을 보호하는 방법을 설명하며 도커가 내장하고 있는 몇 가지 보안 기능을 다룬다.
◆ 11장은 쿠버네티스에서 도커 컨테이너로 마이크로서비스를 배포하고 mTLS와 JWT로 서비스 간 통신을 보호하는 방법을 설명한다.
◆ 12장은 이스티오 서비스 메시로 마이크로서비스의 보안 처리 부담을 전가하는 방법을 설명한다.
5부는 개발 프로세스에서 보안 점검을 수행하는 방법을 설명한다.
◆ 13장은 소나큐브, 젠킨스 및 OWASP ZAP으로 마이크로서비스를 대상으로 한 보안 점검을 자동화하는 방법을 설명한다.
목차
목차
- 1부. 개요
- 1장. 마이크로서비스 보안의 특징
- 1.1 모놀리식 애플리케이션의 보안 동작 원리
- 1.2 마이크로서비스 보안의 어려움
- 1.2.1 공격 노출 지점이 넓어질수록 공격받을 위험도 증가
- 1.2.2 보안 검증 지점 분리는 성능 저하를 초래
- 1.2.3 배포 복잡성으로 인한 마이크로서비스 간 초기 신뢰 설정 어려움
- 1.2.4 다양한 마이크로서비스 간 통신 추적의 어려움
- 1.2.5 컨테이너의 불변성으로 인한 자격증명과 접근 제어 정책 유지의 어려움
- 1.2.6 마이크로서비스의 분산된 특성으로 인한 사용자 컨텍스트 공유의 어려움
- 1.2.7 다중 개발 언어 지원 아키텍처는 개발 팀에 더 많은 보안 전문지식을 요구
- 1.3 핵심 보안 원칙
- 1.3.1 인증은 스푸핑으로부터 시스템을 보호
- 1.3.2 무결성 검증으로 데이터 변조에서 시스템을 보호
- 1.3.3 부인방지: 한 번의 서명으로 영구적으로 기록하자
- 1.3.4 기밀성은 의도하지 않은 정보 노출에서 시스템을 보호
- 1.3.5 가용성: 어떠한 상황에서도 시스템을 가동 중인 상태로 유지
- 1.3.6 인가: 권한 범위를 넘어선 행위 차단
- 1.4 외부 경계 보안
- 1.4.1 마이크로서비스 그룹에서 API 게이트웨이의 역할
- 1.4.2 경계 지점에서의 인증
- 1.4.3 경계 지점 인가 절차
- 1.4.4 클라이언트 애플리케이션/사용자 컨텍스트를 상위 마이크로서비스로 전달
- 1.5 서비스 간 통신 보안
- 1.5.1 서비스 간 인증
- 1.5.2 서비스 수준 인가
- 1.5.3 마이크로서비스 간 사용자 컨텍스트 전파
- 1.5.4 신뢰 경계 간 연결
- 요약
- 2장. 마이크로서비스 보안을 위한 첫 단계
- 2.1 첫 번째 마이크로서비스 제작
- 2.1.1 필요 소프트웨어 다운로드 및 설치
- 2.1.2 예제 코드 저장소 복사본 생성
- 2.1.3 주문 처리 마이크로서비스 컴파일
- 2.1.4 주문 처리 마이크로서비스 접근
- 2.1.5 소스 코드 디렉토리에는 어떤 것이 있는가?
- 2.1.6 마이크로서비스의 소스 코드 이해
- 2.2 OAuth 2.0 서버 준비
- 2.2.1 인가 서버와의 통신
- 2.2.2 OAuth 20 인가 서버 실행
- 2.2.3 OAuth 20 인가 서버에서 액세스 토큰 획득
- 2.2.4 액세스 토큰 응답 이해하기
- 2.3 OAuth 2.0을 사용한 마이크로서비스 보안
- 2.3.1 OAuth 20 기반 보안
- 2.3.2 예제 코드 실행
- 2.4 클라이언트 애플리케이션에서 보안이 적용된 마이크로서비스 호출
- 2.5 OAuth 2.0 권한 범위를 사용한 서비스 수준 인가 수행
- 2.5.1 인가 서버에서 범위가 지정된 액세스 토큰 획득
- 2.5.2 OAuth 20 범위를 사용한 마이크로서비스 접근 보호
- 요약
- 2부. 외부 경계 보안
- 3장. API 게이트웨이를 사용한 클라이언트와 내부 시스템 사이의 트래픽 보안
- 3.1 마이크로서비스 그룹에서 API 게이트웨이의 필요성
- 3.1.1 마이크로서비스에서 보안 영역 분리
- 3.1.2 소비를 더 어렵게 하는 마이크로서비스 그룹의 고유한 복잡성
- 3.1.3 외부에 노출하지 않는 게 바람직한 마이크로서비스의 특성
- 3.2 외부 경계 보안
- 3.2.1 마이크로서비스 소비자 환경 이해
- 3.2.2 접근 위임
- 3.2.3 API 보호를 위해 Basic 인증을 사용해선 안 되는 이유
- 3.2.4 API 보호를 위해 공통 전송 계층 보안을 사용해선 안 되는 이유
- 3.2.5 OAuth 20을 사용해야 하는 이유
- 3.3 Zuul API 게이트웨이 설치
- 3.3.1 주문 처리 마이크로서비스 컴파일 및 실행
- 3.3.2 Zuul 프록시 컴파일 및 실행
- 3.3.3 Zuul 게이트웨이에 OAuth 20 기반 보안 적용
- 3.4 Zuul과 마이크로서비스 간의 통신 보안
- 3.4.1 방화벽으로 접근 방지
- 3.4.2 mTLS를 사용한 API 게이트웨이와 마이크로서비스 간의 통신 보안
- 요약
- 4장. 단일 페이지 애플리케이션으로 보안을 강화한 마이크로서비스 접근
- 4.1 앵귤러를 사용해 단일 페이지 애플리케이션 실행
- 4.1.1 앵귤러 애플리케이션 빌드 및 실행
- 4.1.2 단일 페이지 애플리케이션의 동작원리 살펴보기
- 4.2 CORS 구축
- 4.2.1 동일 출처 정책 사용
- 4.2.2 CORS 사용
- 4.2.3 교차 출처 요청을 허용하는 출발지 검사
- 4.2.4 API 게이트웨이를 리소스 서버 프록시로 운영
- 4.3 OIDC를 사용한 단일 페이지 애플리케이션 보안
- 4.3.1 OIDC 로그인 흐름 이해
- 4.3.2 애플리케이션 코드 분석
- 4.4 연합 인증 사용
- 4.4.1 다수의 신뢰 도메인들
- 4.4.2 도메인 간의 신뢰 형성
- 요약
- 5장. 요청 제한, 모니터링 및 접근 제어 수행
- 5.1 Zuul을 사용해 API 게이트웨이로 보내지는 요청 관리
- 5.1.1 할당량 기반 애플리케이션 요청 제한
- 5.1.2 사용자를 위한 공평한 사용 정책
- 5.1.3 주문 처리 마이크로서비스에 할당량 기반 요청 제한 적용
- 5.1.4 마이크로서비스의 최대 처리 용량
- 5.1.5 운영 관점에서의 요청 제한
- 5.1.6 OAuth 20 토큰 및 인가 처리 지점을 향한 요청 제한
- 5.1.7 권한 기반 요청 제한
- 5.2 프로메테우스와 그라파나를 사용한 모니터링 및 분석
- 5.2.1 주문 처리 마이크로서비스 모니터링
- 5.2.2 프로메테우스 메트릭 모니터링의 동작원리
- 5.3 OPA를 사용해 API 게이트웨이에 접근 제어 정책 적용
- 5.3.1 도커 컨테이너로 OPA 실행
- 5.3.2 OPA 엔진에 데이터 제공
- 5.3.3 OPA 엔진에 접근 제어 정책 제공
- 5.3.4 OPA 정책 평가
- 5.3.5 OPA 사용 시 참고사항
- 요약
- 3부. 서비스 간 통신
- 6장. 인증서를 사용해 내부 시스템(서비스) 간의 트래픽 보호
- 6.1 mTLS를 사용하는 이유
- 6.1.1 인증기관을 이용해 클라이언트와 서버 간에 신뢰 구축
- 6.1.2 mTLS는 클라이언트와 서버가 서로를 식별하도록 지원
- 6.1.3 HTTPS는 TLS 기반으로 동작하는 HTTP 프로토콜
- 6.2 마이크로서비스 접근을 보호하기 위해 인증서 생성
- 6.2.1 인증기관 생성
- 6.2.2 주문 처리 마이크로서비스에서 사용할 키 생성
- 6.2.3 재고 마이크로서비스에서 사용할 키 생성
- 6.2.4 한 번의 스크립트 실행으로 필요한 모든 키 생성
- 6.3 TLS를 사용해 마이크로서비스 보호
- 6.3.1 TLS를 적용한 주문 처리 마이크로서비스 실행
- 6.3.2 TLS를 적용한 재고 마이크로서비스 실행
- 6.3.3 TLS를 사용해 2개의 마이크로서비스 간 통신 보호
- 6.4 매력적인 mTLS
- 6.5 키 관리의 어려움
- 6.5.1 키 프로비저닝과 부트스트래핑 신뢰
- 6.5.2 인증서 해지
- 6.6 키 순환
- 6.7 키 사용 모니터링
- 요약
- 7장 JWT를 사용한 내부 시스템(서비스) 간의 트래픽 보호
- 7.1 마이크로서비스 보호를 위한 JWT 사용 사례
- 7.1.1 공유 JWT를 사용해 마이크로서비스 간 사용자 컨텍스트 공유
- 7.1.2 서비스 간 상호작용을 위해 새로 발급한 JWT를 사용해 사용자 컨텍스트 공유
- 7.1.3 다른 신뢰 도메인에 속한 마이크로서비스와 사용자 컨텍스트 공유
- 7.1.4 자체발급 JWT
- 7.1.5 네스티드 JWT
- 7.2 JWT를 발급하는 STS 구축
- 7.3 JWT를 사용해 마이크로서비스 보호
- 7.4 접근 제어에 사용할 권한 범위 출처로 JWT 사용
- 7.5 JWT를 사용해 서비스 간 통신 보호
- 7.6 다른 aud 속성을 가진 새로운 JWT로 JWT 교환
- 요약
- 8장. gRPC를 사용한 내부 시스템(서비스) 간의 트래픽 보호
- 8.1 gRPC를 사용한 서비스 간 통신
- 8.2 mTLS를 사용해 서비스 간 gRPC 통신 보호
- 8.3 JWT를 사용해 서비스 간 gRPC 통신 보호
- 요약
- 9장. 반응형 마이크로서비스 보호
- 9.1 반응형 마이크로서비스를 사용하는 이유
- 9.2 카프카를 메시지 브로커로 구축
- 9.3 이벤트를 카프카 토픽에 푸시하는 마이크로서비스 개발
- 9.4 카프카 토픽에서 이벤트를 읽는 마이크로서비스 개발
- 9.5 TLS를 사용해 전송 데이터 보호
- 9.5.1 TLS 키와 카프카 인증서 생성 및 서명
- 9.5.2 카프카 서버에 TLS 설정
- 9.5.3 마이크로서비스에 TLS 설정
- 9.6 mTLS를 사용한 인증
- 9.7 접근 제어 목록을 사용해 카프카 토픽에 대한 접근 제어
- 9.7.1 카프카 접근 제어 목록 활성화 및 클라이언트 식별
- 9.7.2 카프카에서 접근 제어 목록 정의
- 9.8 NATS를 메시지 브로커로 설정
- 요약
- 4부. 안전한 배포
- 10장. 도커로 컨테이너 보안 정복
- 10.1 도커에서 STS 실행
- 10.2 도커 컨테이너에서 시크릿 관리
- 10.2.1 도커 이미지에 포함한 시크릿 외부화
- 10.2.2 환경 변수로 시크릿 전달
- 10.2.3 도커로 배포하는 운영 환경의 시크릿 관리 방안
- 10.3 도커 이미지 서명 및 검증을 위해 도커 컨텐트 트러스트 사용
- 10.3.1 TUF
- 10.3.2 도커 컨텐트 트러스트
- 10.3.3 키 생성
- 10.3.4 DCT로 서명
- 10.3.5 DCT로 서명 검증
- 10.3.6 DCT가 사용하는 키 유형
- 10.3.7 DCT가 클라이언트 애플리케이션을 리플레이 공격으로부터 보호하는 방법
- 10.4 주문 처리 마이크로서비스를 도커에서 실행
- 10.5 제한된 권한으로 컨테이너 실행
- 10.5.1 컨테이너를 root 외의 사용자로 실행
- 10.5.2 root 사용자의 권한 삭제
- 10.6 Docker Bench for Security 실행
- 10.7 도커 호스트에 대한 접근 보호
- 10.7.1 도커 데몬에 원격 접근 활성화
- 10.7.2 도커 API 접근을 보호하기 위해 엔진엑스 서버에서 mTLS 활성화
- 10.8 컨테이너 이상의 보안 고려
- 요약
- 11장 쿠버네티스상의 마이크로서비스 보안
- 11.1 쿠버네티스상에서 STS 실행
- 11.1.1 STS로 사용할 쿠버네티스 디플로이먼트를 YAML 형식으로 정의
- 11.1.2 쿠버네티스에서 STS 디플로이먼트 생성
- 11.1.3 디플로이먼트 트러블슈팅
- 11.1.4 쿠버네티스 클러스터 외부에 STS 노출
- 11.2 쿠버네티스 환경에서 시크릿 관리
- 11.2.1 컨피그맵을 사용한 쿠버네티스 설정 외부화
- 11.2.2 applicationproperties 파일을 위한 컨피그맵 정의
- 11.2.3 keystorejks와 jwtjks 파일을 위한 컨피그맵 정의
- 11.2.4 키 저장소 자격증명을 위한 컨피그맵 정의
- 11.2.5 kubectl 클라이언트로 컨피그맵 생성
- 11.2.6 쿠버네티스 디플로이먼트에서 컨피그맵 소비
- 11.2.7 초기화 컨테이너를 사용한 키 저장소 로딩
- 11.3 쿠버네티스 시크릿 사용
- 11.3.1 모든 컨테이너의 디폴트 토큰 시크릿
- 11.3.2 시크릿 사용을 위해 STS 업데이트
- 11.3.3 쿠버네티스가 시크릿을 저장하는 방법에 대한 이해
- 11.4 쿠버네티스에서 주문 처리 마이크로서비스 실행
- 11.4.1 주문 처리 마이크로서비스의 컨피그맵/시크릿 생성
- 11.4.2 주문 처리 마이크로서비스의 디플로이먼트 생성
- 11.4.3 주문 처리 마이크로서비스의 서비스 생성
- 11.4.4 종단 간 흐름 테스트
- 11.5 쿠버네티스에서 재고 마이크로서비스 실행
- 11.6 쿠버네티스 서비스 계정 사용
- 11.6.1 서비스 계정 생성 및 파드와 계정 연결
- 11.6.2 사용자 지정 서비스 계정으로 파드 실행 시 이점
- 11.7 쿠버네티스에서 역할 기반 접근 제어 사용
- 11.7.1 STS에서 쿠버네티스 API 서버와 통신
- 11.7.2 서비스 계정을 클러스터롤과 연결
- 요약
- 12장 이스티오 서비스 메시로 마이크로서비스 보호
- 12.1 쿠버네티스 디플로이먼트 설정
- 12.1.1 이스티오 자동삽입 활성화
- 12.1.2 기존 작업 정리
- 12.1.3 마이크로서비스 배포
- 12.1.4 주문 처리와 STS를 노드포트 서비스 유형으로 재배포
- 12.1.5 종단 간 흐름 테스트
- 12.2 이스티오 인그레스 게이트웨이에서 TLS 터미네이션 활성화
- 12.2.1 이스티오 인그레스 게이트웨이에 TLS 인증서 배포
- 12.2.2 가상 서비스 배포
- 12.2.3 PERMISSIVE 인증 정책 정의
- 12.2.4 종단 간 흐름 테스트
- 12.3 mTLS로 서비스 간 통신 보호
- 12.4 JWT로 서비스 간 통신 보호
- 12.4.1 JWT 인증 적용
- 12.4.2 JWT 인증으로 종단 간 흐름 테스트
- 12.4.3 PeerAuthentication과 RequestAuthentication
- 12.4.4 서비스 간 통신에서 JWT를 사용하는 방법
- 12.4.5 JWK 상세히 살펴보기
- 12.5 인가 적용
- 12.5.1 JWT 상세히 살펴보기
- 12.5.2 역할 기반 접근 제어 적용
- 12.5.3 역할 기반 접근 제어를 사용한 종단 간 흐름 테스트
- 12.5.4 이스티오 14.0 버전 이후 역할 기반 접근 제어 개선사항
- 12.6 이스티오에서 키 관리
- 12.6.1 볼륨 마운트를 통한 키 프로비저닝과 교체
- 12.6.2 볼륨 마운트를 통한 키 프로비저닝 및 키 교체 제한
- 12.6.3 SDS로 키 프로비저닝 및 교체
- 요약
- 5부. 안전한 개발
- 13장. 시큐어 코딩 관행 및 자동화
- 13.1 OWASP API 보안 TOP 10
- 13.1.1 취약한 객체 수준 인가
- 13.1.2 취약한 인증
- 13.1.3 과도한 데이터 노출
- 13.1.4 리소스 부족 및 속도 제한
- 13.1.5 취약한 함수 수준 인가
- 13.1.6 대량 할당
- 13.1.7 잘못된 보안 설정
- 13.1.8 인젝션
- 13.1.9 부적절한 자산 관리
- 13.1.10 불충분한 로깅 및 모니터링
- 13.2 정적 코드 분석 실행
- 13.3 젠킨스와 보안 점검 통합
- 13.3.1 젠킨스 설정 및 실행
- 13.3.2 젠킨스로 빌드 파이프라인 설정
- 13.4 OWASP ZAP으로 동적 분석 실행
- 13.4.1 패시브 스캐닝과 액티브 스캐닝 비교
- 13.4.2 ZAP으로 모의해킹 수행
- 요약
- 부록 A. OAuth 2.0과 OIDC
- 부록 B. JWT
- 부록 C. 단일 페이지 애플리케이션 아키텍처
- 부록 D. 마이크로서비스 환경의 모니터링 가능성
- 부록 E. 도커의 원리
- 부록 F. OPA
- 부록 G. OpenSSL을 사용한 인증기관 및 관련 키 생성
- 부록 H. SPIFFE
- 부록 I. gRPC 원리
- 부록 J. 쿠버네티스의 원리
- 부록 K. 서비스 메시와 이스티오의 원리