密碼的選定,一向是一個很兩難的議題。太過簡單的密碼容易被猜到,而太過複雜的密碼也因為難以記憶而逼迫使用者利用各種秘技加以繞過(如自動記憶的功能,甚至是直接把密碼大剌剌地寫在螢幕前的便利貼上)。不過不管如何選擇,密碼本身都難以避免一種技術性很低的破解方式,那就是暴力破解法。只要給予足夠的時間,任何的密碼都可以在嘗試過所有可能組合之後被猜到。面對這類攻擊行為,我們能做的就是讓所有可能的組合範圍盡量龐大(所以要求在密碼當中使用更多的字元和特殊符號),另外一個應對之策就是減緩嘗試的速度。以減緩嘗試速度來看,許多應用程式會在密碼輸入錯誤之後停頓一段時間(如一秒鐘)才允許下一次的登入嘗試。一秒鐘對於人類來說或許是一個很短的時間,但是對於自動化的攻擊程式來說可就算是天長地久了。至於要停頓多久,那就看應用程式開發人員自己的判斷了,有些可能是固定的時間,有些則可能讓停頓的時間隨著錯誤次數的增加而越來越長。
除了延緩可以再次嘗試登入的時間,更嚴謹的系統甚至會進行封鎖的動作,而封鎖的對象一般是針對帳號或 IP 位址。然而,不管是針對帳號或 IP 位址的封鎖,都無法避免駭客利用這些特點對系統進行阻斷服務攻擊 (Denial of Service, DoS)的可能性。舉例來說,如果應用程式會針對嘗試登入錯誤達三次的帳號進行封鎖,駭客只要故意利用此帳號故意登入錯誤三次,就可以讓這個帳號無法使用。雖然針對帳號或 IP 位址的封鎖,兩者之間並沒有矛盾之處,甚至也可以同時進行,但是在大多數的情況下應用程式僅會針對一個項目予以封鎖。
簡單來看,以帳號形式的封鎖比 IP 形式的封鎖更容易遭受阻斷服務的攻擊,原因在於駭客可以輕易地使用各個帳號進行嘗試登入的動作。相較於帳號,駭客要假冒合法使用者的 IP 位址而使得這些 IP 位址受到封鎖,在技術上的難度就顯得高了許多。封鎖 IP 位址比較大的風險在於如果這是一個經過 NAT 轉換過的 IP 位址,封鎖此一 IP 位址可能就代表了有一大群的電腦因此都同時遭受封鎖。
除了封鎖的對象,封鎖機制還有另外一個必須考量的重點就是封鎖的時間長短。封鎖的時間越長,對駭客而言在進行錯誤嘗試的攻擊時就須花費更多的時間,但是另外一方面也讓阻斷服務攻擊一旦成功時所造成的影響越嚴重。封鎖時間的極致,就是必須由管理者手動解除封鎖,而不是在固定的時間後自動解除。這類系統雖然安全性很高,但是卻會大幅增加管理者的負擔,因此使用上必須格外謹慎。
其次,阻擋的方式亦會決定阻擋的成效。阻擋可以分為本機與網路兩種形式,本機最常見的方式就是透過主機型的防火牆 (例如 iptables),而在 Linux 下還有 /etc/hosts.deny 也可以用來當做阻擋的機制。至於網路的形式,包含網路型的防火牆以及路由器/交換器的 ACL,都是常見的阻擋方式。在主機上進行阻擋,可以同時應付來自外部與內部的攻擊。而如果利用網路進行封鎖,在應付來自內部的攻擊上可能就會力有未逮。然而對於一個異質環境而言,如何在不同的作業系統上統一管理封鎖的機制,是利用主機進行阻擋時所必須面對的嚴峻挑戰。
談完了封鎖的基本概念,我將在下一篇跟各位分享如何在 CentOS 下利用 fail2ban 這個套件達成封鎖的目的。
沒有留言:
張貼留言