基於CentOS系統的VPS安全設置與優化

本文所有代碼基於CentOS 6.4操作系統為例進行說明,於6.x版本應該都是適用的,其他版本的話主要是命令的路徑不同,思路是一致的。本文也可以稱為:CentOS操作系統全設置與優化。安裝好CentOS系統後,建議不要急著去做這些安裝設置和優化,因為過早操作,會在Web環境搭建(特別是用主機控制面板的)過程當中因為早過禁止某些權限和程序而造成問題。所以這些安全設置和優化,建議最後才來操作。

Server

第一步、賬戶安全管理

1. 修改密碼長度

[root@localhost /]# vi /etc/login.defs
PASS_MIN_LEN 18

2. 創建一個普通用戶賬號並設置密碼,這樣所有的操作都使用該普通賬號進行,後面還要禁止Root帳號的操作。

[root@localhost /]# useradd ru
[root@localhost /]# passwd ru

上面的ru用你想創建的用戶名替代

3. 禁用不必要的帳號

Linux默認提供了很多賬號,賬號越多,系統就越容易受到攻擊,所以應該禁止所有默認的被操作系統本身啟動的並且不必要的賬號。 可以使用 vi /etc/passwd 查看系統賬號,使用 vi /etc/group 查看系統的用戶組。

[root@localhost /]# userdel adm
[root@localhost /]# userdel lp
[root@localhost /]# userdel sync
[root@localhost /]# userdel shutdown
[root@localhost /]# userdel halt
[root@localhost /]# userdel news
[root@localhost /]# userdel uucp
[root@localhost /]# userdel operator
[root@localhost /]# userdel games
[root@localhost /]# userdel gopher
[root@localhost /]# userdel ftp

[root@localhost /]# groupdel adm
[root@localhost /]# groupdel lp
[root@localhost /]# groupdel news
[root@localhost /]# groupdel uucp
[root@localhost /]# groupdel games
[root@localhost /]# groupdel dip
[root@localhost /]# groupdel pppusers

以上代碼一條一條輸入運行既可。

5. 禁止非授權用戶獲得權限

[root@localhost /]# chattr +i /etc/passwd
[root@localhost /]# chattr +i /etc/shadow
[root@localhost /]# chattr +i /etc/group
[root@localhost /]# chattr +i /etc/gshadow

這樣操作之後也無法創建賬號和修改密碼,後面可以使用chattr -i命令恢復之後再進行操作。這也是為什麼本人文章開始時建議大家搭建VPS時最後做這些優化了。

6. 禁止Ctrl+Alt+Delete重啟命令

修改 /etc/inittab 文件,將下面一行註釋掉

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

或者

[root@localhost ~]# vi /etc/init/control-alt-delete.conf 
#exec /sbin/shutdown -r now "Control-Alt-Deletepressed"  #註釋掉

7. 設置/etc/profile

# 設置自動退出終端,防止非法關閉ssh客戶端造成登錄進程過多,可以設置大一些,單位為秒
[root@localhost /]# echo "TMOUT=3600" >>/etc/profile
# 歷史命令記錄數量設置為10條
[root@localhost /]# sed -i "s/HISTSIZE=1000/HISTSIZE=10/" /etc/profile
[root@localhost /]# source /etc/profile

8. 重新設置 /etc/rc.d/init.d/ 目錄下所有文件的許可權限

/etc/rc.d/init.d/ 目錄下所有文件僅root賬號可以讀、寫和執行其中的所有腳本文件:

[root@localhost /]# chmod -R 700 /etc/rc.d/init.d/*

第二步、SSH安全配置

SSH作為系統登錄的入口,其安全性的重要性不言而喻。一般系統都會默認安裝了SSH。如果沒有安裝SSH,使用yum install ssh命令進行安裝。

接下來先備份原來的配置文件

[root@localhost /]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

然後修改 Vi /etc/ssh/sshd_config 文件:

#SSH的端口,默認為22,比喻改為5028端口
Port 5028
# 將#protocol 2,1改為
protocol 2
# 不允許root用戶直接登錄
PermitRootLogin no
# 不允許空密碼登錄
PermitEmptyPasswords no
# 不允許使用網址登錄
UseDns no

然後使用 service sshd restart 重啟SSH服務。

第三步、關閉系統中不需要的服務,刪除不必要的軟件包

1. 刪除不必要的軟件包

yum remove Deployment_Guide-en-US finger cups-libs cups ypbind
yum remove bluez-libs desktop-file-utils ppp rp-pppoe wireless-tools irda-utils
yum remove sendmail* samba* talk-server finger-server bind* xinetd
yum remove nfs-utils nfs-utils-lib rdate fetchmail eject ksh mkbootdisk mtools
yum remove syslinux tcsh startup-notification talk apmd rmt dump setserial portmap yp-tools
yum groupremove "Mail Server" "Games and Entertainment" "X Window System" "X Software Development" 
yum groupremove "Development Libraries" "Dialup Networking Support" 
yum groupremove "Games and Entertainment" "Sound and Video" "Graphics" "Editors" 
yum groupremove "Text-based Internet" "GNOME Desktop Environment" "GNOME Software Development"

