반응형

 

이번 포스팅에서는 이전 포스팅에서 다루어보았던 권한 정책 부여 방식에 따라, 서비스를 사용하기 위해서 자격 증명을 통해 인증하는 방법을 살펴보려고 한다.

 


영구적 정책 부여 vs 임시 정책 부여

 

1. 역할(Role)을 활용한 임시 정책 부여 

  • 임시 자격 증명 (Access Key, Secret Key, Session Token)를 통해 정책 부여
  • 만료 시간이 정해져 있어 자격 증명이 자동으로 폐기된다. 
  • 단기간 작업, 다른 계정이나 서비스의 접근 제어, 보안이 중요한 환경(자격 증명이 탈취되더라도 만료됨)에서 사용

2. IAM 사용자, 그룹, 리소스에 직접 영구적인 정책을 부여

  • 장기 자격 증명 (Access Key, Secret Key)을 통해 정책 부여
  • 정책은 명시적으로 제거하거나 수정하지 않는 한 계속 유효하다.
  • IAM 사용자 및 그룹 기반의 접근제어, 지속적인 장기적 권한이 필요한 경우에서 사용.
  • 보안상의 이유로 가능한 임시 자격 증명 방식을 권장.

 

https://sjh9708.tistory.com/246

 

[AWS] IAM : 사용자 및 권한 정책 관리 기초 (그룹, 역할)

이번 포스팅에서는 계정 및 사용자를 관리하기 위한 IAM의 기본적인 개념 및 활용법에 대해서 살펴보려고 한다.  계정(Account)와 사용자(User)   AWS에서 계정과 사용자의 용어는 구분된다. 계정

sjh9708.tistory.com

 

 

 


AWS 서비스 접근 방식 : 영구 자격 증명

 

AWS 웹 콘솔

웹 기반 사용자 인터페이스로, 브라우저를 통해 AWS 서비스에 접근하고 관리하는 방식.

  • 웹 기반의 콘솔에 로그인하여 AWS 사용.
  • 콘솔 엑세스 자격 증명(아이디/비밀번호, MFA 설정 등) 을 사용하여 인증

 

프로그래밍 엑세스 방식

프로그래밍 방식으로 AWS 리소스에 접근하고 관리할 수 있는 방식.

  • CLI : 명령줄 기반 AWS 서비스를 관리하는 통합 도구
  • SDK : 다양한 프로그래밍 언어로 만들어진 AWS 서비스 관리 패키지 사용
  • Access Key Pair를 통해 자격 증명
    • Access Key ID : 유저 이름에 해당하는 키, 공개되어도 무방하다.
    • Secret Access Key : 패스워드에 해당하는 키. 비밀키로서 관리된다. 유출되지 않도록 주의.
  • 프로파일 가능 : 자격증명의 단위. 서로 다른 자격 증명에 이름을 부여하여 스위칭하여 사용.

 

 


IAM 사용자의 Access Key Pair 생성하기

 


 

 

 

 


장기 자격 증명 방식 인증

 

1. 초기 EC2 인스턴스에서 IAM User List를 조회하는 것에 대한 접근 권한이 없음.

 

 


2. Access Key Pair를 통한 자격 증명

 

 


3. 인증받은 사용자의 권한 정책에 의해 IAM User List 조회 권한 획득.

 

 


프로파일링

 

  • AWS CLI에서 사용하는 인증 정보와 기본 설정의 저장 단위
  • 여러 AWS 계정을 사용하는 경우 각 계정에 대해 별도의 프로파일을 생성할 수 있다.
  • 프로파일은 인증 정보 파일(~/.aws/credentials)과 구성 파일(~/.aws/config)에 저장된다

 

 


1. Access Key Pair를 기반으로 프로파일을 생성할 수 있다.

aws configure --profile PROFILE_NAME

 

 


2. 생성된 프로파일 조회

aws configure list-profiles

 

 

 

 


3. 프로파일의 권한을 사용하여 IAM 사용자 정보 조회하기.

 

 

 

 


SDK 기반으로 장기 자격 증명하기

 

Node.js에서 SDK를 활용하여 장기 자격 증명 이후 서비스 사용.

const { IAMClient, ListUsersCommand, ListRolesCommand } = require("@aws-sdk/client-iam"); // AWS SDK : IAM 클라이언트 모듈 사용

async function runTest() {
    const client = new IAMClient({
        region: "ap-northeast-2", // 리전 
        credentials: {
            accessKeyId: "AKIAW5WU5KLTW4Q5JB7Y", // 액세스 키 ID
            secretAccessKey: YOUR_SECRET_KEY, // 액세스 키 Secret
        }
    });

    try {
        const dataUser = await client.send(new ListUsersCommand({}));   // 사용자 출력
        dataUser.Users.forEach((element) => {
            console.log(element.UserName); 
        });
    } catch (error) {
        console.error(error); 
    }
}

