시작하는 동안 Spring boot MariaDB 볼트 사용자 이름 자격 증명을 사용할 수 없음
문제 문: java.sql.SQLSyntaxErrorException:address=(host=127.0.0.1)(port=3306)(type=master)에 연결할 수 없습니다. (host=1058) 데이터베이스 'my-db'에 대한 사용자 '@'localhost'에 대한 액세스가 거부되었습니다. 시작하는 동안 사용자를 사용할 수 없습니다.
볼트 구성:
vault write database/config/my-db \
plugin_name=mysql-database-plugin \
connection_url="{{username}}:{{password}}@tcp(127.0.0.1:3306)/" \
allowed_roles="healthy-role-r-wr" \
username="root" \
password="myrootpassword"
vault write database/roles/healthy-role-r-wr \
db_name=my-db \
creation_statements="CREATE USER '{{name}}'@'localhost' IDENTIFIED BY '{{password}}'; GRANT ALL PRIVILEGES ON my-db.* TO '{{name}}'@'localhost'; FLUSH PRIVILEGES;" \default_ttl="1h" \
max_ttl="24h"
mysql 명령을 테스트하는 동안 mysql에 연결할 수 없다는 메시지 없이 host @localhost를 언급해야 했습니다.
vault read database/creds/healthy-role-r-wr
Key Value
--- -----
lease_id database/creds/healthy-role-r-wr/DugI5aIeYPUg0lmjtcNSM87L
lease_duration 1h
lease_renewable true
password C1yN7Tl-00XlwkOwbFCh
username v_root_healthy-ro_7nl7RPTqb6QkAJ
mysql -uv_root_healthy-ro_7nl7RPTqb6QkAJ -pC1yN7Tl-00XlwkOwbFCh my-db
MariaDB [my-db]> select count(*) from my_table;
1 row in set (0.025 sec)
Vault가 올바르게 구성되어 있는 것 같습니다.
application.yml
spring:
application:
name: my-springboot-app
cloud:
vault:
host: 127.0.0.1
port: 8200
scheme: http
authentication: token
token: TOKEN
generic:
enabled: true
database:
backend: mysql
kv:
enabled: true
backend: tcds/kv/my-springboot-app
application-name: my-springboot-app
config:
import: vault://secret/my-springboot-app
datasource:
url: jdbc:mariadb://127.0.0.1:3306/my-db
driver-class-name: org.mariadb.jdbc.Driver
platform: mariadb
role: healthy-role-r-wr
#username: ${dbusername}
#password: ${dbpassword}
jpa:
show-sql: true
hibernate:
ddl-auto: update
POM:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.4</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
<spring-cloud.version>2020.0.1</spring-cloud.version>
</properties>
종속성:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-vault-config-databases</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
볼트에서 저는 위의 application.yml에 표시된 것처럼 사용자 이름과 암호로 KV를 만드는 비밀을 만들었습니다.만약 내가 이것을 통과한다면,
#username: ${dbusername}
#password: ${dbpassword}
그러면 애플리케이션이 깨끗하게 시작되고 사용자 목록을 얻기 위해 API 호출을 할 수 있습니다.하지만 이것은 원래의 방식이 아닙니다.사용자 이름과 암호가 동적으로 생성되고 있으므로 응용 프로그램에서 사용해야 합니다.
스프링 부트 앱이 볼트를 인식하고 볼트와 통신할 수 있기 때문에 구성이 누락된 것 같습니다. 다만 동적 자격 증명을 읽는 방법을 찾을 수 없습니다.
귀하의 문제는 제가 우연히 만나 며칠 동안 해결해 온 문제와 유사하게 들리므로, 귀하나 다른 사람에게 도움이 될 경우를 대비하여 여기에 글을 올립니다.
데이터베이스 플러그인에서 동적으로 로드할 속성 이름과 일치하는 속성 이름으로 사용자 이름 및/또는 암호를 kv에 저장하는 경우 동일한 키를 가진 중복 속성 로더가 있으며 kv 값이 우선합니다.
예를 들어 내 경우에 내가 한 일은
vault kv put secret/foo spring.datasource.password=wrongpassword
(DB 플러그인이 암호를 로드하는 데 사용하는 암호의 기본 키는 spring.datasource.password입니다.)
내가 전화할 수 있는 동안
vault read database/creds/some-role
SpringBoot 앱을 실행했을 때 사용 중인 암호가 kv 값이라는 것을 알게 되었습니다.디버깅할 때 속성 로더 우선 순위 때문이라는 것을 알았습니다.
DB 플러그인에서 사용할 키/값 쌍에서 kv를 지울 경우 정의한 역할에 의해 생성된 동적 자격 증명을 사용해야 합니다.
또한 데이터 소스를 구성하려면 SpringBoot 앱의 시작 동작을 수정하기 위해 볼트 정보가 포함된 bootstrap.yml 파일이 필요한 것으로 알고 있습니다.
spring:
application:
name: <app name>
cloud:
vault:
database:
enabled: true
role: <role>
backend: database
host: <host>
port: <port>
scheme: https
authentication: token
token: <your vault token>
uri: <vault URL>
이 다른 답변도 저에게 도움이 되었습니다.그것은 내 앱의 속성 값을 봄 클라우드 - bootstrap.properties를 내 병 밖에서 볼 수 있게 해주었습니다.
생성한 역할은 아래와 같이 spring.cloud.vault.database 아래에 나열되어야 합니다.
database:
enabled: true
role: healthy-role-r-wr
backend: database # not mysql as you have it in your config
당신이 자세히 살펴보고 싶다면 이에 대한 비디오를 자세히 만들었습니다.
언급URL : https://stackoverflow.com/questions/66838626/spring-boot-mariadb-vault-username-credentials-not-available-during-startup
'programing' 카테고리의 다른 글
오류 2002(HY000):소켓 '/var/run/mysqld/mysqld/mysqld를 통해 로컬 MySQL 서버에 연결할 수 없습니다.sock' (2) 해결책이 작동하지 않음 (0) | 2023.08.17 |
---|---|
병합 커밋이 없는 Git 로그 보기 (0) | 2023.08.17 |
CSS에서 배경 이미지를 제거하려면 어떻게 해야 합니까? (0) | 2023.08.17 |
Google Analytics에서 AJAX에서 호출한 페이지를 추적하려면 어떻게 해야 합니까? (0) | 2023.08.17 |
쿼리에서 그룹 함수 오류를 잘못 사용하는 중 (0) | 2023.08.17 |