도커 컨테이너에 AWS 자격 증명을 전달하는 가장 좋은 방법은 무엇입니까?
저는 아마존 EC2에서 도커 컨테이너를 실행하고 있습니다.현재 도커 파일에 AWS 자격 증명을 추가했습니다.이것을 하는 가장 좋은 방법을 알려주시겠습니까?
이 질문이 있은 후 도커에서 많은 것이 변경되었습니다. 따라서 업데이트된 답변을 시도해 보겠습니다.
첫째, 특히 클라우드 내부에서 이미 실행 중인 컨테이너에 대한 AWS 자격 증명을 사용하는 경우 Vor가 제안하는 IAM 역할을 사용하는 것이 매우 좋은 옵션입니다.만약 당신이 그렇게 할 수 있다면, 그의 대답에 1 더하기 1을 더하고 나머지는 건너뜁니다.
클라우드 외부에서 작업을 실행하거나 다른 유형의 암호를 사용하는 경우 암호를 저장하지 않는 것이 좋습니다.
환경 변수: 컨테이너에 정의된 경우 컨테이너 내부의 모든 프로세스가 액세스할 수 있고 /proc를 통해 표시되며, 애플리케이션이 로그에 저장된 위치를 표시하기 위해 환경을 덤프할 수 있으며, 가장 중요한 것은 컨테이너를 검사할 때 일반 텍스트로 표시된다는 것입니다.
이미지 자체: 이미지는 종종 많은 사용자가 풀 액세스 권한을 가진 레지스트리로 푸시되며, 때로는 이미지를 풀하는 데 필요한 자격 증명이 없습니다.한 계층에서 암호를 삭제하더라도 이미지는 다음과 같은 일반적인 Linux 유틸리티로 분해할 수 있습니다.
tar비밀은 처음 이미지에 추가된 단계에서 찾을 수 있습니다.
그렇다면 도커 컨테이너의 비밀을 위한 다른 옵션은 무엇이 있을까요?
옵션 A: 이미지를 빌드하는 동안에만 이 비밀이 필요하고 빌드가 시작되기 전에 비밀을 사용할 수 없으며 아직 빌드 키트에 액세스할 수 없다면, 다단계 빌드가 가장 좋은 옵션입니다.빌드의 초기 단계에 암호를 추가하여 사용한 다음 암호 없이 해당 단계의 출력을 릴리스 단계로 복사하고 해당 릴리스 단계만 레지스트리 서버에 푸시합니다.이 비밀은 빌드 서버의 이미지 캐시에 남아 있기 때문에 마지막 수단으로만 사용하는 경향이 있습니다.
옵션 B: 또한 빌드 시간 동안 18.09에 출시된 BuildKit을 사용할 수 있다면, 현재 단일 RUN 라인에 대한 볼륨 마운트로 비밀을 주입할 수 있는 실험 기능이 있습니다.이 마운트는 이미지 계층에 기록되지 않으므로 공용 레지스트리 서버에 푸시될 염려 없이 빌드 중에 암호에 액세스할 수 있습니다.결과 Docker 파일은 다음과 같습니다.
# 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: 스웜 모드 또는 기타 오케스트레이션 없이 단일 노드에서 런타임에 자격 증명을 읽기 전용 볼륨으로 마운트할 수 있습니다.이 자격 증명에 액세스하려면 도커 외부에서 동일한 자격 증명 파일에 대한 동일한 액세스 권한이 필요하므로 도커가 없는 시나리오와 다를 바 없습니다.가장 중요한 것은 모든 시나리오에서 볼륨이 해당 범위를 벗어났기 때문에 컨테이너를 검사하거나 로그를 보거나 이미지를 레지스트리 서버에 푸시할 때 이 파일의 내용이 표시되지 않아야 한다는 것입니다.이 경우 컨테이너 배포와는 별도로 도커 호스트에 자격 증명을 복사해야 합니다. 도커 API에 대한 액세스는 호스트에서 루트이며 루트는 모든 사용자의 파일을 볼 수 있으므로 해당 호스트에서 컨테이너를 실행할 수 있는 능력을 가진 모든 사용자가 자격 증명을 볼 수 있습니다.호스트에 루트가 있는 사용자를 신뢰하지 않는 경우 도커 API 액세스 권한을 부여하지 마십시오.)
당분간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: Swarm Mode 및 Kubernetes와 같은 오케스트레이션 도구를 사용하여 볼륨보다 더 나은 비밀 지원을 제공합니다.스웜 모드를 사용하면 파일이 관리자 파일 시스템에서 암호화됩니다(비록 암호 해독 키도 종종 있기 때문에 관리자가 암호 해독 키를 입력하지 않고도 관리자를 다시 시작할 수 있습니다).더 중요한 것은 암호가 필요한 작업자에게만 암호가 전송되고(그 암호로 컨테이너를 실행), 작업자의 메모리에만 저장되며 디스크는 저장되지 않으며 tmpfs 마운트가 있는 컨테이너에 파일로 주입된다는 것입니다.스웜 외부의 호스트에 있는 사용자는 이 비밀을 자신의 컨테이너에 직접 탑재할 수 없지만 도커 API에 대한 개방형 액세스 권한을 통해 노드에서 실행 중인 컨테이너에서 비밀을 추출할 수 있으므로 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-update 의 스크립트를 사용하여 제 비밀을 버전화합니다.
옵션 E: 암호를 관리하는 다른 도구가 있으며, 자동으로 만료되는 시간 제한 암호를 만들 수 있는 기능을 제공하기 때문에 볼트를 가장 좋아합니다.그런 다음 모든 응용 프로그램은 암호를 요청하기 위해 고유한 토큰 집합을 얻으며, 이러한 토큰은 볼트 서버에 도달할 수 있는 한 시간 제한된 암호를 요청할 수 있는 기능을 제공합니다.이렇게 하면 네트워크에서 암호가 제거될 경우 암호가 작동하지 않거나 빨리 만료되기 때문에 위험이 줄어듭니다.AWS for Vault 관련 기능은 https://www.vaultproject.io/docs/secrets/aws/index.html 에 문서화되어 있습니다.
가장 좋은 방법은 IAM 역할을 사용하고 자격 증명을 전혀 다루지 않는 것입니다. (http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html 참조)
증명은 다에서자검수있다니에서 할 수 .http://169.254.169.254.....이 주소는 개인 IP 주소이므로 EC2 인스턴스에서만 액세스할 수 있습니다.
현대의 모든 AWS 클라이언트 라이브러리는 자격 증명을 가져와 새로 고치고 사용하는 방법을 "알고" 있습니다.그래서 대부분의 경우 여러분은 그것에 대해 알 필요조차 없습니다.올바른 IAM 역할로 ec2를 실행하면 됩니다.
예옵션으런환에변전수있달다습니할로수경로임타예▁()로 할 수 .docker run -e AWS_ACCESS_KEY_ID=xyz -e AWS_SECRET_ACCESS_KEY=aaa myimage)
터미널에서 printenv를 실행하여 이러한 환경 변수에 액세스할 수 있습니다.
또다접근방compose은식른 도커-er.yaml에 임시 읽기 전용 볼륨을 만드는 것입니다.및 SDK 등에서 AWS CLI 및 SDK(boto3 또는 AWS SDK for Java 등)를 .default을 의옆습모로 합니다.~/.aws/credentialsjava.
프로파일을 에 AWS_AWS_PROFILE 변수를 실행할 수 .docker-composecommand
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 사용자를 사용했습니다.다른 사용자를 사용하는 경우 변경하기만 하면 됩니다./root/.aws사용자 홈 디렉토리로 이동합니다.
:ro 전용 입니다.
여러 개의 프로필이 있는 경우 매우 유용합니다.~/.aws/credentials파일과 MFA도 사용하고 있습니다.IAM 역할이 있는 ECS에 도커 컨테이너를 배포하기 전에 로컬에서 테스트하려는 경우에도 유용합니다.
또 다른 방법은 호스트 시스템에서 도커 컨테이너로 키를 전달하는 것입니다.당신은 행음다추수있다니습에 할 수 .docker-composejava.
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-okta 또는 saml2aws에 의해 자격 증명이 설정된 경우에도 다음과 같은 한 줄기 작업이 가능합니다.
$ docker run -v$HOME/.aws:/root/.aws:ro \
-e AWS_ACCESS_KEY_ID \
-e AWS_CA_BUNDLE \
-e AWS_CLI_FILE_ENCODING \
-e AWS_CONFIG_FILE \
-e AWS_DEFAULT_OUTPUT \
-e AWS_DEFAULT_REGION \
-e AWS_PAGER \
-e AWS_PROFILE \
-e AWS_ROLE_SESSION_NAME \
-e AWS_SECRET_ACCESS_KEY \
-e AWS_SESSION_TOKEN \
-e AWS_SHARED_CREDENTIALS_FILE \
-e AWS_STS_REGIONAL_ENDPOINTS \
amazon/aws-cli s3 ls
해야 할 수도 .rw합니다.ro 전용) 탑재 시 (읽기 전용) 사항.aws의 -v$HOME/.aws:/root/.aws:ro
볼륨 장착은 이 스레드에서 확인할 수 있지만 다음과는 다릅니다.docker-compose v3.2 +마운트를 바인딩할 수 있습니다.
예를 들어 이름이 지정된 파일이 있는 경우.aws_creds프로젝트의 루트:
컴포지트 파일 서비스에서 볼륨에 대해 다음 작업을 수행합니다.
volumes:
# normal volume mount, already shown in thread
- ./.aws_creds:/root/.aws/credentials
# way 2, note this requires docker-compose v 3.2+
- type: bind
source: .aws_creds # from local
target: /root/.aws/credentials # to the container location
이하면, 의 도커 허브에 으로 저장할 수 . 는 도커 허브에 저장할 수 있기 입니다.aws credentials이지에물나지않다입니것을예연... 연결하려면 되는 위치, 에서 로컬로 올바른 를 가지고 있어야 .
은 지역이 될 이고, 당신의 이것지효있을것이고가의당,신은역을 입니다.~/.aws디렉토리 및/또는 환경 변수 또는 임시 액세스 토큰으로 재정의할 수 있습니다.임시 액세스 토큰은 로컬 개발을 위해 선호되는 방법입니다. https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html
version: '3.8'
services:
my-container-name:
environment:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_SESSION_TOKEN
- AWS_PROFILE
- AWS_REGION
- AWS_DEFAULT_REGION=us-east-1
secrets:
- source: aws
target: /home/appuser/.aws
uid: "1000"
gid: "1000"
mode: 0700
secrets:
aws:
file: "~/.aws"
의 내용은 를 실행하고 있지 않다는 것을 전제로 합니다.root(하지 (발하지마요세제있다실습니고그하리고신행대을들것그),!), 그리고 appuser루트로 실행하려면 다음과 같이 대체합니다./home/appuser/와 함께/root/
이것을 당신에게 추가하는 것을 추천합니다.Dockerfile일반적으로 진입점/인접점 바로 앞:
RUN groupadd -r -g 1000 appuser && useradd -m -r -u 1000 -g appuser appuser
USER appuser
실제 프로덕션 구현의 경우 K8을 가정하여 IAM 역할 및 Kubernetes 서비스 계정을 사용해야 합니다. https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/ 더 나은 설명자: https://aws.amazon.com/blogs/containers/diving-into-iam-roles-for-service-accounts/
은 수있다니습생을 만들 수 .~/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
승인된 답변에 언급된 지침을 따른 후에도 동일한 문제가 발생하는 경우 두 가지 다른 소스의 환경 변수를 전달하지 않는지 확인합니다.제 경우에는 환경 변수를 전달하고 있었습니다.docker run파일을 통해 변수가 매개 변수로 전달되는 원인이 되는 매개 변수가 영향을 미치지 않습니다.
그래서 다음 명령은 제게 효과가 없었습니다.
docker run --env-file ./env.list -e AWS_ACCESS_KEY_ID=ABCD -e AWS_SECRET_ACCESS_KEY=PQRST IMAGE_NAME:v1.0.1
증명 하기 자격 항된로으이동목급언env.list파일 도움말
php apache 도커의 경우 다음 명령이 작동합니다.
docker run --rm -d -p 80:80 --name my-apache-php-app -v "$PWD":/var/www/html -v ~/.aws:/.aws --env AWS_PROFILE=mfa php:7.2-apache
이전의 몇 가지 답변을 바탕으로 다음과 같이 저만의 답을 만들었습니다.내 프로젝트 구조:
├── Dockerfile
├── code
│ └── main.py
├── credentials
├── docker-compose.yml
└── requirements.txt
나의docker-compose.yml파일 이름:
version: "3"
services:
app:
build:
context: .
volumes:
- ./credentials:/root/.aws/credentials
- ./code:/home/app
나의Docker파일 이름:
FROM python:3.8-alpine
RUN pip3 --no-cache-dir install --upgrade awscli
RUN mkdir /app
WORKDIR /home/app
CMD python main.py
언급URL : https://stackoverflow.com/questions/36354423/what-is-the-best-way-to-pass-aws-credentials-to-a-docker-container
'programing' 카테고리의 다른 글
| 절대 위치 및 오버플로 숨김 (0) | 2023.08.14 |
|---|---|
| 크롬 개발자 도구에서 사람이 읽을 수 있는 자바스크립트 (0) | 2023.08.14 |
| jQuery를 사용하여 div로 스크롤 (0) | 2023.08.14 |
| JavaScript에서 마지막 슬래시 뒤에 있는 문자열 값 가져오기 (0) | 2023.08.14 |
| 중간 텍스트의 최대 길이? (0) | 2023.08.14 |