डॉकटर कंटेनर में AWS क्रेडेंशियल पास करने का सबसे अच्छा तरीका कौन सा है?


104

मैं Amazon EC2 पर डॉकटर-कंटेनर चला रहा हूं। वर्तमान में मैंने DWSerile में AWS क्रेडेंशियल्स जोड़ दिए हैं। क्या आप मुझे ऐसा करने का सबसे अच्छा तरीका बता सकते हैं?


2
कैसे के बारे में अगर मैं अपने लैपटॉप पर एक डॉकटर कंटेनर चला रहा हूं जो कि ईसीएस में जादुई रूप से काम करने वाला है, जब मैं इसे वहां धकेलता हूं? मुझे लगता है कि मैं - thevolume ध्वज का उपयोग करने वाला हूँ ... किसी ने पहले ही जवाब दिया होगा ...
Randy L

जवाबों:


107

सबसे अच्छा तरीका है कि 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) के रूप में रनटाइम पर पास कर सकते हैं

आप टर्मिनल पर प्रिंटेनव चलाकर इन पर्यावरण चर का उपयोग कर सकते हैं।


35
क्या स्थानीय विकास / परीक्षण के दौरान ऐसा करने का एक अच्छा तरीका है जो उत्पादन में सुरक्षा से समझौता नहीं करता है? मुझे यह सुनिश्चित करना अच्छा लगेगा कि एक छवि पूरी तरह से तैनात किए बिना काम करती है।
माननीय क्रोनिक

3
एक विकल्प जिसे मैंने पर्यावरण चर के साथ पोस्ट किया है वह देव / स्थानीय वातावरण में ठीक काम करता है।
Vor

5
मुझे आश्चर्य है कि अगर यह एक टाइपो है, लेकिन मुझे प्रवेश करने की आवश्यकता है AWS_SECRET_ACCESS_KEY, नहीं AWS_SECRET_KEY, वैसे भी आपका जवाब बहुत मददगार था। धन्यवाद।
अकवाल

14
इसे सीधे शब्दों में कहें (उन लोगों के लिए जो इस उत्तर को उसी तरह प्राप्त करते हैं जैसे मैंने किया था); ईसी 2 पर चलने वाला एक डॉकटर कंटेनर मेजबान भूमिका के समान भूमिका प्राप्त करेगा। (मुझे इस तरह से एक "ELI5" की जरूरत थी जब मेरे कंटेनरों में AWS CLI ने रहस्यमय तरीके से काम किया, इसके बावजूद कोई क्रेडेंशियल्स उनके पास नहीं गया!)
एडम वेस्टब्रुक

8
विकास के उद्देश्यों के लिए पर्यावरण चर को असाइन करने के लिए अपने स्थानीय प्रोफ़ाइल से प्रमुख मान प्राप्त करने का आसान तरीका (जैसा कि कैमरोनकेलबेरी / पासवर्ड / ... में सुझाव दिया गया है ): "aws --profile default config get aws_access_key_id"
Altair7852

92

यह प्रश्न पूछे जाने के बाद से डॉकटर में बहुत कुछ बदल गया है, इसलिए यहां एक अद्यतन उत्तर का प्रयास किया गया है।

सबसे पहले, विशेष रूप से पहले से ही क्लाउड के अंदर चलने वाले कंटेनरों पर AWS क्रेडेंशियल के साथ, IAM भूमिकाओं का उपयोग करते हुए Vor के रूप में सुझाव देता है कि वास्तव में एक अच्छा विकल्प है। यदि आप ऐसा कर सकते हैं, तो उसके उत्तर में एक और एक जोड़ दें और शेष को छोड़ दें।


