保護Raspberry Pi不受攻擊的步驟
from http://www.makezine.com.tw/make2599131456/secure-your-raspberry-pi-against-attackers
Raspberry Pi是能夠用在所有專題上的夢幻開發板。價格便宜、使用簡單,廣泛支援各式各樣的作業系統,還有著可用程式控制的GPIO腳位、多核心處理器及多個USB連接埠。
Raspberry Pi非常適合用在自動化和蒐集資訊的專題上,但若一不小心,用了這可愛開發板的簡單業餘專題,恐怕就會成為網路入侵口或其他安全漏洞。Raspberry Pi跟ARM Trustzone不同,沒有安全開機的功能,SD卡和作業系統也無法加密。因此,這裡要介紹Raspberry Pi和各位連接到網路上的機器應該遵守的保全技巧。
Raspberry Pi非常適合用在自動化和蒐集資訊的專題上,但若一不小心,用了這可愛開發板的簡單業餘專題,恐怕就會成為網路入侵口或其他安全漏洞。Raspberry Pi跟ARM Trustzone不同,沒有安全開機的功能,SD卡和作業系統也無法加密。因此,這裡要介紹Raspberry Pi和各位連接到網路上的機器應該遵守的保全技巧。
為什麼Raspberry Pi會被駭?
- 其電腦能力遭到濫用,盜取加密貨幣。
- 攻擊者在攻擊其他主機之際,能夠把這當成中繼點使用,以免被查出來。
- 這能當作內部網路的入侵口來用。攻擊者可以輕易存取檔案伺服器,安裝勒索軟體。然後就會盜取發黑函用的文件,改寫防火牆和路由器的設定,以便能夠自由進出。接下來,就會攻擊路由器的Web主控臺,執行uPNP操作,還能開啟網路上的其他連接埠進行攻擊。
密碼
更改預設密碼——假如要安裝最新版本的NOOBS或Raspbian時,要記得將Pi使用者的密碼從預設值改成更長更難猜的內容。跟P@assword1!之類的密碼相比, iamasuckerfor5dollarmojitos這種的會比較安全。就算預定要讓帳號失效,這個步驟也是基本的防護措施,要記得去做。
使用者帳號
下一步是要讓Raspbian當中預設的Pi帳號失效。進行之前,要先建立新的帳號。這時要使用useradd指令。使用額外的旗標之後,還可以設定該使用者新的主目錄。
首先要以Pi使用者的身分登錄,執行以下的指令:
$ sudo /usr/sbin/useradd --groups sudo -m makezine
這會將makezine的部分改寫成自己的使用者名稱,建立新的帳號,替這個帳號建立目錄(像是/home/makezine之類的)。另外,還要建立sudo群組用的帳號,以便使用者可以運用sudo指令。建立新的使用者帳號之後,就要依照以下設定替這個帳號設定密碼:
$ sudo passwd makezine
其次要重設root密碼。密碼要設定得又長又難猜。
$ sudo passwd root
最後再讓Pi帳號失效。
$ sudo passwd --lock pi
現在可以登出Pi帳號,使用新密碼登入新帳號。
首先要以Pi使用者的身分登錄,執行以下的指令:
$ sudo /usr/sbin/useradd --groups sudo -m makezine
這會將makezine的部分改寫成自己的使用者名稱,建立新的帳號,替這個帳號建立目錄(像是/home/makezine之類的)。另外,還要建立sudo群組用的帳號,以便使用者可以運用sudo指令。建立新的使用者帳號之後,就要依照以下設定替這個帳號設定密碼:
$ sudo passwd makezine
其次要重設root密碼。密碼要設定得又長又難猜。
$ sudo passwd root
最後再讓Pi帳號失效。
$ sudo passwd --lock pi
現在可以登出Pi帳號,使用新密碼登入新帳號。
保護SSH
預設情況下,Raspbian安裝的SSH(安全殼協定)能夠從任何地方存取。不過,這可以防止SSH的設定變更,唯有使用認證過的SSH金鑰,才能獲准登入特定的機器。私人金鑰至少要備份在2個安全的地方。
做這件事情時,要先使用vi或其他文字編輯器,透過以下指令開啟SSH的設定檔:
$ sudo vi /etc/ssh/sshd_config
然後要設定以下的程式行。這時要確定註解行遭移除。註解行是前端附上#符號的說明用行列,不會變成設定處理的對象。
# 認證:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
# 不使用密碼時要更改為yes(不建議)。
PermitEmptyPasswords no
# 想讓挑戰/回應安全驗證生效時要更改為yes
#(要注意PAM認證和執行緒的問題)
ChallengeResponseAuthentication no
# 禁止通用密碼時要更改為no。
PasswordAuthentication no
UsePAM no
最後一行非常重要,這會禁用PAM(Pluggable Authentication Modules,可插入式認證模組)或Linux的原生驗證,唯有使用金鑰才能獲准登入。接下來要產生SSH金鑰。執行時要使用Windows的PuTTY或Linux的ssh-keygen指令。使用者的主目錄下要建立「.ssh」目錄,建立包含以下指令在內的authorized_keys檔案。設定時要記得適當下放權限(否則就不能用金鑰認證)。
$ mkdir ~/.ssh
$ chmod 0700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
接下來使用文字編輯器開啟authorized_keys檔案,貼在產生的公開金鑰上,以便能夠登錄。這時必須重新啟動SSH,讓指令發揮作用。
$ sudo systemctl restart ssh
做這件事情時,要先使用vi或其他文字編輯器,透過以下指令開啟SSH的設定檔:
$ sudo vi /etc/ssh/sshd_config
然後要設定以下的程式行。這時要確定註解行遭移除。註解行是前端附上#符號的說明用行列,不會變成設定處理的對象。
# 認證:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
# 不使用密碼時要更改為yes(不建議)。
PermitEmptyPasswords no
# 想讓挑戰/回應安全驗證生效時要更改為yes
#(要注意PAM認證和執行緒的問題)
ChallengeResponseAuthentication no
# 禁止通用密碼時要更改為no。
PasswordAuthentication no
UsePAM no
最後一行非常重要,這會禁用PAM(Pluggable Authentication Modules,可插入式認證模組)或Linux的原生驗證,唯有使用金鑰才能獲准登入。接下來要產生SSH金鑰。執行時要使用Windows的PuTTY或Linux的ssh-keygen指令。使用者的主目錄下要建立「.ssh」目錄,建立包含以下指令在內的authorized_keys檔案。設定時要記得適當下放權限(否則就不能用金鑰認證)。
$ mkdir ~/.ssh
$ chmod 0700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 0600 ~/.ssh/authorized_keys
接下來使用文字編輯器開啟authorized_keys檔案,貼在產生的公開金鑰上,以便能夠登錄。這時必須重新啟動SSH,讓指令發揮作用。
$ sudo systemctl restart ssh
防火牆
SSH設定完畢之後,就要檢查Pi的iptables防火牆是否正確運作。為了保險起見,最好要事先設定防火牆,讓防火牆的規則生效,連線被擋住時會記錄訊息。首先要使用以下指令安裝iptables。
$ sudo apt-get install iptables iptables-persistent
使用iptables防火牆時,需要讀取新的核心模組。最簡單的方法是重新啟動Pi。安裝iptables之後,就要使用以下指令檢查iptables現在的規則:
$ sudo /sbin/iptables -L
這樣就會顯示規則的清單,裡面應該什麼都還沒寫。規則可以透過以下指令儲存及編輯成文字檔。
$ sudo /sbin/iptables-save > /etc/iptables/rules.v4
這個檔案會讓iptables常駐,當系統啟動或重新啟動時防火牆就一定會生效。檔案要依照以下形式儲存(要因應需求編輯規則):
$ sudo cat /etc/iptables/rules.v4
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 允許所有回送(lo0)流量,所有流量降到不使用loO時的127/8。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# 允許所有確定的接收連線。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允許所有發送流量。
# 想要單單允許特定流量時,請變更這裡。
-A OUTPUT -j ACCEPT
# 允許SSH連線。
# --dport的數值要和/etc/ssh/sshd_config內的相同。
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# 將iptables拒絕的呼叫記錄起來(透過dmesg指令就看得到)。
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# 拒絕其他所有接收連線。除非政策明確允許,否則預設為拒絕。
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
接下來要確定iptables會正常運作。這有點複雜,要透過SSH遠端連線,雖然會發生某些問題,卻不想切斷連線。幸運的是有個指令能夠套用規則,幫忙檢查連線。假如在一定時間內沒有回應,程式就會判斷連線遭到切斷,取消變更。假如有所回應,變更就會固定不變。透過以下指令即可進行:
$ sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4
假如一切功能正常,就會套用變更,其結果可以透過以下指令檢查:
$ sudo /sbin/iptables -L
關掉不必要的功能。防火牆只須列出必要的服務。要儘量選擇非預設的連接埠。
要連線到自己的網絡上。Pi必須要安裝在自己的網絡上,平常使用時要能辨識發送到網路上的連線,事先過濾。還要記得想辦法讓Pi連不上自己的檔案伺服器或其他系統。從Pi到網路的連線最好也要加上限制。
$ sudo apt-get install iptables iptables-persistent
使用iptables防火牆時,需要讀取新的核心模組。最簡單的方法是重新啟動Pi。安裝iptables之後,就要使用以下指令檢查iptables現在的規則:
$ sudo /sbin/iptables -L
這樣就會顯示規則的清單,裡面應該什麼都還沒寫。規則可以透過以下指令儲存及編輯成文字檔。
$ sudo /sbin/iptables-save > /etc/iptables/rules.v4
這個檔案會讓iptables常駐,當系統啟動或重新啟動時防火牆就一定會生效。檔案要依照以下形式儲存(要因應需求編輯規則):
$ sudo cat /etc/iptables/rules.v4
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 允許所有回送(lo0)流量,所有流量降到不使用loO時的127/8。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# 允許所有確定的接收連線。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允許所有發送流量。
# 想要單單允許特定流量時,請變更這裡。
-A OUTPUT -j ACCEPT
# 允許SSH連線。
# --dport的數值要和/etc/ssh/sshd_config內的相同。
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
# 將iptables拒絕的呼叫記錄起來(透過dmesg指令就看得到)。
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# 拒絕其他所有接收連線。除非政策明確允許,否則預設為拒絕。
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
接下來要確定iptables會正常運作。這有點複雜,要透過SSH遠端連線,雖然會發生某些問題,卻不想切斷連線。幸運的是有個指令能夠套用規則,幫忙檢查連線。假如在一定時間內沒有回應,程式就會判斷連線遭到切斷,取消變更。假如有所回應,變更就會固定不變。透過以下指令即可進行:
$ sudo /usr/sbin/iptables-apply /etc/iptables/rules.v4
假如一切功能正常,就會套用變更,其結果可以透過以下指令檢查:
$ sudo /sbin/iptables -L
關掉不必要的功能。防火牆只須列出必要的服務。要儘量選擇非預設的連接埠。
要連線到自己的網絡上。Pi必須要安裝在自己的網絡上,平常使用時要能辨識發送到網路上的連線,事先過濾。還要記得想辦法讓Pi連不上自己的檔案伺服器或其他系統。從Pi到網路的連線最好也要加上限制。
更新和備份
套件要定期更新。我們要透過Raspberry Pi的網站檢查更新。只要安裝unattended-upgrades這項套件,就能夠自動更新。詳情可見官方Debian wiki。
設定要做備份。SD卡有時會壞掉,所以要將資料或SD卡的所有內容,弄成加密套件、檔案或檔案系統,備份到USB記憶體內。
儘量別用預先安裝的映像檔。假如要使用從某個地方取得的預裝映像檔,就要想想為什麼必須這樣做。原作者值得信賴嗎?內容沒有經過改造,摻雜可疑的軟體和後門嗎?還有可能是在作者不知情的狀況下混進去的,要小心查明這是否安全。倘若不確定時,就要將Pi放在自己的網路上,放在連接不到其他系統或網路的地方檢查過再安裝。假如路由器有DMZ區段或訪客用的Wi-Fi網路時,最好慎選Pi放置的地方,前提是只有想曝光的服務才能公開在網路上。要是無論如何都想安裝映像檔,最好依照以下方式進行:
# /bin/rm -v /etc/ssh/ssh_host_*
# dpkg-reconfigure openssh-server
設定要做備份。SD卡有時會壞掉,所以要將資料或SD卡的所有內容,弄成加密套件、檔案或檔案系統,備份到USB記憶體內。
儘量別用預先安裝的映像檔。假如要使用從某個地方取得的預裝映像檔,就要想想為什麼必須這樣做。原作者值得信賴嗎?內容沒有經過改造,摻雜可疑的軟體和後門嗎?還有可能是在作者不知情的狀況下混進去的,要小心查明這是否安全。倘若不確定時,就要將Pi放在自己的網路上,放在連接不到其他系統或網路的地方檢查過再安裝。假如路由器有DMZ區段或訪客用的Wi-Fi網路時,最好慎選Pi放置的地方,前提是只有想曝光的服務才能公開在網路上。要是無論如何都想安裝映像檔,最好依照以下方式進行:
- 所有帳號的密碼都要變更,而不光是Pi使用者和root使用者。Raspberry Pi附贈的軟體包含各式各樣的服務。只要使用netstat,就可以檢查哪個服務會生效,所以要事先設定防火牆和路由器,這樣就能單純公開所需的內容。
- 透過以下方法重新產生SSH金鑰:
# /bin/rm -v /etc/ssh/ssh_host_*
# dpkg-reconfigure openssh-server
- 將生效服務所用的連接埠變更為通常沒在使用的連接埠,防止軟體自動安裝及服務大量掃描。大多數攻擊者會鎖定標準的連接埠。
- 詢問映像檔作者最新的更新和相關的安全注意事項。
確保持續性
硬體看門狗計時器(Hardware Watchdog Timer):假如Raspberry Pi在旅行離家的期間當機,自動化系統也會停擺。不過,Raspberry Pi配備博通硬體看門狗計時器,當Raspberry Pi沒有回應時就會自動重新啟動。
散熱片:假如Raspberry Pi因為天候或超頻導致過熱,就會是一樁憾事。因此最好要事先將散熱片裝在CPU上,這樣即使承受巨大的負荷也不會熱失控。散熱片價格既便宜,安裝也容易。
Logwatch:這會在晚上發送電子郵件報告前一天的活動和警告訊息。因此,Raspberry Pi必須要能發送電子郵件,這時exim4郵件轉寄代理就派上用場了。使用以下指令即可安裝Logwatch:
$ sudo apt-get install logwatch
安裝過後,就必須配合/usr/share/logwatch/default.conf/logwatch.conf的檔案進行編輯。預設情況下,Logwatch會發送電子郵件給root帳號,說不定會需要一些轉寄的方法。詳情可以看我的電子郵件轉寄相關文章。
散熱片:假如Raspberry Pi因為天候或超頻導致過熱,就會是一樁憾事。因此最好要事先將散熱片裝在CPU上,這樣即使承受巨大的負荷也不會熱失控。散熱片價格既便宜,安裝也容易。
Logwatch:這會在晚上發送電子郵件報告前一天的活動和警告訊息。因此,Raspberry Pi必須要能發送電子郵件,這時exim4郵件轉寄代理就派上用場了。使用以下指令即可安裝Logwatch:
$ sudo apt-get install logwatch
安裝過後,就必須配合/usr/share/logwatch/default.conf/logwatch.conf的檔案進行編輯。預設情況下,Logwatch會發送電子郵件給root帳號,說不定會需要一些轉寄的方法。詳情可以看我的電子郵件轉寄相關文章。
留言
張貼留言