Bảo mật cấp cột


9

Tôi đang cần một giải pháp để ẩn các cột cụ thể trong một bảng. Chúng tôi có những người cần xây dựng báo cáo dựa trên cơ sở dữ liệu này và cụ thể là một số bảng có thông tin bí mật nhưng không được phép xem các mục như tiền lương hoặc ssn. Có thể lọc các cột cụ thể cho người dùng?


1
Số phiên bản của oracle (10.1 / 10.2 / 11.1 / 11.2) và bạn đang sử dụng Enterprise Edition / Standard Edition, ngoài ra bạn có bất kỳ tùy chọn được cấp phép bổ sung nào không (ví dụ: Oracle Advanced Security)?
Phil

Phiên bản doanh nghiệp 10g R2. Không có tính năng được cấp phép bổ sung mà tôi biết.
Robert

Câu trả lời:


13

Bạn có thể làm điều này với chế độ xem bình thường, miễn là người dùng có liên quan chưa có quyền truy cập vào bảng cơ sở.

VÍ DỤ:

SQL> create user reportuser identified by reportuser;

User created.

SQL> grant create session to reportuser;

Grant succeeded.

SQL> grant create synonym to reportuser;

Grant succeeded.

SQL> select user from dual;

USER
------------------------------
PHIL

SQL> create table basetable
(
  id number primary key,
  viewable varchar2(30),
  secret varchar2(30)
);

Table created.

SQL> insert into basetable values ( 1, 'hello world','this is secret' );

1 row created.

SQL> commit;

Commit complete.

SQL> create view reportview
as
select id, viewable
from basetable;

View created.

SQL> grant select on reportview to reportuser;

Grant succeeded.

SQL> conn reportuser/reportuser
Connected.
SQL> select * from phil.basetable;
select * from phil.basetable
                   *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select secret from phil.basetable;
select secret from phil.basetable
                        *
ERROR at line 1:
ORA-00942: table or view does not exist

SQL> select * from phil.reportview;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL>

Nếu bạn thu hồi quyền trên các bảng trong câu hỏi & tạo các chế độ xem, cùng với một từ đồng nghĩa cho mỗi chế độ xem người dùng có cùng tên với bảng gốc, thì nó phải trong suốt.

VÍ DỤ:

SQL> select user from dual;

USER
------------------------------
REPORTUSER

SQL> create synonym basetable for phil.reportview;

Synonym created.

SQL> select * from basetable;

        ID VIEWABLE
---------- ------------------------------
         1 hello world

SQL>

Bạn cũng có thể làm điều này với Cơ sở dữ liệu riêng ảo , nhưng tôi nghĩ đó là một tùy chọn được cấp phép bổ sung đắt tiền. Bạn sử dụng DBMS_RLS để định cấu hình các chính sách bảo mật có liên quan mà bạn yêu cầu.


Cảm ơn các câu trả lời chi tiết. Không có cách nào bạn biết để lọc trên bảng thực tế. Đây sẽ là một giải pháp sạch hơn cho chúng tôi vì chúng tôi sẽ có một số bảng để làm điều này. Giải pháp của bạn có thể làm việc mặc dù.
Robert

2
Nếu bạn thu hồi quyền trên các bảng trong câu hỏi & tạo các khung nhìn, cùng với một từ đồng nghĩa cho mỗi người dùng có cùng tên với bảng gốc, thì nó phải trong suốt.
Phil

Được rồi, cái đó có lý. Tôi đã không nghĩ về việc tạo từ đồng nghĩa cho người dùng. Vì vậy, tôi cần tạo một người dùng báo cáo, cấp cho họ quyền truy cập vào tất cả các bảng, sau đó xóa các bảng cụ thể mà tôi lo lắng. Sau đó bắt đầu tạo các khung nhìn để ẩn các cột.
Robert

Vâng Bất kỳ câu hỏi, rơi tự do để trở lại và hỏi. Đừng quên kiểm tra :)
Phil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.