एक बार जब आप क्लाउड के बाहर चीजों को चलाना शुरू कर देते हैं, या एक अलग प्रकार का रहस्य होता है, तो दो प्रमुख स्थान हैं जो मैं रहस्यों को संग्रहीत करने के खिलाफ सुझाता हूं :

  1. पर्यावरण चर: जब इन्हें कंटेनर पर परिभाषित किया जाता है, तो कंटेनर के अंदर की प्रत्येक प्रक्रिया तक इनकी पहुंच होती है, वे इसके माध्यम से दिखाई देते हैं / खरीदे जाते हैं, एप्स अपने पर्यावरण को डंप करने के लिए डंप कर सकते हैं जहां यह लॉग में संग्रहीत हो जाता है, और सबसे महत्वपूर्ण बात, वे इसमें दिखाई देते हैं जब आप कंटेनर का निरीक्षण करते हैं तो स्पष्ट पाठ।

  2. छवि में ही: छवियों को अक्सर उन रजिस्ट्रियों में धकेल दिया जाता है जहां कई उपयोगकर्ताओं की पहुंच होती है, कभी-कभी बिना किसी क्रेडेंशियल के छवि को खींचने की आवश्यकता होती है। यहां तक ​​कि अगर आप एक परत से रहस्य को हटाते हैं, तो छवि को आम लिनक्स उपयोगिताओं से अलग किया जा सकता है 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 पर प्रलेखित है


22

एक और तरीका यह है कि मेजबान मशीन से डॉकटर कंटेनर की चाबियों को पास किया जाए। आप 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}

3
सही क्षेत्र वातावरण चर AWS_REGION है। देखें stackoverflow.com/questions/44151982/...
जॉन कैमेरिन

3
कृपया आधिकारिक दस्तावेज़ देखें जिसमें AWS_DEFAULT_REGION docs.aws.amazon.com/cli/latest/userguide/…
prafi

7
जब मैंने AWS_DEFAULT_REGION का उपयोग किया, तो मुझे एक अपवाद मिला कि एक डिफ़ॉल्ट क्षेत्र नहीं मिला। मेरी खोज ने docs.aws.amazon.com/sdk-for-java/v1/developer-guide/… का नेतृत्व किया, जो AWS_REGION पर्यावरण चर को निर्दिष्ट करता है, और जो मेरे लिए काम करता है।
जॉन कैमरिन

यदि आप अस्थायी क्रेडेंशियल्स का उपयोग कर रहे हैं, तो आपको आवश्यकता भी हो सकती हैAWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
दावोस

14

फिर भी एक और तरीका यह है कि डॉकटर-कम्पोज़ में केवल अस्थायी रीड-ओनली वॉल्यूम बनाएं। 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 रोल्स हैं, लेकिन स्थानीय रूप से आप नहीं।


खिड़कियों पर .aws` कैटलॉग स्थित है "%UserProfile%\.aws"। इसलिए मुझे लगता है कि आपको बदलना होगा: - ~/.aws/:/root/.aws:roसे- %UserProfile%\.aws:/root/.aws:ro
आर्टुर सीपिटोव्स्की

1
यह केवल सिंगल बिल्ड प्रक्रियाओं के साथ काम करेगा और मल्टीस्टेज नहीं।
wlarcheveque

@ वर्चस्व देखभाल विस्तृत करने के लिए?
एरिक

- host:containerवाक्यविन्यास का उपयोग करते समय बहुत सावधान रहें , यदि फ़ाइल / फ़ोल्डर मेजबान पर मौजूद नहीं है, तो यह (रूट के रूप में) बन जाता है और awscli आपको इसे शून्य बाइट फ़ाइल खिलाने के लिए धन्यवाद नहीं देगा। आपको "लंबे रूप" का उपयोग करना चाहिए जो निर्दिष्ट करता है कि टाइप बाइंड, होस्ट पथ और कंटेनर पथ अलग-अलग लाइनों पर है, यह विफल हो जाता है यदि फ़ाइल मौजूद नहीं है, जो कि आप अपने docker-compose.dev में चाहते हैं। yml लेकिन आपके docker-compose.yml (prod / AWS परिनियोजित) में नहीं।
ड्रैगन 788

0

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