【AWS KMS】 로컬 lambda에서 각각 KMS를 사용하여 encrypt & decrypt 수행

7621 단어 람다aws-cliAWS

【AWS KMS】 로컬 lambda에서 각각 KMS를 사용하여 encrypt & decrypt 수행



AWS 초보자로 기존 lambda 프로젝트에 들어가 코드 변경을 할 필요가 나왔다.
aws-cli도 잘 모르는 상태로 여러가지 해 보았으므로, 그 비망록적.

KMS는 무엇입니까? ?



키 관리 서비스.
암호화를 원활하게 할 수 있는 사람.

로컬로 encrypt&decrypt



encrypt하기 위한 keyId 얻기



command
$ aws kms list-aliases | grep -1 "<使いたい鍵のalias>"

<사용하고 싶은 키의 alias>를 포함한 전후 1행이 표시된다.

결과
{
    "AliasName": "alias/<使いたい鍵のalias>",
    "AliasArn": "arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias>",
    "TargetKeyId": "~~~~~~~~~~~~~~~~~~~~~~~~~"

변수에 결과 저장



위의 결과 중 AliasArn 또는 TargetKeyId 중 하나가 환경 변수에 저장됩니다. 

command
# AliasArn
$ export KEYID=arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias> 

# TargetKeyId
$ export KEYID=arn:aws:kms:ap-northeast-1:***********:key/~~~~~~~~~~~~~~~~~~~~~~~~~ 

KeyId로 encrypt



command
aws kms encrypt --key-id $KEYID --plaintext 'password'

결과
{
  "CiphertextBlob": "AQICAHhPD3PY32D6FMhjkfVLRA+NeKc4i9PzZnuvVW+gVfdbZgH91eCL1o/eTMdUI4KM2NSIAAAAZzBlBgkqhkiG9w0BBwagWDBWAgEAMFEGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQM7yY+K+tyCS+dwvwWAgEQgCSpZgm/KnrB7KeVQw3eqCYBlJP/hxUt5/q6J3eIaBe+/IRvx5k==",
  "KeyId": "arn:aws:kms:ap-northeast-1:351540792571:key/13dc2c62-05fa-425e-9910-3fb450610d93"
}

결과에서 알 수 있듯이, 암호화 된 문자열과 그 때 사용 된 KeyID가 출력됩니다.
이 encrypt 된 캐릭터 라인만을 꺼내 base64 디코드 해 파일에 보존한다.

command
aws kms encrypt --key-id $KEYID --plaintext 'password' --query CiphertextBlob --output text | base64 --decode> encrypted.txt

sublime text로 열면 이런 느낌이었다. 제대로 바이너리 파일이 되고 있다.

encrypted.txt
0102 0200 784f 0f73 d8df 60fa 14c8 6391
f54b 440f 8d78 a738 8bd3 f366 7baf 556f
a055 f75b 6601 31d8 9d55 e417 1e8e 0e0d
d04b d4cb 9524 0000 0067 3065 0609 2a86
4886 f70d 0107 06a0 5830 5602 0100 3051
0609 2a86 4886 f70d 0107 0130 1e06 0960
8648 0165 0304 012e 3011 040c a991 30c4
8984 f22c 1912 f3aa 0201 1080 24ac 20a7
5d08 b799 ac6b 2d09 7f42 5f9c 287e ae93
f9ac b7e2 6298 cdf9 fb58 9824 1a1a 3c49
c5

vim에서 열면 이런 느낌이었다. 문자화 굉장히, 제대로 base64로 인코딩할 수 있을 것 같다.


decrypt



command
aws kms decrypt --ciphertext-blob fileb://encrypted.txt

결과
{
    "KeyId": "arn:aws:kms:ap-northeast-1:***********:key/~~~~~~~~~~~~~~~~~~~~~~~~~",
    "Plaintext": "cGFzc3dvcmQK"
}

decrypt 결과로 반환 된 Plaintest는 base64로 인코딩되므로 base64로 디코딩하고 표시합니다.
아까처럼 decrypt된 문자열만 가져오고 base64로 디코딩합니다.

command
aws kms decrypt --ciphertext-blob fileb://encrypted.txt --query Plaintext --output text | base64 --decode

결과
password

원래대로 돌아왔다.

원격에서 lambda에서 encrypt&decrypt



제대로, lambda상의 그 function의 변경 권한을 가진 유저와, kms사용 권한을 가지는 롤을 주어진 function를 사용해, 실시하는 것.

환경 변수 설정



command
$ aws lambda update-function-configuration --function-name <関数名> --environment Variables={ORIGIN='password'}

encrypt하기 위한 keyId 얻기



command
$ aws list-aliases | grep -1 "<使いたい鍵のalias>"

<사용하고 싶은 키의 alias>를 포함한 전후 1행이 표시된다.

결과
{
    "AliasName": "alias/<使いたい鍵のalias>",
    "AliasArn": "arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias>",
    "TargetKeyId": "~~~~~~~~~~~~~~~~~~~~~~~~~"

encrypt&decrypt



lambda_function.py
import os

# for decryption
from base64 import b64decode
import boto3

ORIGIN = os.environ.get('ORIGIN')
# ここに、さっきのkeyId情報を入力
KeyId = 'arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias> '
kms = boto3.client('kms')
ENCRIPTED = kms.encrypt(KeyId=KeyId,Plaintext=ORIGIN)['CiphertextBlob']

def lambda_handler(event, context):
    print("--------------------------------------------------------")

    print('origin = ' + ORIGIN)
    ENCRIPTED = base64.b64encode(ENCRIPTED).decode('utf-8')
    print('enc='+ENCRIPTED)

    dec = kms.decrypt(CiphertextBlob = b64decode(ENCRYPTED))['Plaintext']
    print('dec = ' + dec) 

command
$ zip lambda_function.py.zip lambda_function.py
$ aws lambda update-function-code --function-name <関数名> --zip-file fileb://lambda_function.py.zip

lambda에서 test를 실행합니다. 제대로 표시되면 성공

base64에 관해서 아직 잘 모르기 때문에, 제대로 거기까지도 공부하지 않으면. . .

참고 기사

좋은 웹페이지 즐겨찾기