İÇİNDEKİLER
- •Test ortamlarınızda gerçek kişisel veri var mı?
- •Kısaca: Statik ve Dinamik Maskeleme
- •Neden Maskeleme Gerekli?
- •1. Adım: Kişisel Veriyi Bulun
- •2. Adım: Maskeleme Yöntemini Seçin
- •Statik Maskeleme: Test Ortamı İçin
- •Dinamik Maskeleme: Production İçin
- •Yerleşik yöntem: view ve kolon yetkileri
- •Eklentiler
- •Maskelemeyi Atlatma Riskleri
- •Maskeleme Süreci İçin Kontrol Listesi
- •Aryasoft ile Veri Maskeleme
- •Sıkça Sorulan Sorular
- •Kaynaklar
- •Test ortamlarınızı kişisel veriden arındırın
Veri maskeleme, kişisel ve hassas verilerin gerçek değerleri yerine değiştirilmiş, kısmen gizlenmiş veya sahte değerlerle gösterilmesidir. PostgreSQL’de iki temel yaklaşım vardır: test ve geliştirme ortamlarına kopyalanan verinin kalıcı olarak değiştirildiği statik maskeleme ve verinin yerinde kaldığı, yalnızca yetkisi olmayan kullanıcılara maskeli gösterildiği dinamik maskeleme. Production verisinin maskelenmeden test ortamına kopyalanması, KVKK açısından en sık karşılaşılan risklerden biridir.
Bu rehber, test ortamlarını production verisiyle besleyen yazılım ekipleri ve KVKK uyumundan sorumlu BT yöneticileri için hazırlandı. Örnekleri PostgreSQL 18 üzerinde test ettik.
Test ortamlarınızda gerçek kişisel veri var mı?
Aryasoft, veritabanlarınızdaki kişisel verileri tespit eder ve test ortamlarına maskelenmiş veri aktaran, tekrarlanabilir bir süreç kurar.
Kısaca: Statik ve Dinamik Maskeleme
| Statik maskeleme | Dinamik maskeleme | |
|---|---|---|
| Ne yapar? | Verinin kopyasını kalıcı olarak değiştirir. | Veriyi değiştirmez; sorgu sonucunu kullanıcıya göre maskeler. |
| Nerede kullanılır? | Test, geliştirme, eğitim ve dış paylaşım ortamları | Production’da (üretim ortamında) destek, raporlama ve çağrı merkezi ekipleri |
| Gerçek veri ortamda kalır mı? | Hayır | Evet; yetkili kullanıcılar gerçek veriyi görür. |
| Risk | Maskeleme eksikse kopyada kişisel veri kalır. | Yetki hatası veya atlatma yöntemleriyle gerçek veri görülebilir. |
| Tipik araçlar | SQL script’leri, PostgreSQL Anonymizer | View ve kolon yetkileri, PostgreSQL Anonymizer, Aurora’da pg_columnmask |
Neden Maskeleme Gerekli?
Production veritabanının bir kopyasını test ortamına almak, yazılım ekiplerinin gerçekçi veriyle çalışması için yaygın bir uygulamadır. Ancak test ortamları genellikle production kadar korunmaz: daha geniş erişim, daha zayıf parolalar, dış geliştiriciler ve kayıt altına alınmayan sorgular. Bu ortamlardaki gerçek kişisel veri, production’daki tüm güvenlik önlemlerini anlamsız hale getirir.
KVKK, kişisel verilerin işlenme amacıyla bağlantılı, sınırlı ve ölçülü olmasını şart koşar. Bir yazılım testinin gerçek müşteri kimlik numaralarına ihtiyacı yoktur.
Uyarı
Maskeleme ile anonimleştirme aynı şey değildir. Maskelenmiş veri, başka verilerle birleştirildiğinde kişiyi yeniden tanımlamaya izin veriyorsa hâlâ kişisel veri sayılabilir. Test verisinin hukuki durumunu kurumunuzun KVKK sorumlusuyla birlikte değerlendirin.
1. Adım: Kişisel Veriyi Bulun
Maskelemenin ilk adımı, hangi kolonların kişisel veya hassas veri içerdiğini bilmektir. Kolon adları iyi bir başlangıç noktasıdır:
SELECT table_schema, table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
AND column_name ~* '(tckn|tc_?kimlik|kimlik|ad_?soyad|full_?name|e_?mail|eposta|telefon|phone|gsm|adres|address|iban|kart|card|dogum|birth|maas|salary)'
ORDER BY table_schema, table_name, column_name;
Kolon adlarına bakmak yeterli değildir; “aciklama” veya “not” gibi serbest metin alanları da kişisel veri içerebilir. Bu alanlarda örnek veriler üzerinde desen kontrolü yapın (örneğin 11 haneli sayılar, e-posta adresleri). Bulguları, hangi kolonun hangi yöntemle maskeleneceğini gösteren bir envanter tablosuna dönüştürün.
2. Adım: Maskeleme Yöntemini Seçin
| Yöntem | Örnek | Ne zaman? |
|---|---|---|
| Kısmi gizleme | 12345678901 → *******8901 | Destek ekiplerinin kaydı doğrulaması gerekiyorsa |
| Sahte değerle değiştirme | Ayşe Yılmaz → Müşteri 1047 | Test verisinin gerçekçi görünmesi yeterliyse |
| Tutarlı takma ad (pseudonym) | Aynı e-posta her zaman aynı sahte değere dönüşür | Tablolar arası ilişkilerin ve birleştirmelerin korunması gerekiyorsa |
| Gürültü ekleme | Maaş ±%10 rastgele değişir | İstatistiksel dağılımın korunması gerekiyorsa |
| Genelleştirme | Doğum tarihi → doğum yılı | Analiz için tam değer gerekmiyorsa |
| Silme (NULL) | Not alanı boşaltılır | Alan testler için gerekli değilse |
Statik Maskeleme: Test Ortamı İçin
En basit ve en şeffaf yöntem, test ortamına geri yüklenen kopya üzerinde maskeleme script’i çalıştırmaktır. Script’in her geri yüklemede otomatik çalışması ve kopya kullanıcılara açılmadan önce tamamlanması gerekir.
-- Runs on the TEST copy right after the restore, before anyone gets access
UPDATE customers
SET full_name = 'Müşteri ' || id,
email = 'musteri' || id || '@ornek.test',
phone = '0500' || lpad((id % 10000000)::text, 7, '0'),
tckn = NULL;
-- Consistent pseudonym: the same input always maps to the same output
UPDATE orders
SET customer_email = 'u_' || left(md5(customer_email || 'proje-gizli-tuz'), 12) || '@ornek.test';
Tutarlı takma ad yönteminde kullanılan “tuz” (salt) değeri gizli tutulmalıdır; aksi halde yaygın e-posta adresleri denenerek eşleştirme yapılabilir.
İpucu
Maskeleme script’ini test ortamını yenileyen işin (restore job) ayrılmaz bir parçası yapın ve script’in sonunda doğrulama sorguları çalıştırın: maskelenmesi gereken kolonlarda gerçek desenle eşleşen satır kalmadığını kontrol edin. Doğrulama başarısız olursa ortam kullanıcılara açılmamalıdır.
Dinamik Maskeleme: Production İçin
Yerleşik yöntem: view ve kolon yetkileri
PostgreSQL’in yerleşik özellikleriyle dinamik maskeleme, maskeli bir view oluşturup kullanıcıya tabloya değil view’a yetki vererek yapılır:
CREATE TABLE customers (id int PRIMARY KEY, full_name text, tckn text, phone text);
INSERT INTO customers VALUES (1, 'Ayşe Yılmaz', '12345678901', '05321234567');
CREATE VIEW customers_masked AS
SELECT id,
left(full_name, 1) || '*** ' || left(split_part(full_name, ' ', 2), 1) || '***' AS full_name,
repeat('*', 7) || right(tckn, 4) AS tckn,
left(phone, 4) || ' *** ** ' || right(phone, 2) AS phone
FROM customers;
CREATE ROLE support_user LOGIN PASSWORD 'change_me';
REVOKE ALL ON customers FROM support_user;
GRANT SELECT ON customers_masked TO support_user;
-- As support_user:
SELECT * FROM customers_masked;
-- id | full_name | tckn | phone
-- 1 | A*** Y*** | *******8901 | 0532 *** ** 67
Bu yöntem sade ve şeffaftır; ancak uygulamanın tablo yerine view’u sorgulaması gerekir ve maskeleme kuralları her view’da ayrı ayrı yönetilir.
Eklentiler
| Araç | Nedir? | Not |
|---|---|---|
| PostgreSQL Anonymizer | Açık kaynak eklenti. Maskeleme kurallarını kolon düzeyinde etiket olarak tanımlar; dinamik maskeleme, statik maskeleme ve maskeli dışa aktarım sunar. | Kendi sunucunuzda kurulur; bazı yönetilen bulut servislerinde bulunmayabilir. |
| pg_columnmask | Amazon Aurora PostgreSQL’e özgü dinamik maskeleme eklentisi; politikalar rol ve ağırlığa göre uygulanır. | Yalnızca Aurora PostgreSQL’de (16.10+ ve 17.6+); topluluk sürümünde yok |
Hangi aracı seçerseniz seçin, maskeleme kurallarının bir envantere bağlı olması ve yeni eklenen kolonların bu envantere girmesini sağlayan bir sürecin bulunması gerekir.
Maskelemeyi Atlatma Riskleri
Dinamik maskeleme, yetkisiz kullanıcının verinin kendisine hiçbir yoldan ulaşamaması şartıyla güvenlidir. Şu noktaları kontrol edin:
- Doğrudan tablo erişimi: Maskeli view’u kullanan rolün asıl tabloya yetkisi olmamalıdır.
- Çıkarım saldırıları: Maskeli kolon üzerinde
WHERE tckn LIKE '1%'gibi filtreler çalışıyorsa, değer tahmin edilerek bulunabilir. - Yedekler ve dışa aktarımlar: Yedekler gerçek veriyi içerir; erişimi kısıtlı ve şifreli olmalıdır.
- Loglar: Sorgu logları parametre olarak gerçek değerleri içerebilir.
Maskeleme Süreci İçin Kontrol Listesi
| Adım | Sorumlu | Kanıt |
|---|---|---|
| Kişisel veri envanteri çıkarıldı. | Veri sahibi + DBA | Kolon envanteri |
| Her kolon için yöntem belirlendi. | Veri sahibi + KVKK sorumlusu | Maskeleme kuralları |
| Test yenileme işine maskeleme eklendi. | DBA | İş tanımı ve script |
| Maskeleme sonrası doğrulama yapılıyor. | DBA | Doğrulama sorguları ve sonuçları |
| Test ortamına erişim, maskeleme bitmeden açılmıyor. | DBA | İş akışı |
| Yeni kolonlar envantere ekleniyor. | Yazılım ekibi | Değişiklik yönetimi süreci |
Aryasoft ile Veri Maskeleme
Aryasoft, PostgreSQL ve SQL Server ortamlarınızdaki kişisel verileri tespit eder, kolon bazında maskeleme kurallarını sizinle birlikte belirler ve test ortamlarını otomatik olarak maskelenmiş veriyle yenileyen bir süreç kurar. Veri yönetişimiyle ilgili saha gözlemlerimizi veri yönetişimi yazımızda, PostgreSQL’in diğer güvenlik katmanlarını PostgreSQL güvenlik rehberimizde anlattık. Ayrıntılar PostgreSQL hizmetleri sayfamızda.
Sıkça Sorulan Sorular
Kaynaklar
Bu rehberdeki teknik bilgiler Kasım 2026’da aşağıdaki kaynaklarla karşılaştırıldı.
- PostgreSQL dokümantasyonu: CREATE VIEW
- PostgreSQL dokümantasyonu: Privileges
- PostgreSQL Anonymizer dokümantasyonu
- AWS: Using dynamic masking with Aurora PostgreSQL (pg_columnmask)
- Kişisel Verileri Koruma Kurumu
Veri Maskeleme
Test ortamlarınızı kişisel veriden arındırın
Aryasoft kişisel verileri tespit eder, maskeleme kurallarını sizinle birlikte belirler ve test ortamlarını otomatik olarak maskelenmiş veriyle yenileyen bir süreç kurar.