플러그인 아키텍처
플러그인 아키텍처
플러그인은 사전 정의된 인터페이스와 매개변수를 가진 별도의 독립 실행형 애플리케이션이에요. Vault는 RPC를 통해 플러그인을 실행하고 통신해요. 플러그인은 Vault와 메모리 공간을 공유하지 않으며, 플러그인의 충돌이 Vault 전체를 충돌시키지 못해요.
출처: 문서
본문
플러그인 등록
플러그인 시스템의 중요한 고려 사항은 Vault가 호출하는 모든 플러그인이 인증되고 무결성을 유지하도록 하는 거예요. 그 결과 Vault는 명시적으로 구성된 플러그인 디렉터리에서만 수동 플러그인 등록을 허용하고, 유효한 카탈로그 엔트리가 있는 플러그인만 활성화해요.
플러그인 디렉터리는 Vault 서버에서 접근할 수 있어야 하며 심볼릭 링크일 수 없어요. 기본 Vault 구성에는 플러그인 디렉터리가 포함되지 않으며, 플러그인 디렉터리를 구성하기 전에는 플러그인을 수동으로 등록할 수 없어요.
플러그인 카탈로그는 Vault 배리어(barrier)에 있으며 현재 등록된 플러그인을 추적해요. 등록 시 Vault는 카탈로그를 업데이트하기 전에 플러그인 아티팩트가 플러그인 디렉터리에 존재하고 제공된 SHA256 체크섬과 일치하는지 확인해요.
플러그인을 등록하면 플러그인이 Vault 백엔드에 보이고 실행 가능해지지만, 특정 마운트 경로에서 활성화하기 전에는 플러그인 프로세스가 실행되지 않아요.
플러그인 프로세스 실행
플러그인 프로세스를 시작하기 전에 Vault는 플러그인 카탈로그에서 플러그인을 이름으로 조회하고 플러그인 아티팩트의 SHA256을 등록된 SHA256 합계와 대조해요. 합계가 일치하면 Vault는 카탈로그에 등록된 명령과 함께 JWT 형식의 응답 래핑 토큰 및 관련 mlock 설정을 사용해 플러그인을 시작해요.
Vault는 내장 플러그인은 Vault 프로세스 내에서 생성하고 외부 플러그인은 별도의 프로세스로 생성하며, 이때 Vault가 부모 프로세스가 돼요.
활성 Vault 노드와 performance standby 노드 모두 외부 플러그인 프로세스를 생성할 수 있어요. 플러그인 프로세스는 Vault가 명시적으로 종료할 때까지 계속 실행돼요. 일반적인 종료 이벤트는 다음과 같아요.
- Vault 활성 노드 스텝다운(step-down)
- Vault 배리어 실링(seal)
- Vault 정상 종료(graceful shutdown)
- 외부 플러그인을 사용하는 시크릿 엔진 또는 인증 메서드 비활성화
- 구성된 데이터베이스 연결 삭제
- 구성된 데이터베이스 연결 업데이트
- 구성된 데이터베이스 연결 리셋 요청
- 데이터베이스 루트 자격 증명 회전
- 이전에 실패한 루트 자격 증명 회전 작업의 WAL 롤백
Vault는 플러그인 프로세스 생명주기를 자동으로 관리해요. 플러그인을 활성화하면 프로세스가 시작되지만, Vault는 다른 내부 프로세스를 통해 필요에 따라 플러그인 프로세스를 시작하고 종료해요. Vault가 플러그인의 생명주기를 관리하고 추적하므로 플러그인을 수동으로 종료하지 않는 것이 좋아요. Vault가 플러그인 프로세스를 대역 외로 종료하면 Vault는 해당 플러그인이 필요한 클라이언트 요청을 받을 때 프로세스를 지연 재로드(lazily reload)해요.
멀티플렉싱
Vault는 같은 유형의 마운트에 여러 프로세스를 생성하지 않도록 플러그인 멀티플렉싱을 허용해요. 멀티플렉싱을 구현하는 플러그인을 실행할 때 Vault는 모든 Vault 네임스페이스에서 해당 유형의 모든 마운트에 대해 단일 플러그인 프로세스를 사용해요. 플러그인 멀티플렉싱은 기존 플러그인의 현재 동작에 영향을 주지 않아요.
플러그인 멀티플렉싱 구현에 대한 추가 자료:
- 데이터베이스 시크릿 엔진
- 시크릿 엔진 및 인증 메서드
플러그인 통신
Vault는 플러그인 쪽의 RPC 서버에 상호 인증된 TLS 연결을 통해 플러그인과 안전하게 통신해요. HashiCorp 관리 플러그인은 go-plugin의 AutoMTLS 기능을 사용해 전송 인증을 위한 상호 TLS를 자동으로 협상해요.
컴파일 시점에 Vault 바이너리에 포함된 내장 플러그인은 TLS 연결을 설정하는 올바른 API 주소를 이미 알고 있지만, 수동 등록된 플러그인이 마운트 시점에 Vault 서버와 통신을 설정할 수 있도록 Vault 구성에 api_addr 매개변수를 설정해야 해요. 스토리지 백엔드가 HA를 활성화하고 자동 호스트 주소 감지(예: Consul)를 지원한다면 Vault는 api_addr을 자동으로 결정하려고 시도해요.
성능 확장
Vault Enterprise에서 실행되는 플러그인은 플러그인 작성자의 명시적 조치 없이 performance standby를 활용할 수 있어요. 기본적으로 Vault Enterprise는 플러그인에 대한 요청을 포함한 모든 요청을 performance standby에서 처리하려고 해요.
플러그인 요청이 스토리지에 쓰려고 하면 요청은 read-only 오류를 받고, Vault는 원본 전체 요청을 투명하게 활성 노드로 다시 라우팅해요. 그 결과 플러그인은 플러그인 코드를 명시적으로 변경하지 않고도 Vault Enterprise에서 수평 확장할 수 있어요.