IT/Infra&Cloud

[aws] KMS/CloudHSM

Hayley Shim 2023. 10. 29. 00:50

안녕하세요. 최근 CloudNet@ AWS Security Study를 진행하며 해당 내용을 이해하고 공유하기 위해 작성한 글입니다. 해당 내용은 ‘쉽게 적용하는 AWS 보안 레시피’ 책과 AWS Docs 내용을 기반으로 했습니다.

  • 암호화는 키를 사용해 평문을 암호문으로 변환하는 프로세스입니다.
  • 동일한 키를 사용해 암호문을 평문으로 변환할 수 있는데, 이를 복호화라고 합니다.
  • AWS 키 관리 서비스 KMS는 공유 하드웨어 보안 모듈HSM 을 사용하면서 암호화키를 생성하고 관리할 수 있게 도와줍니다.
  • CloudHSM은 AWS 내에서 암호화키를 관리할 수 있지만 보안 강화를 위해 전용 HSM을 사용할 수 있는 서비스입니다.

KMS

AWS Key Management Service(AWS KMS)는 데이터를 보호하는 데 사용하는 암호화 키를 쉽게 생성하고 제어할 수 있게 해주는 관리형 서비스입니다.

실습

1. KMS 키생성

  • 콘솔 로그인 → KMS 서비스 → 좌측 사이드 바 “고객 관리형 키(CMK)” 클릭 → 키 생성 클릭
  • 다른 설정은 기본 유지, 별칭과 설명을 입력 후 다음을 클릭합니다.
  • 이전 IAM 실습에서 생성한 awssecadmin user를 사용했습니다.

레이블 추가

키 관리 권한 정의

키 사용 권한 정의

2. KMS 키 교체

# 키 생성
CREATE_KEY_JSON=$(aws kms create-key)

# 키 ID 변수 지정
KEY_ID=$(echo $CREATE_KEY_JSON | jq -r ".KeyMetadata.KeyId")

# 매년 키 자동 교체 활성화
aws kms enable-key-rotation --key-id $KEY_ID

# 키 삭제 예약 : 대기 기간(7일) 
aws kms schedule-key-deletion --key-id $KEY_ID --pending-window-in-days 7

3. 평문 암복호화

# [awssecadmin 계정] 키 생성
CREATE_KEY_JSON=$(aws kms create-key --profile awssecadmin --description "my text encrypt descript demo")
echo $CREATE_KEY_JSON | jq

KEY_ID=$(echo $CREATE_KEY_JSON | jq -r ".KeyMetadata.KeyId")
echo $KEY_ID

# [awssecadmin 계정] create alias 
export ALIAS_SUFFIX=hayley
aws kms create-alias --alias-name alias/$ALIAS_SUFFIX-2 --target-key-id $KEY_ID --profile awssecadmin

# [awssecadmin 계정] 평문을 암호화해보기
echo "Hello 123123" > secrect.txt
aws kms encrypt --profile awssecadmin --key-id alias/$ALIAS_SUFFIX-2 --cli-binary-format raw-in-base64-out --plaintext file://secrect.txt --output text --query CiphertextBlob | base64 --decode > secrect.txt.encrypted

# [awssecadmin 계정] descript data
aws kms decrypt --profile awssecadmin --ciphertext-blob fileb://secrect.txt.encrypted --output text --query Plaintext | base64 --decode
Hello 123123

CloudHSM

AWS CloudHSM은 AWS 클라우드에 하드웨어 보안 모듈을 제공합니다. 하드웨어 보안 모듈(HSM)은 암호화 작업을 처리하고 암호화 키에 보안 스토리지를 제공하는 컴퓨팅 장치입니다.

CloudHSM 클러스터 생성

1. CloudHSM Cluster 생성

# get subnet ids 
aws ec2 describe-subnets 

## ap-northeast-2a subnet-00c8a4e9b2a5f7ec6
## ap-northeast-2b subnet-0791e595c6b5786f8

# aws cloudhsmv2 create-cluster --hsm-type hsm1.medium --backup-retention-policy DAYS 7 --subnet-ids subnet-00c8a4e9b2a5f7ec6 subnet-0791e595c6b5786f8
## --hsm-type hsm1.medium 고정값, --backup-retention-policy DAYS 7 단위 확인 필요
aws cloudhsmv2 create-cluster --hsm-type hsm1.medium  --subnet-ids subnet-00c8a4e9b2a5f7ec6 subnet-0791e595c6b5786f8

2. HSM 생성

export CLUSTER_HSM=cluster-knw3zxahbud aws cloudhsmv2 create-hsm --cluster-id $CLUSTER_HSM --availability-zone ap-northeast-2a

3. HSM 에서 이용할 IAM 계정 생성 및 EC2 생성

