GCP์์ ์๋ Queryable Encryption ์ฌ์ฉ
์ด ํ์ด์ง์ ๋ด์ฉ
- ๊ฐ์
- ์์ํ๊ธฐ ์ ์
- KMS ์ค์
- GCP ์๋น์ค ๊ณ์ ๋ฑ๋ก
- GCP ๊ณ ๊ฐ ๋ง์คํฐ ํค ๋ง๋ค๊ธฐ
- ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
- ํค ๋ณผํธ collection์ ๊ณ ์ ์ธ๋ฑ์ค ๋ง๋ค๊ธฐ
- ๋ฐ์ดํฐ ์ํธํ ํค ๋ฐ ์ํธํ๋ collection ๋ง๋ค๊ธฐ
- ์ํธํ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ํ MongoClient ๊ตฌ์ฑ
- ์ํธํ๋ ํ๋๊ฐ ์๋ ๋ฌธ์ ์ฝ์ ํ๊ธฐ
- ์ํธํ๋ ๋ฌธ์ ์กฐํ
- ์์ธํ ์์๋ณด๊ธฐ
๊ฐ์
์ด ๊ฐ์ด๋์์๋ Google Cloud ํค ๊ด๋ฆฌ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ Queryable Encryption ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
์ด ๊ฐ์ด๋์ ๋จ๊ณ๋ฅผ ์๋ฃํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ด ํ์๋ฉ๋๋ค:
GCP ํค ๊ด๋ฆฌ ์๋น์ค์์ ํธ์คํ ๋๋ ๊ณ ๊ฐ ๋ง์คํฐ ํค ์ ๋๋ค.
CMK ๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ๋ ๋ฌธ์๋ฅผ ์ฝ์ ํ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
์์ํ๊ธฐ ์ ์
์ด ๊ฐ์ด๋์ ์ฝ๋๋ฅผ ์๋ฃํ๊ณ ์คํํ๋ ค๋ฉด ์ค์น ์๊ตฌ ์ฌํญ ํ์ด์ง์ ํ์๋ ๋๋ก ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํด์ผ ํฉ๋๋ค.
ํ
์ฐธ์กฐ: ์ ์ฒด ์ ์ฉ
์ด ๊ฐ์ด๋์์ ๋ง๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ฝ๋๋ฅผ ๋ณด๋ ค๋ฉด ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํด๋นํ๋ ํญ์ ์ ํํ๊ณ ์ ๊ณต๋ ๋งํฌ๋ฅผ ๋ฐ๋ผ๊ฐ์ธ์.
KMS ์ค์
GCP ์๋น์ค ๊ณ์ ๋ฑ๋ก
Google Cloud ์ ๊ธฐ์กด ๊ณ์ ์ ๋ฑ๋กํ๊ฑฐ๋ ๋ก๊ทธ์ธํฉ๋๋ค. .
ํ๋ก์ ํธ์ ๋ํ ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ
GCP์์ ์๋น์ค ๊ณ์ ์ ๋ง๋ค๋ ค๋ฉด ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ ๋ฅผ ๋ฐ๋ฅด์ธ์. ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
์๋น์ค ๊ณ์ ํค ์ถ๊ฐ
GCP์ ์๋น์ค ๊ณ์ ํค๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ์๋น์ค ๊ณ์ ํค ๊ด๋ฆฌ ํ๊ธฐ๋ฅผ ๋ฐ๋ฅด์ธ์. ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
์ค์
์๋น์ค ๊ณ์ ํค๋ฅผ ์์ฑํ ๋ ๋น๊ณต๊ฐ ํค ์ ๋ณด๋ฅผ ์ผํ์ฑ ๋ค์ด๋ก๋๋ก ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด ํํ ๋ฆฌ์ผ์ ๋ท๋ถ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก ์ด ํ์ผ์ PKCS12 ๋๋ JSON ํ์์ผ๋ก ๋ค์ด๋ก๋ํด์ผ ํฉ๋๋ค.
GCP ๊ณ ๊ฐ ๋ง์คํฐ ํค ๋ง๋ค๊ธฐ
์ ๊ณ ๊ฐ ๋ง์คํฐ ํค ์์ฑ
ํค ์์ฑ ๋จ๊ณ์ ๋ฐ๋ผ ํค๋ง๊ณผ ๋์นญ ํค๋ฅผ ์์ฑํฉ๋๋ค. ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด ํค๋ ๊ณ ๊ฐ ๋ง์คํฐ ํค(CMK)์ ๋๋ค.
์ด ํํ ๋ฆฌ์ผ์ ์ดํ ๋จ๊ณ์์ ์ฌ์ฉํ ์ ์๋๋ก ๊ณ ๊ฐ ๋ง์คํฐ ํค ์ ๋ํ ๋ค์ ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ธฐ๋กํฉ๋๋ค.
ํ๋ | ํ์ ์ฌํญ | ์ค๋ช
|
---|---|---|
key_name | ์ | ๊ณ ๊ฐ ๋ง์คํฐ ํค ์ ์๋ณ์์
๋๋ค. |
key_ring | ์ | ํค๊ฐ ์ํ ํค ๊ทธ๋ฃน์ ์๋ณ์์
๋๋ค. |
key_version | ์๋ | ๋ช
๋ช
๋ ํค์ ๋ฒ์ ์
๋๋ค. |
์์น | ์ | ํค์ ๋ํด ์ง์ ๋ ์ง์ญ์
๋๋ค. |
์๋ํฌ์ธํธ | ์๋ | Google Cloud KMS์ ํธ์คํธ ๋ฐ ์ ํ์ ํฌํธ์
๋๋ค. ๊ธฐ๋ณธ๊ฐ์ cloudkms.googleapis.com ์
๋๋ค. |
์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ ์ค์ธ MongoDB ๋๋ผ์ด๋ฒ์ ํด๋นํ๋ ํญ์ ์ ํํ๋ฉด ๊ด๋ จ ์ฝ๋ ์ํ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ์ํธํ ํค ๋ฐ ์ํธํ๋ collection ๋ง๋ค๊ธฐ
GCP KMS ์๊ฒฉ ์ฆ๋ช ์ถ๊ฐ
Queryable Encryption์ด ํ์ฑํ๋ ํด๋ผ์ด์ธํธ ์ฝ๋์ ์๋น์ค ๊ณ์ ์๊ฒฉ ์ฆ๋ช ์ ์ถ๊ฐํฉ๋๋ค.
์ ํธํ๋ MongoDB ๋๋ผ์ด๋ฒ์ ํด๋นํ๋ ํญ์ ์ ํํฉ๋๋ค:
ํ
์ด ๊ฐ์ด๋ ์ GCP ์๋น์ค ๊ณ์ ๋ง๋ค๊ธฐ ๋จ๊ณ์์ ์๋น์ค ๊ณ์ ํค ์๊ฒฉ ์ฆ๋ช ์ด ํฌํจ๋ ํ์ผ์ ์ ์ฅํ์ต๋๋ค.
์๊ฒฉ ์ฆ๋ช
์ JSON ํ์์ผ๋ก ๋ค์ด๋ก๋ํ ๊ฒฝ์ฐ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ <credentials-filename>
์ ์๊ฒฉ ์ฆ๋ช
ํ์ผ ์ด๋ฆ์ผ๋ก ๋์ฒดํ์ฌ ๋น๊ณต๊ฐ ํค ๊ฐ์ ์ถ์ถํ ์ ์์ต๋๋ค.
cat <credentials-filename> | jq -r .private_key | openssl pkcs8 -topk8 -nocrypt -inform PEM -outform DER | base64
์๊ฒฉ ์ฆ๋ช
์ PKCS12 ํ์์ผ๋ก ๋ค์ด๋ก๋ํ ๊ฒฝ์ฐ, GCP ์๋น์ค ๊ณ์ ๊ฐ์ ธ์ค๊ธฐ ์ํธ๋ฅผ ์ง์ ํ๊ณ PEM ์ํธ ๊ตฌ๋ฌธ์ ์ถ๊ฐํ์ฌ ๋ค์ ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ํค์ ์ก์ธ์คํ ๋ ํค์ ์ก์ธ์คํด์ผ ํ๋ฉฐ, ์ด๋ <credentials-filename>
์ ์๊ฒฉ ์ฆ๋ช
ํ์ผ์ ์ด๋ฆ์ผ๋ก ๋์ฒดํฉ๋๋ค.
openssl pkcs12 -info -in <credentials-filename>
ํ
์์ธํ ์์๋ณด๊ธฐ
GCP์ฉ KMS ์ ๊ณต์ ๊ฐ์ฒด์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด Google Cloud Platform KMS๋ฅผ ์ฐธ์กฐํ์ธ์.
ํค ์ ๋ณด ์ถ๊ฐ
๊ณ ๊ฐ ๋ง์คํฐ ํค๋ฅผ ์ง์ ํ๋ ค๋ฉด ๋ค์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ์ธ์.
ํ
์ด ๊ฐ์ด๋ ์ ๊ณ ๊ฐ ๋ง์คํฐ ํค ์์ฑ ๋จ๊ณ์์ ๊ณ ๊ฐ ๋ง์คํฐ ํค ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ์ต๋๋ค.
๋ฐ์ดํฐ ์ํธํ ํค ์์ฑ
MongoDB ์ฐ๊ฒฐ ๋ฌธ์์ด๊ณผ ํค ๋ณผํธ ์ปฌ๋ ์ ๋ค์์คํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌ์ฑํ๊ณ ๋ฐ์ดํฐ ์ํธํ ํค๋ฅผ ๋ง๋ญ๋๋ค.
์ฐธ๊ณ
ํค ๋ณผํธ ์ปฌ๋ ์ ๋ค์์คํ์ด์ค ๊ถํ
์ด ๊ฐ์ด๋์ ํค ๋ณผํธ ์ปฌ๋ ์
์ encryption
๋ฐ์ดํฐ๋ฒ ์ด์ค์ __keyVault
์ปฌ๋ ์
์
๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์์ MongoDB์ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์์๊ฒ encryption.__keyVault
๋ค์์คํ์ด์ค์ ๋ํ ReadWrite ๊ถํ์ด ์๋์ง ํ์ธํฉ๋๋ค.
์ด ์น์ ์ ์ฝ๋ ์ถ๋ ฅ์ ๋ค์๊ณผ ์ ์ฌํด์ผ ํฉ๋๋ค.
Created encrypted collection!
ํ
์์ธํ ์์๋ณด๊ธฐ
GCP KMS๋ฅผ ์ฌ์ฉํ ๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ ์ํธํ ํค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๋ค์ด์ด๊ทธ๋จ์ ๋ณด๋ ค๋ฉด ์ํคํ ์ฒ๋ฅผ ์ฐธ์กฐํ์ธ์.
Azure Key Vault์์ ํธ์คํ ๋๋ ๊ณ ๊ฐ ๋ง์คํฐ ํค๋ก ์ํธํ๋ ๋ฐ์ดํฐ ์ํธํ ํค๋ฅผ ์์ฑํ๋ ์ต์ ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด kmsProviders ๊ฐ์ฒด ๋ฐ dataKeyOpts ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์ธ์.
ํ
์ฐธ์กฐ: ์ฝ๋ ์์ฑ
์ํธํ๋ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ํ MongoClient ๊ตฌ์ฑ
์๋ ์ํธํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์น ์ง์
์ฐธ๊ณ
์๋ ์ํธํ ์ต์
์๋ ์ํธํ ์ต์ ์ ์๋ ์ํธํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ตฌ์ฑ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ฌ ์ํธํ๋ ํ๋์ ์ก์ธ์คํ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์์ ์์ ํฉ๋๋ค.
์๋ ์ํธํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์์ธํ ๋ด์ฉ์ Queryable Encryption์ ์ํ ์๋ ์ํธํ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ด์ง์์ ํ์ธํ์ธ์.
์ํธํ๋ ํ๋๊ฐ ์๋ ๋ฌธ์ ์ฝ์ ํ๊ธฐ
Queryable Encryption์ด ํ์ฑํ๋ MongoClient
์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ ์ฝ๋ ์ค๋ํซ์ ์ฌ์ฉํ์ฌ ์ํธํ๋ ๋ฌธ์๋ฅผ medicalRecords.patients
๋ค์์คํ์ด์ค์ ์ฝ์
ํฉ๋๋ค.
๋ฌธ์๋ฅผ ์ฝ์ ํ๋ฉด Queryable Encryption์ด ํ์ฑํ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ ํ๋๋ฅผ ์ํธํํฉ๋๋ค.
{ "_id": { "$oid": "<_id value>" }, "firstName": "Jon", "lastName": "Doe", "patientId": { "$binary": { "base64": "<ciphertext>", "subType": "06" } }, "address": "157 Electric Ave.", "patientRecord": { "ssn": { "$binary": { "base64": "<ciphertext>", "subType": "06" } }, "billing": { "$binary": { "base64": "<ciphertext>", "subType": "06" } } }, "medications": { "$binary": { "base64": "<ciphertext>", "subType": "06" } }, "__safeContent__": [ { "$binary": { "base64": "<ciphertext>", "subType": "00" } }, { "$binary": { "base64": "<ciphertext>", "subType": "00" } } ] }
๊ฒฝ๊ณ
__safeContent__ ํ๋๋ฅผ ์์ ํ์ง ๋ง์ธ์.
__safeContent__
ํ๋๋ Queryable Encryption์ ๋ฐ๋์ ํ์ํฉ๋๋ค. ์ด ํ๋์ ๋ด์ฉ์ ์์ ํ์ง ๋ง์ธ์.
ํ
์ฐธ์กฐ: ์ฝ๋ ์์ฑ
์ํธํ๋ ๋ฌธ์ ์กฐํ
์ด ๊ฐ์ด๋์ ์ํธํ๋ ํ๋๊ฐ ์๋ ๋ฌธ์ ์ฝ์ ๋จ๊ณ์์ ์ฝ์ ํ ์ํธํ๋ ๋ฌธ์๋ฅผ ๊ฒ์ํฉ๋๋ค.
Queryable Encryption์ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ค์ ์ฝ๋ ์ค๋ํซ์ ์๋ Queryable Encryption์ผ๋ก ๊ตฌ์ฑ๋ ํด๋ผ์ด์ธํธ์ ์๋ Queryable Encryption์ด ๊ตฌ์ฑ๋์ง ์์ ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค.
์ด์ ์ฝ๋ ์ค๋ํซ์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
Finding a document with regular (non-encrypted) client. { _id: new ObjectId("628eabeb37590e84ea742665"), firstName: 'Jon', lastName: 'Doe', patientId: new Binary(Buffer.from("0798810acc0f4f46c9a76883cee80fca12102e9ddcbcdae46a821fa108a8155a850f2d0919475b6531ada68973d436a199b537a05a98a708c36d2bfec4979d59cbe66878865ce19e392d3e4789d309bdacc336e32efcc851806ae0a41b355288c10d01e39147e1c40d919c41913a0c9d2d3fad0d0d1d2873c4fc82c6c22f27b517df5f3131b331b96ed16a7c5cf89e09082a2d898c2dcd73da91d08760ba74a70077b2d0fdbbe1eea75655a19fcc397812325ad40b102cbd16b8d36b22e11e3f93404f24a8ff68cfdec3c22b0e787cb30078a5227b2a", "hex"), 6), address: '157 Electric Ave.', patientRecord: { ssn: new Binary(Buffer.from("07e8b69630c32f4a00a542af768f8abcf50223edd812ff20b0ecb046ee1a9f5a0eef8d85d99cd26076411129942752516ee605c55aadce73f3d44d81ea6ddbbb8134b108a9deb40d8cab9cb4f08ef210ab0c9d2ea4347f9d235b861baf29751e60abcf059eb5c120305bd5ac05a4e07ac8ccfa6d37283f4cdbfeb7a8accb65b71857d486b5cf55e354d6a95e287d9e2dd65f3f9d9c4c9d0bdb1f26c4bd549d7be77db81796be293e08b2223bac67b212423c4e06568578b5bd7a3c33cedc1b291bcda0b27e005144d344563711a489f24b8e9b65bbb721d3a0e9d9b227a0cec0cbad", "hex"), 6), billing: new Binary(Buffer.from("06808ae69d4caa49cf90bb688f386f097f03f870a7b8fcebb1980c9ee5488b1f0f68558fc2163adcd92d00ea5f349f56ed34e7b391f54c48ed2760b4bde73022fc818dc7486a4e046b92ce9c82e00333c7779d9d6bb476713a20632b593b7de54812662cfc4d174d05451d3f4195514e12edba", "hex"), 6) }, medications: new Binary(Buffer.from("06665ec15d38254dc4aa16da856789d33404f27bfea53e0d2fa4deaff166989ab33f469644d89c29112d33b41dbe54ec2d89c43f3de52cdc5d454e8694046216f533614fa7b42b7c5406d6518f7ed8f9e3ce52fda6c8b2146d0f8cc51e21a3467183697e1735a9f60c18e173c1916101", "hex"), 6), __safeContent__: [ new Binary(Buffer.from("3044b134ad0f7c8a90dab1e05bb8b296a8ede540796bd7403ab47693cdba1b26", "hex"), 0), new Binary(Buffer.from("a22ddf9a5657cdd56bef72febbba44371899e6486962a1c07d682082c4e65712", "hex"), 0) ] } Finding a document with encrypted client, searching on an encrypted field { _id: new ObjectId("628eaca1dcf9b63e2f43162d"), firstName: 'Jon', lastName: 'Doe', patientId: 12345678, address: '157 Electric Ave.', patientRecord: { ssn: '987-65-4320', billing: { type: 'Visa', number: '4111111111111111' } }, medications: [ 'Atorvastatin', 'Levothyroxine' ], __safeContent__: [ new Binary(Buffer.from("fbdc6cfe3b4659693650bfc60baced27dcb42b793efe09da0ded54d60a9d5a1f", "hex"), 0), new Binary(Buffer.from("0f92ff92bf904a858ef6fd5b1e508187f523e791f51d8b64596461b38ebb1791", "hex"), 0) ] }
ํ
์ฐธ์กฐ: ์ฝ๋ ์์ฑ
์์ธํ ์์๋ณด๊ธฐ
์ด ๊ฐ์ด๋์ ์ธ๊ธ๋ ์ฃผ์ ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๋ค์ ๋งํฌ๋ฅผ ์ฐธ์กฐํ์ธ์:
์ฐธ์กฐ ํ์ด์ง์์ Queryable Encryption ๊ตฌ์ฑ ์์์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
ํค ๋ฐ ํค ๋ณผํธ ํ์ด์ง์์ ๊ณ ๊ฐ ๋ง์คํฐ ํค์ ๋ฐ์ดํฐ ์ํธํ ํค๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์๋ณด์ธ์.
KMS ์ ๊ณต์๊ฐ Queryable Encryption ํค๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ KMS ์ ๊ณต์ ํ์ด์ง์์ ํ์ธํ์ธ์.