स्प्रिंग बूट गुण फ़ाइल का उपयोग करता है, और कम से कम डिफ़ॉल्ट रूप से, पासवर्ड सादे पाठ में होते हैं। क्या किसी तरह इन को छिपाना / डिक्रिप्ट करना संभव है?
स्प्रिंग बूट गुण फ़ाइल का उपयोग करता है, और कम से कम डिफ़ॉल्ट रूप से, पासवर्ड सादे पाठ में होते हैं। क्या किसी तरह इन को छिपाना / डिक्रिप्ट करना संभव है?
जवाबों:
आप संपत्तियों को एन्क्रिप्ट करने के लिए Jasypt का उपयोग कर सकते हैं , इसलिए आप अपनी संपत्ति इस तरह से कर सकते हैं:
db.password=ENC(XcBjfjDDjxeyFBoaEPhG14wEzc6Ja+Xx+hNPrJyQT88=)
एक बार जब आप अंदर एन्क्रिप्टेड संपत्ति प्राप्त करते हैं, तो जसीप्ट आपको विभिन्न एल्गोरिदम का उपयोग करके अपनी संपत्तियों को एन्क्रिप्ट करने की अनुमति देता है ENC(...)
। उदाहरण के लिए, आप टर्मिनल का उपयोग करके जसपट के माध्यम से इस तरह से एन्क्रिप्ट कर सकते हैं:
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=
स्प्रिंग बूट के साथ इसे आसानी से कॉन्फ़िगर करने के लिए आप इसके स्टार्टर जसप्ट-स्प्रिंग-बूट-स्टार्टर को ग्रुप आईडी के साथ उपयोग कर सकते हैं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/
अपने एप्लिकेशन में अपने एन्क्रिप्टेड गुणों का उपयोग करने के लिए इसे हमेशा की तरह उपयोग करें, या तो अपनी पसंद की विधि का उपयोग करें (स्प्रिंग बूट मैजिक को तार करता है, वैसे भी संपत्ति निश्चित रूप से क्लासपाथ में होनी चाहिए):
@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
निर्यात 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
अद्यतन करें: मैंने देखा कि लोगों ने इसे नीचे मतदान किया है, इसलिए मुझे कहना होगा कि हालांकि यह एक आदर्श समाधान नहीं है, लेकिन यह कुछ उपयोग के मामलों में काम करता है और स्वीकार्य है। क्लाउडफ़ाउंड्री, पर्यावरण चर का उपयोग क्रेडेंशियल को इंजेक्ट करने के लिए करता है जब किसी सेवा को किसी अनुप्रयोग में बाँधा जाता है। अधिक जानकारी https://docs.cloudfoundry.org/devguide/services/application-binding.html
और यह भी कि यदि आपका सिस्टम साझा नहीं किया गया है, तो स्थानीय विकास के लिए भी यह स्वीकार्य है। बेशक, अधिक सुरक्षित और सुरक्षित तरीका @ जे-एलेक्स द्वारा उत्तर में समझाया गया है ।
उत्तर:
यदि आप अपने पासवर्ड को छुपाना चाहते हैं तो सबसे आसान उपाय यह है कि फाइल में या सीधे अपने कोड में एनवायरनमेंटल वैरिएबल का उपयोग 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);
ध्यान दें: पर्यावरण चर सेट करने के बाद आपको पुनरारंभ करना पड़ सकता है। विंडोज के लिए:
अधिक जानकारी के लिए इस प्रलेखन का संदर्भ लें ।
स्प्रिंग क्लाउड कॉन्फ़िगरेशन सर्वर इस प्रकार के व्यवहार की अनुमति देगा। जेसीई का उपयोग करके आप सर्वर पर एक कुंजी सेट कर सकते हैं और इसका उपयोग ऐप्स के गुणों को समझने के लिए कर सकते हैं।
http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
पहले से प्रस्तावित समाधानों के लिए मैं एक बाहरी Secrets Manager
जैसे वॉल्ट को कॉन्फ़िगर करने का विकल्प जोड़ सकता हूं ।
vault server -dev
( केवल DEV के लिए और PROD के लिए नहीं )vault write secret/somename key1=value1 key2=value2
vault read secret/somename
अपने स्प्रिंगबूट प्रोजेक्ट में निम्न निर्भरता जोड़ें:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
तिजोरी विन्यास गुण जोड़ें:
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
एक पर्यावरण चर के रूप में पास करें ।
एक स्प्रिंग वॉल्ट परियोजना है, जिसका उपयोग रहस्यों को प्राप्त करने, भंडारण और पुन: उपयोग करने के लिए भी किया जा सकता है।
निर्भरता:
<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) {
// …
}
}
यदि आप स्प्रिंग बूट वातावरण Kubernetes (K8S) या OpenShift में काफी लोकप्रिय हैं, तो रनटाइम पर एप्लिकेशन प्रॉपर्टी को स्टोर और पुनः प्राप्त करने की संभावना है। इस तकनीक को रहस्य कहा जाता है । कुबेरनेट्स या ओपनशिफ्ट के लिए आपके कॉन्फ़िगरेशन यम फ़ाइल में आप इसके लिए चर और प्लेसहोल्डर की घोषणा करते हैं, और K8S \ OpenShift की ओर वास्तविक मूल्य घोषित करते हैं जो इस प्लेसहोल्डर से मेल खाती है। कार्यान्वयन विवरण के लिए, देखें: K8S: https://kubernetes.io/docs/concepts/configuration/secret/ OpenShift: https://docs.openshift.com/container-platform/3.11/dev_guide/secrets.html
स्प्रिंग बूट अनुप्रयोग में एक डीबी पासवर्ड छुपा मेरे समाधान application.properties कार्यान्वित करता है यहां ।
परिदृश्य: कुछ फर्जी पासवर्ड जो पहले से ही पढ़ रहे हैं और application.properties से बचाए गए हैं , शुरू में, वैश्विक स्प्रिंग ऑब्जेक्ट में विन्यास योग्य होगा, वास्तविक डीबी-पासवर्ड द्वारा रन-टाइम को प्रोग्राममैटली में बदल दिया जाएगा। असली पासवर्ड एक और कॉन्फिगर फाइल से पढ़ा जाएगा, जो सुरक्षित, प्रोजेक्ट-एक्सटर्नल जगह पर सेव किया गया है।
मत भूलो: बीन को मुख्य वर्ग से बुलाओ :
@Autowired
private SchedUtilility utl;
लोकप्रिय K8s करने के लिए अतिरिक्त, jasypt या तिजोरी समाधान में, वहाँ भी है Karmahostage । यह आपको करने में सक्षम बनाता है:
@EncryptedValue("${application.secret}")
private String application;
यह उसी तरह से काम करता है जिस तरह से jasypt करता है, लेकिन एन्क्रिप्शन एक समर्पित सास समाधान पर होता है, जिसमें एक अधिक महीन दाने वाला ACL मॉडल होता है।