【AWS KMS】 로컬 lambda에서 각각 KMS를 사용하여 encrypt & decrypt 수행
【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
commandaws 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 디코드 해 파일에 보존한다.
commandaws kms encrypt --key-id $KEYID --plaintext 'password' --query CiphertextBlob --output text | base64 --decode> encrypted.txt
sublime text로 열면 이런 느낌이었다. 제대로 바이너리 파일이 되고 있다.
encrypted.txt0102 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
commandaws kms decrypt --ciphertext-blob fileb://encrypted.txt
결과{
"KeyId": "arn:aws:kms:ap-northeast-1:***********:key/~~~~~~~~~~~~~~~~~~~~~~~~~",
"Plaintext": "cGFzc3dvcmQK"
}
decrypt 결과로 반환 된 Plaintest는 base64로 인코딩되므로 base64로 디코딩하고 표시합니다.
아까처럼 decrypt된 문자열만 가져오고 base64로 디코딩합니다.
commandaws 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.pyimport 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에 관해서 아직 잘 모르기 때문에, 제대로 거기까지도 공부하지 않으면. . .
참고 기사
Reference
이 문제에 관하여(【AWS KMS】 로컬 lambda에서 각각 KMS를 사용하여 encrypt & decrypt 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ninoko1995/items/a9f082826068eaa5bd99
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ aws kms list-aliases | grep -1 "<使いたい鍵のalias>"
{
"AliasName": "alias/<使いたい鍵のalias>",
"AliasArn": "arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias>",
"TargetKeyId": "~~~~~~~~~~~~~~~~~~~~~~~~~"
# AliasArn
$ export KEYID=arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias>
# TargetKeyId
$ export KEYID=arn:aws:kms:ap-northeast-1:***********:key/~~~~~~~~~~~~~~~~~~~~~~~~~
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"
}
aws kms encrypt --key-id $KEYID --plaintext 'password' --query CiphertextBlob --output text | base64 --decode> 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
aws kms decrypt --ciphertext-blob fileb://encrypted.txt
{
"KeyId": "arn:aws:kms:ap-northeast-1:***********:key/~~~~~~~~~~~~~~~~~~~~~~~~~",
"Plaintext": "cGFzc3dvcmQK"
}
aws kms decrypt --ciphertext-blob fileb://encrypted.txt --query Plaintext --output text | base64 --decode
password
$ aws lambda update-function-configuration --function-name <関数名> --environment Variables={ORIGIN='password'}
$ aws list-aliases | grep -1 "<使いたい鍵のalias>"
{
"AliasName": "alias/<使いたい鍵のalias>",
"AliasArn": "arn:aws:kms:ap-northeast-1:***********:alias/<使いたい鍵のalias>",
"TargetKeyId": "~~~~~~~~~~~~~~~~~~~~~~~~~"
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)
$ zip lambda_function.py.zip lambda_function.py
$ aws lambda update-function-code --function-name <関数名> --zip-file fileb://lambda_function.py.zip
Reference
이 문제에 관하여(【AWS KMS】 로컬 lambda에서 각각 KMS를 사용하여 encrypt & decrypt 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ninoko1995/items/a9f082826068eaa5bd99텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)