programing

스프링 부트 속성 파일에서 암호를 숨기는 방법

yoursource 2022. 9. 3. 17:00
반응형

스프링 부트 속성 파일에서 암호를 숨기는 방법

Spring Boot에서는 속성 파일이 사용되며, 적어도 기본적으로는 비밀번호는 보통 텍스트로 되어 있습니다.이것들을 어떻게든 숨기거나 해독할 수 있을까요?

Jasypt를 사용하여 속성을 암호화할 수 있으므로 다음과 같은 속성을 가질 수 있습니다.

db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)

하면 Jasypt에 할 수 .ENC(...)예를 들어 단말기를 사용하여 Jasypt를 통해 다음과 같이 암호화할 수 있습니다.

encrypted-pwd$ java -cp ~/.m2/repository/org/jasypt/jasypt/1.9.2/jasypt-1.9.2.jar  org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="contactspassword" password=supersecretz algorithm=PBEWithMD5AndDES

----ENVIRONMENT-----------------

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 24.45-b08



----ARGUMENTS-------------------

algorithm: PBEWithMD5AndDES
input: contactspassword
password: supersecretz



----OUTPUT----------------------

XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=

Spring Boot에서 쉽게 설정하려면 스타터 jasypt-spring-boot-starter를 그룹 ID로 사용하면 됩니다.com.github.ulisesbocchio

속성 암호화에 사용한 과 동일한 암호를 사용하여 응용 프로그램을 시작해야 합니다.따라서 다음과 같이 앱을 시작할 수 있습니다.

mvn -Djasypt.encryptor.password=supersecretz spring-boot:run

또는 환경변수 사용(스프링 부트 완화 바인딩 사용):

export JASYPT_ENCRYPTOR_PASSWORD=supersecretz
mvn spring-boot:run

자세한 내용은 아래 링크를 참조하십시오.

https://www.ricston.com/blog/encrypting-properties-in-spring-boot-with-jasypt-spring-boot/

앱에서 암호화된 속성을 사용하려면 원하는 방법 중 하나를 사용하십시오(Spring Boot wires the magic, 어쨌든 속성은 클래스 경로에 있어야 합니다).

「」를 사용합니다.@Value

@Value("${db.password}")
private String password;

★★★★★★★★★★★★★★★★★Environment

@Autowired
private Environment environment;

public void doSomething(Environment env) {
    System.out.println(env.getProperty("db.password"));
}

의 경우 위해 과 같이 수 .ps의 이전 , " " "history할 수 있습니다.하다

  • 을 만드세요.touch setEnv.sh
  • ★★setEnv.shJASYPT_ENCRYPTOR_PASSWORD변수

    #!/bin/module

    JASYPT_ENCryptOR_PASSWORD=supersecretz 내보내기

  • 「」로 합니다.. setEnv.sh
  • mvn spring-boot:run &
  • " " 를 합니다.setEnv.sh
  • 를 다음과 같이 설정 합니다.unset JASYPT_ENCRYPTOR_PASSWORD

에 외부 설정 할 수 .Secrets Manager예를 들어 Vault와 같이.

  1. 서버 구성vault server -dev(DEV에만 해당되며 PROD에는 해당되지 않음)
  2. 을 쓰다vault write secret/somename key1=value1 key2=value2
  3. 확인 " " "vault read secret/somename

SpringBoot 프로젝트에 다음 종속성을 추가합니다.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>

Vault 구성 속성 추가:

spring.cloud.vault.host=localhost
spring.cloud.vault.port=8200
spring.cloud.vault.scheme=http
spring.cloud.vault.authentication=token
spring.cloud.vault.token=${VAULT_TOKEN}

VAULT_TOKEN환경변수로 사용됩니다.

여기의 메뉴얼을 참조해 주세요.

Spring Vault 프로젝트는 비밀에 액세스, 저장 및 해지할 때도 사용할 수 있습니다.

의존관계:

<dependency>
    <groupId>org.springframework.vault</groupId>
    <artifactId>spring-vault-core</artifactId>
</dependency>

볼트 템플릿 구성:

@Configuration
class VaultConfiguration extends AbstractVaultConfiguration {

  @Override
  public VaultEndpoint vaultEndpoint() {
    return new VaultEndpoint();
  }

  @Override
  public ClientAuthentication clientAuthentication() {
    return new TokenAuthentication("…");
  }
}

