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;
Kolay Gelsin.
Kod: Tümünü seç
CREATE ROLE SYSDBA;
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;
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.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.
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.Şifreler kodlamalar bir şekilde çözülebildiği için FB yi geliştirenler uğraşmak istemiyor
http://www.firebirdsql.org/manual/fbmet ... ution.html adresinden alındı.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.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.
Yeni bir kullanıcı açmak için mevcut kullanıcı ile erişmek gerekmiyor mumkysoft yazdı:başka bir root kullanıcısı yaratılırsa (sysdba ile aynı yetkiye sahip) o zaman yine erişilebilir.