programing

시작하는 동안 Spring boot MariaDB 볼트 사용자 이름 자격 증명을 사용할 수 없음

megabox 2023. 8. 17. 21:05
반응형

시작하는 동안 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

반응형