[AWS] Instance Profile을 이용한 접근 제어
제목만 또 거창하다. aws 를 사용하면서 ec2 에서 s3 등에 접근할 때는 보통 access_key 정보를 사용하게 되는데.. 이게 소스 상에 기록되어 있다보면 보안상 그렇게 좋은 것은 아니기 때문에 최근에 Instance Profile 를 사용해서 ec2 에서 s3 등의 다른 서비스에 접속할 때 권한제어를 할 수 있다는 것을 알게 되서 실제로 가능한지 테스트 해보게 됐다. 작업은 aws cli 를 이용해서 진행했다.
우선 ec2 에 적용할 역할(role)을 create-role
명령을 사용하여 아래와 같이 생성한다. 파일 이름은 ec2-role.json
으로 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "Service": "ec2.amazonaws.com"},
"Action": "sts:AssumeRole"
}
]
}
aws iam create-role --role-name ec2-role --assume-role-policy-document file://ec2-role.json
이제 s3 접근 제어를 위한 정책(policy) 을 아래와 같이 생성한다. 파일 이름은 ec2-policy.json
으로 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": "*"
}
]
}
이제 put-role-policy
명령을 사용하 이 정책을 역할에 아래와 같이 연결한다.
aws iam put-role-policy --role-name ec2-role --policy-name ec2-role-policy --policy-document file://ec2-policy.json
create-instance-profile
명령을 사용하여 Instance Profile 을 생성한다.
aws iam create-instance-profile --instance-profile-name ec2-profile
add-role-to-instance-profile
명령을 사용해 Instance Profile 에 ec2 역할을 추가한다.
aws iam add-role-to-instance-profile --instance-profile-name ec2-profile --role-name ec2-role
이제 추가된 Instance Profile 을 이용해 ec2 인스턴스를 새로 생성한다. 기존 ec2 인스턴스에 인스턴스 프로파일을 추가할 수도 있다. 그런 후 아래와 같은 SDK를 사용하는 코드를 사용해 s3 접근을 체크한다. 코드에는 s3 접근을 위한 access_key 정보는 추가하지 않았다. SDK 자체적으로 ec2 인스턴스의 인스턴스 프로파일을 이용해 해당 정보를 처리해서 접근할 수 있는 것으로예상된다.
<?php
require_once __DIR__.'/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Exception\AwsException;
$s3Client = new S3Client([
'region' => 'ap-northeast-2',
'version' => 'latest'
]);
$buckets = $s3Client->listBuckets();
foreach ($buckets['Buckets'] as $bucket) {
echo $bucket['Name'] . "\n";
}
이상이 없다면 s3 버킷 리스트가 출력될 것이다. SDK 사용법은 AWS 문서를 참고한다.
<참고자료>