जब आप अपने आवेदन को ईसी 2 पर तैनात करते हैं, तो ऑटोस्केलिंग समूहों का उपयोग करना एक अच्छा विचार है। ऑटो स्केलिंग समूह आपके एप्लिकेशन को मांग को पूरा करने के लिए ऊपर और नीचे स्केल करने की अनुमति देते हैं, या असफल उदाहरणों से उबरने के लिए, बिना किसी मैन्युअल हस्तक्षेप के। हालांकि, उन्हें काम करने के लिए, सुनिश्चित करें कि बूटिंग समाप्त होने के बाद हर इंस्टेंस लाइव ट्रैफिक की सेवा के लिए पूरी तरह से तैयार है। यदि आप किसी नए सर्वर पर कुछ बदलाव करने के आदी हैं या इसके तैयार होने से पहले कैपिस्ट्रानो के माध्यम से प्रारंभिक परिनियोजन करने के आदी हैं, तो इसके लिए केवल अपने ऐप को सर्वर पर परिनियोजित करने की तुलना में थोड़ा अधिक प्रयास करने की आवश्यकता है।
उदाहरण के लिए, हमारे पास रेल का उपयोग करके बनाया गया एक उपयोगकर्ता-सामना करने वाला वेब एप्लिकेशन है। जब यह बूटिंग हो जाता है, तो प्रत्येक इंस्टेंस के लिए उस रेल को तैयार होना चाहिए और लोड बैलेंसर द्वारा अग्रेषित अनुरोधों का जवाब देने की प्रतीक्षा करनी चाहिए। ऐसा करने के लिए, मैंने पहले एक कस्टम बनाया ऐप, nginx, आदि के साथ Ansible के माध्यम से प्रावधान किए गए एक उदाहरण का स्नैपशॉट लेकर AMI। फिर मैंने उपयोगकर्ता डेटा के साथ ऑटोस्केलिंग समूह को कॉन्फ़िगर किया जो एक स्क्रिप्ट को आमंत्रित करता है जो कॉपी करता है कि कैपिस्ट्रानो तैनाती के लिए क्या करता है - यह git से नवीनतम कोड खींचता है, बंडलर चलाता है, और इसलिए on.तो ऐप और उसकी सभी निर्भरताओं के साथ, क्या बचा है?
आवेदन रहस्य:नियोक्ता का अभिशाप
एप्लिकेशन रहस्य एक चुनौती पेश करते हैं:आप उन्हें संग्रहीत होने से बचाना चाहते हैं जहां उन्हें उजागर किया जा सकता है (जैसे, कहें, आपके गिट रेपो में), लेकिन जब आप चल रहे हों तो आपको उन्हें अपने ऐप पर उपलब्ध होना चाहिए। और ऑटो-स्केलिंग के कारण, आप किसी इंसान पर भरोसा नहीं कर सकते कि वह आपके ऐप के लिए उन्हें जगह दे सके जब उसे उनकी आवश्यकता हो।
इस समस्या का एक उत्तर है हैशिकॉर्प का वॉल्ट। यह विशेष रूप से आपके रहस्यों को गुप्त रखने की इस समस्या को हल करने के लिए लिखा गया सॉफ्टवेयर का एक शानदार टुकड़ा है जब तक कि आपके ऐप को उनकी आवश्यकता न हो। हालांकि, नकारात्मक पक्ष यह है कि आपको वॉल्ट का प्रावधान और प्रबंधन करना होगा — यह एक और सेवा है जिसे आपको चालू रखने की आवश्यकता है।
एक अन्य विकल्प साझा भंडारण (एस 3, स्वाभाविक रूप से) में रहस्यों को सहेजना है, और यह सुनिश्चित करना है कि केवल आपके उदाहरणों की उस बाल्टी और/ऑर्की तक पहुंच हो। यह IAM भूमिकाओं का उपयोग करके किया जा सकता है, जिसमें ऐसी नीतियां शामिल हो सकती हैं जो प्रतिबंधित S3 संसाधनों तक पहुंच प्रदान करती हैं। यह अभी भी आपको अवांछित जोखिम के लिए खुला छोड़ देता है, हालांकि, यदि आप उन सभी रहस्यों को S3 पर सादे पाठ में संग्रहीत करते हैं। उस बकेट या यहां तक कि पूरी दुनिया तक पहुंच रखने वाले अन्य लोगों के लिए गलती से उस डेटा को उपलब्ध कराना संभव है।
क्या यह अच्छा नहीं होगा यदि आप अपने रहस्यों को S3 को सहेजने से पहले एन्क्रिप्ट कर सकें और फिर ज़रूरत पड़ने पर उन्हें ऐप में लोड और डिक्रिप्ट कर सकें?
गुप्त संघटक:अमेज़न की प्रमुख प्रबंधन सेवा
अमेज़ॅन की कुंजी प्रबंधन सेवा (केएमएस) एन्क्रिप्शन कुंजी के साथ बातचीत करने के लिए एक एपीआई प्रदान करती है। IAM भूमिकाओं और Aws::S3::एन्क्रिप्शन मॉड्यूल के साथ संयुक्त होने पर, यह आपके एप्लिकेशन में आपके रहस्यों को लोड करने के लिए कोड की केवल कुछ पंक्तियों को लेता है, जबकि उन्हें S3 पर एन्क्रिप्टेड रखते हुए।
इससे पहले कि मैं खुदाई करूं, मुझे डॉन मिल्स को धन्यवाद देना होगा, जिन्होंने रहस्यों को संग्रहीत करने के लिए KMS प्लस S3 का उपयोग करके एक शानदार पोस्टन लिखा था। मैंने IAM भूमिकाओं के आधार पर और S3 पर रहस्यों के साथ मुख्य जानकारी को संग्रहीत करने के बजाय अलग से KMS कुंजी का ट्रैक रखते हुए उनके दृष्टिकोण को थोड़ा बदल दिया।
KMS एक मास्टर एन्क्रिप्शन कुंजी उत्पन्न करता है और उस तक पहुँच प्रदान करता है जिसका उपयोग आप डेटा को एन्क्रिप्ट और डिक्रिप्ट करने के लिए कर सकते हैं। जब आप इसे कुछ एन्क्रिप्ट करने के लिए कहते हैं, तो KMS आपको मास्टर कुंजी के आधार पर एक अस्थायी कुंजी देता है, और उस अस्थायी कुंजी का उपयोग एन्क्रिप्शन या डिक्रिप्शन के लिए किया जा सकता है।
एक कुंजी उत्पन्न करने के लिए, आप IAM कंसोल पर जाएं और एन्क्रिप्शन कुंजी लिंक चुनें। जब आप कोई कुंजी बनाते हैं, तो आपसे IAM उपयोगकर्ता या भूमिकाएँ निर्दिष्ट करने के लिए कहा जाएगा जो इस कुंजी का उपयोग करने की क्षमता रखेंगे। उस भूमिका का चयन करें जिसे EC2 इंस्टेंस को सौंपा जाएगा जो ऑटोस्केलिंग समूह का एक हिस्सा होगा। कुंजी के ARN पर ध्यान दें -- आप बाद में उसका उपयोग करेंगे।
रॉक्स बनाना:समान भाग KMS और IAM
कुंजी बनाने के बाद, आपके द्वारा चुनी गई IAM भूमिका को संपादित करने के लिए IAM कंसोल का उपयोग करें। इस तरह की नीति संलग्न करके उस बकेट तक पहुंच प्रदान करें जहां रहस्य संग्रहीत किया जाएगा:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1476277816000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:HeadObject"
],
"Resource": [
"arn:aws:s3:::yourbucket/secrets.yml"
]
}
]
}
कॉन्फ़िगर की गई कुंजी और भूमिका से जुड़ी नीति के साथ, अब आप Aws::S3::Encryption::Client उदाहरण के माध्यम से KMS और S3 के साथ इंटरैक्ट कर सकते हैं। यहां कुछ नमूना कोड दिए गए हैं जो गुप्त फ़ाइल को पुनः प्राप्त करते हैं और इसकी सामग्री को पर्यावरण चर में लोड करते हैं:पी>
begin
es3 = Aws::S3::Encryption::Client.new(kms_key_id: ENV['KMS_KEY_ID'])
YAML.load(es3.get_object(bucket: "yourbucket", key: "secrets.yml").body.read).each do |k, v|
ENV[k] ||= v # Don't override local ENV settings
end
rescue ArgumentError
# Raised when no KMS_KEY_ID was found in ENV, so there's nothing to do
rescue Aws::S3::Errors::NoSuchKey
# No secrets file was found, so there's nothing to do
end
सबसे पहले हम KMS कुंजी की आईडी के साथ एक नई वस्तु को इंस्टेंट करते हैं। कुंजी के लिए ARN (आपके द्वारा कुंजी बनाते समय IAM कंसोल में प्रदर्शित) KMS_KEY_ID परिवेश चर में संग्रहीत किया जाता है। जब आप यहां कंस्ट्रक्टर को कीआईडी में पास करते हैं, तो यह आपके लिए अस्थायी डिक्रिप्शन कुंजियों को लाने का काम संभालेगा। यदि आप KMS से बात करने के लिए उपयोग कर रहे हैं, तो आप S3 से बात करने के लिए क्रेडेंशियल के एक अलग सेट का उपयोग करना चाहते हैं, तो आप यहां एक विकल्प के रूप में Aws::S3 ::क्लाइंट उदाहरण निर्दिष्ट कर सकते हैं। यदि आप पहले की तरह IAM भूमिकाएँ सेट करते हैं, हालाँकि, आपको इसकी आवश्यकता नहीं है, क्योंकि Aws::S3::Encryption::Client आपके लिए IAM भूमिका द्वारा प्रदान किए गए क्रेडेंशियल के साथ एक नया Aws::S3::Client उदाहरण बनाएगा।
एन्क्रिप्टेड S3 क्लाइंट तैयार होने के साथ, S3 से डेटा लाने के लिए #get_object का उपयोग करें और KMS द्वारा प्रदान की गई कुंजी का उपयोग करके इसे डिक्रिप्ट करें। एक बार आपके पास डेटा हो जाने के बाद, आप इसके साथ जो चाहें कर सकते हैं। हमारा डेटा वाईएएमएल है, इसलिए हम एप्लिकेशन कोड के उपयोग के लिए कुंजी/मूल्य जोड़े को लोड और ईएनवी में भर देते हैं।
इस कोड को अपने रेल एप्लिकेशन में प्रारंभकर्ता फ़ाइल में छोड़ दें, और आप जाने के लिए अच्छे हैं। ठीक है, एक बार जब आप अपने रहस्यों को S3 पर संग्रहीत कर लेते हैं, अर्थात। :) मान लें कि आपके पास सही IAM भूमिका के साथ चल रहे इंस्टेंस पर IRB कंसोल है, तो आप अपने रहस्यों को संग्रहीत करने के लिए ऐसा कुछ कर सकते हैं:
# Encrypt the data from /path/to/secrets.yml and store it on S3
Aws::S3::Encryption::Client.new(kms_key_id: ENV['KMS_KEY_ID']).
put_object(bucket: "yourbucket", key: "secrets.yml", body: File.read("/path/to/secrets.yml"))
तुरंत परोसें
अब आपके पास अपने रहस्य हमेशा किसी भी नए उदाहरण के लिए उपलब्ध हैं जो गुप्त गुप्त रखते हुए आपके ऑटोस्केलिंग समूह में जुड़ जाते हैं। हर कोई जीतता है! :)पी>