2. 關閉不必要的服務

命令:chkconfig 服務內容 off

輸入以下命令,禁止相應服務:

#linux新型電源管理標準,建議筆記本使用  
chkconfig acpid off  
#和 cron 相似的任務調度器,只不過它並不要求系統持續運行  
chkconfig anacron off  
#運行用戶用at命令調度的任務,需要用到at的得留著  
chkconfig atd off  
#藍牙的,沒有就關了  
chkconfig bluetooth off  
#不做打印服務器的就關了吧  
chkconfig cups off  
#系統安裝後第一次啟動的配置工具  
chkconfig firstboot off  
#藍牙的輸入支持  
chkconfig hidd off  
#ipv6防火牆  
chkconfig ip6tables off  
#內網的話就懶得配置防火牆了  
chkconfig iptables off  
#新增硬件檢測  
chkconfig kudzu off  
#主要用於SELinux,不開SELinux的話就關了  
chkconfig mcstrans off  
#IA32微碼驅動程序  
chkconfig microcode_ctl off  
#SELinux用於監控文件  
chkconfig restorecond off  
#郵件程序,如果不是郵件服務器就關了  
chkconfig sendmail off  
SELinux Troubleshooting  
chkconfig setroubleshoot off  
#禁止系統自動更新  
chkconfig yum-updatesd off  

然後重啟服務器 reboot 開機就不會啟動這些服務了

第四步、防止攻擊

1. 阻止ping

將 /proc/sys/net/ipv4/icmp_echo_ignore_all 文件的內容修改為1,不過這樣的話如果服務器重啟之後就會恢復為0了。

可以將下面的內容加入到 /etc/rc.d/rc.local 文件中:

echo 1 /proc/sys/net/ipv4/icmp_echo_ignore_all

2. 防止IP欺騙攻擊

編輯 /etc/host.conf 文件,在下面增加如下幾行:

[root@localhost /]# vi /etc/host.conf
order bind,hosts
multi off
nospoof on

3. 防止DoS攻擊

對系統所有的用戶設置資源限制可以防止DoS類型攻擊。如最大進程數和內存使用數量等。對 /etc/security/limits.conf 文件添加如下內容:

# 禁止調試文件
* hard core 0
# 限制內存使用為5MB
* hard rss 5000
# 限制進程數為20
* hard nproc 20
* 

接下來必須編輯 /etc/pam.d/login 文件確認下面一行是否存在,如果不存在的話添加上:

session required /lib/security/pam_limits.so

對於DDos攻擊可以使用DDoS deflate腳本,詳細介紹見下面的參考資料。

第五步、系統配置及性能調優

1. 修改系統默認字符集

如果使用英文安裝系統之後,如果系統中有中文會顯示亂碼,這個時候需要修改系統默認的字符集:

[root@localhost /]# vi /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"
 ##Vi編輯器常用命令`i`為修改,`Esc`為退出編輯狀態,`:wq`為保存退出
[root@localhost /]# source /etc/sysconfig/i18n

將系統的編碼修改為zh_CN.UTF-8,後面一句命令是讓修改立即生效。

** 2. 使用ntp服務更新服務器時間**

首先檢查系統中是否安裝了ntp服務:

[root@localhost /]# chkconfig --list |grep ntp

如果沒有安裝的話使用yum進行安裝並更新時間

[root@localhost /]# yum install ntp
[root@localhost /]# ntpdate time.windows.com

也可以將更新命令加入到cron中進行自動更新時間:

[root@localhost /]# crontab -e
* */12 * * * ntpdate time.windows.com

[root@localhost /]# service crond restart

以上操作是每隔12小時自動更新一次時間,可以通過 crontab -l 命令進行查看。

** 3. 去掉系統相關信息**

[root@localhost ~]# echo "Welcome to Server" >/etc/issue 
[root@localhost ~]# echo "Welcome to Server" >/etc/redhat-release 

** 4. 同步系統時間**

[root@localhost ~]# cp /usr/share/zoneinfo/Asia/Shanghai/etc/localtime  #設置Shanghai時區 
[root@localhost ~]# ntpdate cn.pool.ntp.org ;hwclock–w  #同步時間並寫入blos硬件時間 
[root@localhost ~]# crontab –e #設置任務計劃每天零點同步一次 
0 * * * * /usr/sbin/ntpdate cn.pool.ntp.org ; hwclock -w 

** 5. 系統內核優化**

