Grafana를 Hashicorp Vault와 통합
Grafana를 Hashicorp Vault와 통합 (Integrate Grafana with Hashicorp Vault)
Hashicorp Vault로 시크릿(비밀)을 관리한다면, 그 시크릿을 Grafana의 Configuration과 Provisioning에 사용할 수 있어요. Grafana Enterprise에서 사용 가능한 기능이에요. Vault를 활성화하고 $__vault{} 문법으로 설정 값이나 프로비저닝 파일을 가리키는 방식으로 동작합니다.
본문
참고: Grafana Enterprise에서 사용 가능해요.
참고: Grafana를 고가용성(high availability)으로 구성했다면 프로비저닝 파일에 동적 시크릿(dynamic secrets)을 사용하지 않는 것이 좋아요. 각 Grafana 인스턴스는 자신의 lease를 갱신할 책임이 있어요. Grafana 서버 중 하나가 종료되면 데이터 소스 lease가 만료될 수 있어요.
구성 (Configuration)
Vault를 사용하기 전에 Vault 서비스의 URL, 인증 방법(현재는 token만 지원), 토큰을 제공해 Vault를 활성화해야 해요. Grafana는 서비스 토큰이 갱신 가능하고 제한된 수명으로 설정되어 있다면, 이를 자동으로 갱신해요.
짧은 수명의 lease를 사용한다면 Grafana가 lease를 얼마나 자주, 얼마나 오래 갱신할지도 구성할 수 있어요. 문제가 발생하지 않는 한 기본값을 유지하는 것을 권장해요.
[keystore.vault]
# Location of the Vault server
;url =
# Vault namespace if using Vault with multi-tenancy
;namespace =
# Method for authenticating towards Vault. Vault is inactive if this option is not set
# Possible values: token
;auth_method =
# Secret token to connect to Vault when auth_method is token
;token =
# Time between checking if there are any secrets which needs to be renewed.
;lease_renewal_interval = 5m
# Time until expiration for tokens which are renewed. Should have a value higher than lease_renewal_interval
;lease_renewal_expires_within = 15m
# New duration for renewed tokens. Vault may be configured to ignore this value and impose a stricter limit.
;lease_renewal_increment = 1h
vault server -dev 예시:
[keystore.vault]
url = http://127.0.0.1:8200 # HTTP should only be used for local testing
auth_method = token
token = s.sAZLyI0r7sFLMPq6MWtoOhAN # replace with your key
Vault expander 사용하기 (Using the Vault expander)
Vault를 구성한 뒤에는 Vault를 사용하려는 구성 또는 프로비저닝 파일을 설정해야 해요. Vault 구성은 구성의 변수 확장(variable expansion)의 확장이며 $__vault{} 문법을 따르며, 확장 표기는 ${VAR} 대신 $VAR 형태를 써요 (참고: Grafana 변수 확장). Vault의 인자는 콜론으로 구분된 세 부분으로 구성돼요.
- 첫 번째 부분은 사용할 시크릿 엔진(secrets engine)을 지정해요.
- 두 번째 부분은 접근할 시크릿을 지정해요.
- 세 번째 부분은 해당 시크릿의 어떤 필드를 사용할지 지정해요.
예를 들어 Grafana admin 사용자용 Key/Value 시크릿을 secret/grafana/admin_defaults에 두었다면, 그 password 필드에 접근하는 문법은 $__vault{kv:secret/grafana/admin_defaults:password}예요.
시크릿 엔진 (Secrets engines)
Vault는 인가된 사용자가 요청할 때 시크릿을 저장하거나 생성하는 여러 방법을 나타내는 다양한 시크릿 엔진을 지원해요. Grafana는 그중 Grafana 설치에 가장 관련 있을 것 같은 일부를 지원해요.
Key/Value: Grafana는 임의 시크릿을 kv로 저장하고 검색하는 데 사용되는 Vault의 K/V 버전 2 스토리지 엔진을 지원해요.
$__vault{kv:secret/grafana/smtp:username}
Databases: Vault databases 시크릿 엔진은 비슷한 문법을 공유하고 사용자에게 데이터베이스에 대한 동적 접근을 부여하는 시크릿 엔진 계열이에요. Grafana 자체의 데이터베이스 접근을 설정하거나 데이터 소스를 프로비저닝하는 데 모두 사용할 수 있어요.
$__vault{database:database/creds/grafana:username}
예시 (Examples)
다음 예시는 구성 값을 검색하기 위해 Vault를 사용하도록 구성 또는 프로비저닝 파일을 설정하는 방법을 보여 줘요.
Configuration:
Grafana 구성 파일의 이메일과 데이터베이스 자격 증명을 설정하기 위해 Vault를 사용하는 부분 예시.
[smtp]
enabled = true
host = $__vault{kv:secret/grafana/smtp:hostname}:587
user = $__vault{kv:secret/grafana/smtp:username}
password = $__vault{kv:secret/grafana/smtp:password}
[database]
type = mysql
host = mysqlhost:3306
name = grafana
user = $__vault{database:database/creds/grafana:username}
password = $__vault{database:database/creds/grafana:password}
Provisioning:
Vault의 database 시크릿 엔진을 사용해 MySQL 데이터 소스를 설정하는 프로비저닝 YAML 파일의 전체 예시. (provisioning/custom.yaml)
apiVersion: 1
datasources:
- name: statistics
type: mysql
url: localhost:3306
database: stats
user: $__vault{database:database/creds/ro/stats:username}
secureJsonData:
password: $__vault{database:database/creds/ro/stats:password}