İnterbase (xxx.gdb) Şifreleme

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Bir önceki mesajımda da belirttiğim gibi SYSDBA'dan farklı bir kullanıcı adı ile oluşturulan bir veritabanına

Kod: Tümünü seç

CREATE ROLE SYSDBA;
şeklinde SYSDBA adında bir ROL eklenir ise bu veritabanı başka bir makinaya kopyalansa dahi hiçbir şekilde SYSDBA kullanıcı adı ile açılmayacaktır. Deneyin ve görün.
Kolay Gelsin.
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Bu konuda yazılmış bir fonksiyon buldum. Umarım arkadaşların işine yarar.

Kod: Tümünü seç

uses IBSQL, IBDatabase,IBQuery;


function  BikinRole_SYSDBA(namafile,RoleOwner:string):Boolean;
var
  IBDb: TIBDatabase;
  IBTrans: TIBTransaction;
  IBSQL: TIBSQL;
begin
  Result:=False;
  IBTrans:=TIBTransaction.Create(nil);
  IBDb:= TIBDatabase.Create(nil);
  with IBDb do
  begin
  DefaultTransaction:=IBTrans;
  DatabaseName:=namafile;
  LoginPrompt:=False;
  Params.Clear;
  Params.Add('user_name='+RoleOwner);  // modified admin name
  Params.Add('password=masterkey'); // password
  end;
  IBSQL:= TIBSQL.Create(nil);
  with IBSQL do
  begin
  Transaction:=IBTrans;
  Database:=IBDb;
  SQL.Clear;
  SQL.Add('create ROLE SYSDBA');
  end;

  try  // buka security db dengan modified admin account
  IBDb.Open;
  except
  ShowMessage('Error login ke target DB');
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // create role SYSDBA di target DB
  try
  IBTrans.StartTransaction;
  IBSQL.ExecQuery;
  IBTrans.Commit;
  except
  IBTrans.Rollback;
  ShowMessage('role SYSDBA sdh ada di target DB');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // release resources
  IBDb.Close;
  IBSQL.Free;
  IBDb.Free;
  IBTrans.Free;
  Result:=True;
end;



procedure ProtectDatabase(namafile,RoleOwner:string);
var
  IBDb: TIBDatabase;
  IBTrans: TIBTransaction;
  IBSQL: TIBSQL;
begin
  IBTrans:=TIBTransaction.Create(nil);
  IBDb:= TIBDatabase.Create(nil);
  with IBDb do
  begin
  DefaultTransaction:=IBTrans;
  DatabaseName:='C:\\Program Files\\Firebird\\Firebird_1_5\\security.fdb';
  LoginPrompt:=False;
  Params.Clear;
  Params.Add('user_name=SYSDBA');  // default admin name
  Params.Add('password=masterkey'); // password
  end;
  IBSQL:= TIBSQL.Create(nil);
  with IBSQL do
  begin
  Transaction:=IBTrans;
  Database:=IBDb;
  SQL.Clear;
  // ganti admin ke RoleOwner
  SQL.Add('update USERS set USER_NAME = '+QuotedStr(RoleOwner)
    + ' where USER_NAME = '+ QuotedStr('SYSDBA'));
  end;

  try  // buka security db dengan default admin/SYSDBA data
  IBDb.Open;
  except
  ShowMessage('Nama Admin/password telah berubah dari default SYSDBA');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // ExecSQL : ganti nama admin dari SYSDBA menjadi newAdminName
  try
  IBTrans.StartTransaction;
  IBSQL.ExecQuery;
  IBTrans.Commit;
  except
  ShowMessage('Ada error.... quiting');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  if BikinRole_SYSDBA(namafile,RoleOwner) then
  ShowMessage('Berhasil : target DB bakalan tdk dpt lagi dibuka dengan SYSDBA')
   else
  ShowMessage('Ada error....');


  IBSQL.SQL.Clear;
  // kembalikan lagi admin ke SYSDBA
  IBSQL.SQL.Add('update USERS set USER_NAME = '+QuotedStr('SYSDBA')
    + ' where USER_NAME = '+ QuotedStr(RoleOwner));
  try
  IBTrans.StartTransaction;
  IBSQL.ExecQuery;
  IBTrans.Commit;
  except
  ShowMessage('Ada error.... quiting');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  //release resources
  IBDb.Close;
  IBSQL.Free;
  IBDb.Free;
  IBTrans.Free;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ProtectDatabase('C:\\SAMPLE.GDB','TEMP_DBA');