## create iam account ## EC2 VM 에서 hsm 을 초기화 하기 위한 계정 생성  ## hsmuser / h$muser123 ## 엑세스키 활성화, 암호 활성화, 새비밀번호 생성 비활성화  
## 기존 정책 연결 AWSCloudHSMFullAccess 추가  
## access id : AKIAX3DCGODSMQRGFXHA, secret access key : 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 ap-northeast-2# create ec2  
## AMI 는 amazon ami 중에 ssh 되는거 사용 
## sshkey 는 사전 생성한 keyfile myhsmclient  
## subnet 는 hsm cluster 생성시에 sg 생성을 해주는데 port 연동 간의 이슈를 없에기 위하여 다른 subnet 사용하지 않고 hsm cluster 의 subnet 를 사용함aws ec2 run-instances \  
--image-id ami-01d87646ef267ccd7 \  
--count 1 --instance-type t2.micro \  
--key-name myhsmclient\  
--security-group-ids sg-0a52c3f376b89388c \  
--subnet-id subnet-00c8a4e9b2a5f7ec6## sg inbound icmp, ssh 추가 
##    outbond all 추가ssh -i myhsmclient.pem ec2-user@52.78.99.37## in ec2 vm  
## configure hsmuser  
aws configure

4. HSM 클러스터 초기화

CLUSTER_HSM_ID=cluster-knw3zxahbudaws cloudhsmv2 describe-clusters \  
--filters clusterIds=$CLUSTER_HSM_ID \  
--output text --query 'Clusters[].Certificates.ClusterCsr' > "$CLUSTER_HSM_ID"_ClusterCsr.csropenssl genrsa -aes256 -out customerCA.key 2048## Generating RSA private key, 2048 bit long modulus 
## ...+++ 
## ................+++ 
## e is 65537 (0x10001) 
## Enter pass phrase for customerCA.key: # hsmuser 
## Verifying - Enter pass phrase for customerCA.key: # hsmuseropenssl req -new -x509 -days 3652 -key customerCA.key -out customerCA.crt## Enter pass phrase for customerCA.key: 
## You are about to be asked to enter information that will be incorporated 
## into your certificate request. 
## What you are about to enter is what is called a Distinguished Name or a DN. 
## There are quite a few fields but you can leave some blank 
## For some fields there will be a default value, 
## If you enter '.', the field will be left blank. 
## ----- 
## Country Name (2 letter code) [XX]:KO 
## State or Province Name (full name) []: 
## Locality Name (eg, city) [Default City]: ## Organization Name (eg, company) [Default Company Ltd]: 
## Organizational Unit Name (eg, section) []: ## Common Name (eg, your name or your server's hostname) []: 
## Email Address []:openssl x509 -req -days 3652 -in "$CLUSTER_HSM_ID"_ClusterCsr.csr \  -CA customerCA.crt \  
-CAkey customerCA.key \ 
-CAcreateserial \  
-out "$CLUSTER_HSM_ID"_CustomerHsmCertificate.crt## Signature ok 
##subject=/C=US/ST=CA/O=Cavium/OU=N3FIPS/L=SanJose/CN=HSM:EC022C4BDDAA4A56B5768550CDB673:PARTN:1, for FIPS mode 
## Getting CA Private Key 
## Enter pass phrase for customerCA.key:aws cloudhsmv2 initialize-cluster --cluster-id $CLUSTER_HSM_ID  \                                     --signed-cert file://"$CLUSTER_HSM_ID"_CustomerHsmCertificate.crt \                                     --trust-anchor file://customerCA.crtwget https://s3.amazonaws.com/cloudhsmv2-software/CloudHsmClient/EL6/cloudhsm-client-latest.el6.x86_64.rpmsudo yum install -y ./cloudhsm-client-latest.el6.x86_64.rpm  
sudo su 
cp customerCA.crt /opt/cloudhsm/etc/customerCA.crt## ip 정보는 eai 포트를 참고 하여서 first HSM 을 구성하면 됩니다.  
sudo /opt/cloudhsm/bin/configure -a 172.31.3.253

5. HSM 클러스터 활성화

/opt/cloudhsm/bin/cloudhsm_mgmt_util /opt/cloudhsm/etc/cloudhsm_mgmt_util.cfg
[root@ip-172-31-4-137 ec2-user]#/opt/cloudhsm/bin/cloudhsm_mgmt_util /opt/cloudhsm/etc/cloudhsm_mgmt_util.cfg

6. HSM 클러스터 삭제

# remove ec2  
aws ec2 terminate-instances --instance-ids i-04916c75fa9e7d9ae# remove hsm  
aws cloudhsmv2 describe-clusters  
aws cloudhsmv2 delete-hsm --cluster-id cluster-knw3zxahbud --eni-ip 172.31.3.253# remove hsm cluster  
aws cloudhsmv2 delete-cluster --cluster-id cluster-knw3zxahbud

 

 

blog migration project

written in 2022.9.5

https://medium.com/techblog-hayleyshim/aws-kms-cloudhsm-c34832fc18f2