스프링 부트 속성 파일에서 암호를 숨기는 방법
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.sh
JASYPT_ENCRYPTOR_PASSWORD
변수#!/bin/module
JASYPT_ENCryptOR_PASSWORD=supersecretz 내보내기
- 「」로 합니다.
. setEnv.sh
- 을
mvn spring-boot:run &
- " " 를 합니다.
setEnv.sh
- 를 다음과 같이 설정 합니다.
unset JASYPT_ENCRYPTOR_PASSWORD
에 외부 설정 할 수 .Secrets Manager
예를 들어 Vault와 같이.
- 서버 구성
vault server -dev
(DEV에만 해당되며 PROD에는 해당되지 않음) - 을 쓰다
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>
볼트 템플릿 구성:
@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의 경우:
상세한 것에 대하여는, 이 메뉴얼을 참조해 주세요.
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
'programing' 카테고리의 다른 글
이클립스:클래스 이름 자동 완성 시 특정 패키지 제외 (0) | 2022.09.03 |
---|---|
ClassNotFoundException 해결방법 (0) | 2022.09.03 |
Jackson: 필드 직렬화를 방지하는 방법 (0) | 2022.09.03 |
Maven 환경 변수 (0) | 2022.09.03 |
왜 여기에 정수 리터럴을 넣어야 하는지 아세요? (0) | 2022.09.03 |