Hashicorp Vault & Apache APISIX: API 보안 강화하기

Chao Zhang

Chao Zhang

November 15, 2022

Products

오늘날 API(Application Programming Interface)는 다양한 소프트웨어 서비스를 연결하는 가장 일반적인 방법이 되었습니다. 예를 들어, 날씨 API를 통해 오늘의 날씨를 가져오거나 Twitter의 API를 통해 재미있는 메시지를 리트윗할 수 있습니다. API의 상호 연결은 인터넷을 풍부하고 다채롭게 만들지만, 동시에 어두운 면인 API 위협도 드러냅니다.

데이터에 따르면, API는 현재 웹 애플리케이션 공격 표면의 90%를 차지하며, 이는 API가 주요 공격 벡터 중 하나임을 의미합니다. 그렇다면 API 위험을 어떻게 완화할 수 있을까요?

현대 소프트웨어 아키텍처에서 사람들은 API 공격 방어를 위해 API Gateway 패턴을 선택할 수 있습니다. API Gateway는 소프트웨어 서비스의 진입점으로, 로드 밸런싱, 서비스 디스커버리, API 인증과 같은 기능을 제공합니다. Apache APISIX최고의 API Gateway 중 하나로, 인증, 권한 부여, ACL(Access Control List), IP 차단/허용 목록과 같은 기능을 통해 사용자의 API 보안을 강화합니다. 예를 들어, JWT 인증은 API를 보호하는 인기 있는 방법입니다. 이는 API 소비자가 JSON Web Token을 통해 자신의 신원을 증명하도록 요구합니다. 이러한 경우, 자격 증명이 없거나 잘못된 자격 증명을 가진 API 요청은 Apache APISIX에 의해 거부됩니다.

Apache APISIX는 또한 JSON Web Token의 서명을 담당합니다(서명을 위해 비밀키가 필요함). Apache APISIX의 관점에서, 사용자의 비밀키를 저장하는 것은 중요한 문제가 됩니다. 왜냐하면 비밀키가 유출되면 인증이 작동하지 않기 때문입니다. 기본적으로 Apache APISIX는 etcd에 비밀키를 저장하며, etcd는 Apache APISIX의 라우트 및 업스트림과 같은 구성의 설정 센터입니다.

불행히도, etcd는 민감한 데이터를 보호하기 위해 설계되지 않았습니다. 비도덕적인 사람이 etcd 클러스터에 접근할 수 있다면, 그 안의 모든 데이터가 노출될 것입니다. APISIX 라우트 객체의 경우 큰 문제가 아니지만, 비밀키나 X509 인증서의 개인 키의 경우 치명적일 수 있습니다. 민감한 데이터를 더 잘 보호하기 위해 Apache APISIX는 버전 2.12.0부터 Hashicorp Vault를 통합했습니다. 그렇다면 Hashicorp Vault란 무엇일까요?

Hashicorp Vault란 무엇인가?

Hashicorp Vault는 사용자의 비밀키(예: 데이터베이스 자격 증명, 비밀번호, API 키)를 안전하게 저장하기 위한 저장소 인프라입니다. 이는 Amazon Key Management Service 및 Google Cloud Key Management와 같은 많은 외부 시스템과의 통합을 지원합니다. 기술적으로, Hashicorp Vault는 Raft 합의 프로토콜을 사용하는 분산 시스템입니다. 데이터는 여러 백업으로 저장되며, 데이터의 단일 장애 지점에 대해 걱정할 필요가 없습니다.

assets.png

그렇다면 Hashicorp Vault가 특별한 이유는 무엇일까요? Hashicorp Vault 서버를 시작하면, 이는 봉인된 상태입니다. 서버를 봉인 해제하지 않으면 어떤 데이터에도 접근할 수 없습니다. Hashicorp Vault 서버를 봉인 해제하려면, 키 공유(Shamir Secret Sharing 알고리즘을 사용하여 Hashicorp Vault 서버를 초기화할 때 생성됨)를 사용하여 봉인 해제 작업을 반복적으로 실행해야 합니다. 횟수는 키 공유의 수에 따라 달라집니다(키 공유의 수가 X라면 (X/2)+1번). 더욱이, 서버가 공격을 받고 있다는 의심스러운 징후가 보이면 런타임 중에 Hashicorp Vault 서버를 다시 봉인할 수 있습니다.

Apache APISIX가 Hashicorp Vault를 어떻게 사용하는가?

현재 Apache APISIX는 Hashicorp Vault를 jwt-auth 플러그인에 통합했습니다. jwt-auth 플러그인은 JWT 인증을 수행하는 데 사용됩니다.

APISIX-Vault-Communication.png

Hashicorp Vault와 Apache APISIX 간의 기본 상호작용 로직은 다음과 같습니다:

  1. API 요청이 들어옴
  2. JWT Auth 플러그인이 실행됨
  3. Apache APISIX가 Hashicorp Vault에서 비밀키를 가져오려고 시도함
  4. Hashicorp Vault가 비밀키를 반환하고, Apache APISIX가 이를 캐시함
  5. Apache APISIX가 비밀키를 사용하여 JSON Web Token을 검증함
  6. 인증이 통과되고, API 요청이 백엔드 서비스로 전달됨
  7. API 응답을 반환함

Apache APISIX consumer 객체에서 jwt-auth 플러그인을 vault 옵션과 함께 구성하여 Apache APISIX가 Hashicorp Vault에 비밀키를 저장/가져오도록 지시할 수 있습니다. Apache APISIX consumer는 API 소비자의 추상화입니다. API 자격 증명은 consumer 수준에서 구성할 수 있습니다.

curl http://127.0.0.1:9080/apisix/admin/consumers -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "username": "jack",
  "plugins": {
    "jwt-auth": {
      "key": "your-api-key",
      "vault": {}
    }
  }
}'

Hashicorp Vault 구성은 Apache APISIX의 config.yaml에서 설정할 수 있습니다.

vault:
  host: 'http://0.0.0.0:8200'
  timeout: 10
  token: 's.KUWFVhIXgoRuQbbp3j1eMVGa'
  prefix: 'kv/apisix'

여기서 주의할 점은, 토큰이 경로 kv/apisix/consumer에 대한 읽기 권한을 가져야 한다는 것입니다. 이 경로는 Apache APISIX Admin API가 비밀키를 저장하는 곳입니다.

path "kv/apisix/consumer/*" {
    capabilities = ["read"]
}

해당 consumer의 API 요청이 들어오면, Apache APISIX는 구성된 Hashicorp Vault 서버에서 비밀키를 가져오려고 시도하고(결과를 메모리에 캐시함), 이 비밀키를 사용하여 JSON Web Token을 검증합니다.

Apache APISIX와 Hashicorp Vault 통합의 미래

Apache APISIX에는 여러 종류의 민감한 데이터가 있지만, 현재는 JSON Web Token 비밀키만 Hashicorp Vault에 저장할 수 있습니다. 그러나 미래에는 API 키, 사용자 비밀번호와 같은 모든 API 자격 증명을 Hashicorp Vault에 저장할 수 있을 것입니다. 또한, 인증서의 개인 키와 Admin API 키도 저장할 수 있습니다. 이 모든 데이터는 구성에서 분리될 것입니다. 이렇게 하면 API 인증을 사용하기 때문에 뿐만 아니라 API 자격 증명이 적절히 보호되기 때문에 API 보안이 강화됩니다.

Tags: