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.