स्प्रिंग बूट कैसे गुण फ़ाइल में पासवर्ड छिपाने के लिए


81

स्प्रिंग बूट गुण फ़ाइल का उपयोग करता है, और कम से कम डिफ़ॉल्ट रूप से, पासवर्ड सादे पाठ में होते हैं। क्या किसी तरह इन को छिपाना / डिक्रिप्ट करना संभव है?

जवाबों:


87

आप संपत्तियों को एन्क्रिप्ट करने के लिए 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

2
क्या आप कृपया विवरणिका में और अधिक व्याख्या कर सकते हैं: @Frerica Piazza
testuser 12

यह मावेन के साथ उपयोग करने के बारे में स्पष्ट नहीं है। आप कुछ संपत्ति पास करते हैं और आगे क्या? संपत्ति फ़ाइल कहाँ है? कोड में यह मान कैसे है?
16st में gstackoverflow

1
@FedericoPiazza आउटपुट mvn -Djasypt.encryptor.password=supersecretz spring-boot:runको दिखाने के लिए नहीं जा रहा है ps, पासवर्ड को उजागर कर रहा है?
श्री राकिक

1
@ श्रीकी हाँ, बिल्कुल। यह सिर्फ विकास के लिए है, यदि आप इसे उत्पादन के लिए चाहते हैं तो आपको पर्यावरण चर का उपयोग करना चाहिए। स्प्रिंग बूट आपको उपयोग करने की अनुमति देता हैJASYPT_ENCRYPTOR_PASSWORD
Federico Piazza

1
haha और यह पर्यावरण चर में कैसे मिलता है? संभवतः सेवा भिन्नता जैसी एक अन्य फ़ाइल से: डी भी जसिपेट पुराना है, जब यह पासवर्ड व्युत्पत्ति की बात आती है, तो पूरी तरह से यादृच्छिक 32 चरित्र पासवर्ड का उपयोग करना सुनिश्चित करें
रोमन प्लैसिल

14

अद्यतन करें: मैंने देखा कि लोगों ने इसे नीचे मतदान किया है, इसलिए मुझे कहना होगा कि हालांकि यह एक आदर्श समाधान नहीं है, लेकिन यह कुछ उपयोग के मामलों में काम करता है और स्वीकार्य है। क्लाउडफ़ाउंड्री, पर्यावरण चर का उपयोग क्रेडेंशियल को इंजेक्ट करने के लिए करता है जब किसी सेवा को किसी अनुप्रयोग में बाँधा जाता है। अधिक जानकारी 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);

ध्यान दें: पर्यावरण चर सेट करने के बाद आपको पुनरारंभ करना पड़ सकता है। विंडोज के लिए:

विंडोज में

अधिक जानकारी के लिए इस प्रलेखन का संदर्भ लें ।


25
मुझे नहीं लगता है कि पर्यावरण के रूप में मास्टर पासवर्ड सेट करना इतना अच्छा विचार है। पासवर्ड अब आवश्यकता से अधिक उजागर है। फेडरिको द्वारा दिखाए गए अनुसार यह एक स्टार्टअप प्रदान करना पर्यावरण में इसे स्थापित करने की तुलना में कम उजागर और अधिक "सुरक्षित" है।
जवाँ

हां, अगर आप साझा कंप्यूटर का उपयोग कर रहे हैं तो यह नहीं है। लेकिन अगर आप अपने कंप्यूटर के एकमात्र व्यवस्थापक हैं तो कोई अन्य उपयोगकर्ता env var नहीं देख सकता है। मैंने छिपने वाले हिस्से और आसान का जवाब दिया। लेकिन हां, मैं सहमत हूं कि फेडरिको का सुझाया तरीका बेहतर है।
संजय रावत


11

स्प्रिंग क्लाउड कॉन्फ़िगरेशन सर्वर इस प्रकार के व्यवहार की अनुमति देगा। जेसीई का उपयोग करके आप सर्वर पर एक कुंजी सेट कर सकते हैं और इसका उपयोग ऐप्स के गुणों को समझने के लिए कर सकते हैं।

http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html


11

पहले से प्रस्तावित समाधानों के लिए मैं एक बाहरी Secrets Managerजैसे वॉल्ट को कॉन्फ़िगर करने का विकल्प जोड़ सकता हूं ।

  1. तिजोरी को कॉन्फ़िगर करें vault server -dev( केवल DEV के लिए और PROD के लिए नहीं )
  2. रहस्य लिखो vault write secret/somename key1=value1 key2=value2
  3. रहस्यों को सत्यापित करें 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) {
    // …
  }
}

इस समाधान के लिए +1। तिजोरी / etcd (या किसी अन्य) जैसी प्रणाली का उपयोग करने का तरीका है। diogomonica.com/2017/03/27/…
ज़ीउस

3
-1 क्योंकि यह नहीं बताता है कि "मास्टर" कुंजी (VAULT_TOKEN) कैसे सुरक्षित है। VAULT_TOKEN पर्यावरण चर कहाँ से आया है? यह कैसे सुरक्षित है? उस कुंजी को सुरक्षित किए बिना, हमलावर इसका उपयोग स्प्रिंग बूट जार में पैक किए गए कोड का उपयोग करके तिजोरी से रहस्यों को प्राप्त करने के लिए कर सकता है।
कारपोरेटेड्रोन

ठेस पहुंचाना भी मुख्य मुद्दा है। लिहाजा, यहां बात करनी होगी। देव / क्यूए वातावरण के लिए मार्गदर्शन अगर ठीक है।
sofs1

कई पासवर्ड होने पर यह काम करता है। यह कनेक्ट करने के लिए एक पासवर्ड के लिए काम करता है, लेकिन यह कहना मज़ेदार है कि पर्यावरण में वॉल्ट पासवर्ड डालें ताकि आपको दूसरे पासवर्ड को उसी वातावरण में न रखना पड़े।
ली मीडोर

0

यदि आप स्प्रिंग बूट वातावरण 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


0

स्प्रिंग बूट अनुप्रयोग में एक डीबी पासवर्ड छुपा मेरे समाधान application.properties कार्यान्वित करता है यहां

परिदृश्य: कुछ फर्जी पासवर्ड जो पहले से ही पढ़ रहे हैं और application.properties से बचाए गए हैं , शुरू में, वैश्विक स्प्रिंग ऑब्जेक्ट में विन्यास योग्य होगा, वास्तविक डीबी-पासवर्ड द्वारा रन-टाइम को प्रोग्राममैटली में बदल दिया जाएगा। असली पासवर्ड एक और कॉन्फिगर फाइल से पढ़ा जाएगा, जो सुरक्षित, प्रोजेक्ट-एक्सटर्नल जगह पर सेव किया गया है।

मत भूलो: बीन को मुख्य वर्ग से बुलाओ :

@Autowired
private SchedUtilility utl;

0

लोकप्रिय K8s करने के लिए अतिरिक्त, jasypt या तिजोरी समाधान में, वहाँ भी है Karmahostage । यह आपको करने में सक्षम बनाता है:

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

यह उसी तरह से काम करता है जिस तरह से jasypt करता है, लेकिन एन्क्रिप्शन एक समर्पित सास समाधान पर होता है, जिसमें एक अधिक महीन दाने वाला ACL मॉडल होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.