API Gateway와 함께 Secret Manager를 사용하는 방법
Shirui Zhao
January 13, 2023
시크릿(Secret)이란?
IT 환경에서 시크릿은 시스템과 애플리케이션이 인증이나 암호화 알고리즘의 입력으로 사용하는 비인간적 특권 자격 증명입니다. 예를 들어, 프로그램이 데이터베이스에 연결하기 위해 필요한 비밀번호, 암호화된 통신을 위한 키/인증서 등이 모두 시크릿에 속합니다.
일반적인 시크릿 유형은 다음과 같습니다:
- 암호화 키
- 클라우드 서비스 접근 자격 증명
- 애플리케이션 프로그래밍 인터페이스(API) 키
- 접근 토큰
- SSH(보안 셸) 키
시크릿 매니저(Secret Manager)
시크릿 매니저는 시크릿의 수명 주기 동안 저장, 검색, 교체 및 감사를 수행합니다. HashiCorp Vault는 가장 일반적으로 사용되는 시크릿 매니저 서비스 중 하나이며, 그 작동 원리는 다음과 같습니다(이미지 출처: HashiCorp 공식 웹사이트):
HashiCorp Vault 외에도 AWS, Google, Azure와 같은 클라우드 제공업체도 시크릿 매니저 서비스를 제공합니다.
시크릿 매니저를 사용하여 애플리케이션을 구축하면 보안이 강화될 뿐만 아니라 다음과 같은 기능을 제공합니다:
- 시크릿을 여러 머신에서 쉽게 업데이트할 수 있도록 하여 애플리케이션에 영향을 미치지 않습니다.
- 개발자는 시크릿의 저장에 너무 많은 주의를 기울일 필요 없이 비즈니스 로직 자체에 더 집중할 수 있습니다.
- 시크릿 교체 및 취소를 재배포하거나 활성 애플리케이션을 중단하지 않고 수행할 수 있습니다.
- 시크릿 매니저는 유연하고 상세한 감사 로그를 제공하여 모든 사용자 접근 이력을 추적할 수 있으며, 감사 및 규제 요구 사항을 더 쉽게 충족할 수 있습니다.
API 게이트웨이에서 시크릿 매니저 사용
비즈니스 트래픽의 입구인 API 게이트웨이는 종종 인증을 위한 API 키 및 토큰과 같은 방대한 양의 시크릿 정보를 포함합니다. 따라서 API 게이트웨이에 시크릿 매니저를 통합하는 것이 매우 중요합니다.
API 게이트웨이에서 시크릿 사용 시나리오
Key Auth
는 API 게이트웨이에서 간단한 인증 방법입니다. 사용자는 미리 키를 설정해야 하며, 클라이언트가 API 요청을 할 때 미리 설정된 키를 해당 요청 헤더에 작성하거나 요청 매개변수로 접근하여 인증을 통과합니다. 그러나 키 유출은 흔하며, 키는 종종 구성 파일에 저장되거나 코드에 변수로 저장됩니다. 키가 제대로 저장되지 않으면 GitHub와 같은 공개 코드 저장소에 노출될 수도 있어 보안에 큰 위협이 됩니다. 관리자는 종종 키 유출로 인한 심각한 피해를 방지하기 위해 정기적으로 이러한 키를 업데이트합니다. 그러나 일부 정적 키의 경우 각 머신에서 개별적으로 구성 파일을 업데이트하는 것도 서비스의 안정성에 큰 위협이 될 수 있습니다.
API 게이트웨이에 시크릿 매니저 통합
API 게이트웨이에 시크릿 매니저를 통합하면 Key Auth
인증을 위한 미리 설정된 키를 시크릿 매니저 서비스에 저장할 수 있으며, 키 유출로 인한 일련의 문제를 효과적으로 해결할 수 있습니다. API 게이트웨이는 단지 키 사용자일 뿐이며, 키의 실제 값은 외부 시크릿 매니저 서비스에 저장됩니다. 또한, API 게이트웨이는 키에 대한 참조만 유지하므로 API 게이트웨이가 해킹당하더라도 코드나 구성 파일에서 실제 키를 얻을 수 없습니다. 또한, 키 값을 업데이트해야 하는 경우 API 게이트웨이의 코드나 구성을 수정하지 않고 시크릿 매니저에서만 업데이트하면 되므로 API 게이트웨이를 재시작하지 않아도 됩니다.
아래에서는 Apache APISIX를 예로 들어 API 게이트웨이에서 Key Auth
를 위한 미리 설정된 키를 시크릿 매니저에 저장하는 방법을 보여줍니다.
Apache APISIX에서 시크릿 매니저 사용 예제
Apache APISIX는 동적, 실시간, 고성능 API 게이트웨이로, 로드 밸런싱, 동적 업스트림, 카나리 릴리스, 세분화된 라우팅, 속도 제한, 서비스 저하, 서킷 브레이커, 인증 및 관찰 가능성과 같은 수백 가지 기능을 제공합니다.
버전 3.1.0에서 Apache APISIX는 다양한 시크릿 매니저 서비스를 통합하기 위해 APISIX Secret
을 도입했습니다. 그 작동 순서는 다음과 같습니다:
아래에서는 Vault를 시크릿 매니저 서비스로 사용합니다. Key Auth
인증을 사용하여 Apache APISIX에서 키를 저장하는 방법을 설명합니다.
Vault에서 키 생성
키를 생성하기 전에 Vault 서비스를 시작해야 합니다. 이 섹션은 Apache APISIX 생태계에서 Vault를 사용하는 최적의 방법을 공유하므로 Vault 자체의 구성에 대해서는 자세히 설명하지 않습니다. 자세한 내용은 여기에서 확인할 수 있습니다.
Vault에서 해당 키를 생성하려면 다음 명령을 사용할 수 있습니다:
vault secrets enable -version=1 -path=apisix kv
vault kv put apisix/jack auth-key=secret-key
위 명령을 실행한 후 apisix/jack
경로 아래에 auth-key
라는 키가 생성되고, 그 값은 secret-key
입니다.
APISIX에서 구성
먼저, Admin API
를 통해 시크릿 리소스를 추가하고 Vault의 주소 및 기타 연결 정보를 구성합니다:
- APISIX 시크릿 리소스 ID는 "gateway"이며, 참조: https://apisix.apache.org/docs/apisix/terminology/secret/#usage-1
prefix
필드는 Vault에서 키의 경로이며,token
필드는 Vault 토큰입니다.
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/gateway \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"uri": "https://127.0.0.1:8200",
"prefix": "apisix",
"token": "hvs.chjDFWvZRcihoq2vpSsVenmR"
}'
그런 다음, key-auth
플러그인을 사용하여 소비자를 생성하고 해당 경로 또는 서비스에 대해 Key Auth 인증을 수행합니다. 키 필드는 APISIX 시크릿 리소스를 참조합니다:
curl http://127.0.0.1:9180/apisix/admin/consumers \
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"username": "jack",
"plugins": {
"key-auth": {
"key": "$secret://vault/gateway/jack/auth-key"
}
}
}'
위 두 단계를 통해 사용자의 요청이 key-auth
플러그인에 도달하면 Secret
컴포넌트는 사용자가 구성한 시크릿 매니저를 통해 제공된 인터페이스를 호출하여 Vault에서 키의 실제 값을 가져옵니다. 키의 값을 찾지 못하면 플러그인은 오류를 기록하고 Key Auth
검증을 수행하지 못합니다.
그런 다음 Key Auth
인증을 수행할 경로를 생성합니다:
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"id": "getting-started-ip",
"uri": "/ip",
"plugins": {
"key-auth": {}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
마지막으로, 키 없이 API 게이트웨이에 요청을 보내 결과를 확인합니다:
curl -i "http://127.0.0.1:9080/ip"
결과는 다음과 같습니다:
HTTP/1.1 401 Unauthorized
...
{"message":"Missing API key found in request"}
그런 다음, 키와 함께 API 게이트웨이에 요청을 보내 결과를 확인합니다:
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'
결과는 다음과 유사합니다:
HTTP/1.1 200 OK
...
{
"origin": "127.0.0.1, 59.172.90.243"
}
또한, Apache APISIX는 환경 변수를 간단한 시크릿 매니저 서비스로 확장했으며, Vault에 연결하기 위한 APISIX 토큰도 환경 변수에 저장할 수 있습니다. 따라서 APISIX를 시작하기 전에 다음 명령으로 환경 변수를 설정할 수 있습니다:
export VAULT_TOKEN="root"
Secret
리소스를 추가할 때 환경 변수를 참조합니다:
curl http://127.0.0.1:9180/apisix/admin/secrets/vault/1
-H 'X-API-KEY: Your-API-KEY' -X PUT -d '
{
"uri": "https://127.0.0.1:8200",
"prefix": "apisix",
"token": "$ENV://VAULT_TOKEN"
}'
위 단계를 통해 Key Auth
인증에 필요한 키를 Vault에 저장할 수 있으며, 플러그인을 구성할 때 평문으로 표시하지 않아도 됩니다.
결론
API 게이트웨이에는 방대한 양의 시크릿 정보가 있습니다. 시크릿 매니저를 사용하여 시크릿을 관리하면 API 게이트웨이에 평문 시크릿 정보가 없도록 하여 API 게이트웨이의 보안과 안정성을 효과적으로 향상시킬 수 있습니다. 세계에서 가장 활발한 오픈소스 API 게이트웨이인 Apache APISIX도 시크릿 매니저를 크게 지원합니다. 이 글에서는 Key Auth
인증을 사용하여 APISIX에서 키 정보를 관리하는 방법을 설명했습니다.