AWS 자격 증명을 사용자 데이터로 EC2 인스턴스에 전달하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/640838

문제

EC2 인스턴스 쿼리 S3 및 SQS가 필요한 AWS 기반 작업 처리 아키텍처가 있습니다.실행 중인 인스턴스가 API에 액세스할 수 있도록 자격 증명은 base64로 인코딩된 셸 스크립트 형식의 사용자 데이터(-f)로 전송됩니다.예를 들어:

$ cat ec2.sh
...
export AWS_ACCOUNT_NUMBER='1111-1111-1111'
export AWS_ACCESS_KEY_ID='0x0x0x0x0x0x0x0x0x0'
...
$ zip -P 'secret-password' ec2.sh
$ openssl enc -base64 -in ec2.zip

많은 인스턴스가 시작되었습니다 ...

$ ec2run ami-a83fabc0 -n 20 -f ec2.zip

각 인스턴스는 init 스크립트에 하드 코딩된 'secret-password'를 사용하여 ec2.zip을 디코딩하고 해독합니다.작동하기는 하지만 접근 방식에는 두 가지 문제가 있습니다.

  1. 'zip -P'는 그다지 안전하지 않습니다.
  2. 비밀번호는 인스턴스에 하드 코딩되어 있습니다(항상 'secret-password'임).

방법은 설명된 것과 매우 유사합니다. 여기

더 우아하고 수용 가능한 접근 방식이 있습니까?gpg를 사용하여 자격 증명을 암호화하고 이를 해독하기 위해 인스턴스에 개인 키를 저장하는 것이 지금 고려 중인 접근 방식이지만 어떤 주의 사항도 알지 못합니다.AWS 키 쌍을 직접 사용할 수 있습니까?API의 매우 분명한 부분이 누락되었나요?

도움이 되었습니까?

해결책

자격 증명을 머신에 저장할 수 있습니다(또는 전송, 사용 후 제거).

보안 채널(예:사용하여 scp 비대화형 인증을 사용합니다.키 쌍)을 사용하면 사용자 정의 암호화를 수행할 필요가 없습니다(권한이 다음으로 올바르게 설정되었는지 확인하세요). 0400 항상 키 파일에 있습니다.마스터 파일에 대한 권한을 설정하고 사용하십시오. scp -p)

위 내용으로 귀하의 질문에 대답할 수 없는 경우, 더 구체적인 세부 정보를 제공해 주십시오.귀하의 설정이 무엇이며 달성하려는 것이 무엇입니까?EC2 작업은 중앙 위치의 여러 노드에서 시작됩니까?여러 노드와 중앙 위치 간에 SSH를 사용할 수 있나요?등.


편집하다

고려해 보셨나요? AMI 매개변수화, AMI를 인스턴스화하는 사람들은 먼저 사용자 데이터(ec2-run-instances -f user-data-file)를 AWS 키로 사용하시겠습니까?그러면 AMI는 다음에서 이러한 인스턴스별 매개변수를 동적으로 검색할 수 있습니다. http://169.254.169.254/1.0/user-data.


업데이트

