Özellikle bankalar, sigorta şirketleri ile Aselsan, Tubitak gibi askeri ve devlet bazlı kurumlar için verinin ve veritabanının güvenliği olmazsa olmazdır.
Teknolojinin akıl almaz bir hızda gelişmesi bilgi alışverişi yapan ve veriyi güvenli bir şekilde saklamak isteyen insanlar ve Veritabanı Yönetim Sistemleri için çeşitli sorunları da beraberinde getirmiştir. Özellikle Bankalar, Sigorta şirketleri ve Aselsan,Tubitak gibi Askeri ve Devlet bazlı kurumlar için Verinin ve Veritabanının Güvenliği olmazsa olmazdır. O yüzden Oracle gibi dünyada Veritabanı teknolojileri konusunda söz sahibi olan Firmalar da Security konusunda bir çok çözüm geliştirmişlerdir.
Oracle da Veritabanında Security için başlıca önerdiği çözümler aşağıdaki gibidir.
1.Transparent Data Encryption 2.Data Redaction 3.Data Masking 4.Database Firewall 5.Privileged User Control 6.Database auditing and Reporting
Ben bu yazımda Transparent Data Encryption ve Data Redactionı anlatıyor olacağım.
Transparent Data Encryption ( TDE ) özelliği ilk defa Oracle 10g R2 sürümüyle tanıtılmış olup Enterprise edition da Advanced Security lisansıyla beraber kullanılabilen bir özelliktir.
Bildiğiniz gibi Oracle veritabanında tüm veriler fiziksel olarak Datafile larda tutulmaktadır. Kurumların bazı özel verilerinin kötü amaçlı kimseler tarafından erişilmesini önlemek için ise Oracle verileri fiziksel olarak saklandıkları Datafile lardada Şifreleyerek tutulmasını önermektedir. Bu durumda Datafile’lara direk erişildiğinde yada Backuplara erişildiğinde bile özel veriler yetkisiz kişilerin eline geçmemiş olur.
Oracle Transparent Data Encryption özelliği ile Wallet içine gömdüğümüz Master key ile Tablespace,tablo ve kolon seviyesinde verileri şifreleyebiliriz. Wallet açık olduğu müddetçe veritabanındaki yetkili kullanıcılar verileri görebilir wallet kapalı ise veriler görünmeyecektir.
Oracle Data Redaction ile bizim için kritik olan verileri yetkisiz ve görmesini istemediğimiz userlara farklı şekilde gösterebiliriz. Şunu unutmayın Data Redaction yukarıda bahsetmiş olduğum Transparent data Encryption özelliği gibi veriyi fiziksel diskte bir değişikliğe uğratMAZ sadece yetkisi kullanıcılar verileri görmek istediğinde veriler maskelenerek yada değiştirilerek yetkisiz kullanıcılara sunar.
Oracle Data Redaction özellikle yetkisiz kullanıcıların veriyi yanlış görmesi yönüyle çok güçlü bir özelliktir. Şirketlerde son yıllarda güvenlik zaafiyetlerinden ötürü çok sorun çıkmakta bazen bu konunun sonu mahkemede bitmektedir.
Bu yüzdendir ki hepimiz yaşamışızdır Çağrı merkezleri aradığında Anne kızlık soyadınızın sadece 1 ve 3.karakteri yada 4 ve 5.karakteri nedir diye sorarlar. Çoğu kimse bunu saçma bulur ve tamamını söyler yada bir kısım insan aslında Çağrı merkezi yetkilisinin bunu gördüğünü ve bilerek birkaç karakteri sorduğunu düşünür. Yada beni niye o an düşünmeye itiyosun soyadın 1.ve 3.karakteri yada 2.ve 4.karakteri hangisidir diye uğraştırıyorsun diye düşünür. Ancak gerçek öyle değildir, çünkü çağrı merkezindeki çalışan gerçektende o verinin sadece bir kaç karakterini görür geri kalan kısım x yada * karakteriyle kapatılmıştır. Doğru olanda budur, çünkü Çağrı merkezi yetkilisi dahil olmak üzere Hiç kimsenin müşterinin anne kızlık soyadı, Kredi kartı bilgileri yada banka bilgileri gibi mahrem bilgileri bilmesine hakkıda yok gerekte yoktur.
Veride fiziksel değişiklik yapmadan, wallet yönetimi gibi karmaşık konulara girmeden veriyi yetkisiz kullanıcılara karşı güvenilir hale getirebilmenin tek yolu da Oracle Data Redactiondır. Bunun için Oracle ın DBMS_REDACT paketiyle Redaction yapabilirsiniz.
Redaction yaparken Full, Partial, Regular Expression ve Random olarak aşağıdaki gibi farklı seçenekleri kullanabilirsiniz.
Oracle Data Redaction işleminin Backup / Restore, Upgrade,Patch gibi işlemlere herhangi bir etkiside bulunmamaktadır. Verilerimiz Diskte ve talep edildiğinde Buffer cache de yine raw haliyle geliyor ancak yetkisiz ( Bu yazımda kullanmış olduğum örnekteki tek yetkili kullanıcı MEHMET kullanıcısı olacak bu user ın dışındaki SALIH ve DEVECI userları Data Redaction a maruz kalacaklardır. ) kullanıcılara tanımlanmış farklı kurallara göre veriler maskeleniyor kısaca değiştiriliyor.
Redaction yaparken Full, Partial, Regular Expression ve Random olarak aşağıdaki gibi farklı seçenekleri kullanabilirsiniz. Ben genelde daha güvenli olması için Random metodunu kullanmaktayım. Random metodunda redaction yapılacak kolondan Runtime da çekilen her sorguda farklı veri gelmektedir buda Verilerimizin güvenliği açısından çok önemlidir.
Yukarda bahsetmiş olduğum kredi kartı ve Çağrı merkezindeki senaryoyu aşağıda örneklendirmeyle yapıp konuyu kapatıyor olacağım. Öncellikle aşağıdaki gibi örnek bir veri seti oluşturuyorum.
CREATE TABLE mehmet.kart_bilgileri ( id NUMBER NOT NULL, musteri_id NUMBER NOT NULL, kart_no NUMBER NOT NULL, kart_string VARCHAR2(19) NOT NULL, bitis_tarihi DATE NOT NULL, guvenlik_no NUMBER NOT NULL, gecerlilik_tarihi DATE, CONSTRAINT mehmet.kart_bilgileri_pk PRIMARY KEY (id) ); INSERT INTO mehmet.kart_bilgileri VALUES (1, 1000, 2013201320132013, '2013-2013-2013-2013', TRUNC(ADD_MONTHS(SYSDATE,12)), 123, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (2, 1001, 1989198919891989, '1989-1989-1989-1989', TRUNC(ADD_MONTHS(SYSDATE,12)), 234, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (3, 1002, 2018201820182018, '2018-2018-2018-2018', TRUNC(ADD_MONTHS(SYSDATE,12)), 345, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (4, 1003, 1453145314531453, '1453-1453-1453-1453', TRUNC(ADD_MONTHS(SYSDATE,12)), 456, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (5, 1004, 5710571057105710, '5710-5710-5710-5710', TRUNC(ADD_MONTHS(SYSDATE,12)), 567, NULL); COMMIT;
Bu örnek tabloyu sorguladığımızda aşağıdaki gibi gelecektir.
YKart_no kolonuna aşağıdaki gibi Full redaction yapıyoruz.
BEGIN DBMS_REDACT.add_policy( object_schema => 'mehmet', object_name => 'mehmet.kart_bilgileri', column_name => 'kart_no', policy_name => 'redact_kart_info', function_type => DBMS_REDACT.full, expression => '1=1' ); END; /
Redaction sonrası Mehmet ve Salih kullanıcısıyla ayrı ayrı sorguladığımızda aşağıda görüldüğü gibi Mehmet kullanıcısı Kart_noyu doğru görürken,
Salih kullanıcısı DBMS_REDACT.full un o anki default değeri olan 0 ı görmektedir.
Bu kolona Full yerine Partial olarak 12 karakterine 1 yazdıralım ve yetkisiz kullanıcılar bu kısmı sadece 1 görsün dersek aşağıdaki gibi Redaction yapmamız gerekiyor.
BEGIN DBMS_REDACT.alter_policy ( object_schema => 'mehmet', object_name => 'mehmet.kart_bilgileri', policy_name => 'redact_kart_info', action => DBMS_REDACT.modify_column, column_name => 'kart_no', function_type => DBMS_REDACT.partial, function_parameters => '1,1,12' ); END; /
Redaction yaptıktan sonra Mehmet ve Salih Kullanıcılarında aynı sorguyu çekince gelen veriler aşağıdaki gibi olacaktır.
Mehmet Kullanicisi:
Salih Kullanıcısı:
Kart String kolonuna da aşağıdaki gibi Partial Redaction yapabiliriz. Bu yöntemde piyasada çok fazla kullanılır Kredi kartının son 4 hanesi dışındakilerin yetkisiz kullanıcılar tarafından görünmesi amacıyla çokça kullanılır.
BEGIN DBMS_REDACT.alter_policy ( object_schema => 'mehmet', object_name => 'mehmet.kart_bilgileri', policy_name => 'redact_kart_info', action => DBMS_REDACT.add_column, column_name => 'kart_string', function_type => DBMS_REDACT.partial, function_parameters => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,#,1,12' ); END; /
Bu Redactionı yaptıktan sonra Mehmet ve Salih kullanıcısıyla ayrı ayrı sorguladığımızda Salih kullanıcısının kart_no ve kart_string kolonunu Redactiona tabi olmuş bir şekilde gördüğünü göreceğiz.
Ve son olarak Güvenlik no kolonuna da Random olarak Redaction yapmak için aşağıdaki scripti çalıştırıyoruz.
BEGIN DBMS_REDACT.alter_policy ( object_schema => 'mehmet', object_name => 'kart_bilgileri', policy_name => 'redact_card_info', action => DBMS_REDACT.add_column, column_name => 'guvenlik_no', function_type => DBMS_REDACT.RANDOM ); END; /
Bu özelliği kullanmak için Lisansınızın Enterprise Edition olması ve ayrıca bunun üstüne de Advanced Security Option lisansınızın bulunması gerekiyor. Bunun da Core başına 15000$ olduğunu unutmadan kullanmanızı tavsiye ederim.
Sizde Kurum olarak Security konusunda endişeliyseniz ve çözüm arıyorsaniz, Oracle Database Security danışmanlığı ve eğitimi almak isterseniz piyasanın en deneyimli ve Oracle Certified Expert danışmanlarımız sizinle iletişime geçebilir.
Teknolojinin akıl almaz bir hızda gelişmesi bilgi alışverişi yapan ve veriyi güvenli bir şekilde saklamak isteyen insanlar ve Veritabanı Yönetim Sistemleri için çeşitli sorunları da beraberinde getirmiştir. Özellikle Bankalar, Sigorta şirketleri ve Aselsan,Tubitak gibi Askeri ve Devlet bazlı kurumlar için Verinin ve Veritabanının Güvenliği olmazsa olmazdır. O yüzden Oracle gibi dünyada Veritabanı teknolojileri konusunda söz sahibi olan Firmalar da Security konusunda bir çok çözüm geliştirmişlerdir.
Oracle da Veritabanında Security için başlıca önerdiği çözümler aşağıdaki gibidir.
1.Transparent Data Encryption 2.Data Redaction 3.Data Masking 4.Database Firewall 5.Privileged User Control 6.Database auditing and Reporting
Ben bu yazımda Transparent Data Encryption ve Data Redactionı anlatıyor olacağım.
Transparent Data Encryption ( TDE ) özelliği ilk defa Oracle 10g R2 sürümüyle tanıtılmış olup Enterprise edition da Advanced Security lisansıyla beraber kullanılabilen bir özelliktir.
Bildiğiniz gibi Oracle veritabanında tüm veriler fiziksel olarak Datafile larda tutulmaktadır. Kurumların bazı özel verilerinin kötü amaçlı kimseler tarafından erişilmesini önlemek için ise Oracle verileri fiziksel olarak saklandıkları Datafile lardada Şifreleyerek tutulmasını önermektedir. Bu durumda Datafile’lara direk erişildiğinde yada Backuplara erişildiğinde bile özel veriler yetkisiz kişilerin eline geçmemiş olur.
Oracle Transparent Data Encryption özelliği ile Wallet içine gömdüğümüz Master key ile Tablespace,tablo ve kolon seviyesinde verileri şifreleyebiliriz. Wallet açık olduğu müddetçe veritabanındaki yetkili kullanıcılar verileri görebilir wallet kapalı ise veriler görünmeyecektir.
Oracle Data Redaction ile bizim için kritik olan verileri yetkisiz ve görmesini istemediğimiz userlara farklı şekilde gösterebiliriz. Şunu unutmayın Data Redaction yukarıda bahsetmiş olduğum Transparent data Encryption özelliği gibi veriyi fiziksel diskte bir değişikliğe uğratMAZ sadece yetkisi kullanıcılar verileri görmek istediğinde veriler maskelenerek yada değiştirilerek yetkisiz kullanıcılara sunar.
Oracle Data Redaction özellikle yetkisiz kullanıcıların veriyi yanlış görmesi yönüyle çok güçlü bir özelliktir. Şirketlerde son yıllarda güvenlik zaafiyetlerinden ötürü çok sorun çıkmakta bazen bu konunun sonu mahkemede bitmektedir.
Bu yüzdendir ki hepimiz yaşamışızdır Çağrı merkezleri aradığında Anne kızlık soyadınızın sadece 1 ve 3.karakteri yada 4 ve 5.karakteri nedir diye sorarlar. Çoğu kimse bunu saçma bulur ve tamamını söyler yada bir kısım insan aslında Çağrı merkezi yetkilisinin bunu gördüğünü ve bilerek birkaç karakteri sorduğunu düşünür. Yada beni niye o an düşünmeye itiyosun soyadın 1.ve 3.karakteri yada 2.ve 4.karakteri hangisidir diye uğraştırıyorsun diye düşünür. Ancak gerçek öyle değildir, çünkü çağrı merkezindeki çalışan gerçektende o verinin sadece bir kaç karakterini görür geri kalan kısım x yada * karakteriyle kapatılmıştır. Doğru olanda budur, çünkü Çağrı merkezi yetkilisi dahil olmak üzere Hiç kimsenin müşterinin anne kızlık soyadı, Kredi kartı bilgileri yada banka bilgileri gibi mahrem bilgileri bilmesine hakkıda yok gerekte yoktur.
Veride fiziksel değişiklik yapmadan, wallet yönetimi gibi karmaşık konulara girmeden veriyi yetkisiz kullanıcılara karşı güvenilir hale getirebilmenin tek yolu da Oracle Data Redactiondır. Bunun için Oracle ın DBMS_REDACT paketiyle Redaction yapabilirsiniz.
Redaction yaparken Full, Partial, Regular Expression ve Random olarak aşağıdaki gibi farklı seçenekleri kullanabilirsiniz.
Oracle Data Redaction işleminin Backup / Restore, Upgrade,Patch gibi işlemlere herhangi bir etkiside bulunmamaktadır. Verilerimiz Diskte ve talep edildiğinde Buffer cache de yine raw haliyle geliyor ancak yetkisiz ( Bu yazımda kullanmış olduğum örnekteki tek yetkili kullanıcı MEHMET kullanıcısı olacak bu user ın dışındaki SALIH ve DEVECI userları Data Redaction a maruz kalacaklardır. ) kullanıcılara tanımlanmış farklı kurallara göre veriler maskeleniyor kısaca değiştiriliyor.
Redaction yaparken Full, Partial, Regular Expression ve Random olarak aşağıdaki gibi farklı seçenekleri kullanabilirsiniz. Ben genelde daha güvenli olması için Random metodunu kullanmaktayım. Random metodunda redaction yapılacak kolondan Runtime da çekilen her sorguda farklı veri gelmektedir buda Verilerimizin güvenliği açısından çok önemlidir.
Yukarda bahsetmiş olduğum kredi kartı ve Çağrı merkezindeki senaryoyu aşağıda örneklendirmeyle yapıp konuyu kapatıyor olacağım. Öncellikle aşağıdaki gibi örnek bir veri seti oluşturuyorum.
CREATE TABLE mehmet.kart_bilgileri ( id NUMBER NOT NULL, musteri_id NUMBER NOT NULL, kart_no NUMBER NOT NULL, kart_string VARCHAR2(19) NOT NULL, bitis_tarihi DATE NOT NULL, guvenlik_no NUMBER NOT NULL, gecerlilik_tarihi DATE, CONSTRAINT mehmet.kart_bilgileri_pk PRIMARY KEY (id) ); INSERT INTO mehmet.kart_bilgileri VALUES (1, 1000, 2013201320132013, '2013-2013-2013-2013', TRUNC(ADD_MONTHS(SYSDATE,12)), 123, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (2, 1001, 1989198919891989, '1989-1989-1989-1989', TRUNC(ADD_MONTHS(SYSDATE,12)), 234, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (3, 1002, 2018201820182018, '2018-2018-2018-2018', TRUNC(ADD_MONTHS(SYSDATE,12)), 345, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (4, 1003, 1453145314531453, '1453-1453-1453-1453', TRUNC(ADD_MONTHS(SYSDATE,12)), 456, NULL); INSERT INTO mehmet.kart_bilgileri VALUES (5, 1004, 5710571057105710, '5710-5710-5710-5710', TRUNC(ADD_MONTHS(SYSDATE,12)), 567, NULL); COMMIT;
Bu örnek tabloyu sorguladığımızda aşağıdaki gibi gelecektir.
YKart_no kolonuna aşağıdaki gibi Full redaction yapıyoruz.
BEGIN DBMS_REDACT.add_policy( object_schema => 'mehmet', object_name => 'mehmet.kart_bilgileri', column_name => 'kart_no', policy_name => 'redact_kart_info', function_type => DBMS_REDACT.full, expression => '1=1' ); END; /
Redaction sonrası Mehmet ve Salih kullanıcısıyla ayrı ayrı sorguladığımızda aşağıda görüldüğü gibi Mehmet kullanıcısı Kart_noyu doğru görürken,
Salih kullanıcısı DBMS_REDACT.full un o anki default değeri olan 0 ı görmektedir.
Bu kolona Full yerine Partial olarak 12 karakterine 1 yazdıralım ve yetkisiz kullanıcılar bu kısmı sadece 1 görsün dersek aşağıdaki gibi Redaction yapmamız gerekiyor.
BEGIN DBMS_REDACT.alter_policy ( object_schema => 'mehmet', object_name => 'mehmet.kart_bilgileri', policy_name => 'redact_kart_info', action => DBMS_REDACT.modify_column, column_name => 'kart_no', function_type => DBMS_REDACT.partial, function_parameters => '1,1,12' ); END; /
Redaction yaptıktan sonra Mehmet ve Salih Kullanıcılarında aynı sorguyu çekince gelen veriler aşağıdaki gibi olacaktır.
Mehmet Kullanicisi:
Salih Kullanıcısı:
Kart String kolonuna da aşağıdaki gibi Partial Redaction yapabiliriz. Bu yöntemde piyasada çok fazla kullanılır Kredi kartının son 4 hanesi dışındakilerin yetkisiz kullanıcılar tarafından görünmesi amacıyla çokça kullanılır.
BEGIN DBMS_REDACT.alter_policy ( object_schema => 'mehmet', object_name => 'mehmet.kart_bilgileri', policy_name => 'redact_kart_info', action => DBMS_REDACT.add_column, column_name => 'kart_string', function_type => DBMS_REDACT.partial, function_parameters => 'VVVVFVVVVFVVVVFVVVV,VVVV-VVVV-VVVV-VVVV,#,1,12' ); END; /
Bu Redactionı yaptıktan sonra Mehmet ve Salih kullanıcısıyla ayrı ayrı sorguladığımızda Salih kullanıcısının kart_no ve kart_string kolonunu Redactiona tabi olmuş bir şekilde gördüğünü göreceğiz.
Ve son olarak Güvenlik no kolonuna da Random olarak Redaction yapmak için aşağıdaki scripti çalıştırıyoruz.
BEGIN DBMS_REDACT.alter_policy ( object_schema => 'mehmet', object_name => 'kart_bilgileri', policy_name => 'redact_card_info', action => DBMS_REDACT.add_column, column_name => 'guvenlik_no', function_type => DBMS_REDACT.RANDOM ); END; /
Bu özelliği kullanmak için Lisansınızın Enterprise Edition olması ve ayrıca bunun üstüne de Advanced Security Option lisansınızın bulunması gerekiyor. Bunun da Core başına 15000$ olduğunu unutmadan kullanmanızı tavsiye ederim.
Sizde Kurum olarak Security konusunda endişeliyseniz ve çözüm arıyorsaniz, Oracle Database Security danışmanlığı ve eğitimi almak isterseniz piyasanın en deneyimli ve Oracle Certified Expert danışmanlarımız sizinle iletişime geçebilir.