मैं Amazon EC2 पर डॉकटर-कंटेनर चला रहा हूं। वर्तमान में मैंने DWSerile में AWS क्रेडेंशियल्स जोड़ दिए हैं। क्या आप मुझे ऐसा करने का सबसे अच्छा तरीका बता सकते हैं?
मैं Amazon EC2 पर डॉकटर-कंटेनर चला रहा हूं। वर्तमान में मैंने DWSerile में AWS क्रेडेंशियल्स जोड़ दिए हैं। क्या आप मुझे ऐसा करने का सबसे अच्छा तरीका बता सकते हैं?
जवाबों:
सबसे अच्छा तरीका है कि IAM भूमिका का उपयोग करें और क्रेडेंशियल्स के साथ बिल्कुल भी सौदा न करें। (देखें http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html )
क्रेडेंशियल्स को फिर से प्राप्त किया जा सकता है http://169.254.169.254.....
क्योंकि यह एक निजी आईपी एड्रेस है, यह केवल EC2 उदाहरणों से ही सुलभ हो सकता है।
सभी आधुनिक एडब्ल्यूएस क्लाइंट लाइब्रेरी "जानते हैं" कैसे वहाँ से क्रेडेंशियल्स लाने, ताज़ा करने और उपयोग करने के लिए। इसलिए ज्यादातर मामलों में आपको इसके बारे में जानने की जरूरत नहीं है। बस सही IAM भूमिका के साथ ec2 चलाएं और आप जाने के लिए अच्छा है।
एक विकल्प के रूप में आप उन्हें पर्यावरण चर (यानी docker run -e AWS_ACCESS_KEY_ID=xyz -e AWS_SECRET_ACCESS_KEY=aaa myimage
) के रूप में रनटाइम पर पास कर सकते हैं
आप टर्मिनल पर प्रिंटेनव चलाकर इन पर्यावरण चर का उपयोग कर सकते हैं।
AWS_SECRET_ACCESS_KEY
, नहीं AWS_SECRET_KEY
, वैसे भी आपका जवाब बहुत मददगार था। धन्यवाद।
यह प्रश्न पूछे जाने के बाद से डॉकटर में बहुत कुछ बदल गया है, इसलिए यहां एक अद्यतन उत्तर का प्रयास किया गया है।
सबसे पहले, विशेष रूप से पहले से ही क्लाउड के अंदर चलने वाले कंटेनरों पर AWS क्रेडेंशियल के साथ, IAM भूमिकाओं का उपयोग करते हुए Vor के रूप में सुझाव देता है कि वास्तव में एक अच्छा विकल्प है। यदि आप ऐसा कर सकते हैं, तो उसके उत्तर में एक और एक जोड़ दें और शेष को छोड़ दें।
एक बार जब आप क्लाउड के बाहर चीजों को चलाना शुरू कर देते हैं, या एक अलग प्रकार का रहस्य होता है, तो दो प्रमुख स्थान हैं जो मैं रहस्यों को संग्रहीत करने के खिलाफ सुझाता हूं :
पर्यावरण चर: जब इन्हें कंटेनर पर परिभाषित किया जाता है, तो कंटेनर के अंदर की प्रत्येक प्रक्रिया तक इनकी पहुंच होती है, वे इसके माध्यम से दिखाई देते हैं / खरीदे जाते हैं, एप्स अपने पर्यावरण को डंप करने के लिए डंप कर सकते हैं जहां यह लॉग में संग्रहीत हो जाता है, और सबसे महत्वपूर्ण बात, वे इसमें दिखाई देते हैं जब आप कंटेनर का निरीक्षण करते हैं तो स्पष्ट पाठ।
छवि में ही: छवियों को अक्सर उन रजिस्ट्रियों में धकेल दिया जाता है जहां कई उपयोगकर्ताओं की पहुंच होती है, कभी-कभी बिना किसी क्रेडेंशियल के छवि को खींचने की आवश्यकता होती है। यहां तक कि अगर आप एक परत से रहस्य को हटाते हैं, तो छवि को आम लिनक्स उपयोगिताओं से अलग किया जा सकता है tar
और गुप्त उस चरण से पाया जा सकता है जहां इसे पहली बार छवि में जोड़ा गया था।
तो डॉकर कंटेनरों में रहस्यों के लिए और क्या विकल्प हैं?
विकल्प A: यदि आपको अपनी छवि के निर्माण के दौरान केवल इस रहस्य की आवश्यकता है, तो निर्माण शुरू होने से पहले रहस्य का उपयोग नहीं कर सकते हैं, और अभी तक BuildKit तक पहुंच नहीं है, तो एक बहु-मंच बिल्ड सबसे अच्छा विकल्प है। आप गुप्त को निर्माण के प्रारंभिक चरणों में जोड़ देंगे, इसका उपयोग वहां करेंगे, और फिर उस चरण के आउटपुट को गुप्त के बिना अपने रिलीज़ चरण में कॉपी कर सकते हैं, और केवल उस रिलीज़ चरण को रजिस्ट्री सर्वर पर धकेल दें। यह रहस्य अभी भी बिल्ड सर्वर पर छवि कैश में है, इसलिए मैं इसे केवल अंतिम उपाय के रूप में उपयोग करता हूं।
विकल्प बी: बिल्ड समय के दौरान, यदि आप बिल्डकिट का उपयोग कर सकते हैं जो 18.09 में जारी किया गया था, वर्तमान में प्रयोगात्मक विशेषताएं हैं जो एकल आरयूएन लाइन के लिए वॉल्यूम माउंट के रूप में रहस्यों के इंजेक्शन की अनुमति देता है। उस माउंट को इमेज लेयर्स पर नहीं लिखा जाता है, इसलिए आप बिल्ड के दौरान रहस्य तक पहुंच सकते हैं बिना चिंता किए इसे सार्वजनिक रजिस्ट्री सर्वर पर धकेल दिया जाएगा। परिणामी डॉकरीफाइल ऐसा दिखता है:
# syntax = docker/dockerfile:experimental
FROM python:3
RUN pip install awscli
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials aws s3 cp s3://... ...
और आप इसे 18.09 या नए जैसे कमांड के साथ बनाते हैं:
DOCKER_BUILDKIT=1 docker build -t your_image --secret id=aws,src=$HOME/.aws/credentials .
विकल्प C:एक बार नोड पर, झुंड मोड या अन्य आर्केस्ट्रा के बिना, आप केवल पढ़ने के लिए वॉल्यूम के रूप में क्रेडेंशियल्स माउंट कर सकते हैं। इस क्रेडेंशियल तक पहुंचने के लिए उसी एक्सेस की आवश्यकता होती है जो आपके पास डॉकटर के समान क्रेडेंशियल फ़ाइल के बाहर होगी, इसलिए यह डॉकटर के बिना परिदृश्य से बेहतर या बुरा नहीं है। सबसे महत्वपूर्ण बात, इस फ़ाइल की सामग्री तब दिखाई नहीं देनी चाहिए जब आप कंटेनर का निरीक्षण करते हैं, लॉग देखते हैं, या छवि को रजिस्ट्री सर्वर पर धकेलते हैं, क्योंकि वॉल्यूम हर परिदृश्य में उस से बाहर होता है। इसके लिए आवश्यक है कि आप डॉकटर होस्ट पर अपने क्रेडेंशियल्स को कॉपी करें, कंटेनर की तैनाती से अलग। (ध्यान दें, उस होस्ट पर कंटेनरों को चलाने की क्षमता वाला कोई भी व्यक्ति आपकी क्रेडेंशियल देख सकता है क्योंकि डॉक एपीआई तक पहुंच होस्ट पर रूट है और रूट किसी भी उपयोगकर्ता की फ़ाइलों को देख सकता है। यदि आप होस्ट पर रूट वाले उपयोगकर्ताओं पर भरोसा नहीं करते हैं। ,
एक के लिए docker run
, यह इस तरह दिखता है:
docker run -v $HOME/.aws/credentials:/home/app/.aws/credentials:ro your_image
या एक कम्पोज़ फाइल के लिए, आपके पास होगा:
version: '3'
services:
app:
image: your_image
volumes:
- $HOME/.aws/credentials:/home/app/.aws/credentials:ro
विकल्प D:ऑर्केस्ट्रेशन टूल्स जैसे कि झुंड मोड और कुबेरनेट्स के साथ, अब हमारे पास ऐसे सीक्रेट सपोर्ट हैं जो वॉल्यूम से बेहतर हैं। झुंड मोड के साथ, फ़ाइल प्रबंधक फ़ाइल सिस्टम पर एन्क्रिप्टेड है (हालांकि डिक्रिप्शन कुंजी अक्सर वहां भी होती है, जिससे प्रबंधक को डिक्रिप्ट कुंजी दर्ज किए बिना व्यवस्थापक को पुनरारंभ करने की अनुमति मिलती है)। इससे भी महत्वपूर्ण बात, यह रहस्य केवल उन श्रमिकों को भेजा जाता है जिन्हें गुप्त की आवश्यकता होती है (उस रहस्य के साथ एक कंटेनर चलाना), यह केवल कार्यकर्ता पर मेमोरी में संग्रहीत होता है, कभी डिस्क नहीं, और यह एक फ़ाइल में एक tmpfs के साथ कंटेनर में इंजेक्ट किया जाता है माउंट। झुंड के बाहर होस्ट करने वाले उपयोगकर्ता अपने स्वयं के कंटेनर में सीधे उस रहस्य को माउंट नहीं कर सकते हैं, हालांकि, docker API की खुली पहुंच के साथ, वे नोड पर चल रहे कंटेनर से रहस्य को निकाल सकते हैं, इसलिए फिर से, इस पहुंच को सीमित करें एपीआई। रचना से, यह गुप्त इंजेक्शन जैसा दिखता है:
version: '3.7'
secrets:
aws_creds:
external: true
services:
app:
image: your_image
secrets:
- source: aws_creds
target: /home/user/.aws/credentials
uid: '1000'
gid: '1000'
mode: 0700
आप docker swarm init
एक नोड के लिए झुंड मोड को चालू करते हैं , फिर अतिरिक्त नोड्स जोड़ने के लिए निर्देशों का पालन करें। आप बाहरी रूप से रहस्य बना सकते हैं docker secret create aws_creds $HOME/.aws/credentials
। और आप कम्पोज़ फाइल को साथ में तैनात करते हैं docker stack deploy -c docker-compose.yml stack_name
।
मैं अक्सर स्क्रिप्ट का उपयोग करके अपने रहस्यों का संस्करण देता हूं: https://github.com/sudo-bmitch/docker-config-upate
विकल्प ई: अन्य उपकरण रहस्यों को प्रबंधित करने के लिए मौजूद हैं, और मेरा पसंदीदा वॉल्ट है क्योंकि यह समय सीमित रहस्यों को बनाने की क्षमता देता है जो स्वचालित रूप से समाप्त हो जाते हैं। हर एप्लिकेशन को तब रहस्यों का अनुरोध करने के लिए टोकन का अपना सेट मिलता है, और वे टोकन उन्हें उन समय सीमित रहस्यों का अनुरोध करने की क्षमता देते हैं, जब तक वे तिजोरी सर्वर तक नहीं पहुंच सकते। यह जोखिम को कम कर देता है यदि कोई रहस्य कभी भी आपके नेटवर्क से बाहर ले जाया जाता है क्योंकि यह या तो काम नहीं करेगा या समाप्त होने के लिए जल्दी होगा। वॉल्ट के लिए AWS के लिए विशिष्ट कार्यक्षमता https://www.vaultproject.io/docs/secrets/aws/index.html पर प्रलेखित है
एक और तरीका यह है कि मेजबान मशीन से डॉकटर कंटेनर की चाबियों को पास किया जाए। आप docker-compose
फ़ाइल में निम्न पंक्तियाँ जोड़ सकते हैं ।
services:
web:
build: .
environment:
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
- AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION}
AWS_DEFAULT_REGION
docs.aws.amazon.com/cli/latest/userguide/…
AWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
फिर भी एक और तरीका यह है कि डॉकटर-कम्पोज़ में केवल अस्थायी रीड-ओनली वॉल्यूम बनाएं। AWS CLI और SDK (जैसे boto3 या Java के लिए AWS SDK) फ़ाइल default
में प्रोफ़ाइल की तलाश कर रहे हैं ~/.aws/credentials
।
यदि आप अन्य प्रोफाइल का उपयोग करना चाहते हैं तो आपको docker-compose
कमांड चलाने से पहले AWS_PROFILE चर का निर्यात करने की भी आवश्यकता है
export AWS_PROFILE=some_other_profile_name
version: '3'
services:
service-name:
image: docker-image-name:latest
environment:
- AWS_PROFILE=${AWS_PROFILE}
volumes:
- ~/.aws/:/root/.aws:ro
इस उदाहरण में मैंने डॉकटर पर रूट उपयोगकर्ता का उपयोग किया। यदि आप अन्य उपयोगकर्ता का उपयोग कर रहे हैं तो /root/.aws
उपयोगकर्ता होम डायरेक्टरी में बदलाव करें
:ro
- केवल पढ़ने के लिए वॉल्यूम के लिए खड़ा है
यह तब बहुत मददगार होता है जब आपके पास ~/.aws/credentials
फाइल में कई प्रोफाइल होते हैं और आप एमएफए का भी उपयोग कर रहे होते हैं। यह तब भी मददगार है जब आप ECS पर इसे लागू करने से पहले स्थानीय रूप से डॉकटर-कंटेनर का परीक्षण करना चाहते हैं, जिस पर आपके पास IAM रोल्स हैं, लेकिन स्थानीय रूप से आप नहीं।
"%UserProfile%\.aws"
। इसलिए मुझे लगता है कि आपको बदलना होगा: - ~/.aws/:/root/.aws:ro
से- %UserProfile%\.aws:/root/.aws:ro
- host:container
वाक्यविन्यास का उपयोग करते समय बहुत सावधान रहें , यदि फ़ाइल / फ़ोल्डर मेजबान पर मौजूद नहीं है, तो यह (रूट के रूप में) बन जाता है और awscli आपको इसे शून्य बाइट फ़ाइल खिलाने के लिए धन्यवाद नहीं देगा। आपको "लंबे रूप" का उपयोग करना चाहिए जो निर्दिष्ट करता है कि टाइप बाइंड, होस्ट पथ और कंटेनर पथ अलग-अलग लाइनों पर है, यह विफल हो जाता है यदि फ़ाइल मौजूद नहीं है, जो कि आप अपने docker-compose.dev में चाहते हैं। yml लेकिन आपके docker-compose.yml (prod / AWS परिनियोजित) में नहीं।
आप ~/aws_env_creds
युक्त बना सकते हैं
touch ~/aws_env_creds
chmod 777 ~/aws_env_creds
vi ~/aws_env_creds
मूल्य नीचे जोड़ें (आपकी कुंजी बदलें)
AWS_ACCESS_KEY_ID=AK_FAKE_KEY_88RD3PNY
AWS_SECRET_ACCESS_KEY=BividQsWW_FAKE_KEY_MuB5VAAsQNJtSxQQyDY2C
फ़ाइल को बचाने के लिए "esc"।
कंटेनर को चलाएं और परीक्षण करें
my_service:
build: .
image: my_image
env_file:
- ~/aws_env_creds