Upload
amazon-web-services-korea
View
906
Download
2
Embed Size (px)
Citation preview
AWS Identity and Access Management
AWS Black Belt Tech Webinar 2014 (Old Meister)Written by: Amazon Data Services Japan Ltd. Security consultant : Takada Tomomi
Translated by:Amazon Corporate Services Korea LLC Solutions Architect : Younjin Jeong
Agenda
• IAM overview
• IAM policy
• IAM role
• AWS Security Token Service
• 정리
Agenda
• IAM overview
• IAM policy
• IAM role
• AWS Security Token Service
• 정리
AWS Identity and Access Management (IAM)
• AWS 를 안전하게 사용하기 위한 인증/허가 시스템
• AWS 사용자 인증 및 접근 정책 관리 AWS 관리를 위한 그룹, 사용자 및 role (역할) 생성 가능
그룹별 제한된 권한의 부여가 가능
사용자별 인증 및 권한 부여가 가능
개발팀 운영팀
IAM 동작 방식API 및 관리 콘솔에서 접근 권한을 설정/확인
모든 작업가능
S3에 대해모든 작업가능
S3 읽기만가능
관리자
개발자
사용자
IAM
O
O
O
X
X
IAM 사용자• AWS account 를 통한 관리 작업을 위해 생성 가능한 사용자
– AWS 1개의 계정 (account) 에 5000 명까지 생성 가능
• 사용자별 설정 가능 정보– 사용자 이름
• IAM 식별 관리 및 관리 콘솔 로그인에 사용하는 ID
• 최장 64 까지의 알파벳, 숫자, +=,.@-_
– 경로 (옵션)
• 사용자 옵션으로 넣을 수 있는 정보
• 경로를 바탕으로 사용자의 검색이 가능
• 조직 계층이나 프로젝트 구성등을 설정하는데 사용 예)/aws/sa/
• 512자 까지 Basic Latin 문자(알파벳, 숫자, 다음과 같은 특수기호, !"#$%&'()=~|-^\@`{[}]*:+;?_)
• 시작과 끝이 ‘/’
– 소속 그룹
• 사용자당 10개의 그룹에 소속 가능
– 권한
• AWS 서비스에 대한 접근 권한을 API 레벨에서 설정 가능
• JSON 형식으로 권한을 설정– 세부 내용은 계속
IAM 그룹
• IAM 사용자를 그룹화 하여 관리 가능– AWS 1개의 계정 (account) 에서 100 개의 그룹까지 생성 가능
• 그룹에 설정 가능한 정보– 그룹 이름
• 그룹의 식별에 사용
– 경로(옵션)
• 조직의 계층 등을 묘사하는데 사용 예)/aws/
– 권한
• 그룹에 설정된 권한은 IAM 사용자에게 설정된 권한과 상충 되는지 체크
• 체크의 방법은 이후에 계속
Group
IAM에서 사용하는 인증 도구(1) 엑세스키 ID / 비밀 엑세스키 (Access Key ID / Secret Access Key)
REST,Query 형식의 API 인증에 사용
2개까지 생성 가능
Active/Inactive 상태의 전환 가능
키의 노출에 매우 주의가 필요
GitHUB
AMI 에 포함
문서로 작성, 배포
암호화되지 않은 메일에 기입
X.509 Certificate
SOAP 방식의 API 요청 인증에 사용
OpenSSL 등의 도구로 인증서를 생성, 업로드
IAM에서 사용하는 인증 도구 (2)
AWS 관리 콘솔 로그인 암호 기본값은 설정되지 않음 (로그인 불가)
128 문자까지 Basic Latin 타입을 사용
암호 변경을 강제하는 정책 설정이 가능
AWS 계정별로 생성 가능
최소 암호 길이, 대소문자 구분 등
MFA (Multi-Factor Authentication) 하드웨어 기반의 MFA 또는 소프트웨어 기반의 MFA 중 택일
하드웨어 MFA
Gemalto 사에서 AWS 용 장치를 구입
Token 유형
카드 유형 (NEW! 2014/5/29)
http://onlinenoram.gemalto.com/
소프트웨어 기반 MFA
스마트 폰 또는 PC에 설치
Google Authenticator 등 TOTP가 구현된 소프트웨어 사용가능
New!
관리 콘솔 로그인 방법
• IAM 사용자는 AWS 계정에 마련된 별도의 URL 에서 로그인 가능
• 기본 URL + 계정 이름의 형태
• 「Account Alias」사용자가 쉽게 인식 가능한 URL 사용 가능
– S3 bucket 이름과 마찬가지로 Global unique
AWS 계정의 비밀 엑세스키에 대해
• 보안성 강화 정책으로 인해 AWS root account 계정에 대한 “기존의” 비밀키를 확인하는 것이 2014년 4월 21일 부터 불가능 합니다.
• 만약 현재 사용중인 키를 분실하였다면, 새로운 키를 발급하여 사용해야합니다.
• root account 의 사용자 키를 만들어서 사용하는 방법은 권고되지 않으며,모든 작업에 대해 IAM 사용자를 만들어 사용하는 것이 좋습니다.
Agenda
• IAM overview
• IAM policy
• IAM role
• AWS Security Token Service
• 정리
IAM 정책 (policy) • AWS 접근 권한의 설정
• JSON 형태로 접근 조건을 상세하게 지정– http://docs.aws.amazon.com/IAM/latest/UserGuide/AccessPolicyLanguage.html
{"Statement
{"Effect": "Allow","Action": [" s3:ListBuckets "," s3:Get * "
], "Resource": [" arn:aws:s3:::mybucket "
],"Condition": {"IpAddress": {"aws:SourceIP": [“176.32.92.49/32“]
}}
}]
}
이 조건으로 AWS 접근권한을확인
접근 권한 설정
{"Effect": "Allow","Action": [
" s3:ListBuckets "," s3:Get * "
], "Resource": [
"arn:aws:s3:::mybucket"],"Condition": {
"IpAddress": {"aws:SourceIP":
[“176.32.92.49/32“]}
}}
Effect:접근 허용 (whitelisting) ”Allow”접근 거부 (blacklisting) ”Deny”
Action:적용할 AWS API 를 지정
Resource:작업 대상이 되는 AWS 리소스를 지정
Condition:세부 조건을 지정 (대상 인스턴스, 소스IP등)
본 정책은 “S3 mybucket 에 대해 ListBuckets 과 모든 Get API 를요청하는 176.32.92.49/32 호스트에만 허용한다” 를 정의 한다.
Action
• 「Action」은 수행할 작업 자체에 대한 설정 ec2:runInstances
ec2:AttachVolume
s3:CreateBucket
s3:DeleteObject
와일드카드 지정이 가능 예)ec2:Describe*
지정된 작업 이외에는「NotAction」을 사용 예)“NotAction”: “iam:*” (IAM 작업 이외 허용)
"Action": [" s3:ListBuckets"," s3:Get*"
]
Resource
• 「Resource」은 작업 대상을 지정하는 설정 EC2 인스턴스
EBS 볼륨
S3 버켓
S3 오브젝트
• ARN(Amazon Resource Name)
“arn:aws:” 로 시작하는 문자열
arn:aws:service:region:account:resource
예) arn:aws:s3:::mybucket http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html
• 지정 자원 이외에는「NotResource」– 예) “NotResource” : “arn:aws:s3:::hoge”
"Resource": [" arn:aws:s3:::mybucket"
]
Resource로 지정할 수 있는 AWS 서비스
• AWS IAM
• Amazon EC2
• Amazon RDS
• Amazon Route53– Hostedzone,change
• Amazon S3– bucket,object
• Amazon Glacier– vault
• AWS Storage Gateway– gateway,volume,target
• AWS CloudTrail
http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_SpecificProducts.html
• Amazon SimpleDB– domain
• Amazon Redshift
• Amazon Kinesis– stream
• Amazon SNS– topic
• Amazon SQS– queue
• Amazon DynamoDB– Table, index
• Amazon SWF– domain
• AWS Elastic Beanstalk
• AWS CloudFomration
• AWS OpsWorks
• Amazon CloudSearch– domain
• Amazon Elastic Transcoder
• AWS Marketplace
2014/6 기준
Amazon EC2 Resource 지정• 다음의 리소스 지정이 가능
– VPC
– VPC Peering connection
– 인스턴스 ID
– 이미지
– Key pair
– Network Interface
– Subnet
– Route table
– Placement group
• 지정 가능한 Action에 대해서는 온라인 문서를 참조– AcceptVpcPeeringConnection, CreateVpcPeeringConnection, DeleteVpcPeeringConnection
– RebootInstances,StartInstances,StopInstances,TerminateInstaces, RunInstances
– AttachVolume,DeleteVolume,DetachVolume
– 기타 등
• Condition 을 사용한 세부 조건에 대한 명시가 가능 (이후 설명)
"Resource": [arn:aws:ec2:::instance/i-123abc"
]
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.htmlhttp://docs.aws.amazon.com/AWSEC2/latest/APIReference/ec2-api-permissions.html
– Security Group
– Network ACL
– Customer gateway
– Internet gateway
– DHCP Options set
– 인스턴스 프로파일 이름
– Placement group 이름
– 스냅샷 ID
– EBS 볼륨 ID
NEW! 2013/11
2014/6 기준
Condition
• Resource에 대한 Action (허용 또는 거부)별 조건을 설정• 정책 변수 (조건키)에 대한 연산자를 사용하여 조건을 지정
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/AccessPolicyLanguage_ElementDescriptions.html#Condition
"Condition": {"IpAddress": {"aws:SourceIP": “176.32.92.49/32“ }
}
연산자 정책 변수 조건
Condition 연산자• 문자열
– 완전일 치 또는 부분 일치의 여부
• 수치– 부등식
• 날짜 및 시간– 지정한 날짜 이전 또는 이후
• Boolean
• IP 주소– 지정된 주소의 범위
• Amazon 리소스 이름– 완전 일치 또는 부분 일치
• ...IfExists– 위 연산자들에 조건을 부여, 변수가 없으면 무시
• 조건키의 유무
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/AccessPolicyLanguage_ElementDescriptions.html#Condition
"Condition": {"StringEquals": {"ec2:ResourceTag/stack":
“prod"}}
"Condition": {“streq": {"ec2:ResourceTag/stack":
“prod"}}
정책 변수
• 모든 요청에 유효한 변수– aws:CurrentTime
– aws:EpochTime
– aws:TokenIssueTime
– aws:principaltype
– aws:SecureTransport
– aws:SourceIp
– aws:UserAgent
– aws:userid
– aws:username
• AWS 서비스 관련 변수– s3:prefix
– sns:Protocol
– ec2:ResourceTag/tag 이름 등
"Condition": {"IpAddress": {"aws:SourceIP":
“176.32.92.49/32“}}
예를 들어, API / 콘솔에 대한 사용을 지정된IP 에만 허용하려는 경우 사용
EC2 리소스에 대한 정책 변수• ec2:AccepterVpc
• ec2:AvailabilityZone
• ec2:EbsOptimized
• ec2:ImageType
• ec2:InstanceProfile
• ec2:InstanceType
• ec2:Owner
• ec2:Public
• ec2:ParentSnapshot
• ec2:PlacementGroup
• ec2:PlacementGroupStrategy
• ec2:Region
• ec2:RequesterVpc
• ec2:ResourceTag/tag-key
• ec2:RootDeviceType
• ec2:Tenancy
• ec2:VolumeIops
• ec2:VolumeSize
• ec2:VolumeTypehttp://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-policies-for-amazon-ec2.html
2014/6 기준
"Condition": {"StringEquals": {“ec2:ResourceTag/Name":
“webserver“}}
여러개의 Condition 사용, ”OR” 및 ”AND”
• Condition 아래의 블록에서는 AND, 블럭 내에서 배열로 지정되면 OR
• 이 경우, 「2013/7/16 일 12:00 부터 15:00사이에 소스 IP192.168.176.0/24 또는 192.168.143.0/24 네트워크에서의 엑세스 요청」을의미한다
"Condition" : {"DateGreaterThan" : {
"aws:CurrentTime" : "2013-07-16T12:00:00Z"},"DateLessThan": {
"aws:CurrentTime" : "2013-07-16T15:00:00Z"},"IpAddress" : {
"aws:SourceIp" : ["192.168.176.0/24","192.168.143.0/24"]}
} OR
AND
AND
AWS 서비스 Action Resource tag
IAM ○ ○
Amazon CloudFront ○
Amazon CloudWatch ○
AWS Data Pipeline ○
Amazon EC2 ○ ○ ○
Amazon ElastiCache ○
Amazon Elastic MapReduce ○
Amazon Elastic Transcoder ○ ○
Amazon RDS ○ ○ ○
Amazon Route 53 ○ ○
Amazon S3 / Glacier ○ ○
Amazon Redshift ○ ○
AWS OpsWorks ○ ○
AWS Storage Gateway ○ ○
Amazon SimpleDB ○ ○
Amazon SES ○
Amazon DynamoDB ○ ○
AWS 서비스 Action Resource tag
Amazon SNS ○ ○
Amazon SQS ○ ○
Amazon VPC ○ ○ ○
Amazon Direct Connect ○
Auto Scaling ○
AWS CloudFormation ○ ○
AWS Elastic Beanstalk ○ ○
AWS CloudHSM
Elastic Load Balancing ○ ○
Amazon WorkSpaces
AWS Import/Export ○
Amazon Kinesis ○ ○
Amazon AppStream ○
Amazon CloudSearch ○ ○
Amazon SWF ○ ○ ○
Amazon CloudTrail ○ ○
IAM을 지원하는 AWS 서비스
http://docs.aws.amazon.com/IAM/latest/UserGuide/Using_SpecificProducts.html 2014/6 기준
IAM 정책 생성기 (Policy generator)
• IAM 관리 콘솔 또는 아래의 링크를 통해 사용 가능– http://awspolicygen.s3.amazonaws.com/policygen.html
JSON 문법 검사 도구를 사용하면 편리합니다.예)http://pro.jsonlint.com/https://github.com/zaach/jsonlint
IAM 정책 샘플 (1)
{"Version":"2012-10-17", "Statement": [{
"Action": [ "ec2:CreateSnapshot", "ec2:DeleteSnapshot", "ec2:DescribeSnapshotAttribute","ec2:DescribeSnapshots" ],
"Effect": "Allow", "Resource": "*"} ]
}
EBS백업만 가능Version은 별도로 부여하지않으면, 2012-10-17이
자동으로 추가 됨
IAM 정책 샘플 (2)
{"Statement": [
{"Action": ["ec2:PurchaseReservedInstancesOffering"
],"Effect": "Deny","Resource": [
"*"]
}]
}
RI 구매 제한
{"Version":"2012-10-17", "Statement": [{"Sid": "AllowGroupToSeeBucketListInTheConsole","Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],"Effect": "Allow","Resource": ["arn:aws:s3:::*"] },
{"Sid": "AllowRootAndHomeListingOfCompanyBucket","Action": ["s3:ListBucket"],"Effect": "Allow","Resource": ["arn:aws:s3:::my-company"],"Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}} },
{ "Sid": "AllowListingOfUserFolder","Action": ["s3:ListBucket"],"Effect": "Allow","Resource": ["arn:aws:s3:::my-company"],"Condition":{"StringLike":{"s3:prefix":["home/Bob/*"]}} },
{ "Sid": "AllowAllS3ActionsInUserFolder", "Action":["s3:*"], "Effect":"Allow","Resource": ["arn:aws:s3:::my-company/home/Bob/*"] }
]}
IAM정책 샘플 (3)
“my-company” 버켓내의 ”home/Bob”을 포함하는하위key 만 사용 가능
Statement 에서 여러정책을 사용하는 경우Sid 를 다른 사용자와겹치지 않도록 설정
IAM 정책 샘플 (4)
{"Version":"2012-10-17", "Statement": [{"Sid": “StrictBucketLocation","Action": ["s3:CreateBucket"],"Condition": {"StringEquals": {
"s3:LocationConstraint": "ap-northeast-1"}
},"Resource": ["*"],"Effect": "Allow"
},{"Sid": "AllowListBucket","Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],"Effect": "Allow","Resource": ["arn:aws:s3:::*"]
}]}
지정된 region 이외의리전에서 버켓 생성 불가능
IAM 정책 샘플 (5)
{"Version": "2012-10-17","Statement": [{
"Action": ["ec2:StartInstances“,"ec2:StopInstances"],"Resource": [
"arn:aws:ec2:*:*:instance/*"],"Effect": "Allow","Condition":{"StringEquals":{"ec2:ResourceTag/project":"myapp"
}}]}
지정된 태그가 붙어 있는 (키:project, 값:myapp)인스턴스만 시작 /중지 가능
IAM 정책 샘플 (6)
{ "Version":"2012-10-17", "Statement":[{
"Effect":"Allow","Action": "rds:CreateDBInstance","Resource":"arn:aws:rds:us-east-1:1234567890:db:test*","Condition":{"streq":{"rds:DatabaseEngine":"mysql"}},"Condition":{"streq":{"rds:DatabaseClass": "db.t1.micro"}}
}]}
Mysql 과 t1.micro, “test” 로 시작하는 RDS 만 생성 가능
Support 및 결재 정보 관련 접근 제어
• AWS 지원 및 비용 청구 화면에도 IAM 을 통한 권한 할당이 가능
• 지원의 경우 ”support” Action 을 허용– 사용권한을 배제하는 경우 Deny 를 사용
• 비용 청구 화면은 다음과 같이 설정– 루트 계정으로 로그인, 보안 질문을 설정
– 비용 관련 화면에 대한 접근을 활성화
– IAM 사용자에게 ”aws-portal” 에 대한 접근 권한을 부여
https://aws.amazon.com/jp/premiumsupport/iam/http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/ControllingAccessWebsite.html
{“Statement”: [{“Action”: [ “support:*” ],“Effect”: “Allow”,“Resource”: “*”
}]}
{"Statement":[{"Effect":"Allow","Action":
[ "aws-portal:ViewBilling","aws-portal:ViewUsage"]
"Resource":"*"}]
}
사용자 Statement사용자 Statement
엑세스 가/부 결정 로직
• 엑세스 제어 조건은 여러개를 설정 가능– 사용자 그룹별로 다수의 상반되는 조건을 설정하는 것도 가능
• 기본적으로 모든 접근은 거부 ( 기본 Deny)– 접근 권한에 “Allow”가 있는 경우에만 허용
– 그러나 다수의 조건중 하나에라도 “Deny”가 있는 경우 접근 거부 (명시적 Deny)
– 기본 Deny < Allow < 명시적 Deny
그룹 Statement
Allow
해당 없음(기본 Deny)
결과 :Allow
Allow
결과:Deny
그룹 Statement
Deny
IAM 정책 시뮬레이터
• IAM 웹 콘솔에서, IAM 사용자 Permission tab 또는 다음의링크에서 사용 가능https://policysim.aws.amazon.com/home/index.jsp?
• 프로덕션 서비스에 적용하기 전에 정책을 테스트 가능– 권한 문제의 해결
– Condition 조건을 적용한 테스트
– 정책 변수를 적용한 테스트
사용자 기반과 리소스 기반
• 정책은 사용자, 그룹, 그리고 AWS 리소스에도 적용이 가능
• S3 버킷, SQS 큐 등에 대한 정책의 적용이 가능– 「특정 IP 주소에서만 버켓에 엑세스」설정이 가능
사용자 기반 리소스 기반
리소스 기반 정책에 의한 Account 간의 접근
• AWS 의 계정을 넘어선 권한 설정– S3,SQS,SNS 등의 서비스에서 이용 가능
{"Statement" : {
"Effect":"Allow","Principal" : {
“AWS”:“arn:aws:iam::Account B 넘버:root"},"Action":"s3:*","Resource":"arn:aws:s3:::mybucket/*"
}}
1.Account A 버켓에 다음과 같은 정책을 지정
2.Account B 에 mybucket 에 대한 접근 권한을 부여
Principal 에 접근을원하는 사용자에대한 조건을 설정
정책의 최대 길이
• IAM 사용자– 부여한 모든 정책의 길이 합계가 2,048 자 이하
• IAM 그룹– 부여한 모든 정책의 길이 합계가 5,120 자 이하
• IAM Role – 부여한 모든 정책의 길이 합계가 10,240 자 이하
http://docs.aws.amazon.com/IAM/latest/UserGuide/LimitationsOnEntities.html
Agenda
• IAM overview
• IAM policy
• IAM role
• AWS Security Token Service
• 정리
IAM role?
• AWS 서비스 및 어플리케이션등의 엔티티에 AWS 에 대한 권한을부여하기 위한 도구– 예를 들어 특정 EC2 인스턴스 내에서 동작중인 어플리케이션에 특정 S3 버켓에 대한 접근
권한을 부여 할 수 있다
• IAM 사용자 및 그룹이 반드시 필요하지 않음
• 설정 항목은, role 이름 또는 IAM 정책– 최대 10,240 문자열 길이의 정책 설정이 가능
• EC2외에도 Beanstalk, Data Pipeline 등에서도 이용
사용 사례 : IAM Role for EC2 instances
프로그램
EC2 인스턴스에 지정된 역할을 부여하는 기능 EC2 인스턴스를 시작할 때 role 을 지정하면 인증 정보가 meta data 로 설정된다
인증 정보는 STS(Security Token Service) 에서 생성
• 각 인스턴스마다 다른 키
• 키의 유효 기간이 되면 새로운 키로 rotate
어플리케이션에서 인증정보를 획득하고 AWS 서비스에 접근• 인스턴스 내에서 meta data 접근
• Access key id, Secret Key id, 세션 token 을 획득
• 3가지의 인증 정보를 사용하여 API 호출
IAM Rolemeta-data
meta data 에서 인증정보 취득
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/EC2_Admin
{"Code" : "Success","LastUpdated" : "2014-06-08T01:51:52Z","Type" : "AWS-HMAC","AccessKeyId" : "ASIAJY2YJ5S2ZYK25BLQ","SecretAccessKey" : "Kp1NblZ7mov/4ln7GLu8dqvN5GztXXXXXXXXXXXXXX","Token" : "AQoDYXdzELP//////////wEa0ANmvPx2CpTfOWjuPSMQ+/XXXXXXXXXXXXXXXX","Expiration" : "2014-06-08T08:17:52Z"
}
Role
STS 세션 토큰인증 유효 기간
IAM Role 을 설정한 EC2 인스턴스 내에서 검색
IAM 사용자 서비스와 비교
프로그램
IAM Rolemeta-data
프로그램
meta-data
IAM role 을 사용하게 되면 인스턴스와 key 관리를 분리하여 프로그램에key 정보를 노출하지 않으므로 더 높은 보안성을 제공할 수 있다
IAM 사용자 서비스 IAM role 사용시
인증 정보 포함
AWSCredentials credentials = new BasicAWSCredentials(“엑세스 키 ID”,”시크릿 키ID”);
AmazonEC2 ec2 = new AmazonEC2Client(credentials);”ec2.describeInstances();
• AWS SDK 를 사용하는 경우, 인증정보 취득 및 만료 전 자동적으로적용
AWS CLI 는 IAM Role에 대응
• http://aws.amazon.com/jp/cli/
AmazonEC2 ec2 = new AmazonEC2Client();”ec2.describeInstances();
IAM Role 적용시
IAM Role 적용 인스턴스에서인증 정보의 설정이 필요
사용 사례 : IAM role 을 사용하여 다른 account 리소스접근• 계정 사용자에게 다른 계정의 IAM 권한을 연결 하는 기능
• 예를 들어, 개발 전용의 계정을 사용하여 프로덕션에서 사용하는 S3 버켓을 업로드
http://docs.aws.amazon.com/IAM/latest/UserGuide/cross-acct-access.html
개발 계정을 위한 role
프로덕션 계정개발 계정
AssumeRole
인증 정보
개발자 계정 전용의인증 정보를 통해 버켓 접근
IAM Team AccountAcct ID: 111122223333
s3-role
{ "Statement": [{
"Effect": "Allow","Action": “s3:*","Resource": "*"
}]
}
My AWS AccountAcct ID: 123456789012
Jeff 엑세스키 인증
S3-role 을 통해 임시 접근key를 획득
할당 받은 임시 key 를 통해S3 에 접근
{ "Statement": [{"Effect": "Allow","Action": “sts:AssumeRole","Resource": "arn:aws:iam::111122223333:role/s3-role"
}]
}
{ "Statement": [{"Effect":"Allow","Principal":{"AWS":"arn:aws:iam::123456789012:root"},"Action":"sts:AssumeRole"
}]
}
IAM role 을 사용하여 다른 account 에 접근 하는 동작
S3-role 에 접근하는 다른 계정의 account id 를 설정계정 B의 s3-role 접근을 허용하는 정책을 Jeff 에 할당
Jeff (IAM User)
s3-role 에 부여되는 정책
STS
Assumed-Role Session – Code Samplepublic static Credentials getAssumeRoleSession(String AccessKey, String SecretKey )
{
Credentials sessionCredentials;
AmazonSecurityTokenServiceClient client = new AmazonSecurityTokenServiceClient(
Accesskey, GetSecretkey,
new AmazonSecurityTokenServiceConfig());
// Store the attributes and request a new AssumeRole session (temporary security credentials)
AssumeRoleRequest request = new AssumeRoleRequest
{
DurationSeconds = 3600,
RoleArn = "arn:aws:iam::111122223333:role/s3-role",
RoleSessionName = "S3BucketBrowser"
};
AssumeRoleResponse startSessionResponse = client.AssumeRole(request);
if (startSessionResponse != null) // Check for valid security credentials or null
{
AssumeRoleResult startSessionResult = startSessionResponse.AssumeRoleResult;
sessionCredentials = startSessionResult.Credentials;
return sessionCredentials;
}
else
{
throw new Exception("S3 Browser :: Error in retrieving temporary security creds, received NULL");
}
}
서로 다른 Account 접근의 제어를 위한 MFA 설정
• AWS 계정간의 접근을 위해 MFA 설정을 추가 하는 기능
• AWS 의 관리 콘솔에서 role 을 생성시 require MFA 의 체크 박스를 사용 하는 것으로설정 가능
• MFA 인증 된 사용자만 인정 정보를 받을 수 있음– AssumeRole
– GetSessionToken{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"AWS": "Parent-Account-ID"},"Action": "sts:AssumeRole","Condition": {"Null": {"aws:MultiFactorAuthAge": false}}
}]
}
http://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html
Agenda
• IAM overview
• IAM policy
• IAM role
• AWS Security Token Service
• 정리
AWS Security Token Service(STS)
• 일시적으로 사용할 token 을 발급해 주는 서비스
• 동적으로 IAM 정책이 적용된 사용자를 생성– STS는 사용자 수의 제한이 없음
• IAM Role for EC2 서비스가 STS를 이용– Assume Role
Temporary Security Credentials
• AWS에 대한 임시 인증 정보를 생성하는 방법– 만료 시간이 정해진 인증 정보 (인증 token)
• 사용자에게 다음 3가지의 key 를 발급 엑세스 키 ID(ASIAJTNDEWXXXXXXX)
비밀 엑세스 키 (HQUdrMFbMpOHJ3d+Y49SOXXXXXXX)
세션 토큰(AQoDYXdzEHQakAOAEHxwpf/ozF73gmp9vZDWDPkgFnzwSG/3ztBw9Z4IUslNNn503+3SeN0nwI3wcdLR8y8Ulv9cnksMrBGjRVrJl2xg+/CRnI9nJ1tteHp6yso3sP0BVvnxLpNwyIUpHrcTHt+8v2P6Y9/VX2zl8Hc/cy6La0r1/GuiHb9NEwqt6VIgjPWCZzHXzX8XsUObKhMnAUkY2IdTMrNKXcqVk8VbC6BNTqWsMIIfQPz9fDjKK1ifAFmHVSWvUxio94n+ebXXpy1NuHnt5JEGV34VPLMsrpZ86b+eulKNE1suoQ8TM5E1O66rYwizkq6w+cJovUnMxg6ESASBvolsrEioLiP+SE7cX1i8gRrSG9/KT59GYTlhTzStjjFroCAqZu4KYplGUMCDl1g0twrdXeymsu3GG70Qwu0wSi3WjkW8VPiajahJXCEgp6gIgXElwkrBO01H5Y9NNDEyQaq8ocOGBPVRu+DS9LMs9SHASXimnnVeIN+1FVkXXXXXXXXXXXXXXXXXXXXXXXX)
인증 정보를 획득하는 방법
• Self-sessions (GetSessionToken)
• Federated sessions (GetFederationToken)
• Assumed-role sessions • AssumeRole• AssumeRoleWithWebIdentity• AssumeRoleWithSAML
Session
Access Key Id
Secret Access Key
Expiration
Session Token
Temporary Security
Credentials
인증 정보 취득을 위한 API
STS에서 사용할 수 있는 API Action
概要
GetSessionToken IAM 사용자의 임시 접근 권한을 취득하기 위한 API
GetFederationToken 인증을 받은 Federated 사용자의 temporary security credentials을 얻기 위한 API
AssumeRole 기존 IAM 사용자의 인증 정보를 사용하여 IAM Role 의temporary security credentials을 획득하기 위한 API
AssumeRoleWithWebIdentity Amazon, Facebook, Google 의 인증정보를 사용하여temporary security credentials 을 획득하기 위한 API
AssumeRoleWithSAML idP 인증 및 SAML을 AWS 와 연동하여 temporary security credentials 를 획득하기 위한 API
http://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html
인증 정보의 유효기간
• 토큰의 유형에 따라 유효 기간은 다양 [Min/Max/Default]• Self (Account) [15 min / 60 min / 60 min]• Self (IAM User) [15 min / 36 hrs / 12 hrs]• Federated [15 min / 36 hrs / 12 hrs]• Assumed-role [15 min / 60 min / 60 min]
• 이미 발행된 티켓은 연장 또는 단축 불가
• 즉시 권한 제어가 필요한 경우 티켓 발행에 사용한 IAM 사용자 및 IAM role 의 권한을 변경
Session
Access Key Id
Secret Access Key
Expiration
Session Token
IAM 사용자AWS Account’sAccess Key ID
Temporary Security
Credentials
호텔에 비유 한다면
AWS 계정
IAM사용자
Temporary Security
Credentials
IAM의 권한 계층
Permissions Example
모든 조작이 가능 Action: *Effect: AllowResource: *(implicit)
사용자 또는 그룹에 권한을할당
Action: [‘s3:*’, ‘sts:Get*’]Effect: AllowResource: *
Token 생성시에 결정 Action: [ ‘s3:Get*’ ]Effect: AllowResource: ‘arn:aws:s3:::mybucket/*’
Identity Federation(ID연계)
• 기업・조직의 인증 기능과 AWS 인증을 연동
• 예를 들어, LDAP 으로 인증된 사용자에게 S3 권한을할당
• 인증된 사용자에 대해 Temporary Security Credentials을 발행
대표적인 사용 사례
• 임시 권한 양도– 일시적으로 S3 에 업로드 할 수 있는 응용 프로그램
– 일시적으로 EC2 인스턴스를 시작할 수 있는 구성
• 조직 사용자별 접근 제어– 사용자별로 사용 가능한 S3 버켓 생성
• 모든 사용자별 IAM 사용자를 만들 필요 없음
– 조직 그룹과 연동하여 접근 제어
• 모바일 응용 프로그램– 서비스에 로그인한 모바일 앱 사용자별로 임시 인증 정보 생성
– 모바일 앱에서 S3에 직접 업로드
– 유효 기간
– 수천, 수만의 사용자 워크로드를 처리 가능
사용 사례 : API Federation 을 통한 S3 접근(Sample - http://aws.amazon.com/code/1288653099190193)
• Identity provider– Windows Active Directory
– AD 그룹 구성원에 권한 부여
• AWS API (S3*)에 대한 접근 권한을 부여
• GetFederationToken API 사용
5
• Access Key• Secret Key• Session Token
Get Federation TokenResponse
AWS API Federation
Customer (Identity Provider) AWS Cloud (Relying Party)
AWS Resources
User Application
Active Directory
Federation Proxy
4Get FederationToken Request
3
2
S3 Bucket with Objects
Amazon DynamoD
B
Amazon EC2
인증 정보요청
1
인증 정보수신
6
APP
Federation Proxy
• GetFederationTokenRequest()에서는Proxy 에서 IAM 사용자 인증 정보를 사용
• 해당 IAM 사용자의 권한은 Federation 사용자의 권한을 커버 해야 함
• Proxy는 할당된 자격 증명을 안전하게보호할 필요가 있음
AWS API호출
7
http://aws.typepad.com/aws_japan/2011/08/aws-identity-and-access-management-now-with-identity-federation.html
사용 사례 : Console Federation(Sample - http://aws.amazon.com/code/4001165270590826)
• Identity provider– Windows Active Directory
– AD 그룹 구성원에 따라 권한을 부여
– AD 그룹에 따라 IAM role 선택
• AWS 관리 콘솔에 SSO
• AssumeRole API 사용
Console Federation
Customer (IdP) AWS Cloud (Relying Party)
AWS Management
Console
Browser interface
Corporate directory
Federation proxy
1 URL에 접근
3
2
콘솔 redirection
10
로그인 URL 생성9
4 List RolesRequest
8Assume Role Response
Temp Credentials• Access Key• Secret Key• Session Token
7 AssumeRole Request
role 선택Combo box
생성
6
Federation proxy
• AssumeRoleRequest()의 호출을 위해Proxy 에서 IAM 사용자의 인증 정보를요청
• IAM 사용자의 권한은 ListRoles 의assume role 수행이 필요
• Proxy는 인증정보를 안전하게 보관할필요가 있음
5List RolesResponse
SAML 2.0 을 사용한 SSO Federation
• Security Token Service (STS)가 Security Assertion Markup Language(SAML)지원을 시작
• AWS 리소스 접근에 기존의 ID 관리 소프트웨어의 사용이 가능
• AWS 관리 콘솔의 SSO 에도 사용 가능
• 새로운 assumeRoleWithSAML API에 의해 federation 이 가능
New 2013/11/11
SAML을 사용한 Console Federation
Enterprise (Identity Provider) AWS (Service Provider)
AWS Sign-in
Browser interface
Corporate identity
store
Identityprovider
1내부용 포털 접근포털은 IdP 역할
2 인증 요청 응답
5AWS 관리 콘솔
redirection
3
새로운 AWS login 엔드포인트에 SAML 정보를
통해 인증
4
http://aws.typepad.com/aws_japan/2013/11/aws-identity-and-access-management-using-saml.html
사용 사례 : Web Identity Federation
• AssumeRoleWithWebIdentity 의 이용– 소셜 서비스 인증을 이용하여 AWS 접근을 제어하는 서비스
• 소셜 서비스 인증을 확인하는 서버가 필요 없음– 예를 들어, 스마트폰 앱에서 S3에 파일을 로그인 하는 서비스를 만들 수 있음
• 현재 Google,Facebook,Amazon(Login with Amazon)을 지원
• IAM Role 을 사용
Web Identity Federation
AWS Cloud
US-E
AST-1
EU
-WEST-1
AP-S
OU
TH
EAST-1AWS Services
Amazon DynamoDB
S3
사용자 인증1
6
7
IAM
EC2 Instances
Token 검증4
Web identityProvider
3
5정책확인
Id Token획득
2
Mobile App
http://aws.typepad.com/aws_japan/2013/05/aws-iam-now-supports-amazon-facebook-and-google-identity-federation.html
STS 지원 서비스
2014/06 기준
AWS Products
AWS Billing and Cost Management Yes
Amazon AppStream Yes
Auto Scaling Yes
AWS CloudFormation Yes
Amazon CloudFront Yes
AWS CloudHSM No
Amazon CloudSearch Yes
AWS CloudTrail Yes
Amazon CloudWatch Yes
AWS Data Pipeline Yes
AWS Direct Connect Yes
Amazon DynamoDB Yes
AWS Elastic Beanstalk No
Amazon Elastic Compute Cloud Yes
AWS Products
Elastic Load Balancing Yes
Amazon Elastic MapReduce No
Amazon Elastic Transcoder Yes
Amazon ElastiCache Yes
Amazon Flexible Payments Service No
Amazon Fulfillment Web Service No
Amazon Glacier Yes
AWS Identity and Access Management Yes
AWS Import/Export Yes
Amazon Kinesis Yes
AWS Marketplace Yes
AWS Marketplace Management Portal No
Amazon Mechanical Turk No
AWS OpsWorks Yes
AWS Products
Amazon Redshift Yes
Amazon Relational Database Service Yes
Amazon Route 53 Yes
AWS Security Token Service Yes
Amazon Simple Email Service Yes
Amazon Simple Notification Service Yes
Amazon Simple Queue Service Yes
Amazon Simple Storage Service Yes
Amazon Simple Workflow Service Yes
Amazon SimpleDB Yes
AWS Storage Gateway Yes
AWS Support Yes
Amazon Virtual Private Cloud Yes
Amazon WorkSpaces No
http://docs.aws.amazon.com/STS/latest/UsingSTS/UsingTokens.html
Federation/SSO 제공하는 파트너 솔루션
http://www.xceedium.com/xsuite/xsuite-for-amazon-web-services http://www.okta.com/aws/ http://www.symplified.com/solutions/single-sign-on-sso https://www.pingidentity.com/products/pingfederate/http://www.cloudberrylab.com/ad-bridge.aspx
http://aws.amazon.com/jp/iam/partners/
Agenda
• IAM overview
• IAM policy
• IAM role
• AWS Security Token Service
• 정리
IAM 모범 사용 사례 (1)
각 사용자에 대해 별도의 IAM 사용자를 생성
권한 관리는 사용자가 아닌 그룹에 할당
최소 권한 부여의 원칙
높은 복잡도의 암호 정책
권한이 있는 IAM 사용자 계정은 MFA 사용
IAM 모범 사용 사례 (2)
EC2 인스턴스에서는 IAM Role 을 사용
권한의 공유는 IAM Role 을 사용
인증 정보는 정기적으로 업데이트
Condition 을 사용하여 접근 권한에 대한 세부 조건을 지정
AWS root 계정은 최대한 사용을 자제
정리
• IAM 을 사용하여 보다 안전하게 AWS 서비스의 사용– 보안 구성 및 권한 제어를 통해 운영에 대한 실수도 미연에 방지
• STS를 활용하면 AWS 서비스를 모바일에서 백엔드로 사용하는 것도가능– 서버 비용 절감 가능
• IAM 자체에는 별도의 비용이 부과되지 않음
참고 자료
• IAM 제품 소개– http://aws.amazon.com/ko/documentation/iam/
• IAM 베스트 프랙티스– http://docs.aws.amazon.com/IAM/latest/UserGuide/IAMBestPractices.html
• AWS Security Blog– http://blogs.aws.amazon.com/security/
감사합니다.