Spinnaker Authorization
스핀에커(Spinnaker)의 권한관리를 위해 피아트 서비스(Fiat Service)가 추가되었다. 스핀에커가 처음에 공개되었을 때는 사용자 인증과 권환관리 기능이 없었다. 그러더니 게이트(Gate)에 OAuth2를 이용한 인증 기능이 추가되었고, 다음으로 피아트가 생기면서 GitHub, LDAP, SAML등의 기술을 활용하여 권한관리를 할 수 있는 기능이 추가되었다.
역할 제공자(Role Providers)
피아트는 역할(Role)을 직접 다루지 않는다. 대신 조직(Organization) 또는 그룹(Group)의 정보를 제공하는 외부 Solution과 연동하여 이 문제를 해결하다. 다시말해서 관리자는 역할 제공자(Role Provider) 중 한가지를 이용하여 조직과 그 속에 속한 사용자를 직접 관리하며 피아트는 현재 접속한 사용자가 어떠한 조직에 속해 있는 지 역할 제공자에게 물어보는 것만 한다.
현재 지원되는 역할 제공자는 SAML, GitHub Team, G Suite Group, LDAP 이 있다.
아래 설정은 GitHub의 팀 정보를 이용하여 사용자가 어떠한 팀에 속해 있는지 확인하도록 피아트에 지정하는 내용을 보여준다. /opt/fiat/config/fiat-local.yml 에 다음의 설정을 추가하고 피아트를 재실행하면 GitHub와 연동을 시작하게 된다.
auth:
groupMembership:
service: github
github:
organization: changeme
baseUrl: https://api.github.com
accessToken: changeme
paginationValue: 100
redis:
connection: "redis://redis.example.internal:6379"
services:
front50:
baseUrl: "http://front50.example.internal"
clouddriver:
baseUrl: "http://clouddriver.example.internal"
fiat:
enabled: true
권한지정
스핀에커에서는 권한을 설정하는 곳이 2 군데가 있다. 한 곳은 클라우드 제공자(Cloud Provider)들을 다루는 클라우드 드라이버(Cloud Driver)에 설정하는 것이고 다른 하나는 스핀에커 UI화면의 어플리케이션 설정화면에서 지정하는 것이다. 클라우드 드라이버에 설정하는 것은 해당 클라우드 제공자를 다루기 위한 권한을 어떤 팀 또는 그룹에 부여할 지 결정한다. 아래 예제를 보면 AWS의 특정 계정(Account)에 대해서 operators 그룹은 모든 작업을 할 수 있는 반면, developers와 managers는 보기만 할 수 있도록 설정하였다. 다시 말해서 'prod' 라는 이름의 AWS 계정에 대해서 operators 팀에 속한 사용자는 AWS 자원을 만들 수 있지만 developers에 속한 사람은 AWS 자원을 만들 수 없다. 비록 developers에 속한 사용자가 파이프라인(Pipeline)를 실행할 수 있는 권한이 있다고 하더라도 클라우드 드라이버에서 서버그룹(Server Group)이나 부하 분산기(Load Balancer)를 만들 권한이 없으면 해당 파이프라인은 결과적으로 실패하게 된다.
그리고 이런 경우도 있다. 아래 예제에서 'prod'계정에 대해 operators가 읽기권한이 없을 경우를 생각해 보자. 이렇게 읽기권한이 없고 쓰기권한만 있을 경우에도, 파이프라인 실행에 문제가 생길 수 있다. 쓰기권한만 있으면 별 문제가 없을 것이라고 쉽게 생각할 수 있겠지만 스핀에커의 배포 스테이지(Deploy Stage)는 기존 상태를 읽는 과정이 필요하기 때문에 읽기권한도 필요하기 때문이다.
clouddriver-local.yml
aws:
accounts:
- name: rel
accountId: 123456789012
regions:
- name: ap-southeast-2
permissions:
read:
- operators
write:
- operators
- name: prod
accountId: 984637253615
permissions:
read:
- developers
- managers
- operators
write:
- operators
defaultAssumeRole: role/spinnakerManaged
enabled: true
클라우드 드라이버에 권한(Permission) 설정을 했다면 이제 각 어플리케이션 (Application) - 스핀에커에서 관리하는 마이크로서비스(Microservice) 한 개를 의미한다 - 에서 권한을 지정해야 한다. 스핀에커 UI에서 어플리케이션을 선택한 다음, 설정(Config)으로 가서 편집(Edit)를 누르면 다음과 같은 화면을 볼 수 있다. 아래 그림과 같은 설정화면이 나타나면 원하는 그룹에게 적절한 권한을 지정할 수 있다.
서비스 계정 (Service Accounts)
Google이 스핀에커에 참여하면서 권한관리 기능이 집중적으로 추가되었다. 그래서 권한관리 기능의 예제들이 대부분 GCP (Google Cloud Platform) 기반으로 되어있다. 서비스 계정(Service Account)도 GCP에 나오는 개념인데, 서비스나 시스템(System)에서 사용할 공통 계정을 말한다. 스핀에커에서는 젠킨스(Jenkins)를 연동할 때 사용한다. 피아트를 처음켜면 젠킨스와 스핀에커의 파이프라인을 실행하는 기능이 동작하지 않는 경우가 있는데, 그 이유는 젠킨스가 스핀에커에서 사용할 계정이 없기 때문이다. 그렇다고 GitHub이나 LDAP에 젠킨스 계정을 만들면 암호관리 등의 번거로운 추가 작업들이 필요해서 불편하다. 그래서 스핀에커 내부에서만 사용할 수 있는 계정을 만들고 다른 사용자들처럼 팀이나 조직에 포함시켜 주면된다.
아직은 할야드(Halyard)에서 서비스 계정을 만드는 명령을 직접적으로 지원하지는 않는다. 추후 추가될 것 같다. 그래서 Fiat API를 직접 호출해서 서비스 계정을 만들어 주어야 한다. 다음과 같이 프론트50(Front50)의 RESTful API를 직접 호출해서 새로운 계정을 만들 수 있다.
curl -X POST http://front50.example.internal/serviceAccounts -H "Content-type: application/json" -d '{"name":"myApp-svc-account", "memberOf":["myApp-prod","myApp-qa"]}'
서비스 계정을 만들었다면, 피아트에서 해당 계정을 읽어갈 수 있도록 동기화 API를 불러주면 된다.
curl -X POST http://fiat.example.internal/roles/sync
서비스 계정이 제대로 만들어 졌는지 확인하려면 다음과 같이 서비스 계정 조회 API를 불러주면 된다.
curl http://fiat.example.internal/authorize/myApp-svc-account
Fiat on
마지막으로 이 부분이 제일 중요한데, 데크와 피아트에서 권한관리 기능을 사용하겠다고 설정을 했더라도 반드시 게이트에도 설정을 해야 한다. 설정을 추가해야하는 위치는 /opt/gate/config/gate-local.yml 이며, 추가해주어야 하는 내용은 아래와 같다.
services:
fiat:
baseUrl: "http://fiat.example.internal"
enabled: true