배경
오토피디아에서는 온프레미스 쿠버네티스 클러스터를 운영하고 있습니다. 클러스터에는 내부 구성원들이 사용하는 서비스부터 외부에 제공하는 서비스까지 다양하게 배포되어 있는데요. 이렇게 다양한 서비스를 운영하다보면 꼬리표처럼 따라오는 문제가 생기게 됩니다. 바로 보안이죠.
보안은 서비스 규모가 점점 커지게 되면 필연적으로 중요하게 다루어야할 이슈가 됩니다. 하지만 모순적이게도 가장 중요하지만 늘 뒤로 미뤄지게 되는 경우가 대부분인데요. 저희도 이제는 굉장히 많은 서비스가 온프레미스 쿠버네티스에서 운영되면서 더 이상 보안 문제를 무시할 수가 없게 되었습니다.
그래서 사내에서 사용하는 다양한 서비스에 대한 보안을 조금 더 강화하기로 하였고 쿠버네티스 상에서 돌아가고 있는 각 서비스에 SSO(Single Sign On)를 적용함으로써 이러한 문제를 해결하기로 하였습니다.
SSO와 OAuth
개발자라면 모두들 OAuth에 대해서 한 번쯤은 들어보셨을텐데요. 우리는 OAuth를 통해 별다른 회원가입 기능없이 외부 서비스 제공자(구글, 네이버, 카카오…) 아이디로 서비스에 간편하게 가입 할 수 있습니다. 그렇다면 SSO는 무엇일까요?
싱글 사인 온 즉, SSO는 이름 그대로 하나의 계정을 이용하여 여러 시스템에 접근할 수 있는 방법을 말합니다. 예를 들어보겠습니다. 사내에서 A와 B 서비스를 운영중이라면 이 둘은 엄연히 다른 서비스이기 때문에 각각 계정을 만들고 로그인을 해야합니다.
하지만 운영하는 서비스가 많아지면 그만큼 관리해야 하는 계정이 많아지기 때문에 굉장히 귀찮아지는 불상사가 발생하게 되는데요. SSO를 도입하면 이러한 문제를 해결할 수 있습니다. 하나의 계정으로 여러 시스템에 접근이 가능하게 되는 것이죠.
듣기만 해도 굉장히 편리해보이는 기술들입니다. 그렇다면 이 둘을 합친다면 어떨까요? SSO를 OAuth 인증 방식으로 구축하면 사용자는 귀찮게 계정을 만들 필요없이 하나의 구글 아이디로 다양한 서비스에 접근할 수 있게 됩니다.
oauth-proxy: 쿠버네티스 OAuth
이러한 인증 체계를 쿠버네티스 상에서도 구현할 수 있는데요. oauth-proxy
를 이용하면 아주 쉽게 OAuth를 활용한 SSO 시스템을 구축할 수 있습니다. 그렇다면 oauth-proxy는 무엇이고, 어떻게 동작하는 것일까요?
쿠버네티스에서 인증은 Ingress(이하 인그레스)에서 처리됩니다. 인그레스는 클러스터 외부에서 접근하는 요청들을 어떻게 처리하면 좋을지 정의하는 역할을 합니다. 인증 또한 외부에서 쿠버네티스 내부 서비스에 접근하기 위한 것이기 때문에 인그레스를 거치게 됩니다.
우리는 OAuth를 이용하여 인증을 해야하기 때문에 외부 서비스를 통해 인증을 받았다는 어떠한 확인서를 받아와야 하는데요. oauth-proxy는 프록시라는 이름처럼 위의 과정을 대리로 해주는 역할을 합니다. 인그레스는 oauth-proxy가 받아온 확인서를 서비스에 전달만 해주는 것이죠.
작동원리를 간략하게 요약해보면 아래와 같습니다.
- 특정 서비스에 접속
- 각 서비스 Ingress에 설정해둔 Annotation에 따라 oauth2-proxy auth-url을 통해 인증여부 확인. 만약 인증이 안되었다면 auth-signin(로그인 창)으로 이동
- 서비스/oauth로 인증요청하고 oauth-proxy 서버가 token id 획득하여 인증여부 결정
더 자세한 설명을 원하신다면 아래 참고 자료에 커피고래님의 글을 참고하시면 좋을 것 같습니다.
구축과정
더 많은 내용을 확인하려면 오토피디아 블로그를 방문해주세요!