데이터 암호화란?
데이터 암호화는 당연히 VPC안에서 우리의 서버에 들어오지 못하게 막을겁니다. 하지만 만약에 뚫렸을 떄를 가정해서 그 안의 정보들을 보지 못함에 목적이 있습니다.
Client-side 암호화란 사용자가 직접 암화화 키를 관리하는 것입니다. 만약 사용자가 서버에 비밀번호를 쳐서 회원가입을 하려고 한다고 해 봅시다. 근데 그 중간과정에서 해커가 비밀번호 순서를 조금 바꾸어서 보내게 된다면, 서버에는 제가 쓴 비밀번호가 아닌 비밀번호가 저장되겠죠, 이러한 상황을 막기 위해, 암호화를 하는 것입니다. 그리고 이렇게 사용자가 직접 암호화 하는 것을 도와주기 위한 서비스가 AWS KMS( Key Management Service )입니다.
Server-side 암호화란 AWS가 알아서 서버에 저장된 데이터를 암호화 시켜놓는 것입니다. 만약 S3에 raw한 데이터를 저장한다고 해 봅시다. 그러면 S3에서는 자동으로 이를 암호화해서 저장하고 복호화 해서 저희한테 주는 원리입니다. 이를 위해서는 키가 있어야 하는데, 이를 자동으로 관리까지 해줍니다. S3, RDS, DynamoDB, Redshift등은 모두 암호화 기능을 기본으로 갖추고 있습니다. 이들은 모두 암호화 키를 관리하기 위해 AWS의 KMS을 우리가 모르는 사이에 사용합니다.
AWS KMS(Key Management Service)란?
우선 CMK(Customer Master Key)는 모든 키들을 관리해주는 가장 상위에 있는 키라고 보시면 됩니다. 그래서 이를 HSMs(Hardware Security Modules)라는 저장소에 저장하게 됩니다.
위 그림이 KMS의 핵심입니다. CMK는 4KB의 데이터만 암호화 할 수 있습니다. 그래서 S3에 저장된 데이터같은건 CMK가 아니라 data key라는 것을 활용해서 암호화합니다. KMS는 CMK만 관리하고, 이 data key는 관리하지 않습니다. 만약 위 그림처럼 어떠한 데이터를 암호화하기 위해 CMK가 2개의 data key인 Plaintext data key와 Encrypted data key2개를 만들어 냈다고 해 봅시다. 그러면 당연히 암호화되지 않은 Plaintext data key를 통해 데이터를 암호화 할 것입니다. 그리고 CMK는 바로 plaintext data key를 삭제하게 됩니다. 그 이유는 이게 있으면 해커가 이 데이터를 발견하게 되면 그 옆에 이를 풀 수 있는 key가 바로 옆에 있어 바로 풀 수 있기 때문입니다. 그래서 이 key를 암호화한 Encrypted data key만 남겨둡니다. 그러면 데이터를 복호화 할 때는 당연히 Encrypted data key를 통해 풀 수는 없습니다. 그래서 CMK가 Encrypted data key를 Plaintext data key로 복호화하고, 이를 활용하여 데이터를 복호화 한다음에 다시 또 Plaintext data key를 없애는 방식으로 복호화를 합니다.
간단히 4KB가 넘는 데이터를 암호화하고 복호화 하는 과정은 위와 같습니다.
그리고 또 중요한 개념은 CMK는 생성된 regio을 떠나지 않는 다는 것입니다. ( ap-northeast-2 )
이 강의의 강사님의 회사는 데이터가 아주 큰 자산인데, 이렇게 데이터가 핵심 자산일 수록 이러한 암호화는 필수라고 합니다. S3에 이미지를 등록할 때, 이를 Server-Side에서 암호화를 S3자체적으로 한번 해줍니다. 그리고 data key로 또 암호화 하고 이 data key를 또CMK로 암호화 하므로 3중 암호화가 되겠네요 ㅋㅋ