在完成 最小安裝 與 網路設定 之後,此時你的 CentOS 已經處於 On Live 狀態,在預設的安裝中,CentOS 會內建並啟動 SSH 遠端連線的服務,且啟動防火牆,只允許 ICMP 與 SSH 連線,這表示你已經可以透過網路連線,而不再需要直接操作實體主機。
但,這樣就夠安全了嗎?其實 SSH 一點都不安全,當你的主機開啟此類服務時,表示任何人都可能透過網路的方式來嘗試連線到你的主機,透過 Port 掃瞄、字典檔或暴力破解,無論如何,root 密碼最終還是會被破解,而你的主機就淪為駭客的溫床。
因此,本文將引導大家透過設定 SSH ,降低被攻擊的可能,在配合防火牆的配置,只允許許可的網段連線,讓駭客無從而入。最後再針對環境配置,讓系統運作更加乾淨利落。
一、使用 SSH 連線 (PuTTY , PieTTY)
在剛安裝完後的主機,預設就會開啟 SSH 服務,而 Port 也為預設的 22,要遠端連線這個服務,就必須去下載 SSH 的 Client 軟體,一般在 Windows 環境下,幾乎所有使用 Linux 系統的玩家,都會推薦使用PuTTY (支援中文的版本為 PieTTY) 這一套來連線。
只要輸入您的主機 IP 與 Port ,就會透過網路遠端連線到該主機
使用 SSH 第一次連線時,會進行 RSA2 的金鑰交換,來達成整個連線,傳輸資料的安全(加密傳輸),這就是 SSH 比一般連線還安全的原因(能防止中途攔截時,封包內容被解讀)
再來就會看到登入畫面,輸 root 帳戶與密碼就會登入成功了,這也意味著任何能夠知道 IP 的人,都能嘗試登入你的 root 帳號
二、設定 SSH 服務
如上面所說,目前的 SSH 是可能會被任何人連線的,因此,我們可以透過 SSH 服務的設定檔來增加安全性,目標作以下幾項變更:
- 更改 Port 為 22 (防止掃瞄Port)
- 不允許 root 登入(自己建立另一個新使用者來登入)
- DNS反查關閉(加快登入速度)
- 只允許指定的帳號登入(如範例為 yenpai 和 jess)
SSH 服務的設定檔 /etc/ssh/sshd_config
1
2
3
4
5
6
7
8
9
10
11
| [root@localhost ~] # vi /etc/ssh/sshd_config Port 22 PermitRootLogin no UseDNS no AllowUsers yenpai jess [root@localhost ~] # service sshd restart Stopping sshd: [ OK ] Starting sshd: [ OK ] [root@localhost ~] # |
設定完後要重啟服務(service sshd restart)才會真正生效,可以透過 netstat 指令來確認重啟後的 SSH 服務是否以 Port 22 來接受連線
1
2
3
| [root@localhost ~] # netstat -ant | grep :22 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 :::3322 :::* LISTEN |
目前 SSH 的 Port 已經被更改到 22,並且 root 帳戶無法登入,所以要建立另一個使用者帳戶來登入(adduser 新增帳戶,passwd 設定帳戶密碼)
1
2
3
4
5
6
7
| [root@localhost ~] # adduser yenpai [root@localhost ~] # passwd yenpai Changing password for user yenpai. New password: Retype new password: passwd: all authentication tokens updated successfully. [root@localhost ~] # |
三、一些基本的調效(非必要)
其實在 CentOS 安裝時若選用最小安裝,那系統已經是十分乾淨,直接運作都十分穩定,以下設定僅是提供參考,可視情況再微調。
關閉 SELinux
1
2
| sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config setenforce 0 |
安裝常用的工具
1
2
3
4
5
| #網路工具 yum -y install sudo wget openssh -clients #排程,發信 yum -y install vixie -cron crontabs postfix |
設定開機時自動啟用的服務(僅列出習慣會開的服務)
1
2
3
4
5
6
7
8
| chkconfig crond on chkconfig iptables on chkconfig lvm2 -monitor on chkconfig messagebus on chkconfig network on chkconfig rsyslog on chkconfig sshd on chkconfig udev -post on |
更新所有套件
1
| yum -y update |
修改語系(通常預設為 UTF8 就可,但也可能需要建構 BIG5 環境)
1
2
3
4
5
| vi /etc/sysconfig/i18n #LANG="en_US.UTF-8" LANG= "en_US" SYSFONT= "latarcyrheb-sun16" |
修改本機 tty console (使用網路 SSH 來連,不需開太多的 Console 端)
================================================================
iptables腳本檔防火牆設定概述
這些腳本檔是參考鳥哥的iptables實際設定修改而成,iptables腳本檔可以從以下網址下載:
在pulipuli.iptables.zip裡面有六個檔案。以sh副檔名的三個檔案是可以執行的腳本檔,其他三個則是設定檔。
以下簡單敘述這些腳本檔的目的,稍後會再詳細介紹腳本檔的內容與用法。
- iptables.rule.sh:設定iptables的主要規則。以下三個檔案是依附此腳本的設定檔:
- iptables.deny:設定要阻擋的IP。
- iptables.allow:設定要允許的IP。
- iptables.service:設定要允許的連接埠。
- reset_iptables.sh:清除iptables的設定。
- view_iptables.sh:觀察iptables的設定。
<^>iptables.rule.sh的功用
其中,主要的設定都集中在iptables.rule.sh中,裡面設定了相當多常見的防火牆規則。以下我簡單地敘述它的綱要:
- 設定核心的網路功能
- 重設防火牆設定:包括阻擋所有INPUT封包
- 開放 lo 本機網路卡
- 開放由本機發出的回應封包
- 阻擋指定的IP:使用iptables.deny設定檔
- 允許指定的IP連入:使用iptables.allow設定檔
- 允許 0 3 3/4 4 11 12 14 16 18 ICMP封包進入
- 允許指定的連接埠連入:使用iptables.service設定檔
- 儲存防火牆設定
以下是iptables.rule.sh的內容:
#!/bin/bash # 請先輸入您的相關參數,不要輸入錯誤了! EXTIF="eth0" # 這個是可以連上 Public IP 的網路介面 RULE_PATH="/root/iptables" #iptables的設定路徑,最後不要有「/」 export EXTIF RULE_PATH # 第一部份,針對本機的防火牆設定!########################################## # 1. 先設定好核心的網路功能: # 防止SYN Flloding的DoS攻擊 echo "1" > /proc/sys/net/ipv4/tcp_syncookies # 防止ping的Dos攻擊 echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts #rp_fileter:啟動逆向路徑過濾(Reverse Path Filtering) #log_martians:記錄不合法的IP來源到/var/log/meesages for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do echo "1" > $i done # 以下建議關閉 # accept_source_route:來源路由 # accept_redirects:IP相同時採用最短路徑 # send_redirects:與前者類似,發送ICMP redirect封包 for i in /proc/sys/net/ipv4/conf/*/{,accept_source_route,accept_redirects,send_redirects}; do if [ -f $i ]; then echo "0" > $i fi done # 2. 清除規則、設定預設政策及開放 lo 與相關的設定值 PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH iptables -F iptables -X iptables -Z iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #接受lo本機介面網路卡 iptables -A INPUT -i lo -j ACCEPT #接受由本機發出的回應封包 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 3. 啟動額外的防火牆 script 模組 if [ -f $RULE_PATH/iptables.deny ]; then sh $RULE_PATH/iptables.deny fi if [ -f $RULE_PATH/iptables.allow ]; then sh $RULE_PATH/iptables.allow fi # 4. 允許某些類型的 ICMP 封包進入 # 詳細請參考ICMP協定 http://linux.vbird.org/linux_server/0110network_basic.php#tcpip_network_icmp AICMP="0 3 3/4 4 11 12 14 16 18" for tyicmp in $AICMP do iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT done # 5. 允許某些服務的進入,請依照你自己的環境開啟 if [ -f $RULE_PATH/iptables.service ]; then sh $RULE_PATH/iptables.service fi # 6. 最終將這些功能儲存下來吧! /etc/init.d/iptables save
各個指令的意義請參考鳥哥的Linux私房菜 第九章、防火牆與NAT伺服器介紹,在此不贅述。以下我就直接介紹如何安裝、設定與使用這些腳本檔。
<^>1. iptables腳本檔安裝
iptables的設定必須以 root 管理者 的身分操作,因此這一篇所有的動作都請以 root 進行吧。
另外,為了避免防火牆配置錯誤導致伺服器無法遠端連線,建議請在可以直接控制本機的時候再進行設定。以免設定錯誤導致伺服器無法連線的時候,再遠端也無能為力啊。
<^>1-1. 檔案下載與配置
請下載以下檔案:
將該zip檔案上傳到伺服器的指定目錄「/root/」。並以unzip解壓縮。unzip解壓縮的指令如下:
[root@dspace-dlll ~]# unzip pulipuli.iptables.zip -d /root
iptables的腳本檔就會出現在「/root/iptables」目錄中。
當然,你也可以在其他電腦解壓縮之後再上傳到「/root/iptables」目錄。
<^>1-2. 修改sh權限為700
為了要讓副檔名為sh的腳本檔可以執行,必須將他們的權限設為700,意思是只有擁有者root才能執行。
設定權限的指令如下:
[root@dspace-dlll ~]# chmod 700 /root/iptables/*.sh
<^>2. iptables腳本檔設定
在主要設定中,我們會先讓iptables阻擋所有外來連線。因此我們要在以下三個檔案中設定特別阻擋或允許的IP與連接埠設定。以下主要設定的有三個檔案,他們的優先順序也是由先到後:
- iptables.deny:設定要阻擋的IP。
- iptables.allow:設定要允許的IP。
- iptables.service:設定要允許的連接埠。
<^>2-1. iptables.deny 設定要阻擋的IP
檔案的內容如下,紅字的部份是要阻擋的IP:
#!/bin/bash # 這份設定要搭配iptables.rule.sh運作 # 底下填寫的是『你要抵擋的IP!』 # iptables -A INPUT -i $EXTIF -d members.lycos.co.uk -j DROP #不能使用Domain Name,會被iptables轉換成IP iptables -A INPUT -i $EXTIF -s 213.131.252.251 -j DROP #阻止後門程式連入 iptables -A INPUT -i $EXTIF -d 213.131.252.251 -j DROP #阻止後門程式連出
在此範例中,我將「213.131.252.251」這個IP列為阻擋的對象。一個IP有兩條設定,一個是加上「-s」參數的阻擋連入,一個是加上「-d」參數的阻擋輸出。如果你要擋下其他的IP的話,可以據此依樣畫葫蘆建立相同的設定,然後更換IP即可。
<^>2-2. iptables.allow 設定要允許的IP
檔案的內容如下,藍字的部份是要允許一定範圍的IP,紅字部分是要允許的IP:
#!/bin/bash # 這份設定要搭配iptables.rule.sh運作 # 底下則填寫你允許進入本機的其他網域或主機 #iptables -A INPUT -i $EXTIF -s 140.119.61.0/255.255.255.0 -j ACCEPT #140.119.61.*的電腦,不建議開放 iptables -A INPUT -i $EXTIF -s 140.119.61.254 -j ACCEPT #允許指定IP連線
此例中,我設定「140.119.61.0/255.255.255.0」,也就是「140.119.61.*」這個範圍的IP都可以允許連線,不論是用哪種連接埠。(因為連接埠的設定iptables.service是在iptables.allow之後執行)但是這種大範圍的允許規則比較危險,除非你非常信任這個區域網路,否則不建議開放。因此我將此條規則前面加上「#」註解掉,讓它無法生效。
另外我指定「140.119.61.254」這個IP,允許他連線到伺服器,而不論是用哪種連接埠。如果你通常使用固定IP來管理這台伺服器,那麼我比較建議使用這種用法。
<^>2-3. iptables.service 設定要允許的連接埠
檔案的內容如下,紅字的部份是要允許的連接埠,藍字的部份是連接埠預設對應的服務名稱:
#!/bin/bash # 這份設定要搭配iptables.rule.sh運作 # 5. 允許某些服務的進入,請依照你自己的環境開啟 #iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP #iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH 不建議直接開放,請允許IP即可 #iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP #iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS #iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW #iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3 #iptables -A INPUT -p TCP -i $EXTIF --dport 389 --sport 1024:65534 -j ACCEPT # LDAP #iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS SSL #iptables -A INPUT -p TCP -i $EXTIF --dport 8080 --sport 1024:65534 -j ACCEPT # Tomcat #iptables -A INPUT -p TCP -i $EXTIF --dport 10000 --sport 1024:65534 -j ACCEPT # Webmin
在iptables.rule.sh中,我們先將所有連線都擋掉,而以白名單的方式設定要允許的連接埠。這邊設定的連接埠,可以讓任何電腦藉此連線到伺服器。
然而,我們一般伺服器開放的服務並沒有這麼多,通常只有開放WWW網頁伺服器而已,因此大部分的服務我都用「#」註解掉不使用。請依照你的需求來決定是否要開放。
必須要注意的是,我並不建議在此開放管理用的連接埠,像是ssh用的22、Webmin用的10000。我建議應該要設定 iptables.allow 指定允許的IP連線即可,這些IP不會受到iptables.service的連接埠設定限制。不要將管理用的連接埠開放到網際網路,是比較安全的作法。
<^>3. 執行iptables腳本檔
<^>3-1. 執行iptables.rule.sh:設定生效
設定完上述三個檔案之後,接下來執行 iptables.rule.sh 腳本檔,設定才會生效。
執行的指令與正常運作的訊息如下:
[root@dspace-dlll ~]# /root/iptables/iptables.rule.sh
正在儲存防火牆規則到 /etc/sysconfig/iptables: [ 確定 ]
<^>3-2. 執行view_iptables.sh:檢查設定
為了確認iptables的設定是否有正常寫入,你可以執行 view_iptables.sh 這個腳本檔。其實它的內容只是「iptables –L –n -v」 ,也就是iptables查詢設定的指令。為了簡便記憶,我把它連同參數一起寫成 view_iptables.sh 這個腳本檔。
執行 view_iptables.sh 的指令與正常運作的訊息如下:
[root@dspace-dlll ~]# /root/iptables/view_iptables.sh Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 65 5564 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 55 3344 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 DROP all -- eth0 * 213.131.252.251 0.0.0.0/0 0 0 DROP all -- eth0 * 0.0.0.0/0 213.131.252.251 0 0 ACCEPT all -- eth0 * 140.119.61.254 0.0.0.0/0 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 0 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 3 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 3 code 4 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 4 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 11 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 12 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 14 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 16 0 0 ACCEPT icmp -- eth0 * 0.0.0.0/0 0.0.0.0/0 icmp type 18 0 0 ACCEPT tcp -- eth0 * 0.0.0.0/0 0.0.0.0/0 tcp spts:1024:65534 dpt:80 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 98 packets, 8728 bytes) pkts bytes target prot opt in out source destination
看到設定都有順利存入iptables之後,防火牆設定就大功告成囉!
<^>reset_iptables.sh:清除iptables設定
有時候防火牆設定並不如人意,你又不確定是哪裡設定錯誤的時候,你可以用reset_iptables.sh 來暫時清除所有防火牆的設定。
reset_iptables.sh的檔案內容如下。
#!/bin/bash # 清除iptables的所有設定,並允許所有連線 iptables -F iptables -X iptables -Z iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # 儲存設定 #/etc/init.d/iptables save #先不儲存,重開機之後就會恢復之前的設定
請注意最後一行,我將儲存設定的指令註解掉,因此清除iptables設定的動作並不會永久儲存,下次重新開機或重新啟動iptables的時候,之前的設定就會恢復。如果你有必要永久儲存的話,請取消這一行的註解吧。
reset_iptables.sh 的執行指令如下:
[root@dspace-dlll ~]# /root/iptables/reset_iptables.sh
================================================================
個人補充:
在設定防火牆時,順序很重要,會由上往下逐條通過,如果上面就檔掉的連線下方再怎麼開啟權限都都無效果
在設定防火牆時,順序很重要,會由上往下逐條通過,如果上面就檔掉的連線下方再怎麼開啟權限都都無效果
# 請先輸入(定義)您的相關參數,不要輸入錯誤了! EXTIF="eth0" # 這個是可以連上 Public IP 的網路介面 RULE_PATH="/root/iptables" #iptables的設定路徑,最後不要有「/」 export EXTIF RULE_PATH
# ping 這台主機才 ping 的到
-A INPUT -p icmp -j ACCEPT
#內部網卡 (localhost) 全開
-A INPUT -i lo -j ACCEPT
#同意經由 tpc 連入 22 port 的連線 (NEW = 外面新連入的服務 )
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#全拒絕,這兩行固定增加在最下方安全才有保障
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
#內部網卡 (localhost) 全開
-A INPUT -i lo -j ACCEPT
#同意經由 tpc 連入 22 port 的連線 (NEW = 外面新連入的服務 )
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#全拒絕,這兩行固定增加在最下方安全才有保障
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
選項與參數:
[root@www ~]# iptables [-t tables] [-FXZ]
-F :清除所有的已訂定的規則;
-X :殺掉所有使用者 "自訂" 的 chain (應該說的是 tables )囉;
-Z :將所有的 chain 的計數與流量統計都歸零
[root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD]
[ACCEPT,DROP]
-P :定義政策( Policy )。注意,這個 P 為大寫啊!
ACCEPT :該封包可接受
DROP :該封包直接丟棄,不會讓 client 端知道為何被丟棄。
[root@www ~]# iptables [-AI 鏈名] [-io 網路介面]
[-p 協定] \
> [-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]
-AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加"
-A :新增加一條規則,該規則增加在原本規則的最後面。例如原本已經有四條規則,
使用 -A 就可以加上第五條規則!
-I :插入一條規則。如果沒有指定此規則的順序,預設是插入變成第一條規則。
例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 號
鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。
-io 網路介面:設定封包進出的介面規範
-i :封包所進入的那個網路介面,例如 eth0, lo 等介面。需與 INPUT 鏈配合;
-o :封包所傳出的那個網路介面,需與 OUTPUT 鏈配合;
-p 協定:設定此規則適用於哪種封包格式
主要的封包格式有: tcp, udp, icmp 及 all 。
-s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如:
IP :192.168.0.100
網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。
若規範為『不許』時,則加上 ! 即可,例如:
-s ! 192.168.100.0/24 表示不許 192.168.100.0/24 之封包來源;
-d 目標 IP/網域:同 -s ,只不過這裡指的是目標的 IP 或網域。
-j :後面接動作,主要的動作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG)
[root@www ~]# iptables [-AI 鏈] [-io 網路介面]
[-p tcp,udp] \
> [-s 來源IP/網域] [--sport 埠口範圍] \
> [-d 目標IP/網域] [--dport 埠口範圍] -j [ACCEPT|DROP|REJECT]
--sport 埠口範圍:限制來源的埠口號碼,埠口號碼可以是連續的,例如 1024:65535
--dport 埠口範圍:限制目標的埠口號碼。
[root@www ~]# iptables -A INPUT [-m state] [--state 狀態]
-m :一些 iptables 的外掛模組,主要常見的有:
state :狀態模組
mac
:網路卡硬體位址 (hardware
address)
--state :一些封包的狀態,主要有:
INVALID
:無效的封包,例如資料破損的封包狀態
ESTABLISHED:已經連線成功的連線狀態;
NEW
:想要新建立連線的封包狀態;
RELATED
:這個最常用!表示這個封包是與我們主機發送出去的封包有關
[root@www ~]# iptables -A INPUT -m mac --mac-source
aa:bb:cc:dd:ee:ff \
> -j ACCEPT
--mac-source :就是來源主機的 MAC 啦!
[root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT
--icmp-type :後面必須要接 ICMP 的封包類型,也可以使用代號,
例如 8 代表 echo request 的意思。
沒有留言:
張貼留言