Arsip: protect/un-protect data FB/IB dari "gangguan" SYSDBA


by mat_koder in Articles more 14 years ago 2235
Ada kalanya kita sebagai developer suatu aplikasi database ingin data-nya relatif aman dari "gangguan luar" , supaya data tetap terpelihara utuh . Saya katakan relatif karena tentunya bila si "pengganggu" tsb punya akses ke physical db maka bisa saja dianya melakukan gangguan thp file tsb ( misalnya menghapus file).
Cara yg umum dilakukan developer untuk memngontrol akses de db adalah dengan mengatur akses user ( yg user name-nya sdh diatur sebelumnya ) ke tabel-tabel tertentu , dengan menset akses baca/tulis/insert/modify dll. Cara ini bisa di-bypass dengan mudah bilamana ada user yg bisa login dengan SYSDBA password , bahkan bilamana password SYSDBA-nya dirubah, bisa saja user tsb menggantikan security.fdb ( tempat password SYSDBA diletakkan) dengan "fresh" security.fdb yg didapatkan dari instalasi baru Firebird ( atau membawa file FDB/GDB tsb ke server yg SYSDBA accountnya dikenal - dan mengopreknya disana).

cara lain yg sedikit lebih sulit ditembus adalah dengan meng-create ROLE SYSDBA di db file tsb , sehingga ketika user mencoba login dengan SYSDBA account, akan menimbulkan error krn SYSDBA-nya dupilkate ( sdh ada di role ). Contoh produk lokal yg menggunakan proteksi ini adalah ACCURATE ( applikasi accounting yg di-develop dgn Delphi) , versi trialnya.


Cara proteksi semacam ini disinggung pada artikel berikut :
http://ftp.ibphoenix.com/main.nfs?a=ibphoenix&s=1123605099:169734&page=ibp_file_meta_security
namun dlm artikel tsb tidak dibahas cara melakukannya.

meng-create ROLE SYSDBA pada firebird adalah dengan syntak:
'create role SYSDBA'

namun bilamana ini dilakukan maka akan error sebab SYSDBA sdh terdaftar sebagai user, sehingga satu-satunya cara adalah dengan login di firebird yg super-usernya bukanlah SYSDBA.

Ada 2 cara melakukannya:
1. Membangun kembali firebird dari source ( bisa di-download dari sourceforge.net ) dimana

source-nya sdh dirubah dengan super-user name bukan lagi SYSDBA.
2. Login lewat standar Firebird installation ( super user=SYSDBA / password=masterkey ), dan dilakukan lewat kode Delphi.

cara yg no-2 yg akan ditunjukkan dalam artikel ini.


I. Memprotect data.

Triknya adalah dengan memanipulasi username SYSDBA di security.fdb ( isc.gdb pd interbase ) dan dengan username yg sdh dimanipulasi ini , konek ke target db.

Langkahnya secara garis besar sbb:
1. Penting : backup / copy dulu security.fdb , klo-klo ntar ada masalah.
3. Bikin koneksi ke security.fdb ( pake IBX : TIBDatabase & TIBTransaction)
2. Bikin SQL yg meng-update user name SYSDBA ke nama laen ( yg akan sbg owner dari role SYSDBA di target db); contoh "TEMP_DBA"
3. Open koneksi ke security.fdb tsb dan exec SQL query.
4. penting : biarkan koneksi ke security Db tetap open.
5. Commit transaction ( shg SYSDBA tdk akan dikenali lagi bilamana user laen akan login).
6. Bikin koneksi baru lagi khusus utk target db.
7. Untuk koneksi ini tentunya nama user = "TEMP_DBA" , password=masterkey
8. Open db ke target db ini
9. Bikin SQL utk membuat/create role SYSDBA di target db
10. Commit transaction - bikin permanen di DB
11. Close connection ke target db.
12. di security db , bikin SQL untuk mengembalikan user name dari TEMP_DBA ke SYSDBA.
13 EXec SQL tsb dan commit.
14. Close semua koneksi.


contoh potongan kodenya sbb:
( contoh ini menggunakan lokal server - server dan prog dlm kompie yg sama)
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;
Syntax Highlighted with https://pascal-id.org/syntax



contoh penggunaan:
procedure TForm1.Button2Click(Sender: TObject);
begin
ProtectDatabase('C:\\SAMPLE.GDB','TEMP_DBA');
end;
Syntax Highlighted with https://pascal-id.org/syntax



II. Unlock db yg terproteksi

Caranya mirip dengan langkah nge-proteknya yakni:
1. Backup security.fdb
2. Bikin koneksi ke security.fdb
3. bikin SQL utk ngeganti SYSDBA ke nama laen ( mis TEMP_DBA ).
4. Exec SQL ini dan commit shg user berikutnya kan melihat new name ini.
5. Biarkan koneksi ke security.fdb ini tetap open.
5. Dengan new name ini ( TEMP_DBA ) , bikin koneksi baru ke target db.
6. setelah terkonek , query data system table tentang role ( tabel RDB$ROLES ), dan cari Owner dari role SYSDBA.
7. Setelah mendapatkan nama owner tsb , di security.fdb , ganti lagi nama user TEMP_DBA ke nama Owner tsb dan commit.
8. Konek lagi ke target db dengan nama user = nama owner dari role.
9. di koneksi baru ini, drop role SYSDBA dan commit.
10.kembali di koneksi security.fdb , bikin SQL baru yg mengganti nama user dari Owner tadi ke original (=SYSDBA).
11. Exec query dan commit, dan close.


contoh potongan kodenya sbb:
( make local connection ).
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;
Syntax Highlighted with https://pascal-id.org/syntax


contoh pemakaian:
procedure TForm1.Button1Click(Sender: TObject);
begin
UnProtectDatabase('C:\\SAMPLE.GDB');
end;
Syntax Highlighted with https://pascal-id.org/syntax
Local Business Directory, Search Engine Submission & SEO Tools FreeWebSubmission.com SonicRun.com