이번 목표는 나만의 DevSecOps Best Practice를 제작하는 것이다.
기본적으로 DevSecOps라 함은 DevOps의 전 단계에 걸쳐 보안성을 확보하고자 노력하는 환경 또는 문화를 의미하는데, 단어 정의 자체가 조금은 두루뭉술하다보니, 누구나 쉽게 이해할 수 있는 상세한 DevSecOps Best Practice를 제작하고자 한다.(다만 AWS에 한정된)
물론 모든 환경에 적용할 수는 없고 이것이 진짜 Best Practice일지 명확히 알 수는 없지만, 최대한 정략적인 데이터 비교를 통해 정보의 신뢰성을 확보하는 방향을 진행할 것이다.
먼저 DevSecOps에 대하여 짚고 넘어가기 전에, DevOps에 관련하여 용어정의를 명확히 하고 넘어가고자 한다.
DevOps 정의
- AWS : DevOps는 애플리케이션과 서비스를 빠른 속도로 제공할 수 있도록 조직의 역량을 향상시키는 문화 철학, 방식 및 도구의 조합
- Attlasian : DevOps는 소프트웨어 개발과 IT 팀 간의 프로세스를 자동화하고 통합하는 일련의 관행, 도구 및 문화 철학
- GitLab : DevOps는 소프트웨어 개발(dev)과 운영(ops)의 조합. 협업과 공동 책임의 문화를 촉진하여 개발팀과 운영팀의 작업을 통합하는 것을 목표로 하는 소프트웨어 엔지니어링 방법론
- Microsoft : DevOps는 개발(Dev)과 운영(Ops)을 결합하여 애플리케이션 계획, 개발, 제공 및 운영에서 사람, 프로세스 및 기술을 통합하는 것
- 위키백과 : 데브옵스(DevOps)는 소프트웨어의 개발(Development)과 운영(Operations)의 합성어로서, 소프트웨어 개발자와 정보기술 전문가 간의 소통, 협업 및 통합을 강조하는 개발 환경이나 문화를 말한다.
AWS, Attlasian, GitLab, Microsoft, 위키백과 등 다양한 곳에서 DevOps라는 단어에 대하여 각자 다른 정의를 내리고 있다. 하지만 잘 읽어보면 이 모든 정의들을 관통하는 통일된 내용이 있다. 바로 "개발과 운영을 통합하는 것" 이다. 나는 DevOps라는 용어에 대하여 "개발과 운영을 통합하는 것" 이라고 정의내리고 다음 단계를 진행하고자 한다.
그렇다면 왜 개발과 운영을 통합하고자 하는것일까? DevOps의 목적은 무엇일까?
DevOps 목적
- AWS : DevOps는 애플리케이션과 서비스를 빠른 속도로 제공하기 위함
- GitLab : 시스템 개발 수명 주기를 단축하고 높은 소프트웨어 품질로 지속적인 제공을 제공하는 것
- Microsoft : 팀이 더 나은, 더 신뢰할 수 있는 제품을 생산하여 고객에게 지속적으로 가치를 제공하기 위함
- 위키백과 : 소프트웨어 개발조직과 운영조직간의 상호 의존적 대응이며 조직이 소프트웨어 제품과 서비스를 빠른 시간에 개발 및 배포하는 것
- Synopsis : 조직이 기존 소프트웨어 개발 프로세스보다 더 빠르게 애플리케이션과 서비스를 제공할 수 있는 능력을 높이기 위함
Attlasian이 목적에 대해 설명해두지 않아서 대신 이번엔 Synopsis에서 정보를 발췌해봤다. 여러 DevOps의 목적에 대한 내용을 수집해보니 표현하는 방식은 달라도 공통적으로 "높은 수준의 서비스를 빠르고 지속적으로 제공하기 위해서" 라는 핵심요소는 동일하다는 것을 알 수 있다. 이에 나는 DevOps의 목적을 "높은 수준의 서비스를 빠르고 지속적으로 제공하기 위함"이라고 정의하겠다.
정의한 목적에 따르면 DevOps는 기존 환경이나 문화에 비해 빠르고 지속적인 서비스 제공을 가능하게 하는것 같은데, 어떤 특징이 이를 가능하게 만드는 것일까?
답은 간단하다. 'DevOps의 개념과 같이 개발과 운영을 합쳤기 때문이다.' 고전적인 개발과 운영은 개발팀이 개발을 하고 운영팀에 배포를 요청하면 운영팀이 업무 요청을 받고 업무 우선순위에 따라 배포를 순차적으로 처리했었다. 거기다 무중단 배포라는 개념이 없던 레거시 시스템들의 경우 고객들에게 서비스 중단시간을 공지하고 배포하고 테스트하는 과정이 필요했기에 더 많은 시간을 소모했었다.
하지만 개발과 운영을 합치고자 하는 문화이자 환경인 DevOps를 구성하기 위해 개발팀과 운영팀은 개발부터 운영배포까지의 과정을 하나의 프로세스로 합치려하고, 이를 자동화하기 위한 노력을 하게된다. 이는 자연스럽게 개발팀과 운영팀간의 불필요한 협업과정을 사라지게 하고 자동화를 통해 사람손을 거치던 불필요한 프로세스들을 사라지게 만들었다. 이렇다보니 개발자는 더욱 속도를 내어 개발하기 편해졌고, 운영팀입장에서는 이 프로세스를 잘 돌아가게 한번만 잘 구성을 하면 그 이후부터는 반복적인 업무들을 하지 않아도 되게 되어 궁극적으로 고객의 서비스 사용성 향상이라는 결과를 이끌어 낼 수 있었던 것이다.
기업들은 이러한 DevOps 환경을 구성하기 위해 흔히 DevOps 파이프라인 또는 DevOps 라이프사이클이라는 것을 만들어 하나의 프로세스를 만들려 노력하게 된다. 한번 예시를 통해 알아보자.
DevOps 라이프사이클




위 사진들은 aws, ibm, oracle, dynatrace와 같은 기업들이 설명해둔 DevOps 파이프라인 또는 라이프사이클이다. (본문에서는 라이프사이클로 통일하겠다)
사진들을 보면 알수 있듯, DevOps가 어떤 라이프사이클을 가지고 있는지 모두가 다르게 설명하고있다. 이는 DevOps 라이프사이클이 정해져있는것이 아니며, 상황과 환경에 맞게 단계가 합칠수도, 분리할수도 있음을 의미한다.
이에 나는 기술적인 DevSecOps Best Practice를 만들겠다는 목표를 세웠기에 보편적인 DevOps 라이프사이클에서 사람이 수동적으로 해야만하는 과정들을 걷어내고 아래 단계들에 대한 보안성 향상을 위한 방법을 검토해보고자 한다.
- Build : 프로그래밍이 완료된 이후, 사용한 언어에 맞는 컴파일러 또는 인터프리터로 빌드하여 빌드 아티펙트 생성
- Test : 생성된 빌드 아티펙트를 테스트환경에서 정상동작하는지 확인
- Deploy : 정상동작할 경우 배포할 시스템에 아티펙트 배포
- Monitor : 배포 이후 서버, 애플리케이션이 정상동작 중인지 모니터링