Spring Boot는 속성 파일을 사용하며 적어도 기본적으로 비밀번호는 일반 텍스트입니다. 어떻게 든 숨기거나 해독 할 수 있습니까?
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로 쉽게 구성하려면 그룹 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
mvn -Djasypt.encryptor.password=supersecretz spring-boot:run
에 표시 되지 ps
않습니까?
JASYPT_ENCRYPTOR_PASSWORD
업데이트 : 나는 사람들이 이것을 반대 투표하는 것을 보았으므로 이것이 이상적인 해결책은 아니지만 이것이 작동하고 일부 사용 사례에서 받아 들일 수 있다고 말해야합니다. 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의 경우 :
자세한 정보는이 문서 를 참조하십시오 .
Spring Cloud Config Server는 이러한 유형의 동작을 허용합니다. JCE를 사용하면 서버에 키를 설정하고이를 사용하여 앱 속성을 암호화 할 수 있습니다.
http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
이미 제안 된 솔루션에 VaultSecrets Manager
와 같은 외부 구성 옵션을 추가 할 수 있습니다 .
vault server -dev
( PROD가 아닌 DEV에만 해당 )vault write secret/somename key1=value1 key2=value2
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) {
// …
}
}
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
Spring Boot App의 application.properties 에서 DB-Password를 숨기는 내 솔루션 은 여기에서 구현 됩니다 .
시나리오 : 시작시 application.properties 에서 이미 읽고 저장 한 일부 가짜 비밀번호 는 전역 Spring 객체에서 ConfigurableEnvironment가 런타임에서 프로그래밍 방식으로 실제 DB-Password로 대체됩니다. 실제 암호는 안전한 프로젝트 외부 위치에 저장된 다른 구성 파일에서 읽습니다.
잊지 마세요 : 메인 클래스 에서 다음을 사용하여 Bean 을 호출합니다 .
@Autowired
private SchedUtilility utl;
인기있는 K8, jasypt 또는 vault 솔루션 외에도 Karmahostage 도 있습니다 . 다음을 수행 할 수 있습니다.
@EncryptedValue("${application.secret}")
private String application;
jasypt와 동일한 방식으로 작동하지만 암호화는 더 세분화 된 ACL 모델이 첨부 된 전용 saas 솔루션에서 발생합니다.