ডকারের ধারকগুলিতে AWS শংসাপত্রগুলি পাস করার সর্বোত্তম উপায় কোনটি?


108

আমি অ্যামাজন ইসি 2 তে ডকার-ধারক চালাচ্ছি। বর্তমানে আমি ডকফাইফাইলে এডব্লিউএস শংসাপত্র যুক্ত করেছি। আপনি কি দয়া করে আমাকে এটি করার সর্বোত্তম উপায়টি জানান?


4
আমি কীভাবে আমার ল্যাপটপে ডকার পাত্রে চালাচ্ছি যা ইসিএসে এটি ধাক্কা দেওয়ার পরে যাদুকরীভাবে ইসিএসে কাজ করার কথা? আমি অনুমান করছি যে আমি - ভলিউম পতাকা ব্যবহার করেছি ... কেউ কেউ ইতিমধ্যে উত্তর দিয়ে গেছে ...
র্যান্ডি এল

উত্তর:


112

সবচেয়ে ভাল উপায় হ'ল আইএএম রোলটি ব্যবহার করা এবং শংসাপত্রগুলি একেবারেই ডিল করবেন না। ( http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles- for-amazon-ec2.html দেখুন )

শংসাপত্রগুলি পুনরুদ্ধার করা যেতে পারে http://169.254.169.254..... এটি যেহেতু এটি একটি ব্যক্তিগত আইপি ঠিকানা, এটি কেবল ইসি 2 উদাহরণ থেকে অ্যাক্সেসযোগ্য।

সমস্ত আধুনিক এডাব্লুএস ক্লায়েন্ট লাইব্রেরিগুলি সেখান থেকে শংসাপত্রগুলি কীভাবে আনতে, রিফ্রেশ করতে এবং ব্যবহার করতে হয় "জানে"। সুতরাং বেশিরভাগ ক্ষেত্রে আপনার এটি সম্পর্কেও জানার দরকার নেই। সঠিক আইএএম ভূমিকার সাথে কেবল এক্স 2 চালান এবং আপনি যেতে ভাল।

বিকল্প হিসাবে আপনি এটিকে পরিবেশের ভেরিয়েবল (যেমন docker run -e AWS_ACCESS_KEY_ID=xyz -e AWS_SECRET_ACCESS_KEY=aaa myimage) হিসাবে রানটাইমে পাস করতে পারেন

আপনি টার্মিনালে প্রিন্টেনভ চালিয়ে এই পরিবেশের পরিবর্তনগুলি অ্যাক্সেস করতে পারেন।


38
স্থানীয় বিকাশ / পরীক্ষার সময় এমন কি করার ভাল উপায় আছে যা উত্পাদনে সুরক্ষার সাথে আপস করে না? আমি নিশ্চিত করতে চাই যে কোনও চিত্র সম্পূর্ণরূপে মোতায়েন না করেই কাজ করে।
হংকট্রোনিক

4
পরিবেশের ভেরিয়েবলগুলির সাথে পোস্ট করা একটি বিকল্প দেব / স্থানীয় পরিবেশে ভাল কাজ করে।
ভোর

4
আমি ভাবছি যদি এই একটি টাইপো, কিন্তু আমি লিখতে হবে AWS_SECRET_ACCESS_KEY, না AWS_SECRET_KEY, যাহাই হউক না কেন আপনার উত্তর খুব সহায়ক ছিল। ধন্যবাদ.
আকাওয়াল

14
এটিকে সহজভাবে বলতে (যারা এই উত্তরটি আমি পেয়েছি ঠিক তেমনভাবে তাদের জন্য); ইসি 2 এ চলমান একটি ডকার ধারক হোস্ট উদাহরণ হিসাবে একই ভূমিকার উত্তরাধিকারী হবে। (আমার কাছে এই জাতীয় একটি "ELI5" দরকার ছিল যখন আমার কনটেইনারগুলিতে AWS CLI কমান্ড না থাকলেও রহস্যজনকভাবে কাজ করেছিলেন!)
অ্যাডাম ওয়েস্টব্রুক

8
সহজ উপায় বিকাশের উদ্দেশ্যে এনভায়রনমেন্ট ভেরিয়েবল (ইন প্রস্তাবিত নির্ধারিত আপনার স্থানীয় প্রোফাইল থেকে কী মান পেতে cameroneckelberry.co/words/... "আওস --profile ডিফল্ট কনফিগার করুন aws_access_key_id":)
Altair7852

101

