2014年4月24日 星期四

[轉貼]CentOS 設定 – 基本調效與 SSH 連線 & 防火牆設定

文章來源 : 百.EDCO - [教學] CentOS 6.3 設定 – (1) 基本調效與 SSH 連線

在完成 最小安裝 與 網路設定 之後,此時你的 CentOS 已經處於 On Live 狀態,在預設的安裝中,CentOS 會內建並啟動 SSH 遠端連線的服務,且啟動防火牆,只允許 ICMP 與 SSH 連線,這表示你已經可以透過網路連線,而不再需要直接操作實體主機。
但,這樣就夠安全了嗎?其實 SSH 一點都不安全,當你的主機開啟此類服務時,表示任何人都可能透過網路的方式來嘗試連線到你的主機,透過 Port 掃瞄、字典檔或暴力破解,無論如何,root 密碼最終還是會被破解,而你的主機就淪為駭客的溫床。
因此,本文將引導大家透過設定 SSH ,降低被攻擊的可能,在配合防火牆的配置,只允許許可的網段連線,讓駭客無從而入。最後再針對環境配置,讓系統運作更加乾淨利落。

一、使用 SSH 連線 (PuTTY , PieTTY)

在剛安裝完後的主機,預設就會開啟 SSH 服務,而 Port 也為預設的 22,要遠端連線這個服務,就必須去下載 SSH 的 Client 軟體,一般在 Windows 環境下,幾乎所有使用 Linux 系統的玩家,都會推薦使用PuTTY (支援中文的版本為 PieTTY) 這一套來連線。
使用 Pietty 來連線 SSH 服務
只要輸入您的主機 IP 與 Port ,就會透過網路遠端連線到該主機
image
使用 SSH 第一次連線時,會進行 RSA2 的金鑰交換,來達成整個連線,傳輸資料的安全(加密傳輸),這就是 SSH 比一般連線還安全的原因(能防止中途攔截時,封包內容被解讀)
image
再來就會看到登入畫面,輸 root 帳戶與密碼就會登入成功了,這也意味著任何能夠知道 IP 的人,都能嘗試登入你的 root 帳號

二、設定 SSH 服務

如上面所說,目前的 SSH 是可能會被任何人連線的,因此,我們可以透過 SSH 服務的設定檔來增加安全性,目標作以下幾項變更:
  1. 更改 Port 為 22 (防止掃瞄Port)
  2. 不允許 root 登入(自己建立另一個新使用者來登入)
  3. DNS反查關閉(加快登入速度)
  4. 只允許指定的帳號登入(如範例為 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 端)
1
2
vi /etc/sysconfig/init
ACTIVE_CONSOLES=/dev/tty[1-2]
================================================================

文章來源 : Linux的iptables防火牆設定記事

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與連接埠設定。以下主要設定的有三個檔案,他們的優先順序也是由先到後:
  1. iptables.deny:設定要阻擋的IP。
  2. iptables.allow:設定要允許的IP。
  3. 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

選項與參數:
[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 的封包類型,也可以使用代號,
              例如代表 echo request 的意思。

沒有留言:

張貼留言