Spring Boot 如何处理www.example.com文件中的Docker-Secretsapplication.properties

bq9c1y66  于 2022-11-05  发布在  Spring
关注(0)|答案(3)|浏览(152)

如何将Docker secrets(来自/run/secrets的文件/数据)注入到application.properties文件中?使用环境变量安全吗?

rqmkfv5c

rqmkfv5c1#

首先,对application.properties的秘密数据使用环境变量是不安全的。
当你谈论秘密时,你主要有两个选择。
1.如果您使用的是Docker Secrets而不是Docker Swarm,那么您可以直接在secret中加载整个application.properties,将其挂载在/run/secrets下,并将其作为带有Spring标志的配置文件引用。
1.如果您将Docker Secrets与Docker Swarm一起使用,则可以将您感兴趣的具体字段存储为secret,并使用Swarm的配置模板将其关联起来。
示例:

echo -n "myUser" | docker secret create db_user -
echo -n "myPass" | docker secret create db_password -
echo -n "jdbc://..." | docker secret create db_url -

应用程序.属性.tmpl

spring.datasource.url={{ secret "db_url" }}
spring.datasource.user={{ secret "db_user" }}
spring.datasource.password={{ secret "db_password" }}

停靠-撰写.yml

version: '3.9'
services:
  api:
    image: yourapp:1.0.0
  configs:
    - source: application.properties
      target: /usr/app/config/application.properties
  secrets:
    - db_url
    - db_user
    - db_password

configs:
  application.properties:
    template_driver: golang
    file: ./application.properties.tmpl
    name: myapp.application.properties

secrets:
  db_url:
    external: true
  db_user:
    external: true
  db_password:
    external: true

当您使用docker stack deploy -c docker-compose.yml myapp进行部署时,它将自动使用机密的内容填充配置,并将其装载到目标路径中。

rur96b6h

rur96b6h2#

如果您订阅了configuration上的 * 十二因素应用 * 理念,则环境变量是存储应用机密的适当位置。
特别是使用Sping Boot ,可以将它们设置为容器中的env变量,遵循UPPER_SNAKE_CASE命名约定,Map到application.propertiesapplication.yml文件中的键。例如,如果您希望将数据库密码设置为好像它在application.properties文件中定义为database.password=i-am-the-password,但在版本控制中忽略它,则可以执行以下操作:

$ export DATABASE_PASSWORD=i-am-the-password

(Or另一种将env var注入容器运行时的方法。)
然后,可以在Java代码中访问数据库口令,如下所示:

import org.springframework.beans.factory.annotation.Value;

public class Example {

  private final String databasePassword;

  public Example(
      @Value("${database.password}") String databasePassword) {

    this.databasePassword = databasePassword;
  }
}
lnxxn5zx

lnxxn5zx3#

目前在Spring这是非常容易的。
首先让我们创建2个秘密:

docker secret create magic magic.yml 
docker secret create arctos arctos.yml

在magic.yml和arctos.yml之上是配置文件,您希望将其作为Docker机密保存,例如:

北极圈.yml

---
arctos:
  cold: "Very cold!"

魔术.yml

---
magic:
  value1: "Hello!"
  value2: 20

现在,让我们创建Sping Boot 简单应用程序:

@SpringBootApplication
@EnableConfigurationProperties({MagicProperties.class, ArctosProperties.class})
public class SimpleWebServiceApplication {

  public static void main(String[] args) {
    SpringApplication.run(SimpleWebServiceApplication.class, args);
  }

}

@ConfigurationProperties("arctos")
record ArctosProperties(String cold) {
}

@ConfigurationProperties("magic")
record MagicProperties(String value1, int value2) {
}

@RestController
@RequiredArgsConstructor // lombok annotation pure constructor can be used
class HelloController {

  private final MagicProperties magicProperties;
  private final ArctosProperties arctosProperties;

  @GetMapping("/magic")
  public MagicProperties magic() {
    return magicProperties;
  }

  @GetMapping("/arctos")
  public ArctosProperties arctos() {
    return arctosProperties;
  }

}

应用程序.yml

---
spring:
  application:
    name: hello-secret
  config:
    import: 
      - optional:file:/run/secrets/magic.yml
      - optional:file:/run/secrets/arctos.yml

停靠-撰写.yml

version: '3.9'

networks:
  default:
    driver: overlay
    name: my-network

services:
  hello-secret:
    image: <your_image_here>
    ports:
      - 8080:8080
    deploy:
      replicas: 1
      update_config:
        order: start-first
        monitor: 10s
        delay: 5s
    secrets:
      - source: magic
        target: magic.yml
      - source: arctos
        target: arctos.yml

secrets:
  magic:
    external: true
  arctos:
    external: true

现在运行:

docker stack deploy -c docker-compose.yml mystack

又叫:

http :8080/magic
http :8080/arctos

后脚本

事实上,我们可以让我们的应用程序更加灵活。例如,如果在开发/测试期间,我们不想使用机密,我们可以稍微扩展我们的应用程序

application.yml,我们通过


# Properties

arctos:
  cold: ${ARCTOS_COLD:}

magic:
  value1: ${MAGIC_VALUE1:}
  value2: ${MAGIC_VALUE2:}

docker-compose.yml我们通过

environment:
  MAGIC_VALUE1: "env_used"
  MAGIC_VALUE2: 0
  ARCTOS_COLD: "In fact in env area is hot ;]"

在这种情况下,当机密没有与我们的服务链接时,将使用环境值。(实际上,如果您提供环境值,它们将具有优先级,因此最终它们将获胜)。

相关问题