다루는 내용
· 아마존 IAM Role 이해하기
· AWS Service Roles 사용하기
· Cross-Account Access Roles 사용하기
· STS (Security Token Service) 사용하기
· Identity Provider Access Roles 사용하기
실습
준비
1. 소스 준비
테스트에 사용할 예제 소스를 준비한다. 예제 소스는 AWS에서 제공하는 JAVA SDK에 포함되어 있다. (http://sdk-for-java.amazonwebservices.com/latest/aws-java-sdk.zip)
여기서는 S3Sample 예제를 이용한다.
2. 라이브러리 복사
lib 디렉토리를 만들고 아래와 같이 필요한 라이브러리를 복사해 둔다.
3. 소스 보기
/root/.aws/credentials 을 참조하는 부분을 주석처리하고, s3 객체 생성시에 credential을 사용하지 않도록 수정하였다.
4. 컴파일
javac -cp .:./lib/* S3Sample.java
5. 실행
java -cp .:./lib/* S3Sample
정상적으로 컴파일되고 실행하였지만, 권한이 없다는 에러가 발생한다.
아마존 IAM Role 이해하기
AWS Identity and Access Management (IAM)은 사용자의 서비스와 리소스에 대한 액세스를 안전하게 관리하기 위해 사용한다. AWS의 서비스들을 십분 활용하기 위해 제공되는 SDK를 사용하여 인스턴스에서 각 서비스들의 리소스에 접근하여야 하는 경우가 있다. Access key와 Secret key를 지정하여 모든 권한을 가질 수 있지만, 보안적으로 바람직한 방법은 아니다. 이런 경우 IAM Role을 이용하여 필요한 권한만 부여할 수 있다.
AWS Service Roles 사용하기
AWS Service Role 생성
1. 콘솔에서 Identity & Access Management 클릭
2. 왼쪽 메뉴에서 Roles 클릭
3. Create New Role 클릭
4. Set Role Name 페이지에서
∙ Role Name : s3-role 입력
∙ Next Step 클릭
5. Select Role Type 페이지에서
∙ AWS Service Roles 선택
∙ Amazon EC2에서 Select 클릭
6. Attach Policy 페이지에서
∙ AmazonS3FullAccess 선택
∙ Next Step 클릭
7. Review 페이지에서
Trusted Entities (EC2)에서 Amazon S3에 FullAccess Policy를 가지는 Role를 생성한다.
∙ Create Role 클릭
새로운 인스턴스 생성
1. 콘솔에서 EC2 클릭
2. Launch Instance 클릭
3. Step 1: Choose an Amazon Machine Image (AMI) 페이지에서
∙ Amazon Linux AMI 선택
4. Step 2: Choose an Instance Type 페이지에서
∙ Next: Configure Instance Details 클릭
5. Step 3: Configure Instance Details 페이지에서
∙ IAM Role : s3-role 선택
∙ Review and Launch 클릭
IAM Role은 새로 생성하는 인스턴스에만 적용할 수 있다. 실행중인 인스턴스에는 적용할 수 없다.
6. Step 7: Review Instance Launch 페이지에서
∙ Launch 클릭
예제 소스 실행
1. 인스턴스 SSH 접속
2. 예제 소스 실행
access key와 secret key를 사용하지 않아도 적용된 IAM Role(s3-role)에 의해 정상 적으로 실행된다.
Cross-Account Access Roles 사용하기
Role 생성
1. 콘솔에서 Identity & Access Management 클릭
2. 왼쪽 메뉴에서 Roles 클릭
3. Create New Role 클릭
4. Set Role Name 페이지에서
∙ Role Name : cross-access-role 입력
∙ Next Step 클릭
5. Select Role Type 페이지에서
∙ Role for Cross-Account Access 선택
∙ Provide access between AWS accounts you own에서 Select 클릭
6. Establish Trust 페이지에서
∙ Account ID : 권한을 할당할 다른 계정 ID 입력 (ex. 93xxxxxxx111)
∙ Next Step 클릭
7. Attach Policy 페이지에서
∙ AmazonS3FullAccess 선택
∙ Next Step 클릭
8. Review 페이지에서
Trusted Entities가 대상 계정 ID가 되며, 내 계정의 Amazon EC2에 FullAccess Policy를 가지는 Role를 생성한다.
∙ Create Role 클릭
9. Cross-Account Access role Link 전달
∙ https://signin.aws.amazon.com/switchrole?account=cpart&roleName=cross-access-role
콘솔 로그인 (다른 계정에서)
1. 콘솔 접속
∙ 역할 전환 클릭
Role을 전달 받은 계정으로 로그인하면 EC2에 대한 권한만 가진다. 앞에서 생성한 EC2는 S3에 대한 권한을 가지고 있다.
STS (Security Token Service) 사용하기
Role 생성
임시적으로 사용 가능한 롤을 생성하여 필요한 경우에만 할당하여 사용할 수 있다. Assume Role의 경우 기본적으로 1시간 동안 사용 가능하며, 900초 ~ 3600초까지 조절 가능하다.
Assume Role
앞에서 AmazonS3FullAccess 정책을 가지는 s3-role을 생성하였다.
1. 콘솔에서 Identity & Access Management 클릭
2. 왼쪽 메뉴에서 Roles 클릭
3. s3-role 클릭
4. 화면 하단 Trust Relationships에서
∙ Edit Trust Relationship 클릭
∙ 신뢰할 수 있는 사용자 추가
∙ Update Trust Policy 클릭
ec2.amazonaws.com만 있는 경우 해당 롤을 할당 받은 인스턴스에서 롤을 사용할 수 있다. Assume Role을 만들기 위해서는 Trusted User를 추가 해주어야 한다. 이 사용자는 해당 롤을 사용할 수 있다라는 의미이므로 해당 룰의 assume role를 만들 수 있다.
5. 인스턴스 접속 (SSH)
/root/.aws/credentials에 access key와 secret key를 정의하여 aws cli를 사용할 수 있어야한다.
6. Assume Role 생성
∙ aws sts assume-role –role-arn arn:aws:iam::ID:role/ROLENAME –role-session-name “SESSIONNAME” 실행
7. 다른 인스턴스 접속 (SSH)
임시로 생성된 롤을 통해 CLI를 사용할 수 있는지 확인해야 하므로 어떠한 권한도 없는 인스턴스면 적당하다.
8. 권한 설정
∙ /root/.aws/credentials
∙ ACCESS KEY, SECRET KEY, SECURITY TOKEN 입력
9. 확인
S3 버킷 리스트 보기 (aws s3 ls)
Identity Provider Access Roles 사용하기
Identity Provider Access Role 중에서 모바일 어플리케이션에 많이 사용되는 web identity providers를 이해한다. 실습 범위를 넘어 가는 부분이 있어 이해에 도움이 될 도구를 소개한다.
https://web-identity-federation-playground.s3.amazonaws.com/index.html
AWS에서 제공하는 도구이다.
1. Step 1 – Authenticate with Identity Provider
∙ Facebook 선택
∙ Facebook Sing in
∙ Facebook API를 통해 Facebook의 accessToken을 받는다.
∙ Proceed to Step 2 클릭
2. Step 2 – Obtain Temporary Security Credentials
∙ Call AssumeRoleWithWebIdentity 클릭
∙ facebook의 accessToken으로 AWS STS에 AssumeRoleWithWebIdentity을 요청한다.
∙ Proceed to Step 3 클릭
3. Step 3 – Access AWS Resource
∙ 생성된 AssumeRoleWithWebIdentity의 access key, secret key, session token으로 Action을 수행한다.
참고
- http://docs.aws.amazon.com/IAM/latest/UserGuide/roles-walkthrough-crossacct.html
- http://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html
- http://docs.aws.amazon.com/STS/latest/UsingSTS/web-identity-federation.html
- https://developers.facebook.com/docs/facebook-login/v2.3