다중/혼합 클라우드로 키 가져오기(암호화)

도구 및 설정


클라우드 공급자 간에 키를 공유하는 흥미로운 부분을 깊이 있게 연구하기 전에 이 강좌를 완성하기 위해 각종 도구를 사용해야 한다.우선, 당신이 필요로 하는 download and install Vault, 그리고 그것을 얻을 수 있는 up and running.또한 설치cURLOpenSSL - 일반적으로 대부분의 Linux 운영 체제에 따라 사전 설치되며 대부분의 패키지 관리자apt, yum, brew, choco/scoop 등을 통해 구입할 수 있습니다.우리의 예시는head와diff를 사용했는데 이것은 Ubuntu 아래coreutilsdiffutils 가방의 일부분이다.운영체제에 유사한 패키지를 찾을 수도 있고 수동 해결 방법을 찾을 수도 있습니다.다음으로 CLIAWS command line tools를 설치하고 configure the CLI가 계정에 연결되어 있는지 확인합니다.마지막 단계는 installconfigure Heroku CLI입니다.
마지막으로 주의해야 할 것은 Heroku가 AWS 키를 사용하는 기능은 개인 또는 차단 데이터베이스 계획이 필요하기 때문에 계정이 상응하는 설정을 했는지 확인하십시오.

소개


오늘날의 초연결 세계에서는 이전에 VPN(Virtual Private Network) 뒤쪽이나 DMZ(비무장 지대)에서 서비스를 잠그는 방법이 더 이상 안전하지 않다.반대로 우리는 제로 신뢰 네트워크 모델에서 조작해야 한다. 이 모델에서 모든 참여자가 악의적이라고 가정해야 한다.이것은 암호화에 중점을 두는 것을 의미한다. 정지와 전송, 그리고 신분과 접근 관리를 포함하여 시스템이 서로 상호작용할 수 있도록 확보하는 데 매우 중요하다.
암호화 과정에서 가장 중요한 부분 중 하나는 정보를 암호화하고 복호화하거나 신분을 검증하는 키입니다.이러한 요구 사항을 해결하는 최신 방법은 자체 키(BYOK)라고 합니다. 고객/최종 사용자로서 귀하가 키를 소유하고 관리하며 이를 제3자(특히 클라우드 공급자)에게 제공하는 것입니다.그러나 BYOK가 무엇인지, 그리고 이를 어떻게 가장 잘 활용하는지 깊이 있게 이해하기 전에 관건적인 관리를 신속하게 되돌아봅시다.

키 관리


비교적 높은 차원에서 키 관리는 일종의 메커니즘으로 이 메커니즘을 통해 수동으로 키를 생성하고 검증하며 취소할 수 있으며 이를 작업 흐름의 일부로 할 수 있다.키 관리의 또 다른 기능은 모든 진실의 원천으로 사용되는 루트 인증서가 다른 인증서 아래 층에서 보호되는 것을 확보하는 것이다. 루트 인증서를 취소하면 발급된 전체 인증서 트리가 무효가 되기 때문이다.
키 관리에 사용되는 더욱 유행하는 도구는 HashiCorp’s Vault 저신뢰도와 동적 인프라 시설의 세계를 위해 설계된 것이다. 이 세계에서 키의 나이는 몇 년이 아니라 몇 분이나 몇 시간으로 평가할 수 있다.기밀 관리, 암호화, 신분 기반 접근 기능을 포함하여 그와 상호작용하는 많은 방법 (CLI, API, 웹 기반 UI) 을 제공하고 플러그인을 통해 다양한 공급업체에 연결할 수 있다.본고의 중점은 볼트를 어떻게 안전하게 배치하는가가 아니라 볼트가 BYOK 주변에서 제공할 수 있는 용례이다. 현재는 여러 클라우드 환경에서 이 키를 사용할 수 있다.
Vault 사용의 주요 특징 중 하나는 인프라와 공급자와 무관한 방식으로 실행되며 서로 다른 시스템과 클라우드에서 키를 제공하고 관리하는 데 사용될 수 있다는 것이다.또한 Vault는 사용자에게 키를 공개하지 않고 정보를 암호화하고 복호화하는 데 사용될 수 있어 보안이 향상됩니다.

BYOK 구름 위에서.


이제 Amazon Web Services(AWS)와 Heroku에 중점을 두고 자신의 키를 만들고 여러 클라우드에 섭취하는 방법을 보여주는 특정한 용례를 깊이 연구하고자 합니다.Amazon의 CLI를 사용하여 AWS KMS에 키를 업로드하고 AWS에서 키를 사용하는 방법을 시연합니다.그리고 우리는 수동 회전 키-이상적인 상황에서 이것은 생산 실현에서 자동적이다.마지막으로 Heroku에서 생성된 키를 이용하여 Postgres 데이터베이스를 암호화합니다.
📝 메모
시작하기 전에 Vault가 installedrunning 인지 확인하고 Vault transit secrets engine setup guide 에 따라 AWS에 업로드할 키를 생성합니다.Vault가 실행 중인지 확인AWS CLI is installed하면 시작합니다.

