در محیطهای اوراکل، یکی از روشهای موثر برای افزایش امنیت، تعریف کاربران مجزا برای اپلیکیشنها و جدا کردن آنها از کاربران مالک (Object Owners) است. این کار نه تنها سطح دسترسی را محدود میکند، بلکه از بروز آسیبهای ناشی از حملات مختلف نیز جلوگیری مینماید. در این مقاله، به نحوه پیادهسازی این روش و اعطای دسترسیهای لازم به کاربر جدید میپردازیم.
قبل از اینکه ادامه بدم باید از استاد عزیزم مهندس تیموری برای آن چیزی که در این مورد ازشون یاد گرفتم تشکر کنم.
تعریف کاربر جدید برای اپلیکیشن: ابتدا باید کاربر جدیدی که اپلیکیشن به آن متصل میشود را ایجاد کنیم. برای مثال، کاربری به نام vahid_app
را ایجاد میکنیم:
CREATE USER vahid_app IDENTIFIED BY strong_password;
GRANT CREATE SESSION TO vahid_app;
ایجاد اسکریپت برای اعطای دسترسیها: اسکریپتی که دسترسیهای لازم را به کاربر vahid_app
اعطا میکند، باید شامل دسترسیهای SELECT
, INSERT
, UPDATE
, DELETE
و EXECUTE
باشد. برای این منظور، میتوانیم یک PL/SQL بلاک ایجاد کنیم که به صورت دینامیک این دسترسیها را به کاربر اعطا نماید.
برای تست این مطلب چند تا object در کاربر vahid که owner حساب میشه می سازیم.
create table t1 (f1 number, f2 date);
create view v1 as select * from t1;
CREATE SEQUENCE S1 INCREMENT BY 1 START WITH 1 MAXVALUE 99999999999999 MINVALUE 1;
create or replace procedure p1
as
begin
insert into t1 values (s1.nextval,sysdate);
end;
/
حالا اسکریپت دسترسی رو اجرا می کنیم.
BEGIN
FOR rec IN (SELECT object_name, object_type
FROM dba_objects
WHERE owner = 'VAHID') LOOP
IF rec.object_type = 'TABLE' THEN
EXECUTE IMMEDIATE 'GRANT SELECT, INSERT, UPDATE, DELETE ON VAHID.' || rec.object_name || ' TO VAHID_APP';
ELSIF rec.object_type in ('VIEW','SEQUENCE') THEN
EXECUTE IMMEDIATE 'GRANT SELECT ON VAHID.' || rec.object_name || ' TO VAHID_APP';
ELSIF rec.object_type IN ('PACKAGE', 'PROCEDURE', 'FUNCTION') THEN
EXECUTE IMMEDIATE 'GRANT EXECUTE ON VAHID.' || rec.object_name || ' TO VAHID_APP';
END IF;
END LOOP;
END;
برای تست هم جستجوی زیر رو اجرا میکنم که ببینم دسترسی ها درست داده شده یا نه؟
SELECT * FROM DBA_TAB_PRIVS WHERE OWNER='VAHID';
حالا مهمترین نکته برای اینکه بدون اینکه لازم باشه تغییر در اپلیکیشنها بدیم، به کاربر جدید وصل بشیم اینه که یک تریگر AFTER LOGON درست کنیم که بعد از اتصال کاربر APP بتونه CURRENT SCHEMA رو به OWNER تغییر بده. این موضوع باعث میشه که دیگه احتیاجی نباشه که نام OWNERرو قبل از OBJECT ها، برای فراخوانی بزاریم.
CREATE OR REPLACE TRIGGER TRG_SET_SCHEMA
AFTER LOGON ON VAHID_APP.SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA=VAHID';
END;
/
حالا بریم یه تست کنیم:
SELECT * FROM T1;
EXEC P1;
موارد بالا که مجوز داره انجام میشه. حالا ببینیم دستور زیر چه کاری میکنه:
TRUNCATE TABLE T1;
ORA-01031: insufficient privileges
01031. 00000 - "insufficient privileges"
.و این همون بهبودی هست که انتظارش رو داشتیم.