end;

uses IBSQL, IBDatabase,IBQuery;


function  DropRole_SYSDBA(namafile,RoleOwner:string):Boolean;
var
  IBDb: TIBDatabase;
  IBTrans: TIBTransaction;
  IBSQL: TIBSQL;
begin
  Result:=False;
  IBTrans:=TIBTransaction.Create(nil);
  IBDb:= TIBDatabase.Create(nil);
  with IBDb do
  begin
  DefaultTransaction:=IBTrans;
  DatabaseName:=namafile;
  LoginPrompt:=False;
  Params.Clear;
  Params.Add('user_name='+RoleOwner);  // modified admin name ( Owner of SYSDBA role)
  Params.Add('password=masterkey'); // password
  end;
  IBSQL:= TIBSQL.Create(nil);
  with IBSQL do
  begin
  Transaction:=IBTrans;
  Database:=IBDb;
  SQL.Clear;
  SQL.Add('drop ROLE SYSDBA'); // buang role ini
  end;

  try  // buka target db dengan admin = RoleOwner
  IBDb.Open;
  except
  ShowMessage('Error login ke target DB');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // execute SQL : buang role SYSDBA dari target DB
  try
  IBTrans.StartTransaction;
  IBSQL.ExecQuery;
  IBTrans.Commit;
  except
  ShowMessage('Ada error.... quiting');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // release resources
  IBDb.Close;
  IBSQL.Free;
  IBDb.Free;
  IBTrans.Free;
  Result:=True;
end;

function  Get_SYSDBA_RoleOwner(namafile,TempAdminName:string):string;
var
  IBDb: TIBDatabase;
  IBTrans: TIBTransaction;
  IBQuery: TIBQuery;
begin
  Result:='';
  IBTrans:=TIBTransaction.Create(nil);
  IBDb:= TIBDatabase.Create(nil);
  with IBDb do
  begin
  DefaultTransaction:=IBTrans;
  DatabaseName:=namafile;
  LoginPrompt:=False;
  Params.Clear;
  Params.Add('user_name='+TempAdminName);  // modified admin name
  Params.Add('password=masterkey'); // password
  end;
  IBQuery:= TIBQuery.Create(nil);
  with IBQuery do
  begin
  Transaction:=IBTrans;
  Database:=IBDb;
  SQL.Clear;
  // temukan Owner dari role ini
  SQL.Add('select RDB$OWNER_NAME from RDB$ROLES where RDB$ROLE_NAME='
    +QuotedStr('SYSDBA'));
  end;

  try  // buka target db dengan temporary admin account
  IBDb.Open;
  except
  ShowMessage('Error login ke target DB');
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  try
  IBTrans.StartTransaction;
  IBQuery.Open ;
  if IBQuery.Eof and IBQuery.Bof then
   Result:=''
  else
   // nama dari Owner si role SYSDBA
   Result:= Trim(IBQuery.Fields[0].AsString);
  IBTrans.Commit;
  except
  ShowMessage('Ada error.... quiting');
  IBQuery.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // release resources
  IBDb.Close;
  IBQuery.Free;
  IBDb.Free;
  IBTrans.Free;
end;


procedure UnProtectDatabase(namafile:string);
var
  IBDb: TIBDatabase;
  IBTrans: TIBTransaction;
  IBSQL: TIBSQL;
  RoleOwner,LastAdmin:string;
