Spring Boot 속성 파일에서 비밀번호를 숨기는 방법


81

Spring Boot는 속성 파일을 사용하며 적어도 기본적으로 비밀번호는 일반 텍스트입니다. 어떻게 든 숨기거나 해독 할 수 있습니까?

답변:


86

당신은 사용할 수 있습니다 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로 쉽게 구성하려면 그룹 ID와 함께 스타터 jasypt-spring-boot-starter 를 사용할 수 있습니다.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는 마법을 연결합니다. 속성은 물론 클래스 경로에 있어야 함).

@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.sh를 내보내려면 편집하십시오.JASYPT_ENCRYPTOR_PASSWORD

    #! / bin / bash

    export JASYPT_ENCRYPTOR_PASSWORD = supersecretz

  • 다음을 사용하여 파일 실행 . setEnv.sh
  • 백그라운드에서 앱 실행 mvn spring-boot:run &
  • 파일 삭제 setEnv.sh
  • 다음을 사용하여 이전 환경 변수를 설정 해제하십시오. unset JASYPT_ENCRYPTOR_PASSWORD

2
gradle @Frerica Piazza를 사용하여 자세히 설명해 주시겠습니까?
— testuser

maven과 함께 사용하는 것은 명확하지 않습니다. 당신은 몇 가지 재산을 전달하고 더 이상 무엇입니까? 어디에 속성 파일? 코드에서이 값을 지정하는 방법은 무엇입니까?
— gstackoverflow

1
@FedericoPiazza 암호를 노출하여 출력 mvn -Djasypt.encryptor.password=supersecretz spring-boot:run에 표시 되지 ps않습니까?
— Srki Rakic

1
@SrkiRakic ​​예, 물론입니다. 이것은 개발 용이며 프로덕션 용으로 원한다면 환경 변수를 사용해야합니다. 봄 부팅하면 사용할 수 있습니다JASYPT_ENCRYPTOR_PASSWORD
— 페데리코 광장을

1
하하 그리고 환경 변수에 어떻게 들어가나요? 아마도 service difinition과 같은 다른 파일에서 온 것 같습니다 : D 또한 jasypt는 암호 파생에 관해서는 구식이므로 완전히 임의의 32 자 암호를 사용하십시오
— Roman Plášil

14

업데이트 : 나는 사람들이 이것을 반대 투표하는 것을 보았으므로 이것이 이상적인 해결책은 아니지만 이것이 작동하고 일부 사용 사례에서 받아 들일 수 있다고 말해야합니다. 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에서

자세한 정보는이 문서 를 참조하십시오 .


25
환경 vars에서 마스터 비밀번호를 설정하는 것은 좋은 생각이 아니라고 생각합니다. 이제 암호가 필요 이상으로 노출됩니다. Federico에서 보여준 것처럼 스타트 업을 제공하는 것은 환경에 설정하는 것보다 노출이 적고 "안전"합니다.
— Jaavaaan

Yaa, 공유 컴퓨터를 사용하는 경우는 아닙니다. 그러나 컴퓨터의 유일한 관리자 인 경우 다른 사용자는 환경 변수를 볼 수 없습니다. 나는 숨는 부분과 쉬운 부분에 대답했다. 그러나 예, Federico가 제안한 방법이 훨씬 더 낫다는 데 동의합니다.
— Sanjay Rawat 2016 년



11

이미 제안 된 솔루션에 VaultSecrets Manager 와 같은 외부 구성 옵션을 추가 할 수 있습니다 .

  1. Vault 서버 구성 vault server -dev( PROD가 아닌 DEV에만 해당 )
  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>

Vault 템플릿 구성 :

@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();
  }
}

Vault 사용 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) {
    // …
  }
}

이 솔루션에 +1. vault / etcd (또는 기타)와 같은 시스템을 사용하는 것이 좋습니다. diogomonica.com/2017/03/27/…
— Book Of Zeus

3
-1은 "마스터"키 (VAULT_TOKEN)가 보안되는 방법을 설명하지 않기 때문입니다. VAULT_TOKEN 환경 변수는 어디에서 왔습니까? 어떻게 보호됩니까? 해당 키를 보호하지 않고 공격자는이를 사용하여 Spring Boot jar에 패키지 된 코드를 사용하여 볼트에서 비밀을 검색 할 수 있습니다.
— corporatedrone

또한 prod 확보가 주요 문제입니다. 그래서 여기서 말해야합니다. 괜찮은 경우 개발 / QA 환경에 대한 지침.
— sofs1

이것은 많은 암호가있을 때 작동합니다. 연결하는 데 하나의 암호에 대해 작동하지만 동일한 환경에 다른 암호를 넣을 필요가 없도록 볼트 암호를 환경에 넣는다는 것은 재미 있습니다.
— Lee Meador 19 년

0

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


0

Spring Boot App의 application.properties 에서 DB-Password를 숨기는 내 솔루션 은 여기에서 구현 됩니다 .

시나리오 : 시작시 application.properties 에서 이미 읽고 저장 한 일부 가짜 비밀번호 는 전역 Spring 객체에서 ConfigurableEnvironment가 런타임에서 프로그래밍 방식으로 실제 DB-Password로 대체됩니다. 실제 암호는 안전한 프로젝트 외부 위치에 저장된 다른 구성 파일에서 읽습니다.

잊지 마세요 : 메인 클래스 에서 다음을 사용하여 Bean 을 호출합니다 .

@Autowired
private SchedUtilility utl;

0

인기있는 K8, jasypt 또는 vault 솔루션 외에도 Karmahostage 도 있습니다 . 다음을 수행 할 수 있습니다.

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

jasypt와 동일한 방식으로 작동하지만 암호화는 더 세분화 된 ACL 모델이 첨부 된 전용 saas 솔루션에서 발생합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.