Elasticsearch 데이터베이스 시크릿 엔진
Elasticsearch 데이터베이스 시크릿 엔진 (Elasticsearch database secrets engine)
데이터베이스 시크릿 엔진에서 Elasticsearch 자격 증명을 동적으로 생성하는 elasticsearch 플러그인을 다룹니다.
출처: 문서
본문
참고: 이 엔진은 TLS 또는 서명 검증의 일부로 외부 X.509 인증서를 사용할 수 있어요. SHA-1을 사용하는 X.509 인증서에 대한 서명 검증은 더 이상 사용되지 않으며(deprecated), Vault 1.12부터는 우회 조치 없이는 사용할 수 없어요. 자세한 내용은 deprecation notices를 참고하세요.
Elasticsearch는 데이터베이스 시크릿 엔진이 지원하는 플러그인 중 하나예요. 이 플러그인은 Elasticsearch에 대해 설정된 역할을 기반으로 데이터베이스 자격 증명을 동적으로 생성합니다.
데이터베이스 시크릿 엔진 설정에 대한 자세한 내용은 데이터베이스 시크릿 엔진 문서를 참고하세요.
기능 (Capabilities)
| 플러그인 이름 | 루트 자격 증명 회전 | 동적 역할 | 정적 역할 | 사용자명 커스터마이즈 |
|---|---|---|---|---|
| elasticsearch-database-plugin | Yes | Yes | Yes (1.6+) | Yes (1.8+) |
시작하기 (Getting started)
이 플러그인을 활용하려면 먼저 X-Pack을 활성화해 Elasticsearch의 네이티브 보안 영역(realm) 을 켜야 해요. 여기서는 Elasticsearch 7.1.1로 이 과정을 안내합니다.
Elasticsearch에서 X-Pack 보안 활성화
Securing the Elastic Stack을 읽고 X-Pack Security 활성화 지침을 따르세요.
암호화된 통신 활성화
이 플러그인은 Elasticsearch의 보안 API와 통신해요. ES는 이 통신에 TLS를 요구해서 암호화되게 합니다.
Elasticsearch에서 TLS를 설정하려면 먼저 암호화된 통신을 읽고 HTTP 클라이언트 통신 암호화 지침을 진행하세요.
Elasticsearch 쪽에서 TLS를 활성화한 후에는, 생성한 .p12 인증서를 Vault가 사용할 수 있도록 다른 형식으로 변환해야 해요. OpenSSL을 사용해 .p12 인증서를 pem 형식으로 변환하는 예제는 여기 있습니다.
또한 Elasticsearch를 실행하는 인스턴스에, 원래 .p12 형식이었던 새로 생성한 CA 인증서를 설치해야 했어요. .p12 CA 인증서를 pem으로 변환한 후, 그 pem을 crt로 변환하고, 그 crt를 /usr/share/ca-certificates/extra에 추가하고, sudo dpkg-reconfigure ca-certificates를 실행하는 방식으로 처리했어요.
위 지침은 Ubuntu 머신이 아니면 다를 수 있어요. 자신의 운영 환경에 맞는 방법을 사용하도록 하세요. 모든 운영 환경을 설명하는 것은 이 지침의 범위 밖입니다.
비밀번호 설정
완료 후 $ $ES_HOME/bin/elasticsearch-setup-passwords interactive를 실행해 X-Pack을 활성화했는지 확인해요. 여러 비밀번호 입력 단계를 거치게 되면 성공적으로 설정된 것입니다.
Vault용 역할 만들기
다음으로, Elasticsearch에서 시크릿 관리에 쓸 Vault 전용 사용자를 만들 것을 권장합니다.
먼저 Vault가 사용자·비밀번호를 관리하는 데 필요한 최소 권한을 주는 역할을 만들어 Elasticsearch에 POST를 수행해요. 여기서는 $ $ES_HOME/bin/elasticsearch-setup-passwords interactive 단계에서 비밀번호를 만든 elastic / vaultuser를 사용했어요.
$ curl \
-X POST \
-H "Content-Type: application/json" \
-d '{"cluster": ["manage_security"]}' \
http://vaultuser:$PASSWORD@localhost:9200/_xpack/security/role/vault
다음으로, 그 역할과 연결된 Vault용 사용자를 만들어요.
$ curl \
-X POST \
-H "Content-Type: application/json" \
-d @data.json \
http://vaultuser:$PASSWORD@localhost:9200/_xpack/security/user/vault
이 예제의 data.json 내용:
{
"password" : "myPa55word",
"roles" : [ "vault" ],
"full_name" : "Hashicorp Vault",
"metadata" : {
"plugin_name": "Vault Plugin Database Elasticsearch",
"plugin_url": "https://github.com/hashicorp/vault-plugin-database-elasticsearch"
}
}
이제 Elasticsearch가 구성되어 Vault와 함께 사용할 준비가 됐어요.
설정 (Setup)
- 데이터베이스 시크릿 엔진이 아직 활성화되지 않았다면 활성화해요.
$ vault secrets enable database
Success! Enabled the database secrets engine at: database/
기본적으로 시크릿 엔진은 엔진 이름으로 활성화돼요. 다른 경로에 활성화하려면 -path 인자를 사용하면 됩니다.
- 적절한 플러그인과 연결 정보로 Vault를 구성해요.
$ vault write database/config/my-elasticsearch-database \
plugin_name="elasticsearch-database-plugin" \
allowed_roles="internally-defined-role,externally-defined-role" \
username=vault \
password=myPa55word \
url=http://localhost:9200 \
ca_cert=/usr/share/ca-certificates/extra/elastic-stack-ca.crt.pem \
client_cert=$ES_HOME/config/certs/elastic-certificates.crt.pem \
client_key=$ES_HOME/config/certs/elastic-certificates.key.pem
사용법 (Usage)
시크릿 엔진이 구성되면 동적·정적 역할을 구성해 자격 증명을 생성할 수 있어요.
동적 역할 (Dynamic Roles)
동적 역할은 매 요청마다 새 자격 증명을 생성해요.
- Vault의 이름을 Elasticsearch의 역할 정의에 매핑하는 역할을 구성해요. 이것은 아무도 Elasticsearch에서 역할의 권한을 out-of-band로 편집해 권한 상승을 못 하기 때문에 가장 안전한 유형의 역할로 간주됩니다.
$ vault write database/roles/internally-defined-role \
db_name=my-elasticsearch-database \
creation_statements='{"elasticsearch_role_definition": {"indices": [{"names":["*"], "privileges":["read"]}]}}' \
default_ttl="1h" \
max_ttl="24h"
- 또는 Vault의 이름을 Elasticsearch의 기존 역할 정의에 매핑하는 역할을 구성해요.
$ vault write database/roles/externally-defined-role \
db_name=my-elasticsearch-database \
creation_statements='{"elasticsearch_roles": ["pre-existing-role-in-elasticsearch"]}' \
default_ttl="1h" \
max_ttl="24h"
- 역할 이름으로
/creds엔드포인트를 읽어 새 자격 증명을 생성해요.
$ vault read database/creds/my-role
Key Value
--- -----
lease_id database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration 1h
lease_renewable true
password 0ZsueAP-dqCNGZo35M0n
username v-vaultuser-my-role-AgIViC5TdQHBdeiCxae0-1602541724
정적 역할 (Static Roles)
정적 역할은 매 요청마다 같은 자격 증명을 반환해요. 자격 증명은 제공된 일정에 따라 회전됩니다.
- Vault의 이름을 Elasticsearch의 기존 사용자에 매핑하는 정적 역할을 구성해요.
$ vault write database/static-roles/my-static-role\
db_name=my-elasticsearch-database \
username=my-existing-elasticsearch-uername \
rotation_period="24h"
- /static-creds 엔드포인트에서 현재 사용자명과 비밀번호를 가져와요.
$ vault read database/static-creds/my-static-role
Key Value
--- -----
last_vault_rotation 2023-09-14T08:24:39.650491913-04:00
password current-password
rotation_period 24h
ttl 23h59m59s
username my-existing-elasticsearch-uername
API
구성 가능한 전체 옵션 목록은 Elasticsearch 데이터베이스 플러그인 API 페이지에서 확인할 수 있어요.
데이터베이스 시크릿 엔진 HTTP API에 대한 자세한 내용은 데이터베이스 시크릿 엔진 API 페이지를 참고하세요.