begin
  IBTrans:=TIBTransaction.Create(nil);
  IBDb:= TIBDatabase.Create(nil);
  with IBDb do
  begin
  DefaultTransaction:=IBTrans;
  DatabaseName:='C:\\Program Files\\Firebird\\Firebird_1_5\\security.fdb';
  LoginPrompt:=False;
  Params.Clear;
  Params.Add('user_name=SYSDBA');  // default admin name
  Params.Add('password=masterkey'); // password
  end;
  IBSQL:= TIBSQL.Create(nil);
  with IBSQL do
  begin
  Transaction:=IBTrans;
  Database:=IBDb;
  SQL.Clear;
  SQL.Add('update USERS set USER_NAME = '
    + QuotedStr('TEMP_DBA')+ ' where USER_NAME = '
    + QuotedStr('SYSDBA'));
  end;

  try  // buka security db dengan default admin/SYSDBA data
  IBDb.Open;
  except
  ShowMessage('Nama Admin/password telah berubah dari default SYSDBA');
  IBTrans.Free;
  IBDb.Free;
  IBSQL.Free;
  exit;
  end;

  // coba ganti nama admin dari SYSDBA menjadi newAdminName
  try
  IBTrans.StartTransaction;
  IBSQL.ExecQuery;
  IBTrans.Commit;
  LastAdmin:='TEMP_DBA';
  except
  ShowMessage('Ada error.... quiting');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  // temukan nama owner role SYSDBA di target DB - login ke target DB dgn temporer account
  RoleOwner:=Get_SYSDBA_RoleOwner(namafile,'TEMP_DBA');
  if RoleOwner<>'' then
  begin
  ShowMessage('Owner dari SYSDBA role adalah :'+RoleOwner);
  IBSQL.SQL.Clear;
  // rubah security db admin ke RoleOwner spy role tsb bisa di-drop
  IBSQL.SQL.Add('update USERS set USER_NAME = '
    + QuotedStr(RoleOwner)+ ' where USER_NAME = '
    + QuotedStr('TEMP_DBA'));
  try
   IBTrans.StartTransaction;
   IBSQL.ExecQuery;
   IBTrans.Commit;
   LastAdmin:=RoleOwner;
  except
   ShowMessage('Ada error.... quiting');
   IBSQL.Free;
   IBTrans.Free;
   IBDb.Free;
   exit;
  end;

  if DropRole_SYSDBA(namafile,RoleOwner)then
   ShowMessage('Target DB bakalan bisa dibuka dgn admin SYSDBA')
  else
   ShowMessage('Ada error');
  end
  else
  ShowMessage('Tdk ditemukan role SYSDBA di target DB');

  IBSQL.SQL.Clear;
  IBSQL.SQL.Add('update USERS set USER_NAME = '
    + QuotedStr('SYSDBA')+ ' where USER_NAME = '
    + QuotedStr(LastAdmin));
  try  // kembalikan lagi admin ke SYSDBA
  IBTrans.StartTransaction;
  IBSQL.ExecQuery;
  IBTrans.Commit;
  except
  ShowMessage('Ada error.... quiting');
  IBSQL.Free;
  IBTrans.Free;
  IBDb.Free;
  exit;
  end;

  //release resources
  IBDb.Close;
  IBSQL.Free;
  IBDb.Free;
  IBTrans.Free;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  UnProtectDatabase('C:\\SAMPLE.GDB');
end;

shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Deneme yanılma yaptım. Yeniden fb yi kurunca yine db ye ulaşabiliyorum. Anlamadığım nerde yanlış yapıyorum. Tamamen uninstall edip security.fdb yi siliyorum tekrar kuruyorum. Bakıyorum ki bizim şifre filan gitmiş. sysdba geçerli tekrar. Bence bu konu çözülmeyecek fb nin bu versiyonu ile.
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Bu konu hiç bir zaman çözülmeyecek (tabi benim acizane görüşüm).
Şifreler kodlamalar bir şekilde çözülebildiği için FB yi geliştirenler uğraşmak istemiyor. Hele hele açık kaynak kodlu bir projede şifreleme yada kodlamanın çözülmesi daha kolay olacaktır. Çünkü nasıl yapıldığını kolayca öğrenebiliyorsunuz.

