1. GDPR
2. FPE
Example:
Copy {
"transforms" : "fpe" ,
"transforms.fpe.type" : "FpeField$Value" ,
"transforms.fpe.key" : "3677397A24432646294A404D63516654" ,
"transforms.fpe.fields" : "SENDER"
}
3. INSERT FIELD
Example:
Copy { "transforms" : "InsertField" ,
"transforms.InsertField.type" : "org.apache.kafka.connect.transforms.InsertField$Value" ,
"transforms.InsertField.static.field" : "TARGET_SYSTEM" ,
"transforms.InsertField.static.value" : "GOLDENORE CDC" }
4. MASK FIELD
Example:
Copy { "transforms" : "Name" ,
"transforms.Name.type" : "org.apache.kafka.connect.transforms.MaskField$Value" ,
"transforms.Name.fields" : "SENDER_NAME" ,
"transforms.Name.replacement" : "MASK SENDER NAME" }
5. TimestampConverter
Dostepne typy danych :
string, unix, Date, Time, or Timestamp.
Example:
Copy {
"transforms" : "StringToNumber,TimestampConverter" ,
"transforms.StringToNumber.type" : "org.apache.kafka.connect.transforms.Cast$Value" ,
"transforms.StringToNumber.spec" : "epoch:int64" ,
"transforms.TimestampConverter.type" : "org.apache.kafka.connect.transforms.TimestampConverter$Value" ,
"transforms.TimestampConverter.field" : "epoch" ,
"transforms.TimestampConverter.target.type" : "string" ,
"transforms.TimestampConverter.format" : "yyyy-MM-dd HH:mm:ss.SSS"
}
Rename Field
Copy { "transforms" : "RenameField" ,
"transforms.RenameField.type" : "org.apache.kafka.connect.transforms.ReplaceField$Value" ,
"transforms.RenameField.renames" : "epoch:time" }
Copy { "transforms" : "TimestampConverter" ,
"transforms.TimestampConverter.type" : "org.apache.kafka.connect.transforms.TimestampConverter$Value" ,
"transforms.TimestampConverter.format" : "yyyy-MM-dd HH:mm:ss" ,
"transforms.TimestampConverter.field" : "epoch" ,
"transforms.TimestampConverter.target.type" : "string" }
6. GDPR Email
Tabela z dostępnymi ustawieniami
"transforms.<nazwa transformaty>.fields": "<nazwa kolumny w której znajduje się mail>"
Pole określające czy chcemy aby dane generowane przez system były zbliżone do ciągu wejściowego ( email format )
"transforms.<nazwa transformaty>.email.format": <true lub false>
Pole określające czy w przypadku nieprawidłowego formatu email ma być wstawiany placeholder
transforms.<nazwa transformaty>.want.placeholder": <true lub false>
Pole określające klucz dla szyfrowania AES
"transforms.<nazwa transformaty>.key": "<klucz AES>"
"770A8B65BB156D24DE2A093277530142"
Pole określające czy nie zważając na format danych chcemy zaszyfrować dane algorytmem AES
"transforms.<nazwa transformaty>.encryption": <true lub false>
Pole określające czy nie zważając na format danych chcemy deszyfrować dane algorytmem AES
"transforms.<nazwa transformaty>.decryption": <true lub false>
Uwagi dodatkowe
Pól które posiadają wartości domyślne nie musimy zawierać w definicji transformaty.
W przypadku braku chęci wstawiania placeholdera dane szyfrowane są za pomocą algorytmu MD5
W przypadku niemożliwości deszyfrowania (ze względu na niedozwolone znaki w kolumnie typu kropki) wykonywane jest domyślna operacja dla całej transformaty a więc szyfrowanie słownikowe
Przykładowe transformaty
Transformata z formatem mail(szyfrowanie słownikowe)
Copy {
"transforms" : "FieldMailReal" ,
"transforms.FieldMailReal.type" : "GdprEmail$Value" ,
"transforms.FieldMailReal.fields" : "email_adress" ,
"transforms.FieldMailReal.email.format" : true
}
lub
{
"transforms" : "FieldMail" ,
"transforms.FieldMail.type" : "GdprEmail$Value" ,
"transforms.FieldMail.fields" : "email_adress"
}
Transformata bez formatu mail(szyfrowanie SHA256) z placeholderem w przypadku, gdy dana w tabeli nie jest mailem
Copy {
"transforms" : "FieldMailNotReal" ,
"transforms.FieldMailNotReal.type" : "GdprEmail$Value" ,
"transforms.FieldMailNotReal.fields" : "email_adress" ,
"transforms.FieldMailNotReal.email.format" : false ,
"transforms.FieldMailNotReal.want.placeholder" : true
}
lub
{
"transforms" : "FieldMailNotReal" ,
"transforms.FieldMailNotReal.type" : "GdprEmail$Value" ,
"transforms.FieldMailNotReal.fields" : "email_adress" ,
"transforms.FieldMailNotReal.email.format" : false
}
Transformata bez formatu mail(szyfrowanie SHA256) z szyfrowaniem MD5 w przypadku, gdy dana w tabeli nie jest mailem
Copy {
"transforms" : "FieldMailNotReal" ,
"transforms.FieldMailNotReal.type" : "GdprEmail$Value" ,
"transforms.FieldMailNotReal.fields" : "email_adress" ,
"transforms.FieldMailNotReal.email.format" : false ,
"transforms.FieldMailNotReal.want.placeholder" : false
}
Transformata szyfrująca AES
Copy {
"transforms" : "FieldEncryption" ,
"transforms.FieldEncryption.type" : "GdprEmail$Value" ,
"transforms.FieldEncryption.fields" : "email_adress" ,
"transforms.FieldEncryption.encryption" : true
}
lub
{
"transforms" : "FieldEncryption" ,
"transforms.FieldEncryption.type" : "GdprEmail$Value" ,
"transforms.FieldEncryption.fields" : "email_adress" ,
"transforms.FieldEncryption.key" : "770A8B65DB156D24ED2C093277530142" ,
"transforms.FieldEncryption.encryption" : true
}
Transformata deszyfrująca AES
Copy {
"transforms" : "FieldDecryption" ,
"transforms.FieldDecryption.type" : "GdprEmail$Value" ,
"transforms.FieldDecryption.fields" : "email" ,
"transforms.FieldDecryption.decryption" : true
}
lub
{
"transforms" : "FieldDecryption" ,
"transforms.FieldDecryption.type" : "GdprEmail$Value" ,
"transforms.FieldDecryption.fields" : "email" ,
"transforms.FieldDecryption.key" : "770A8B65DB156D24ED2C093277530142" ,
"transforms.FieldDecryption.decryption" : true
}
7. GDPR Pesel
Tabela z dostępnymi ustawieniami
"transforms.<nazwa transformaty>.fields": "<nazwa kolumny w której znajduje się pesel>"
Uwagi dodatkowe
W przypadku, gdy w podanym polu wartość nie jest numerem pesel wstawiana zostaje wartość 0.
Przykładowa transformata
Copy {
"transforms" : "FieldPesel" ,
"transforms.FieldPesel.type" : "GdprPesel$Value" ,
"transforms.FieldPesel.fields" : "pesel"
}
8. GDPR Phone
Tabela z dostępnymi ustawieniami
"transforms.<nazwa transformaty>.fields": "<nazwa kolumny w której znajduje się numer telefonu>"
Uwagi dodatkowe
W przypadku, gdy w podanym polu wartość nie jest numerem telefonu wstawiana zostaje wartość 48 z następstwem zer w zależności od długości ciągu wejściowego. W przypadku podania wartości krótszej niż 3 cyfry wstawiana jest wartość 0.
Obsługiwane są numery międzynarodowe.
Nie obsługiwane są numery wewnętrzne, alarmowe oraz operatora.
Numery telefonów mogą posiadać spację między cyframi oraz numer kierunkowy kraju poprzedzony +
Przykładowa transformata
Copy {
"transforms" : "FieldPhoneNumber" ,
"transforms.FieldPhoneNumber.type" : "GdprPhoneNumber$Value" ,
"transforms.FieldPhoneNumber.fields" : "phone_number"
}
9. GDPR GdprPassportId
Tabela z dostępnymi ustawieniami
"transforms.<nazwa transformaty>.fields": "<nazwa kolumny w której znajduje się numer paszportu lub dowodu osobistego>"
Pole określające czy w przypadku nieprawidłowego formatu paszportu lub dowodu osobistego ma być wstawiany placeholder
"transforms.<nazwa transformaty>.want.placeholder": <true lub false>"
Pole określające czy chcemy anonimizować numer paszportu czy dowodu osobistego
"transforms.<nazwa transformaty>.type.settings": <"passport" lub "id">"
Uwagi dodatkowe
Pól które posiadają wartości domyślne nie musimy zawierać w definicji transformaty.
W przypadku braku chęci wstawiania placeholdera dane szyfrowane są za pomocą algorytmu FPE za pomocą cyfr i wielkich liter.
Przykładowe transformaty
Transformata anonimizacji numeru paszportu z placeholderem w przypadku, gdy dana w tabeli nie jest numerem paszportu
Copy {
"transforms" : "FieldPassport" ,
"transforms.FieldPassport.type" : "GdprPassportId$Value" ,
"transforms.FieldPassport.fields" : "passport_number" ,
"transforms.FieldPassport.want.placeholder" : true ,
"transforms.FieldPassport.type.settings" : "passport"
}
lub
{
"transforms" : "FieldPassport" ,
"transforms.FieldPassport.type" : "GdprPassportId$Value" ,
"transforms.FieldPassport.fields" : "passport_number" ,
"transforms.FieldPassport.type.settings" : "passport"
}
Transformata anonimizacji numeru paszportu z szyfrowaniem FPE za pomocą cyfr i wielkich liter w przypadku, gdy dana w tabeli nie jest numerem paszportu
Copy {
"transforms" : "FieldPassport" ,
"transforms.FieldPassport.type" : "GdprPassportId$Value" ,
"transforms.FieldPassport.fields" : "passport_number" ,
"transforms.FieldPassport.want.placeholder" : false ,
"transforms.FieldPassport.type.settings" : "passport"
}
Transformata anonimizacji numeru dowodu osobistego z placeholderem w przypadku, gdy dana w tabeli nie jest numerem dowodu osobistego
Copy {
"transforms" : "FieldIdNumber" ,
"transforms.FieldIdNumber.type" : "GdprPassportId$Value" ,
"transforms.FieldIdNumber.fields" : "id_number" ,
"transforms.FieldIdNumber.want.placeholder" : true ,
"transforms.FieldIdNumber.type.settings" : "id"
}
lub
{
"transforms" : "FieldIdNumber" ,
"transforms.FieldIdNumber.type" : "GdprPassportId$Value" ,
"transforms.FieldIdNumber.fields" : "id_number" ,
"transforms.FieldIdNumber.type.settings" : "id"
}
Transformata anonimizacji numeru dowodu osobistego z szyfrowaniem FPE za pomocą cyfr i wielkich liter w przypadku, gdy dana w tabeli nie jest numerem dowodu osobistego
Copy {
"transforms" : "FieldIdNumber" ,
"transforms.FieldIdNumber.type" : "GdprPassportId$Value" ,
"transforms.FieldIdNumber.fields" : "id_number" ,
"transforms.FieldIdNumber.want.placeholder" : false ,
"transforms.FieldIdNumber.type.settings" : "id"
}
10. GDPR CreditCard
Tabela z dostępnymi ustawieniami
"transforms.<nazwa transformaty>.fields": "<nazwa kolumny w której znajduje się numer karty bankowej>"
Uwagi dodatkowe
W przypadku, gdy w podanym polu wartość nie jest numerem pesel wstawiane zostaje 16 zer (w przypadku przechowywania wartości w zmiennej np. bigint wstawiana jest wartość 0).
Przykładowa transformata
Copy {
"transforms" : "FieldCard" ,
"transforms.FieldCard.type" : "GdprCardNumber$Value" ,
"transforms.FieldCard.fields" : "credit_card"
}
11. Filter (Confluent)
Tabela z dostępnymi ustawieniami
Określa kryteria używane do filtrowania rekordów, które mają zostać uwzględnione lub wykluczone przez tę transformatę. Notacja używana do zapisu warunku filtrowania to predykat JSON Path, którego opis znajduje się w linku: https://github.com/json-path/JsonPath.
"transforms.<nazwa transformaty>.filter.condition": "<warunek filtrowania>"
Określa akcję wykonywaną na rekordach pasujących do predykatu filter.condition. Dopuszczalne wartości to: [include, exclude]. Wartość "include", zostawia rekordy pasujące do predykatu i usuwa wszystkie rekordy, które nie spełniają predykatu. Wartość "exclude" usuwa wszystkie rekordy pasujące do predykatu.
"transforms.<nazwa transformaty>.filter.type": "<"include" lub "exclude">"
Określa zachowanie, gdy rekord nie ma pola (pól) użytych w filter.condition. Użyj "fail", aby rzucić wyjątek i nie wykonać zadania konektora, "include", aby przepuścić rekord, lub "exclude", aby go odrzucić.
"transforms.<nazwa transformaty>.missing.or.null.behavior": "<"fail", "include" lub "exclude">"
Przykładowa transformata
Copy {
"transforms" : "filterPoland" ,
"transforms.filterPoland.type" : "io.confluent.connect.transforms.Filter$Value" ,
"transforms.filterPoland.filter.condition" : "$[?(@.nation== 'Poland')]" ,
"transforms.filterPoland.filter.type" : "include" ,
"transforms.filterPoland.missing.or.null.behavior" : "fail"
}
Transformata z predykatem
Copy {
"transforms" : "filterPoland" ,
"transforms.filterPoland.predicate" : "IsPredicate2" ,
"transforms.filterPoland.type" : "io.confluent.connect.transforms.Filter$Value" ,
"transforms.filterPoland.filter.condition" : "$[?(@.nation== 'Poland')]" ,
"transforms.filterPoland.filter.type" : "include" ,
"transforms.filterPoland.missing.or.null.behavior" : "fail" ,
"predicates" : "IsPredicate2" ,
"predicates.IsPredicate2.type" : "org.apache.kafka.connect.transforms.predicates.TopicNameMatches" ,
"predicates.IsPredicate2.pattern" : ".*client"
}
Powyższa transformata przedstawia użycie predykatu, który pozwala nam na filtrowanie konkretnej tabeli lub tabel. Gdy replikujemy cały schemat lub wiele tabel, które mają kolumny o takiej samej nazwie filtr zadziałałby na wszystkie tabele. Użycie predykatu typu TopicNameMatches pozwala na wskazanie jednego lub wielu topicków za pomocą regex i rozwiązuje problem filtrowania wszystkich tabel znajdujących się w naszym connectorze.
12. Przykład użycia wielu transformat
Copy {
"transforms" : [ "FirstNameField" , "LastNameField" , "CompanyField" , "PhoneNumberField" , "NationField" , "CreditCardField" , "PeselField" , "EmailField" , "PassportField" , "PolishIdField" ] ,
"transforms.FirstNameField.type" : "org.apache.kafka.connect.transforms.MaskField$Value" ,
"transforms.FirstNameField.fields" : "first_name" ,
"transforms.FirstNameField.replacement" : "First Name" ,
"transforms.LastNameField.type" : "org.apache.kafka.connect.transforms.MaskField$Value" ,
"transforms.LastNameField.fields" : "last_name" ,
"transforms.LastNameField.replacement" : "Last Name" ,
"transforms.CompanyField.type" : "FpeField$Value" ,
"transforms.CompanyField.key" : "3677397A24432646294A404D63516654" ,
"transforms.CompanyField.fields" : "company" ,
"transforms.PhoneNumberField.type" : "GdprPhoneNumber$Value" ,
"transforms.PhoneNumberField.fields" : "phone_number" ,
"transforms.NationField.type" : "FpeField$Value" ,
"transforms.NationField.key" : "3677397A24432646294A404D63516654" ,
"transforms.NationField.fields" : "nation" ,
"transforms.CreditCardField.type" : "GdprCardNumber$Value" ,
"transforms.CreditCardField.fields" : "credit_card" ,
"transforms.PeselField.type" : "GdprPesel$Value" ,
"transforms.PeselField.fields" : "pesel" ,
"transforms.EmailField.type" : "GdprEmail$Value" ,
"transforms.EmailField.fields" : "adress_email" ,
"transforms.PassportField.type" : "GdprPassportId$Value" ,
"transforms.PassportField.fields" : "passport_number" ,
"transforms.PassportField.type.settings" : "passport" ,
"transforms.PolishIdField.type" : "GdprPassportId$Value" ,
"transforms.PolishIdField.fields" : "polish_id_number" ,
"transforms.PolishIdField.type.settings" : "id"
}