[root@localhost ~]# vi /etc/sysctl.conf #末尾添加如下參數 
net.ipv4.tcp_syncookies = 1 #1是開啟SYN Cookies,當出現SYN等待隊列溢出時,啟用Cookies來處,理,可防範少量SYN攻擊,默認是0關閉 
net.ipv4.tcp_tw_reuse = 1 #1是開啟重用,允許講TIME_AIT sockets重新用於新的TCP連接,默認是0關閉 
net.ipv4.tcp_tw_recycle = 1 #TCP失敗重傳次數,默認是15,減少次數可釋放內核資源 
net.ipv4.ip_local_port_range = 4096 65000  #應用程序可使用的端口範圍 
net.ipv4.tcp_max_tw_buckets = 5000 #系統同時保持TIME_WAIT套接字的最大數量,如果超出這個數字,TIME_WATI套接字將立刻被清除並打印警告信息,默認180000 
net.ipv4.tcp_max_syn_backlog = 4096 #進入SYN寶的最大請求隊列,默認是1024 
net.core.netdev_max_backlog =  10240  #允許送到隊列的數據包最大設備隊列,默認300 
net.core.somaxconn = 2048  #listen掛起請求的最大數量,默認128 
net.core.wmem_default = 8388608 #發送緩存區大小的缺省值 
net.core.rmem_default = 8388608 #接受套接字緩衝區大小的缺省值(以字節為單位) 
net.core.rmem_max = 16777216   #最大接收緩衝區大小的最大值 
net.core.wmem_max = 16777216   #發送緩衝區大小的最大值 
net.ipv4.tcp_synack_retries = 2  #SYN-ACK握手狀態重試次數,默認5 
net.ipv4.tcp_syn_retries = 2   #向外SYN握手重試次數,默認4 
net.ipv4.tcp_tw_recycle = 1  #開啟TCP連接中TIME_WAIT sockets的快速回收,默認是0關閉 
net.ipv4.tcp_max_orphans = 3276800  #系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上,如果超出這個數字,孤兒連接將立即復位並打印警告信息 
net.ipv4.tcp_mem = 94500000 915000000 927000000 
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力; 
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段; 
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket。內存單位是頁,可根據物理內存大小進行調整,如果內存足夠大的話,可適當往上調。上述內存單位是頁,而不是字節。 

或者用以下參數進行優化

[root@localhost /]# cp /etc/sysctl.conf /etc/sysctl.conf.bak [root@localhost /]# vi /etc/sysctl.conf

net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 400065000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.ip_conntrack_max = 25000000
net.ipv4.netfilter.ip_conntrack_max=25000000
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120

最後,使用 sysctl –p 命令讓上述設置立即生效。最後都設置好後,記得禁止系統自動更新,同時自已建立一個系統鏡像吧,到時需要時就恢復回去,不必要每裝一次系統就重複設置一次。

14 thoughts on “基於CentOS系統的VPS安全設置與優化

    1. jiajia 文章作者

      現在用的這個主題就是大發開發的。主題基本常變,至今還沒有一個主題可以讓我安安份分的。不過這個主題也只是用了2個月。還坐呀,路兄…

      回復
  1. 54evil

    我感覺沒有多少必要折騰,想用VPS擔心自己的技術不過關,完全可以去阿里選擇雲虛擬主機,有雲盾和雲監控,目前大部分攻擊都是都是來源於web的入侵,進而拿下服務器權限。只要你的web代碼沒有問題就ok了!再就是基於linux下的面板問題,你把端口改掉,把面板的登陸頁面標識改掉,或者禁止蜘蛛爬行,就沒有問題的!打比方說你就這麼一個blog放到雲主機上,只要是沒有爆發高危oday,那麼你就是安全的。如果是你放了其他的web程序,對這些程序代碼不瞭解,那麼你就需要做第二部甚至第三部防線。不要為了純粹的安全而去折騰安全,一個是沒有必要,在一個會很累,因為你盲目了!我記得劍心之前q上的簽名有句話帶了好久know it then hack it ! 有精力你完全可以關注當下主流攻擊滲透方式和方法,那麼結合日誌你就懂得我去怎麼防禦,真老虎也會被你變為紙老虎!

    回復
    1. jiajia 文章作者

      非常歡迎你的到來,並且留言這麼長的留言。我也認真閱讀了你的留言,我對於VPS安全不信任原因是有以下這些:
      VPS本身就是一個虛擬的服務器,它需要在上面安裝操作系統,而這個操作系統需要做相應的優化與安全設置。

      這些優化與安全設置都做到了嗎?這些都足夠安全了嗎?我相信很多新手都與我一樣擔心……

      在相應的優化與安全設置都做了後,發現還是有問題,比喻有人不停地掃本身SU權限和SSH權限,窮密破解等。使用17ce進行Get時,VPS後台就顯示硬盤I/O峰值過大,馬上VPS就慢了起來,並且網站無法訪問。

      如果用百度站長工具–漏洞檢查,一運行這個檢查,整個VPS處理停止運行狀態,必須VPS裡的操作系統重啟後才恢復正常。

      回復
  2. abcdef

    error: 「net.ipv4.ip_conntrack_max」 is an unknown key
    error: 「net.ipv4.netfilter.ip_conntrack_max」 is an unknown key
    error: 「net.ipv4.netfilter.ip_conntrack_tcp_timeout_established」 is an unknown key
    error: 「net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait」 is an unknown key
    error: 「net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait」 is an unknown key
    error: 「net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait」 is an unknown key
    執行sysctl -p後出現以上信息,請教

    回復
  3. Pingback引用通告: 個人博客網站優化的一點思路 | JiaJia'blog

發表評論

電子郵件地址不會被公開。 必填項已用*標注