Vault에서 키 만들기


먼저 Vault에서 암호화 키를 만들어야 합니다.
vault write -f transit/keys/byok-demo-key exportable=true allow\_plaintext\_backup=true
키를 내보내려면 Vault UIhttp://localhost:8200/ui/vault/secrets/transit/actions/byok-demo-key?action=export를 사용하거나 Vault CLI에서 직접 키를 내보내는 것을 지원하지 않기 때문에 cURL를 사용해야 합니다.127.0.0.1 주소가 Vault 서버에 매핑됨 - 프로덕션 설정은 로컬 호스트가 아니거나 암호화되지 않습니다.
curl — header “X-Vault-Token: <token>” [http://127.0.0.1:8200/v1/transit/export/encryption-key/byok-demo-key/1](http://127.0.0.1:8200/v1/transit/export/encryption-key/byok-demo-key/1)
이 명령은 출력 키의 base64 인코딩 명문 버전을 AWS KMS에 업로드합니다.base64 명문 키를 파일에 저장합니다. - vault_key.b64 를 사용했습니다.

AWS KMS에 키 업로드


이제 키 재료가 없는 클라이언트 마스터 키(CMK)를 생성해야 합니다.
\# create the keyaws kms create-key — origin EXTERNAL — description “BYOK Demo” — key-usage ENCRYPT\_DECRYPT\# give it a nice nameaws kms create-alias — alias-name alias/byok-demo-key — target-key-id <from above>
출력에서 키 ID를 복사하고 공개 키 및 가져오기 토큰을 다운로드합니다.
aws kms get-parameters-for-import — key-id <from above> — wrapping-algorithm RSAES\_OAEP\_SHA\_1 — wrapping-key-spec RSA\_2048
공개 키와 가져오기 영패를 상기 단계의 출력에서 단독 파일로 복사한 다음 import_token.b64public_key.b64 파일 이름으로 사용한 다음 base64 디코딩합니다.
openssl enc -d -base64 -A -in public\_key.b64 -out public\_key.binopenssl enc -d -base64 -A -in import\_token.b64 -out import\_token.bin
가져오기 영패와 키를 다운로드하면 vault의 키를 포장할 수 있습니다. 먼저 키를 OpenSSL 바이트 형식으로 변환한 다음 KMS의 키를 사용하여 암호화할 수 있습니다.
\# convert the vault key to bytesopenssl enc -d -base64 -A -in vault\_key.b64 -out vault\_key.bin\# encrypt the vault key with the KMS keyopenssl rsautl -encrypt -in vault\_key.bin -oaep -inkey public\_key.bin -keyform DER -pubin -out encrypted\_vault\_key.bin\# import the encrypted key into KMSaws kms import-key-material — key-id <from above> — encrypted-key-material fileb://encrypted\_vault\_key.bin — import-token fileb://import\_token.bin — expiration-model KEY\_MATERIAL\_EXPIRES — valid-to $(date — iso-8601=ns — date=’364 days’)
키가 업로드된 경우 CLI를 통해 빠르게 암호화 및 복호화하여 키가 제대로 작동하는지 확인할 수 있습니다.
\# generate some random text to a filehead /dev/urandom | tr -dc A-Za-z0–9 | head -c 1024 > encrypt\_me.txt\# encrypt the fileaws kms encrypt — key-id <from above> — plaintext fileb://encrypt\_me.txt — output text — query CiphertextBlob | base64 — decode > encrypted\_file.bin\# decrypt the fileaws kms decrypt — key-id <from above> — ciphertext-blob fileb://encrypted\_file.bin — output text — query Plaintext | base64 — decode > decrypted.txt\# validate they match; should be a blank linediff encrypt\_me.txt decrypted.txt
AWS의 다른 부분에서 정지되거나 전송되는 데이터를 암호화할 수 있는 키가 도착했습니다.S3는 암호화된 데이터의 가장 간단하고 중요한 부분 중 하나이다.저장된 파일은 암호화되어야 합니다.스토리지 통을 생성할 때 서버 측 암호화를 활성화하고 키 유형으로 KMS를 선택한 다음 KMS 기본 키 드롭다운 목록에서 만든 특정 키를 선택합니다.

이 때 저장소에 넣은 모든 대상은 자동으로 암호화되어 읽을 때 복호화됩니다.같은 방법으로 데이터베이스를 암호화할 수도 있습니다. KMS와 통합된 서로 다른 서비스의 전체 목록을 보면 목록here을 볼 수 있습니다.

Heroku에서 KMS 키 사용하기


우리의 다음 단계는 우리가 Heroku에서 생성하고 AWS에 업로드하는 키를 사용하는 것입니다!우리의 목적으로, 우리는 창설 과정에서 Postgres 데이터베이스를 암호화할 것이다.이를 위해서는 Heroku의 AWS 계정에 우리가 만든 키에 접근할 수 있는 권한을 부여해야 합니다.이 작업은 키를 만들 때 AWS UI, CLI 또는 정책을 통해 수행할 수 있습니다.
AWS의 키 생성 마법사 중 네 번째 단계에서는 키 사용 권한을 정의해야 합니다.AWS 계정 ID를 키에 추가할 수 있는 별도의 섹션이 있습니다.

Heroku AWS 계정 ID021876802972를 입력하고 마법사를 완료합니다.CLI를 사용하여 이 작업을 수행하려면 키의 기본 정책을 업데이트해야 합니다.
\# get the existing key policyaws kms get-key-policy — policy-name default — key-id <from above> — output text
위의 출력을 heroku-kms-policy.json라는 텍스트 파일에 저장하고 다음 두 문장을 추가합니다.
{
  "Sid": "Allow use of the key",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::021876802972:root"
  },
  "Action": [
    "kms:Encrypt",
    "kms:Decrypt",
    "kms:ReEncrypt\*",
    "kms:GenerateDataKey\*",
    "kms:DescribeKey"
  ],
  "Resource": "\*"
},
{
  "Sid": "Allow attachment of persistent resources",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::021876802972:root"
  },
  "Action": [
    "kms:CreateGrant",
    "kms:ListGrants",
    "kms:RevokeGrant"
  ],
  "Resource": "*",
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": "true"
    }
  }
}
이제 새 문구로 기존 정책을 업데이트합니다.
aws kms put-key-policy — key-id <from above> — policy-name default — policy file://heroku-kms-policy.json
위에 출력이 없으므로 명령이 유효한지 확인하기 위해 get-key-policy 을 다시 실행합니다.
UI를 통해 정책을 업데이트하려면 AWS KMS 콘솔의 Customer Management Key 섹션에서 키를 찾아 편집하여 위의 두 문장을 추가합니다.정책에서 기본 보기로 전환하면 추가 AWS 계정 섹션이 표시됩니다.