runTest();

 

(base) sojaehwi@sojaehwiui-MacBookPro demo-aws-credential % node ./src/test.js
admin
user01
user02

 

 

 

 


AWS 서비스 접근 방식 : 임시 자격 증명

 

AWS 리소스에 접근하기 위해 일정 시간 동안만 유효한 인증 정보를 제공. 서버 간 권한 위임, 단기 작업 등을 위해 사용됨.
IAM Role과 AWS Security Token Service(STS)를 통해 발급되어 사용.

 

 

IAM Role 활용

  • 특정 AWS 리소스에 대한 권한을 부여하는 역할(Role)을 사용.
  • 역할을 통해 인증된 사용자는 해당 권한 범위 내에서 작업 가능.

AWS STS(Security Token Service)

  • STS API를 호출하여 임시 자격 증명을 발급.
  • 기본 구성 요소
    • Access Key ID: 임시로 발급된 사용자 식별자.
    • Secret Access Key: 임시로 발급된 비밀키.
    • Session Token: 추가적인 보안 토큰.

 

 

 


IAM 사용자의 임시 자격 증명 방식 인증 

 

1. IAM 사용자와 역할(Role)

 

 

현재 해당 IAM 사용자의 권한에는 EC2 Read 권한이 존재하지 않는다. 우리는 해당 IAM 사용자에게 EC2 Read 권한을 임시 자격 증명을 통해 부여받은 Role을 통해서 사용해보려고 한다. 

 

 


 

신뢰 관계에서 정의된 엔터티는 이 역할을 부여받아 사용할 수 있는 엔터티를 정의한다. 해당 엔터티에는 IAM 사용자를 포함한 리소스, 서비스 등 다양한 주체가 포함될 수 있다. 우리는 위의 user01 IAM 사용자를 신뢰 관계로 설정하여 해당 역할을 부여받을 수 있도록 설정하였다.

 

권한 정책에는 해당 역할을 부여받았을 때 사용할 수 있는 권한을 넣어준다. 즉, 해당 역할을 임시 자격 증명을 통해 부여받는다면 EC2 Read 권한이 생기게 되는 것이다.

 

 

 

 


 

2. STS API를 활용한 임시 자격 증명을 사용한 AWS 리소스 접근하기

 

const { STSClient, AssumeRoleCommand } = require("@aws-sdk/client-sts"); // STS 클라이언트
const { EC2Client, DescribeInstancesCommand } = require("@aws-sdk/client-ec2"); // EC2 클라이언트

async function getTemporaryCredentials() {
    const stsClient = new STSClient({ 
        region: "ap-northeast-2",
        credentials: {
            accessKeyId: "AKIAW5WU5KLTW4Q5JB7Y", // IAM User의 액세스 키 ID
            secretAccessKey: YOUR_SECRET, // IAM User의 액세스 키 Secret
        } 
    });

    try {
        const assumeRoleResponse = await stsClient.send(
            new AssumeRoleCommand({
                RoleArn: "arn:aws:iam::476114146023:role/ec2-allow", // IAM Role ARN
                RoleSessionName: "MySession", // 세션 이름 (구분될 수 있는 임의의 이름 지정)
            })
        );

        return {
        	// 해당 역할을 사용할 수 있는 임시 자격 증명 정보(Access Key, Secret, Session Token)
            accessKeyId: assumeRoleResponse.Credentials.AccessKeyId,
            secretAccessKey: assumeRoleResponse.Credentials.SecretAccessKey,
            sessionToken: assumeRoleResponse.Credentials.SessionToken,
        };
    } catch (error) {
        console.error("Error assuming role:", error);
        throw error;
    }
}

async function runTest() {
    try {
        // 임시 자격 증명 가져오기
        const credentials = await getTemporaryCredentials();

        // EC2 클라이언트 생성 (임시 자격 증명 사용)
        const client = new EC2Client({
            region: "ap-northeast-2",
            credentials: {
                accessKeyId: credentials.accessKeyId,
                secretAccessKey: credentials.secretAccessKey,
                sessionToken: credentials.sessionToken, // 세션 토큰 추가
            },
        });

        // EC2 인스턴스 리스트 가져오기
        const response = await client.send(new DescribeInstancesCommand({}));
        const instances = response.Reservations;

        instances.forEach((reservation) => {
            reservation.Instances.forEach((instance) => {
                console.log(`Instance ID: ${instance.InstanceId}, State: ${instance.State.Name}`);
            });
        });
    } catch (error) {
        console.error("Error retrieving EC2 instances:", error);
    }
}

