고객들이 자주 요청하는 것은 데이터베이스 내에서 PII를 식별하는 방법입니다. 이를 수행하는 방법을 간단한 예로 보여드리겠습니다.
사용자 스토리: "문서 내에서 암호화되지 않은 신용카드 번호와 주민등록번호를 식별하여 개발자가 데이터베이스에 저장해서는 안 되는 정보를 저장하지 않도록 하고 싶습니다."
배경: N1QL에는 "토큰화" 기능을 4.6부터 지원합니다. 이 기능을 정규식 함수 의 특정 보조 인덱스와 데이터베이스 내의 패턴을 식별할 수 있는 강력한 도구 세트가 있습니다.
솔루션 예시: 버킷(이 경우에는 '기본' 버킷) 내에 저장된 암호화되지 않은 주민등록번호를 식별하는 쿼리를 만들었습니다. xxx-xx-xxxx 또는 xxxxxxxxx와 일치하는 모든 숫자 패턴을 찾고 있습니다. TOKENS 함수를 사용하면 문서를 문자열 배열로 취급할 수 있습니다. 저는 "specials" 플래그를 사용하여 N1QL이 이러한 문자열을 그대로 유지하도록 지시했습니다. 이 플래그를 사용하지 않으면 공백과 대시를 제거하고 해당 문자 뒤에 오는 항목을 무시합니다. 그런 다음 토큰 배열 내의 요소와 일치하는 정규식을 찾습니다.
1 2 3 4 5 |
선택 * FROM 기본값 어디 ANY v IN 토큰(기본값, {"스페셜":true}) 만족 REGEXP_LIKE(토스트링(v),'(\\d{3}-\\d{2}-\\d{4})|(\\b\\d{9}\\b)') END |
버킷에 저장된 암호화되지 않은 신용카드 번호를 식별할 때도 동일한 접근 방식을 사용합니다:
1 2 3 4 5 |
선택 * FROM 기본값 어디 ANY v IN 토큰(기본값, {"스페셜":true}) 만족 REGEXP_LIKE(토스트링(v),'(\\d{4}-\\d{4}-\\d{4}-\\d{4}))|(\\b\\d{16}\\b)') END |
처리 시간을 단축하기 위해 위의 쿼리에 메모리 최적화된 보조 인덱스(MOI)를 사용합니다. Couchbase의 모든 변이는 비동기적으로 인덱스 프로젝터로 전송됩니다. MOI는 인덱스에 포함된 정보를 20ms마다 업데이트한다는 추가적인 이점이 있습니다. 인덱스는 또한 토큰화를 활용합니다.
1 2 3 4 5 6 |
만들기 INDEX `FIND_PI_SSN` 켜기 `기본값`( (DISTINCT (배열 `v` FOR `v` IN 토큰(self, {"스페셜": true}) END))) 어디 ANY `v` IN 토큰(self, {"스페셜": true}) 만족 REGEXP_LIKE(TO_STRING(`v`), "(\\d{3}-\\d{2}-\\d{4})|(\\b\\d{9}\\b)") END |
...그리고 암호화되지 않은 신용 카드의 경우
1 2 3 4 5 6 |
만들기 INDEX `FIND_PI_CCN` 켜기 `기본값`( (DISTINCT (배열 `v` FOR `v` IN 토큰(self, {"스페셜": true}) END))) 어디 any `v` IN 토큰(self, {"스페셜": true}) 만족 REGEXP_LIKE(TO_STRING(`v`), "(\\d{4}-\\d{4}-\\d{4}-\\d{4}))|(\\b\\d{16}\\b)") END |
사용해 보세요: Docker는 제가 개발 환경을 시작하는 데 가장 좋아하는 방법입니다. 위의 예제에 대한 사용하기 쉬운 리포지토리는 github에 있습니다: n1ql-query-nodejs . 도커 컴포즈를 사용하여 두 개의 서비스를 빌드합니다:
- 단일 노드 카우치베이스 클러스터 서비스입니다.
- 암호화되지 않은 PII를 찾는 등 몇 가지 예제를 위해 250,000개의 사용자 프로필과 인덱스로 Couchbase 클러스터를 프로비저닝하는 nodejs 서비스입니다.