자, 지금까지 논의된 다양한 접근 방식을 보안을 염두에 두고 비교한 내용은 다음과 같습니다.

  1. 데이터 보안 AMI에 저장됨 user-data 암호화되지 않은
    • 낮은
    • 일반 텍스트 데이터에 액세스할 수 있습니다. 어느 AMI에 로그인하고 다음에 액세스할 수 있는 사용자 telnet, curl, wget, 등.(일반 텍스트에 액세스할 수 있습니다. http://169.254.169.254/1.0/user-data)
    • 프록시 요청 공격에 취약합니다(예:공격자는 AMI에서 실행 중이거나 실행되지 않을 수 있는 Apache에게 일반 텍스트를 가져와 전달하도록 요청합니다. http://169.254.169.254/1.0/user-data)
  2. 데이터 보안 AMI에 저장됨 user-data 쉽게 얻을 수 있는 키로 암호화(또는 복호화) 가능
    • 낮은
    • 쉽게 얻을 수 있는 키(비밀번호)에는 다음이 포함될 수 있습니다.
      • ABI 내부 스크립트에 하드 코딩된 키(공격자가 ABI를 얻을 수 있음)
      • AMI 자체의 스크립트에 하드 코딩된 키. 어느 AMI에 로그온하는 사용자
      • 공개 키 등과 같이 쉽게 얻을 수 있는 기타 정보
      • 모든 개인 키(공개 키는 쉽게 얻을 수 있음)
    • 쉽게 얻을 수 있는 키(비밀번호)가 있으면 1번 항목에서 확인된 것과 동일한 문제가 적용됩니다.
      • 해독된 데이터는 다음에서 액세스할 수 있습니다. 어느 AMI에 로그인하고 다음에 액세스할 수 있는 사용자 telnet, curl, wget, 등.(일반 텍스트에 액세스할 수 있습니다. http://169.254.169.254/1.0/user-data)
      • 프록시 요청 공격에 취약합니다(예:공격자는 AMI에서 실행 중이거나 실행되지 않을 수 있는 Apache에게 암호화된 데이터를 가져와 전달하도록 요청합니다. http://169.254.169.254/1.0/user-data, 쉽게 얻을 수 있는 키로 은밀히 복호화됨)
  3. 데이터 보안 AMI에 저장됨 user-data 쉽게 얻을 수 없는 키로 암호화
    • 평균
    • 암호화된 데이터에 접근 가능 어느 AMI에 로그인하고 다음에 액세스할 수 있는 사용자 telnet, curl, wget, 등.(암호화된 접근 가능 http://169.254.169.254/1.0/user-data)
      • 그런 다음 무차별 대입 공격을 사용하여 암호화된 데이터를 해독하려는 시도를 할 수 있습니다.
  4. 데이터 보안 AMI의 안전한 위치에 저장됩니다. (암호화할 추가 가치는 없습니다)
    • 더 높은
    • 데이터는 한 명의 사용자, 즉 운영을 위해 데이터가 필요한 사용자만 액세스할 수 있습니다.
      • 예를 들어사용자가 소유한 파일:마스크가 0600 또는 0400인 사용자
    • 공격자는 데이터에 접근하기 위해 특정 사용자를 가장할 수 있어야 합니다.
      • 사용자 직접 로그온 거부와 같은 추가 보안 계층(통과해야 함) root 대화형 가장의 경우) 보안을 향상시킵니다.

따라서 AMI와 관련된 모든 방법은 user-data 가장 안전하지 않습니다. 어느 시스템의 사용자(가장 약한 지점)가 데이터를 손상시킵니다.

S3 자격 증명이 제한된 기간 동안만 필요한 경우(예:배포 프로세스 중에만) 만약에 AWS에서는 다음의 내용을 덮어쓰거나 제거할 수 있도록 허용했습니다. user-data 완료되면(그러나 그렇지 않은 것 같습니다.) 대안은 가능하다면 배포 프로세스 기간 동안 임시 S3 자격 증명을 생성하는 것입니다(이러한 자격 증명을 손상시키거나 user-data, 배포 프로세스가 완료되고 AWS에서 자격 증명이 무효화되면 더 이상 보안 위협이 발생하지 않습니다.)

위의 사항이 해당되지 않는 경우(예:배포된 노드에 무기한으로 필요한 S3 자격 증명) 또는 불가능(예:배포용으로만 임시 S3 자격 증명을 발급할 수 없음) 최선의 방법은 남아 있습니다. scp 올바른 소유권과 권한을 사용하여 여러 노드에 동시에 자격 증명을 제공합니다.

다른 팁

나는 비밀을 EC2 인스턴스에 안전하게 전달하는 다양한 방법과 각각의 장단점을 조사하는 기사를 썼습니다.

http://www.shlomoswidler.com/2009/08/how-to-keep-your-aws-credentials-on-ec2.html

가장 좋은 방법은 사용하는 것입니다 인스턴스 프로파일. 기본 아이디어는 다음과 같습니다.

  • 인스턴스 프로필을 만듭니다
  • 새로운 IAM 역할을 만듭니다
  • 예를 들어 이전에 만든 역할에 정책을 할당하십시오.

    { "명령문": [{ "sid": "stmt1369049349504", "action": "sqs :","효과 ":"허용 ","자원 ":": "" } ] }

  • 역할과 인스턴스 프로필을 함께 연결하십시오.

  • 새 EC2 인스턴스를 시작하면 인스턴스 프로필 이름을 제공하십시오.

모든 것이 잘 작동하고 EC2 인스턴스의 AWS 서비스에 연결하는 데 사용하는 라이브러리가 인스턴스 메타 데이터에서 자격 증명을 검색하는 것이 지원되면 코드는 AWS 서비스를 사용할 수 있습니다.

보토 사용자 메일 링리스트에서 가져온 전체 예 :

먼저, IAM 역할에 액세스 해야하는 서비스와 리소스를 나타내는 JSON 정책 문서를 작성해야합니다. 예를 들어,이 정책은 버킷 "my_bucket"에 대한 모든 S3 조치를 부여합니다. 신청에 적합한 모든 정책을 사용할 수 있습니다.

BUCKET_POLICY = """{
  "Statement":[{
    "Effect":"Allow",
    "Action":["s3:*"],
    "Resource":["arn:aws:s3:::my_bucket"]}]}"""

다음으로 IAM에서 인스턴스 프로파일을 작성해야합니다.

import boto
c = boto.connect_iam()
instance_profile = c.create_instance_profile('myinstanceprofile')

인스턴스 프로파일이 있으면 역할을 만들고 인스턴스 프로파일에 역할을 추가하고 정책을 역할과 연결해야합니다.

role = c.create_role('myrole')
c.add_role_to_instance_profile('myinstanceprofile', 'myrole')
c.put_role_policy('myrole', 'mypolicy', BUCKET_POLICY)

이제 인스턴스를 시작할 때 해당 인스턴스 프로필을 사용할 수 있습니다.

ec2 = boto.connect_ec2()
ec2.run_instances('ami-xxxxxxx', ..., instance_profile_name='myinstanceprofile')

더 이상 EC2 인스턴스에 자격 증명을 제공 할 필요가 없다는 것을 지적하고 싶습니다. IAM을 사용하면 EC2 인스턴스의 역할을 만들 수 있습니다. 이러한 역할에서 EC2 인스턴스가 특정 S3 버킷에서 특정 객체를 얻을 수있는 세밀한 정책을 설정할 수 있습니다. AWS 문서에서 IAM 역할에 대한 자세한 내용을 읽을 수 있습니다.

http://docs.aws.amazon.com/iam/latest/userguide/workingwithroles.html

다른 사람들이 이미 지적한 것처럼, IAM 역할을 사용하여 EC2 인스턴스에 대한 AWS 자격 증명을 저장할 필요는 없습니다. https://aws.amazon.com/blogs/security/a-safer-way-to-distribute-aws-credentials-to-ec2/. 안전하게 저장하기 위해 동일한 방법을 사용할 수 있다고 덧붙일 것입니다. 비 AWS 자격 증명 EC2 인스턴스의 경우 DB 자격 증명이 있으면 보안을 유지하려는 것입니다. S3 Bukcet에 비 AWS 자격 증명을 저장하고 iAM 역할을 사용하여 해당 버킷에 액세스하십시오. 여기에 대한 자세한 정보를 찾을 수 있습니다. https://aws.amazon.com/blogs/security/using-iam-roles-to-distribute-non-aws-credentials-to-your-ec2-instances/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top