Bilmiyorum; belki geliştiricilerin bu konuda kendi çözümlerini kendileri üretmeleri gerekiyor.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

poshet303 yazdı:Bu konu hiç bir zaman çözülmeyecek (tabi benim acizane görüşüm).
Şifreler kodlamalar bir şekilde çözülebildiği için FB yi geliştirenler uğraşmak istemiyor. Hele hele açık kaynak kodlu bir projede şifreleme yada kodlamanın çözülmesi daha kolay olacaktır. Çünkü nasıl yapıldığını kolayca öğrenebiliyorsunuz.

Bilmiyorum; belki geliştiricilerin bu konuda kendi çözümlerini kendileri üretmeleri gerekiyor.
Nerden böyle bir kanıya vardınız? Adamlar bu konuyu 3.0'da yapacaklarına dair yol haritasını ta ne zaman koydular. Öncelikler farklı olabilir.

Ayrıca yukarda mucit arkadaşımız işe yarar, ürettiği çözümü bizlerle paylaştı. Bence o zamana kadar bu çözümü kullanmak yeterli olacaktır.

Kolay gelsin.
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Efendim malumaliniz paradox ta tablo bazında şifreleme vardı. Lakin ne işe yarıyordu. Arka kapısı olan bir şifreleme. Access te, ms sql serverda da şifreleme var. google da aratıığınıza bu şifreleri çözen yığınla araç bulabiliyorsunuz. Ki bu yazılımlar açık kaynaklı olmadığı halde. (yukarda açık kaynak yazılımlarda bu işin neden daha zor olduğunu anlattım, ki arife tarih gerekmezken)
Şifreler kodlamalar bir şekilde çözülebildiği için FB yi geliştirenler uğraşmak istemiyor
evet burda tahmin konusunda abarttığımın bende farkındayım. Yol haritasında database seviyesinde erişim kontrolü ve geliştirilmiş güvenlik yönetimi var. Muhtemelen bu işler yapılacak. Ama ne zaman. Benim tahminim çok uzun sürecek. Çünkü FB geliştiricileri de biliyor ki, yapabilecekleri en iyi güvenlik sistemi bile yeterince güvenli olmayacak. Tabi bu bir tahmin. tartışacak bir şey yok. Bekleyip göreceğiz.

@Mucit arkadaşımızın çözümü de malesef çözüm değil. Zaten bu çözümün ne kadar @Mucit e ait olduğundan da emin değilim. Yaygın olarak biliniyor çünkü. Belki her kez @Mucit ten öğrenmiştir.


Some have reported limited success in this respect by creating an SQL role name of SYSDBA and making sure it does not have access to the database objects.

However it does not really solve the problem. The database file can be viewed with a hex viewer or similar utility and the list of available user names discovered. (Discovering the owners of the database objects would be particularly useful.) Once known, these names can be added to the new server and used directly.
http://www.firebirdsql.org/manual/fbmet ... ution.html adresinden alındı.
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Poshet ten Alıntı:

Some have reported limited success in this respect by creating an SQL role name of SYSDBA and making sure it does not have access to the database objects.