VaultTemplate 주입 및 사용:

public class Example {

  @Autowired
  private VaultOperations operations;

  public void writeSecrets(String userId, String password) {
      Map<String, String> data = new HashMap<String, String>();
      data.put("password", password);
      operations.write(userId, data);
  }

  public Person readSecrets(String userId) {
      VaultResponseSupport<Person> response = operations.read(userId, Person.class);
      return response.getBody();
  }
}

PropertySource:

@VaultPropertySource(value = "aws/creds/s3",
  propertyNamePrefix = "aws."
  renewal = Renewal.RENEW)
public class Config {

}

사용 예:

public class S3Client {

  // inject the actual values
  @Value("${aws.access_key}")
  private String awsAccessKey;
  @Value("${aws.secret_key}")
  private String awsSecretKey;

  public InputStream getFileFromS3(String filenname) {
    // …
  }
}

업데이트: 사람들이 이 문제에 대해 반대표를 던지고 있는 것을 알 수 있었기 때문에, 이것이 이상적인 솔루션은 아니지만, 일부의 유스케이스에서는 유효하고 받아들여질 수 있습니다.Cloudfoundry는 서비스가 응용 프로그램에 바인딩될 때 환경 변수를 사용하여 자격 증명을 주입합니다.자세한 것은, https://docs.cloudfoundry.org/devguide/services/application-binding.html 를 참조해 주세요.

또, 시스템이 공유되지 않는 경우는, 로컬 개발의 경우도 가능합니다.물론 더 안전하고 안전한 방법은 @J-Alex의 답변에 설명되어 있습니다.

답변:

비밀번호를 숨기는 경우 가장 쉬운 방법은 환경변수를 설정하는 것이 가장 쉬운 방법입니다.application.properties이치

»application.properties:

mypassword=${password}

다음으로 컨피규레이션클래스에서 다음 순서를 수행합니다.

@Autowired
private Environment environment;

[...]//Inside a method
System.out.println(environment.getProperty("mypassword"));

고객님의 고객명configuration 링크:

@Value("${password}")
private String herokuPath;

[...]//Inside a method
System.out.println(herokuPath);

참고: 환경변수를 설정한 후 재시작해야 할 수 있습니다.Windows의 경우:

Windows 의 경우

상세한 것에 대하여는, 이 메뉴얼을 참조해 주세요.

Spring Cloud Config Server는 이러한 유형의 동작을 허용합니다.JCE를 사용하여 서버에 키를 설정하고 이를 사용하여 앱 속성을 암호화할 수 있습니다.

http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html

Spring Boot 환경 Kubernetes(K8S) 또는 OpenShift에서 많이 사용하는 경우 런타임에 애플리케이션 속성을 저장하고 가져올 수 있습니다.이 기술은 비밀이라고 불렸습니다.Kubernetes 또는 OpenShift 구성 yaml 파일에서 변수와 플레이스홀더를 선언하고 K8S\OpenShift 측에서 이 플레이스홀더에 대응하는 실제 값을 선언합니다.구현에 대한 자세한 내용은 K8S: https://kubernetes.io/docs/concepts/configuration/secret/ OpenShift: https://docs.openshift.com/container-platform/3.11/dev_guide/secrets.html 를 참조하십시오.

일반적인 K8, 재셉트 또는 볼트 솔루션 외에 Karmahostage도 있습니다.다음과 같은 작업을 수행할 수 있습니다.

@EncryptedValue("${application.secret}")
private String application;

jasypt와 같은 방법으로 동작하지만 암호화는 전용 saas 솔루션에서 이루어지며 보다 세밀한 ACL 모델이 연결됩니다.

Spring Boot App의 application.properties에서 DB-Password를 숨기는 솔루션이 여기에 구현되어 있습니다.

시나리오: 시작 시 application.properties에서 읽은 가짜 비밀번호가 글로벌 Spring 객체 ConfigurableEnvironment에서 Run-Time 프로그램에서는 실제 DB-Password로 대체됩니다.Password로 대체됩니다.실제 비밀번호는 안전한 프로젝트 외부 장소에 저장된 다른 구성 파일에서 읽는 것입니다.

잊지 마십시오. 메인 클래스Bean에게 전화하십시오.

@Autowired
private SchedUtilility utl;

언급URL : https://stackoverflow.com/questions/37404703/spring-boot-how-to-hide-passwords-in-properties-file

반응형