728x90
반응형

plain text 형태로 S3에 업로드한 자료들이 맘에 걸려서 bucket에 올린 자료들을 모두 암호화 하기로 결정했습니다. 

 

여러 복잡한 절차들이 있을 줄 알았는데 생각보다 큰 불편함없이 마무리 할 수 있어서 좋긴 한데, 뭔가 하다 만 느낌이라 걱정이 싹 가시진 않네요. 

 

기존에 자료를 업로드 하는 app과 자료를 읽는 app 모두에서 별다른 조치를 할 필요는 없었습니다. 

 

IAM에 설정된 사용자에 정책을 추가하는 것과 Bucket에 암호화 설정하기. 그리고 기존 데이터 암호화하기로 모든 작업이 끝나네요. 이 설정이 편한게 데이터 암호화를 클라이언트가 직접 하는게 아닌 server side encryption이라 별로 손 댈게 없어서 좋았습니다. put, get 시 별도 하는게 없어 암호화 되었는지 아닌지를 체감하지 애매하지만요.

 

Bucket에 기본 암호화 설정하기

 

일단 Bucket 설정에서 기본 암호화 설정을 해보겠습니다. 

 

암호화 하려는 버킷의 설정에서 기본 암호화를 선택하면 좌측과 같은 메뉴가 활성화 됩니다. 저는 AES-256을 선택하겠습니다. 

 

이 경우 기존에 업로드된 파일이 암호화 되지는 않고, 새로 업로드되는 자료들만 암호화됩니다. 

 

아래에서 기존 파일들을 암호화 하는 과정을 확인할 수 있습니다.

 

 

 

 

AES-256을 설정하면 좌측과 같은 화면을 확인할 수 있습니다. 

 

"권한" -> "버킷 정책" 중 "Action" 중 업로드 시 암호화된 혹은 암호화 하지 않은 파일에 대한 정책이 별도로 있을 경우 거부될 수 있다는 메세지가 있습니다. 기존에 설정된 내용이 없다면 무시하고 넘어가도 됩니다.

 

AES-256에 대한 공식 문서에는 다음과 같이 설명되어 있습니다. "서버측 암호화를 통해 유휴 데이터를 보호합니다. Amazon S3는 고유한 키로 각 객체를 암호화합니다. 또한 추가 보안 조치로 주기적으로 바뀌는 마스터 키를 사용하여 키 자체를 암호화합니다. Amazon S3 서버 측 암호화는 가장 강력한 블록 암호 중 하나인 256비트 고급 암호화 표준(AES-256)을 사용하여 데이터를 암호화합니다." (링크)

 

 

 

이 설정을 하지 않고 원하는 객체만 암호화 하려면 putObject 시 ServerSidEncryption옵션을 지정하여 암호화 요청을 할 수 있습니다. NodeJS의 샘플 코드로 예를 들어보겠습니다. 

    const AWS = require('aws-sdk');
        .
    .
    this.s3 = new AWS.S3();
    .
    .
	this.s3.putObject({Bucket:'your_bucket_name', Key:'your_key', 
    	Body:your_data, ServerSideEncryption: 'AES256', function(err,data){
			if(err){
				console.log('s3 put : ' + err);
			}
			else{
				console.log('Successfully uploaded!');
			}
		});
        
      .
      .

 

IAM 계정에 권한 설정 하기

 

이런 암호화 처리를 위해서는 접근하는 IAM 계정에 권한이 필요합니다. 

 

IAM에서 S3에 PUT, GET을 처리하는 계정에 연결권 정책의 Action에 aes:Decrypt와 aes:Encrypt를 추가해야 합니다. 

 

적용된 샘플은 아래와 같습니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1540362430000",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "aes:Decrypt",
                "aes:Encrypt"
            ],
            "Resource": [
                "arn:aws:s3:::your_bucket_name"
            ]
        }
    ]
}

 

버킷의 기존 파일들 암호화 하기

 

이제 버킷에 있던 기존 파일들의 암호화를 변경해 보겠습니다. 

 

해당 버킷에서 암호화할 폴더 혹은 파일을 선택 후 "작업" -> "암호화 변경"을 선택합니다. 

 

그리고 AES-256을 선택 후 저장을 선택하면 선택된 객체 모두 암호화를 진행합니다. 암호화된 객체를 다운로드하면 복호화 하여 다운로드 하기 때문에 암호화 된 상태인지 확인할 수 없습니다. 암호화된 객체를 선택하여 개요 부분을 확인하면 아래와 같이 적용된 부분을 확인할 수 있습니다.

 

(* 서버 측 암호화 적용 결과)

 

KMS를 선택하면 원하는 키를 선택할 수 있습니다만.. 키 관리하고 https로만 처리되어야 하는 여러 번거로움 때문에 사용하지는 않았습니다. 

 

이상입니다. 생각보다 간단한데다 사용하는 코드에서도 별다른 처리가 필요없어 너무 손쉽게 끝나버린 "S3 Bucket 암호화 적용하기" 였습니다. 

반응형

+ Recent posts