And Brain said,
AWS로 배우는 IAM, 넌 지나갈 수 없다. (+Spring boot 연동 예제) 본문
AWS에서 보안은 가장 중요한 요소 중 하나이며, 그 중심에는 IAM(Identity and Access Management)이 있습니다. IAM을 제대로 이해하지 못하면 보안 사고로 인해 서비스가 중단되거나 데이터가 유출될 수 있습니다. 이번 가이드에서는 IAM의 개념부터 실전 활용법까지 알아보도록 하겠습니다.
1. IAM ?
1.1 IAM 개념
IAM(Identity and Access Management)은 AWS 리소스에 대한 인증(Authentication)과 권한 부여(Authorization)를 관리하는 서비스로, IAM을 사용하면 AWS 리소스에 대한 접근을 세밀하게 제어할 수 있는데, 각각 개별 사용자(User), 그룹(Group), 역할(Role), 정책(Policy)을 통해 권한을 유연하게 관리할 수 있습니다. 또한, 다중 인증(MFA), 조건부 액세스(Condition), IAM 정책을 활용해 보안성을 극대화할 수 있다.
2. IAM 사용자, 그룹, 역할(Role)의 차이
2.1 IAM 사용자(User)
- IAM 사용자는 AWS 계정에 로그인하여 작업을 수행하는 개별 엔티티입니다.
- 사용자에게 직접 권한을 할당할 수 있지만, 일반적으로 그룹을 활용하여 권한을 관리하는 것이 권장됩니다.
- 각 사용자에게는 고유한 로그인 자격 증명(Access Key, Secret Key)이 부여됩니다.
예시: developer-user에게 EC2 및 S3 접근 권한 부여 가능.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"s3:*"
],
"Resource": "*"
}
]
}
2.2 IAM 그룹(Group)
- IAM 그룹은 여러 IAM 사용자들을 하나의 그룹으로 묶어 공통된 권한을 부여할 수 있습니다.
- 사용자가 개별적으로 권한을 가지지 않고 그룹에 속하는 모든 사용자가 동일한 권한을 상속받게 됩니다.
- 변경이 있을 경우 그룹의 정책만 수정하면 되므로 관리가 용이합니다.
예시: developers 그룹을 만들고, 모든 개발자에게 EC2, Lambda 접근 권한을 부여.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:*",
"lambda:*"
],
"Resource": "*"
}
]
}
2.3 IAM 역할(Role)
- IAM 역할(Role)은 특정 사용자나 서비스에 일시적으로 권한을 부여하는 방식입니다.
- 사용자와 달리 Role은 Access Key, Secret Key를 직접 보유하지 않고, 신뢰할 수 있는 주체(Trusted Entity)에 의해 AssumeRole 방식으로 권한을 위임하게 됩니다.
- EC2, Lambda, ECS 같은 서비스에서 권한을 부여할 때 자주 사용됩니다.
예시: 특정 EC2 인스턴스에만 S3에 대한 접근 권한을 부여하는 Role.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
3. IAM 보안 강화
3.1 MFA(다중 인증) 설정
IAM 사용자 계정이 유출될 경우 추가적인 보안 장치로 MFA(Multi-Factor Authentication)를 설정하기도 하는데, MFA 적용 방법은 아래와 같습니다.
- AWS 콘솔에서 IAM -> 사용자 선택 -> 보안 자격 증명(Security Credentials) 탭 이동.
- MFA 디바이스 추가 버튼 클릭.
- 가상 MFA 디바이스 선택 후 Google Authenticator, Authy 같은 앱과 연결.
- MFA 코드 입력 후 활성화.
MFA가 활성화되면 사용자는 로그인 시 비밀번호 + MFA 코드 입력이 필요함.
3.2 최소 권한 원칙(Least Privilege) 적용하기
- 사용자 및 역할에 필요한 최소한의 권한만 부여해야 한다.
- AdministratorAccess 같은 광범위한 권한 대신 특정 서비스만 사용할 수 있도록 세밀한 정책 적용이 필요함.
- AWS 정책 시뮬레이터(AWS Policy Simulator)를 활용해 적용된 정책이 의도대로 동작하는지 검증 가능.
최소 권한 예시: 특정 S3 버킷(my-secure-bucket)에 대한 읽기 전용 접근 권한만 부여.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-secure-bucket",
"arn:aws:s3:::my-secure-bucket/*"
]
}
]
}
4. IAM Role 생성 및 EC2에 할당하기
1. IAM Role 생성
- AWS IAM 콘솔 이동 → IAM Roles
- 역할(Role) 생성 클릭
- AWS 서비스 → EC2 선택
- 권한 정책 선택 → AmazonS3FullAccess 추가 (또는 필요한 S3 권한만 부여)
- Role 이름 입력 후 생성 (예: EC2-S3-Access)
2. EC2 인스턴스에 IAM Role 할당
- AWS EC2 콘솔 이동 → 실행 중인 인스턴스 선택
- "작업 → 인스턴스 설정 → IAM 역할 수정" 클릭
- IAM Role을 EC2-S3-Access로 변경
이제 해당 EC2 인스턴스는 IAM Role을 통해 AWS API에 접근할 수 있습니다.
5. Spring Boot에서 IAM Role을 통한 S3 연동
Spring Boot에서 AWS SDK를 사용하여 IAM Role을 자동으로 가져와 S3를 사용할 수 있습니다.
1. AWS SDK 의존성 추가
<!-- Maven -->
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.29.38</version>
</dependency>
<!-- Gradle -->
implementation 'software.amazon.awssdk:s3:2.29.38'
2. S3Config.java 설정
IAM Role을 자동으로 가져오는 InstanceProfileCredentialsProvider를 설정합니다.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
@Configuration
public class S3Config {
@Value("${spring.aws.region:ap-northeast-2}")
private String region;
@Value("${spring.aws.credentials.access-key:}")
private String accessKey;
@Value("${spring.aws.credentials.secret-key:}")
private String secretKey;
// 로컬 환경: Access Key와 Secret Key로 S3 클라이언트 생성
@Profile("local")
@Bean
public S3Client localS3Client() {
if (accessKey.isBlank() || secretKey.isBlank()) {
throw new IllegalArgumentException("Access Key와 Secret Key가 로컬 환경에서 필요합니다.");
}
return S3Client.builder()
.region(Region.of(region))
.credentialsProvider(
StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey))
)
.build();
}
// Dev/Prod 환경: IAM 역할 기반 S3 클라이언트 생성
@Profile({"dev", "prod"})
@Bean
public S3Client devProdS3Client() {
return S3Client.builder()
.region(Region.of(region))
.credentialsProvider(InstanceProfileCredentialsProvider.create())
.build();
}
}
위와같이 Spring boot 프로젝트 내에서 Config를 만들어줍니다. 로컬 테스트 환경에서는 AWS 키를 이용했지만, 실제 배포 환경에서는 IAM Role이 적용된 EC2에서 실행하면 자동으로 인증이 이루어집니다. 이렇게 되면 별도의 Access Key, Secret Key 없이 안전하게 AWS 접근 가능해집니다.
6. S3 파일 업로드 및 다운로드 예제
1. 파일 업로드
import org.springframework.stereotype.Service;
import software.amazon.awssdk.core.sync.RequestBody;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import java.nio.file.Paths;
@Service
public class S3Service {
private final S3Client s3Client;
public S3Service(S3Client s3Client) {
this.s3Client = s3Client;
}
public void uploadFile(String bucketName, String filePath, String keyName) {
s3Client.putObject(PutObjectRequest.builder()
.bucket(bucketName)
.key(keyName)
.build(),
RequestBody.fromFile(Paths.get(filePath)));
}
}
2. 파일 다운로드
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
import java.nio.file.Paths;
public void downloadFile(String bucketName, String keyName, String downloadPath) {
s3Client.getObject(GetObjectRequest.builder()
.bucket(bucketName)
.key(keyName)
.build(),
Paths.get(downloadPath));
}
7. 동작 원리
IAM Role을 부여받은 EC2는 AWS의 Instance Metadata Service (IMDS)를 통해 자동으로 인증 정보를 가져옵니다.
1. IAM Role 확인하기
EC2 내부에서 실행하면 현재 인스턴스에 할당된 IAM Role을 확인할 수 있습니다.
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/
→ 할당된 IAM Role 이름이 반환됨
2. IAM Role을 통해 AWS STS 토큰(임시 자격 증명) 가져오기
IAM Role을 사용하면 AWS SDK가 자동으로 IMDS를 호출하여 임시 자격 증명을 가져옵니다.
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/{ROLE_NAME}
이 요청을 수행하면 AWS는 JSON 형식의 Access Key, Secret Key, Session Token을 반환합니다.
예제 응답:
{
"Code": "Success",
"LastUpdated": "2025-02-06T12:34:56Z",
"Type": "AWS-HMAC",
"AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
"SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"Token": "IQoJb3JpZ2luX2VjEAMaCXVzLXdlc3QtMiJHMEUCIQDmXZ...",
"Expiration": "2025-02-06T18:34:56Z"
}
AWS SDK는 이 토큰을 자동으로 사용하여 AWS 리소스에 접근합니다.
8. 정리
Spring Boot에서 IAM Role을 사용하면?
- Access Key / Secret Key를 직접 관리할 필요 없음 → 보안 강화
- IAM Role을 통해 자동으로 인증 정보 가져오기 → 설정 간소화
- AWS SDK가 자동으로 EC2의 IAM Role을 감지하여 S3 접근 가능
AWS IAM은 단순한 계정 관리 서비스가 아니라, AWS 보안의 핵심 요소로, IAM을 올바르게 사용하면 AWS 리소스에 대한 세밀한 접근 제어가 가능하며, 보안 사고를 미연에 방지할 수 있습니다.
'IT > 보안' 카테고리의 다른 글
전자금융기반시설 보안 취약점 평가 가이드 - Linux 서버(SRV-001~070) - [1] (0) | 2025.02.20 |
---|---|
Nessus, 사이버 보안 탐정의 수사 노트 (1) | 2025.02.18 |
버퍼 오버플로우(Buffer Overflow) 공격, 원리와 그 방어 (1) | 2025.02.11 |
NFS(Network File System)의 개념과 보안문제 (0) | 2025.02.11 |
DoS/DDoS(Denial of Service) 공격, 원리와 그 방어 (0) | 2025.02.10 |