এই প্রশ্নটি জিজ্ঞাসা করার পর থেকে ডকারে অনেক কিছুই পরিবর্তিত হয়েছে, তাই এখানে একটি আপডেট উত্তরের চেষ্টা করা হচ্ছে।

প্রথমত, বিশেষত মেঘের অভ্যন্তরে ইতিমধ্যে চলমান ধারকগুলিতে AWS শংসাপত্রগুলির সাথে, ভোরের পরামর্শ অনুসারে আইএএম রোলগুলি ব্যবহার করা সত্যিই একটি ভাল বিকল্প। যদি আপনি এটি করতে পারেন তবে তার উত্তরে আরও একটি প্লাস একটি যুক্ত করুন এবং এটির বাকিটি এড়িয়ে যান।


আপনি একবার মেঘের বাইরে জিনিস চালানো শুরু করার পরে বা অন্য ধরণের গোপনীয়তা অর্জন করার পরে, দুটি মূল জায়গা রয়েছে যা আমি গোপনীয়তাগুলি সংরক্ষণের বিরুদ্ধে প্রস্তাব দিই :

  1. পরিবেশের ভেরিয়েবলগুলি: যখন এগুলি একটি ধারক হিসাবে সংজ্ঞায়িত করা হয়, কনটেইনার অভ্যন্তরের প্রতিটি প্রক্রিয়া তাদের অ্যাক্সেস করে, অ্যাপগুলি তাদের / প্রোকের মাধ্যমে দৃশ্যমান হয়, অ্যাপগুলি তাদের পরিবেশকে স্টাডাউটে ফেলে দিতে পারে যেখানে এটি লগগুলিতে সঞ্চিত হয় এবং সর্বাগ্রে গুরুত্বপূর্ণ যে তারা উপস্থিত হয় আপনি ধারকটি পরিদর্শন করার সময় পাঠ্য সাফ করুন।

  2. চিত্রটিতে নিজেই: চিত্রগুলি প্রায়শই নিবন্ধগুলিতে ঠেলাঠেলি করে যেখানে অনেক ব্যবহারকারীর অ্যাক্সেস টান থাকে, কখনও কখনও চিত্রটি টানতে কোনও শংসাপত্র ছাড়াই। এমনকি যদি আপনি একটি স্তর থেকে গোপনীয়তা মুছে ফেলেন, তবে চিত্রটি সাধারণ লিনাক্স ইউটিলিটিগুলির মতো tarছড়িয়ে দেওয়া যেতে পারে এবং গোপনীয়তাটি সেই ধাপে পাওয়া যায় যেখানে চিত্রটিতে এটি যুক্ত করা হয়েছিল।


সুতরাং ডকার পাত্রে গোপনীয়তাগুলির জন্য অন্যান্য বিকল্পগুলি কী?

বিকল্প এ: যদি আপনার চিত্রটি তৈরির সময় আপনার কেবল এই গোপনীয়তা প্রয়োজন হয় তবে বিল্ডটি শুরুর আগে গোপনীয়তা ব্যবহার করতে পারবেন না এবং বিল্ডকিটটিতে এখনও অ্যাক্সেস নেই, তবে একটি মাল্টি-স্টেজ বিল্ড সবচেয়ে ভাল বিকল্প। আপনি বিল্ডের প্রাথমিক পর্যায়ে গোপনীয়তা যুক্ত করবেন, সেখানে এটি ব্যবহার করবেন এবং তারপরে আপনার প্রকাশের পর্যায়ে গোপনীয়তা ছাড়াই সেই পর্যায়ের আউটপুটটি অনুলিপি করতে পারবেন এবং কেবলমাত্র সেই মুক্তির পর্যায়টি রেজিস্ট্রি সার্ভারগুলিতে ঠেলাবেন। এই গোপনীয়তাটি এখনও বিল্ড সার্ভারে চিত্রের ক্যাশে রয়েছে, সুতরাং আমি এটিকে কেবলমাত্র শেষ অবলম্বন হিসাবে ব্যবহার করার ঝোঁক।

বিকল্প বি: এছাড়াও বিল্ড টাইম চলাকালীন, আপনি যদি বিল্ডকিট ব্যবহার করতে পারেন যা 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 .