Heroku의 키에 대한 액세스 권한이 있으면 Heroku CLI를 사용하여 Postgres 데이터베이스를 응용 프로그램에 연결하고 키 ARN을 지정할 수 있습니다 (ARN:aws:kms:region:account ID:key/key ID와 유사해야 함).
heroku addons:create heroku-postgresql:private-7 — encryption-key CMK\_ARN — app your-app-name
Heroku에서 당신의 Postgres 데이터베이스를 암호화하는 full set of documentation 를 찾을 수 있습니다. 기존 데이터베이스를 어떻게 암호화하는지에 대한 정보를 포함합니다.

정리하다


이 때, Heroku에서 개인 데이터베이스를 실행하거나 차단하는 비용을 고려하여, 사용자가 만든 모든 자원을 삭제하기를 원할 수도 있습니다.마찬가지로 구성을 완전히 취소하고 삭제하려면 7일이 걸리므로 AWS에서 키를 제거하는 것이 좋습니다.Vault dev 서버를 종료하면 dev 실례가 짧기 때문에 모든 정보를 삭제합니다.

주의사항


BYOK는 AWS와 Heroku의 처리 방법에 대해 여러 가지 장점이 있지만 다음과 같은 점을 강조해야 합니다.
  • Vault는 키 회전을 허용하지만 외부 자동화 - cron, CI 파이프, Nomad/Kubernetes 작업 등이 필요합니다.
  • 마찬가지로 AWS의 고객 관리 키도 필요합니다manual rotation.
  • catastrophic failure in AWS이 있으면 키를 다시 가져와야 할 수 있습니다.자동화, 테스트, 검증은 모든 생산 용례의 일부분이어야 한다.
  • 키를 Heroku에서 사용할 때 AWS에서 삭제하는 경우all services and servers that depend on that key will be shutdown.
  • 결론


    이 모든 것이 있다. 우리는 암호화 키의 로컬 소유권을 유지하는 것이 가능하고 취할 수 있으며 소유권은 각종 클라우드 공급업체로 확장될 수 있다는 것을 증명했다.본고는 Vault, KMS, Heroku가 제공하는 기능만 건드린 표면-Vault 자체도 비대칭 암호화를 관리하는 데 사용할 수 있어 전송 중인 데이터와 신분 검증을 보호하는 데 도움이 된다.KMS는 AWS에서 암호화된 기반이며 대부분의 서비스와 연결되어 있어 데이터 보안을 쉽게 보장합니다.마지막으로 Heroku가 KMS 키를 직접 사용하는 능력은 관리 비용을 늘리지 않고 보안 수준을 높일 수 있습니다.

    좋은 웹페이지 즐겨찾기