runTest();

 

 

  • AWS STS API를 호출하여 임시 자격 증명을 요청. 신뢰 관계의 엔터티라는 것을 인증하기 위해서 IAM 사용자의 Access Key, Secret을 포함한다.
  • STS가 신뢰 관계의 엔터티임을 확인했다면, 해당 Role을 사용할 수 있는 새로운 임시 Access Key ID, Secret Access Key, 그리고 Session Token을 반환한다.
  • 반환된 임시 자격 증명을 사용하여 AWS 리소스에 접근할 수 있다.

 

 

 

 

 


EC2 인스턴스의 임시 자격 증명 방식 인증 

 

역할(Role)을 부여받을 수 있는 것은 EC2를 비롯한 여러 AWS의 서비스도 포함된다. 오히려 IAM 사용자에 임시 자격을 부여하는 방식보다 더 많이 사용되는 방식이다.

 

EC2의 경우에는 AWS의 다양한 서비스들과의 연동 시, 권한을 부여받아 사용해야 한다.

  • ex) EC2에서 S3 스토리지, RDS 데이터베이스 등을 사용해야 할 때.

 

EC2의 자격 증명 방식

1. IAM 자격 증명

  • AWS Configure를 통해 자격 증명을 파일로 등록
  • 관리가 어렵고 바꾸기 힘듬. -> 자격 증명이 갱신될 시 모든 EC2를 수동으로 변경시켜줘야 함.
  • 자격 증명이 파일로 저장되므로, 유출 시 보안 위험이 큼.

2. IAM 역할 (Role) 부여

  • 권한이 부여된 IAM 역할을 생성한 후 EC2에 부여
  • AWS에서 권장하는 방식. 관리가 쉽고 교체가 쉬움. 뛰어난 보안성
  • EC2 인스턴스는 AWS 내부적으로 제공되는 임시 자격 증명을 사용하여 안전하게 서비스에 접근 가능.
  • 자격 증명 갱신 시 Role을 변경하면 일괄적으로 자동으로 반영시킬 수 있다.

 

 


 

1. 역할 (Role) 생성하기

 

이번에는 역할을 부여할 대상이 EC2이므로, 신뢰할 수 있는 엔터티로 AWS 서비스의 EC2를 설정한다.

권한으로는 IAM Read 권한을 부여해 보았다.

 

 

 

 


2. EC2의 역할 기반 권한 부여

 

EC2 인스턴스가 IAM 역할에 설정된 권한을 사용하여 AWS 서비스에 접근할 수 있도록 설정한다.

AWS 메타데이터 서버를 통해 자동으로 갱신되는 임시 자격 증명을 사용하게 되며, 자격 증명을 관리할 필요 없이 AWS 서비스에 접근 가능해진다.

 

 

AWS 인스턴스 내부에서는 위의 사진과 같이 임시 자격 증명을 자동으로 활용해서 IAM 사용자 목록에 조회할 수 있는 권한을 사용할 수 있는 모습이다.

 

 

 

 


3. EC2 내부 Application

const { IAMClient, ListUsersCommand, ListRolesCommand } = require("@aws-sdk/client-iam"); // AWS SDK : IAM 클라이언트 모듈 사용

async function runTest() {
    const client = new IAMClient({
        region: "ap-northeast-2", // 리전 
    });

    try {
        const dataUser = await client.send(new ListUsersCommand({}));   // 사용자 출력
        console.log("사용자 목록 출력); 
        dataUser.Users.forEach((element) => {
            console.log(element.UserName); 
        });
    } catch (error) {
        console.error(error); 
    }
}

runTest();

 

EC2 내부 애플리케이션이 SDK를 통해 AWS 리소스에 접근할 때에도 별도의 Access Key Pair 없이 자동으로 임시 자격 증명을 활용하여 서비스에 접근할 수 있는 것을 볼 수 있다.

이것은 SDK가 메타데이터 서버와 자동으로 상호작용하기 때문에 자격 증명 로직을 구현할 필요가 없다.

 

 

 

 

 

 

 

 


References

 

https://docs.aws.amazon.com/

 

https://docs.aws.amazon.com/

 

docs.aws.amazon.com

 

https://www.inflearn.com/course/%EC%89%BD%EA%B2%8C-%EC%84%A4%EB%AA%85%ED%95%98%EB%8A%94-aws-%EA%B8%B0%EC%B4%88/dashboard

 

쉽게 설명하는 AWS 기초 강의 강의 | AWS 강의실 - 인프런

AWS 강의실 | AWS 여정을 시작하기 위해 가장 필요한 내용을 담았습니다., 안녕하세요. AWS 강의실입니다.AWS 공식 커뮤니티 빌더이자 2만명의 구독자를 보유한 AWS Only 강의 유튜브의 경험으로 AWS를

www.inflearn.com

 

 

 

반응형

BELATED ARTICLES

more