However it does not really solve the problem. The database file can be viewed with a hex viewer or similar utility and the list of available user names discovered. (Discovering the owners of the database objects would be particularly useful.) Once known, these names can be added to the new server and used directly.
Bu yazıyı ben de okudum. İki mesaj önce gönderdiğm fonksiyonda sysdba role ünü ekliyor. Bu işi basit hale getiren bir fonk. yazmış. Ama hex editör filan kullanmadan firebird ü uninstall edin. Security.fdb yi de silin. Ve yeniden kurun. Yine sysdba ile bağlanabilirsiniz. Yoksa ben yanlış bir işlem mi yapıyorum. Birisi şu işi adım adım anlatırsa sevinirim.
Benim anladığım
1. Yeni kullanıcı oluştur.
2.Bu kullanıcıya tüm hakları ver.
3.Bu kullanıcı adı ve şifresi ile yeni db oluştur.
4. create role sysdba;
5.sysdba kullanıcısını sil.
??
mucit
Üye
Mesajlar: 83
Kayıt: 24 Kas 2004 10:41
Konum: BURSA

Mesaj gönderen mucit »

Merhaba,

Burada bahsettiğimiz şey veritabanının tamamen açılamaz %100 güvenli bir veritabanı olması değil. Sadece SYSDBA ile açılamaması. Yukarıda bahsettiğim şekilde oluşturulan bir veritabanını başka bir bilgisayara kopyalasanız da security.fdb dosyasını silerek yeniden kopyalasanızda hiç bir şekilde "SYSDBA" kullanıcı adı ile açamazsınız. Veritabanına ancak "SYSDBA" dışında bir kullanıcı adı ile bağlanabilirsiniz.
Çünkü Firebird SYSDBA adında bir ROLE olan veritabanına aynı kullanıcı adı ile erişmenize izin vermez.

İsteyen arkadaşlara kendi oluşturduğum veritabanını e-mail yolu ile gönderebilirim. Sizde kendi bilgisayarınızda benim veritabanı dosyamı SYSDBA ile açıp açamadığınızı kontrol eder ve gerçekten bu yöntemin işe yarayıp yaramadığını kontrol etmiş olursunuz.

Kolay gelsin.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

başka bir root kullanıcısı yaratılırsa (sysdba ile aynı yetkiye sahip) o zaman yine erişilebilir.
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Tamam bana gönderir misin mucit arkadaşım. Mail:faik37@gmail.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

mkysoft yazdı:başka bir root kullanıcısı yaratılırsa (sysdba ile aynı yetkiye sahip) o zaman yine erişilebilir.
Yeni bir kullanıcı açmak için mevcut kullanıcı ile erişmek gerekmiyor mu :?: Erişilecek özel kullanıcı adını biliyorsan zaten tam erişim sende demektir, çünkü kullanıcı bazında bir erişim kısıtlaması yok. Sadece SYSDBA ve varsayılan herkesin bildiği şifresi ile erişim engelleniyor :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

viewtopic.php?t=5800

Linkteki makale ye role ekleme işi de yazılırsa güzel olacak. İşe yarayan bir yöntem. Teşekkürler mucit.
nedimtrc
Üye
Mesajlar: 23
Kayıt: 02 Nis 2007 09:31

Mesaj gönderen nedimtrc »

dostum sen yeni kullanıcı oluştur diyorsun ama denedim sysdba nın yetkilerine müdahale ettirmiyor ki nasıl yapıyorsun acaba yanlış mı yapıyorum acaba 2005 ten bu yana şifreleme konusunda yeni yöntemler varsa arkadaşlar paylaşırsa çok sevinirim
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

önce yeni kullanıcı oluşturuyorsun
sonra gdb dosyasını yeni kullanıcı ile oluşturuyorsun
sonra sysdba isminde bir role oluşturuyorsun.
bundan sonra gdb yi hangi makineye götürürsen götür sysdba açamıyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
nedimtrc
Üye
Mesajlar: 23
Kayıt: 02 Nis 2007 09:31

Mesaj gönderen nedimtrc »

role nasıl oluşturuluyor benim eksiğim bu sanırsam yanlış anlamadım dimi şimdi deniyeceğim
önce yeni bir kullanıcı açıyorum.
sonra veritabanımı baştan oluşturuyorum bu kullanıcı ile açılmış oturumda yeni veritabanı yapıyorum ondan sonra role kısmını nasıl yapabileceğimi gösterirsen çok sevinirim
Cevapla