বিকল্প সি:সোর্ম মোড বা অন্য অর্কেস্টেশন ব্যতীত একক নোডে রানটাইমের সময় আপনি শংসাপত্রগুলি কেবল পঠনযোগ্য ভলিউম হিসাবে মাউন্ট করতে পারেন। এই শংসাপত্রটিতে অ্যাক্সেসের একই অ্যাক্সেসের প্রয়োজন যা আপনার কাছে ডকারের বাইরে একই শংসাপত্রগুলির ফাইল রয়েছে, সুতরাং এটি ডকার ছাড়াই দৃশ্যের চেয়ে ভাল বা খারাপ আর কিছু নয়। সবচেয়ে গুরুত্বপূর্ণ, আপনি যখন ধারকটি পরিদর্শন করেন, লগগুলি দেখুন বা চিত্রটিকে একটি রেজিস্ট্রি সার্ভারে ঠেলাবেন তখন এই ফাইলটির বিষয়বস্তু দৃশ্যমান হওয়া উচিত নয়, কারণ প্রতিটি দৃশ্যে ভলিউম এর বাইরে থাকে। এটির প্রয়োজন নেই যে আপনি আপনার শংসাপত্রগুলি ডকার হোস্টে অনুলিপি করুন, ধারকটির মোতায়েন থেকে পৃথক। (দ্রষ্টব্য, যে হোস্টের মধ্যে ধারক চালানোর ক্ষমতা সম্পন্ন যে কোনও ব্যক্তি আপনার শংসাপত্রটি দেখতে পাবে কারণ ডকার এপিআইতে অ্যাক্সেস হোস্টের মূল এবং মূল যে কোনও ব্যবহারকারীর ফাইল দেখতে পারে you ,

একটির জন্য 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

বিকল্প ডি:সোর্ম মোড এবং কুবারনেটসের মতো অর্কেস্ট্রেশন সরঞ্জামগুলির সাথে আমাদের কাছে এখন সিক্রেটস সাপোর্ট রয়েছে যা ভলিউমের চেয়ে ভাল। স্বর্ম মোডের সাহায্যে ফাইলটি ম্যানেজার ফাইল সিস্টেমে এনক্রিপ্ট করা হয় (যদিও ডিক্রিপশন কীটি প্রায়শই সেখানে থাকে, ম্যানেজারকে একটি ডিক্রিপ্ট কী প্রবেশ না করেই ম্যানেজারটিকে পুনরায় চালু করতে দেওয়া হয়)। আরও গুরুত্বপূর্ণ বিষয়, গোপনীয়তা কেবলমাত্র সেই কর্মীদের কাছে প্রেরণ করা হয় যার গোপনীয়তা প্রয়োজন (সেই গোপনীয়তার সাথে একটি ধারক চালানো) এটি কেবল কর্মীর স্মৃতিতে সংরক্ষণ করা হয়, কখনই ডিস্ক নয় এবং এটি একটি টিএমপিএফএস সহ ধারকটিতে ফাইল হিসাবে ইনজেকশনের ব্যবস্থা করা হয় মাউন্ট। ঝাঁকের বাইরের হোস্টের ব্যবহারকারীরা সেই গোপনীয়তাটি সরাসরি তাদের নিজের পাত্রে মাউন্ট করতে পারবেন না, তবে ডকার এপিআইতে খোলা অ্যাক্সেসের সাথে তারা নোডের চলমান ধারক থেকে গোপনটি বের করতে পারে, সুতরাং আবার কার কাছে এই অ্যাক্সেস রয়েছে তা সীমাবদ্ধ করুন এপিআই রচনা থেকে, এই গোপন ইনজেকশনটি দেখে মনে হচ্ছে:

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-update

বিকল্প ই: গোপনীয়তা পরিচালনার জন্য অন্যান্য সরঞ্জাম উপস্থিত রয়েছে এবং আমার প্রিয়টি ভল্ট কারণ এটি স্বয়ংক্রিয়ভাবে মেয়াদোত্তীর্ণ হয়ে সময় সীমিত গোপনীয়তা তৈরি করার ক্ষমতা দেয়। প্রতিটি অ্যাপ্লিকেশন তার পরে গোপনীয়তাগুলির অনুরোধের জন্য নিজস্ব টোকেনগুলির সেট পায় এবং সেই টোকেনগুলি যতক্ষণ না তারা ভল্ট সার্ভারে পৌঁছতে পারে ততক্ষণ সেই সময়ের সীমাবদ্ধ গোপনগুলির জন্য অনুরোধ করার ক্ষমতা দেয়। এটি কোনও ঝুঁকি হ্রাস করে যদি আপনার নেটওয়ার্ক থেকে কোনও গোপনীয়তা বের করে নেওয়া হয় যেহেতু এটি কাজ করবে না বা দ্রুত মেয়াদ শেষ করবে। ভল্টের জন্য AWS এর সাথে সম্পর্কিত কার্যকারিতাটি https://www.vaultproject.io/docs/secrets/aws/index.html এ নথিভুক্ত করা হয়েছে


23

আর একটি পদ্ধতি হ'ল মেশিন থেকে ডকার পাত্রে কীগুলি পাস করা। আপনি 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}

4
সঠিক অঞ্চলের পরিবেশ পরিবর্তনশীল হ'ল AWS_REGION। স্ট্যাকওভারফ্লো
জন ক্যামেরিন 20'19

4
অনুগ্রহ করে অফিসিয়াল ডকটি দেখুন যা AWS_DEFAULT_REGION ডকস.আও.স.ম্যাজন.কম
ক্লি

7
আমি যখন AWS_DEFAULT_REGION ব্যবহার করি তখন আমি একটি ব্যতিক্রম পাই যে একটি ডিফল্ট অঞ্চল খুঁজে পাওয়া যায় নি। আমার সন্ধানের ফলে ডকস.আও.এসএজ়োন.কম / এসডিকি-ফোর-জাভা / ভি 1 / ডেভেলপার-গাইড / জি যা AWS_REGION এনভায়রনমেন্ট ভেরিয়েবল নির্দিষ্ট করে এবং এটি আমার পক্ষে কাজ করেছে।
জন ক্যামেরিন

আপনি যদি অস্থায়ী শংসাপত্রগুলি ব্যবহার করছেন তবে আপনার প্রয়োজনও হতে পারেAWS_SESSION_TOKEN=${AWS_SESSION_TOKEN}
ডভোস

16

তবুও আরেকটি পদ্ধতি হ'ল ডকার-কমপোজ.আইএমএলে অস্থায়ী পঠনযোগ্য ভলিউম তৈরি করা to এডাব্লুএস সি এল আই এবং এসডিকে (যেমন বোটো 3 বা জাভা এর জন্য এডাব্লুএস এসডিকে ইত্যাদি) ফাইলে defaultপ্রোফাইল খুঁজছেন ~/.aws/credentials

আপনি যদি অন্য প্রোফাইল ব্যবহার করতে চান তবে docker-composeকমান্ড চালানোর আগে আপনার কেবল AWS_PROFILE পরিবর্তনশীল রফতানি করতে হবে export

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ফাইলটিতে আপনার একাধিক প্রোফাইল থাকা এবং এটি এমএফএ ব্যবহার করার সময় এটি খুব সহায়ক । এছাড়াও আপনি যখন ইসিএসের উপর আইএএম ভূমিকা রাখেন তার আগে স্থানীয়ভাবে ডকার-ধারকটি পরীক্ষা করতে চান, তবে স্থানীয়ভাবে আপনি তা কার্যকর করেন না।


উইন্ডোজ .aws` ক্যাটালগ অবস্থিত "%UserProfile%\.aws"। সুতরাং আমি ধরে নিয়েছি যে আপনাকে অবশ্যই পরিবর্তন করতে হবে: - ~/.aws/:/root/.aws:roথেকে- %UserProfile%\.aws:/root/.aws:ro
আর্টুর সিপিয়েটভস্কি

4
এটি কেবলমাত্র একক বিল্ড প্রক্রিয়াগুলিতে কাজ করবে, মাল্টিস্টেজ নয়।
wlarcheveque

@ ওয়ালারচেভেক কে বিস্তৃত করার যত্ন করছেন?
এরিক

- host:containerসিনট্যাক্সটি ব্যবহার করে খুব সতর্কতা অবলম্বন করুন , যদি হোস্টের মধ্যে ফাইল / ফোল্ডারটি উপস্থিত না থাকে তবে এটি তৈরি হয়ে যায় (মূল হিসাবে) এবং অ্যাডস্ক্লি এটি শূন্য বাইট ফাইল খাওয়ানোর জন্য আপনাকে ধন্যবাদ জানায় না। আপনার "লম্বা ফর্ম" ব্যবহার করা উচিত যা টাইপটি হ'ল বাঁধাই, হোস্ট পাথ এবং পৃথক লাইনে ধারক পথ নির্দিষ্ট করে, যদি ফাইলটি না থাকে তবে এটি ব্যর্থ হয় যা আপনার ডকার-কম্পোজ.ডেভে আপনি চান। yml তবে আপনার ডকার-কমপোজ.আইএমএল (প্রোড / এডাব্লুএস মোতায়েন) নয়।
ড্রাগন 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

"এসকে" ফাইলটি সংরক্ষণ করতে।

চালান এবং ধারক পরীক্ষা করুন

 my_service:
      build: .
      image: my_image
      env_file:
        - ~/aws_env_creds
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.