保護我們的VPS的步驟

本教程介紹瞭如何使用Debian GNU / Linux準備和保護虛擬專用服務器(VPS)。 在開始之前,先假設一些事情:

  1. 您對GNU / Linux具有中等的熟悉程度。
  2. 有一個供個人使用的VPS,我們可以通過SSH訪問。
  3. VPS具有專用的外部ipv4 250.250.250.155,而我們的提供商擁有250.250.0.0/16塊。 (一)
  4. 在我們的VPS中,我們將僅啟用http,https和ssh服務以供從外部訪問。
  5. 外部DNS將不會啟用,因為通常是在我們提供商的面板中完成的。 (2)
  6. 它將作為超級用戶運行。

安裝

首先,讓我們更新服務器並安裝一些我們需要的軟件包:

#aptitude更新和aptitude安全升級#aptitude -RvW安裝dropbear gesftpserver sslh iptables-永久ulogd fail2ban nginx-light apache2-utils dnsutils telnet ghostscript poppler-utils zip解壓縮unrar-free p7zip-完全少了Multitail Tee mc

組態

現在,我們將創建一個工作用戶。 以root用戶身份在服務器上工作是不安全的,因此我們將首先創建一個特殊用戶:

adduser運算符usermod -aG sudo運算符

第一個命令創建操作員用戶,第二個命令將其添加到組中 須藤,這將允許以root用戶身份運行應用程序。

調整超級用戶的權限

至於正常工作,我們將使用用戶 算子 先前創建的,我們需要以超級用戶身份調整命令執行選項,為此我們執行以下命令:

visudo命令

該命令基本上允許修改文件 在/ etc / sudoers文件; 其中應包含以下幾行:

默認值env_reset,timestamp_timeout = 0%sudo ALL =(ALL:ALL)ALL

在第一行中,該選項已添加到默認值 時間戳超時 它使您可以設置執行sudo命令時密碼的有效時間(以分鐘為單位)。 默認值為5,但這有時是不安全的,原因有兩個:

  1. 如果我們在密碼過期之前無意中使計算機保持登錄狀態,則有人可以以超級用戶身份執行命令而沒有任何限制。
  2. 如果由於無知而我們在密碼到期之前運行了包含惡意代碼的應用程序或腳本,則該應用程序可以未經超級用戶的許可以超級用戶身份訪問我們的系統。

因此,為了避免風險,我們將值設置為零,也就是說,每次執行sudo命令時,都必須輸入密碼。 如果將負值設置為-1,則結果是密碼永不過期,這將產生與我們想要的相反的結果。

第二行闡明了sudo組可以在任何計算機上執行任何命令,這是很平常的事情,儘管可以對其進行調整。 (3)為了方便起見,有些人將行放在下面以避免輸入密碼:

%sudo ALL =(全部:全部)NOPASSWD:全部

但是,正如我們之前解釋的那樣,這樣做存在風險,因此不建議這樣做。

禁用重啟

出於安全原因,我們還將使用組合鍵禁用重啟 按Ctrl + Alt + Del鍵,為此我們必須在文件中添加此行 / etc / inittab:

ca:12345:ctrlaltdel:/ bin / echo“ Ctrl + Alt + Del已被禁用。”

用DropBear替換OpenSSH

大多數VPS都裝有OpenSSH,這當然非常有用,但是除非我們需要利用OpenSSH的所有功能,否則VPS會有更輕巧的替代品,例如 落熊,通常足以正常使用。 但是,此應用程序的缺點是它沒有集成的SFTP服務器,這就是為什麼我們一開始就安裝該軟件包的原因 gesftp服務器.

要配置Dropbear,我們將修改文件 / etc /默認/ dropbear 這樣它包含以下兩行:

NO_START = 0 DROPBEAR_EXTRA_ARGS =“-w -p 127.0.0.1:22 -I 1200 -m”

第一行僅啟用服務,第二行執行幾項操作:

  1. 避免root訪問。
  2. 將服務放在本地接口的端口22上(稍後我們將解釋原因)。
  3. 設置等待時間(20分鐘)。

安全衛士

端口22(SSH)是眾所周知的,通常是黑客嘗試破壞的第一個端口,因此我們將改用端口443(SSL)。 碰巧該端口用於通過HTTPS進行安全瀏覽。

因此,我們將使用sslh軟件包,它只是一個多路復用器,它分析到達端口443的數據包,並根據流量類型是SSH還是SSL在內部將它們路由到一個服務或另一個服務。

SSLH無法在已經在監聽其他服務的接口上進行監聽,這就是為什麼我們之前讓Dropbear在本地接口上進行監聽的原因。

現在,我們需要做的是指示根據服務類型來確定接口和監聽端口,以及重定向數據包的位置,為此,我們將修改配置文件 / etc /默認/ sslh:

DAEMON = / usr / sbin / sslh DAEMON_OPTS =“-用戶sslh-收聽250.250.250.155:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:443 --pidfile / var / run / sslh / sslh。 pid“ RUN =是

最後,我們重新啟動服務:

服務ssh停止&&服務dropbear啟動&&服務sslh重新啟動

在執行上一個命令之後,我們的安全會話可能會被中斷,在這種情況下,足以再次登錄,但是這次是與工作用戶並使用端口443。如果不中斷該會話,建議將其關閉,然後從適當的值重新開始。

如果一切正常,我們可以繼續以root身份工作,如果需要,請卸載OpenSSH:

sudo su-aptitude -r清除openssh-server

防火牆功能

我們要做的下一件事是將日誌從防火牆中分離到單獨的文件中 /var/log/firewall.log 為了便於進一步分析,這就是為什麼我們在啟動時安裝了ulogd軟件包。 為此,我們將編輯文件 /etc/logd.conf 調整相關部分:

[LOGEMU]文件=“ /var/log/firewall.log” sync = 1

接下來,我們將修改記錄輪換文件 / etc / logrotate / ulogd 保持每天輪換(帶有日期)並將壓縮的齊射保存在目錄中 / var / log / ulog /:

/var/log/ulog/*.log /var/log/firewall.log {每日dateext missingok壓縮delaycompress共享腳本創建640個root adm後旋轉/etc/init.d/ulogd重新加載mv /var/log/firewall.log-* .gz / var / log / ulog / endscript}

因此,我們將通過執行以下操作來創建netfilter規則:

IPT = $(iptables)IPEXT = 250.250.250.155 IPEXTBLK = 250.250.0.0 / 16 IPBCAST = 255.255.255.255 $ IPT -F $ IPT -X $ IPT -Z $ IPT -A INPUT -i lo -j ACCEPT $ IPT- P輸入下降$ IPT -P向前下降$ IPT -P輸出接受$ IPT -A輸入-m狀態-狀態無效-j ULOG -ulog前綴IN_INVALID $ IPT -A輸入-p igmp -j ULOG -ulog -前綴IN_IGMP $ IPT -A輸入-m pkttype -pkt類型廣播-j ULOG -ulog前綴IN_BCAST $ IPT -A INPUT -m pkttype -pkt類型多播-j ULOG -ulog前綴IN_MCAST $ IPT -A轉發-j ULOG -ulog前綴轉發$ IPT -N ICMP_IN $ IPT -A輸入!  -i lo -p icmp -j ICMP_IN $ IPT -A ICMP_IN -p icmp -f -j ULOG --ulog前綴IN_ICMP_FRAGMENTED $ IPT -A ICMP_IN -p icmp -m icmp -m長度!  --length 28:1322 -j ULOG --ulog前綴IN_ICMP_INVALIDSIZE $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit --hashlimit-above 4 / sec --hashlimit-mode srcip --hashlimit-srcmask 24- -hashlimit-name icmpflood -j ULOG --ulog-prefix IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m hashlimit -hashlimit-upto 64kb / min -hashlimit-mode srcip -hashlimit-srcmask 24-hashlimit -名稱icmpattack -j ULOG --ulog前綴IN_ICMP_FLOOD $ IPT -A ICMP_IN -p icmp -m icmp -m u32!  --u32“ 0x4&0x3fff = 0x0” -j ULOG --ulog前綴IN_ICMP_ATTACK $ IPT -A ICMP_IN -p icmp -m icmp!  --icmp類型的echo請求-m狀態-狀態NEW -j ULOG --ulog前綴IN_ICMP_INVALID $ IPT -A ICMP_IN -p icmp -m icmp --icmp類型echo-r​​equest -j ULOG -ulog-前綴IN_ICMP $ IPT -A ICMP_IN -p icmp -m icmp -icmp類型echo-r​​equest -m limit --limit 1 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp類型echo-r​​eply -m限制--limit 2 /秒--limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -p icmp -m icmp --icmp類型目的地-不可訪問-m限制-限制2 /秒-極限突發4 -j接受$ IPT -A ICMP_IN -p icmp -m icmp --icmp類型的時間超過-m極限-極限2 /秒-極限突發4 -j接受$ IPT -A ICMP_IN -p icmp -m icmp --icmp-type參數問題-m limit --limit 2 / sec --limit-burst 4 -j ACCEPT $ IPT -A ICMP_IN -j RETURN $ IPT -N UDP_IN $ IPT-輸入!  -i lo -p udp -j UDP_IN $ IPT -A UDP_IN!  -我!  -p udp -f -j ULOG --ulog前綴IN_UDP_FRAGMENTED $ IPT -A UDP_IN -p udp -m udp --sport 53 -m長度!  --length 28:576 -j ULOG --ulog前綴IN_UDP_DNS_INVALIDSIZE $ IPT -A UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j ULOG --ulog前綴IN_UDP_DNSREQUEST $ IPT- UDP_IN -p udp -m udp --dport 53 -m -state --state NEW -j REJECT-拒絕icmp-port-unreachable $ IPT -A UDP_IN -p udp -m udp!  -體育53!  -s $ IPEXTBLK!  -d $ IPBCAST -m狀態-狀態NEW -j ULOG -ulog前綴IN_UDP $ IPT -A UDP_IN -p udp -m udp -m狀態-state已建立,相關-j接受$ IPT -A UDP_IN -j返回$ IPT -N TCP_IN $ IPT -A INPUT!  -i lo -p tcp -j TCP_IN $ IPT -A TCP_IN!  -我!  -p tcp -f -j ULOG --ulog前綴IN_TCP_FRAGMENTED $ IPT -A TCP_IN -p tcp -m tcp --sport 53 -m狀態--state已建立,相關-m長度!  --length 513:1500 -j ULOG --ulog前綴IN_TCP_DNS_INVALIDSIZE $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m狀態-狀態NEW -j ULOG --ulog-prefix IN_TCP_DNS $ IPT -A TCP_IN -p tcp -m tcp --dport 53 -m狀態--state新-j拒絕-拒絕icmp-port-unreachable $ IPT -A TCP_IN -p tcp -m tcp -m多端口!  --dports 80,443 -m狀態--state NEW -j ULOG --ulog-prefix IN_TCP $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m state --state NEW -m hashlimit-hashlimit -upto 4 /秒--hashlimit-burst 16 --hashlimit-mode srcip --hashlimit-name navreq -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m multiport --dports 80,443 -m狀態-狀態已建立-m connlimit!  --connlimit-above 16 -j ACCEPT $ IPT -A TCP_IN -p tcp -m tcp -m多端口! 

使用先前的配置,我們的VPS應該得到合理的保護,但是如果我們希望可以對其進行更多保護,可以使用一些更高級的規則。

並非所有的VPS都允許為netfilter安裝額外的模塊,但是非常有用的一個是 PSD,這可以避免端口掃描。 不幸的是,默認情況下該模塊未集成到netfilter中,因此有必要安裝某些軟件包然後構建該模塊:

aptitude -RvW安裝iptables-dev xtables-addons-source模塊輔助模塊-assistant --verbose --text-mode自動安裝xtables-addons-source

完成上述操作後,我們可以添加如下規則:

iptables -A INPUT -m psd --psd-weight-threshold 15 -psd-delay-threshold 2000 -psd-lo-port-weight 3 -psd-hi-ports-weight 1 -j ULOG -ulog-前綴IN_PORTSCAN

上面的規則基本上意味著我們將創建一個計數器,該計數器將在每次嘗試訪問低於3的端口時增加1024,並在每次嘗試訪問高於1的端口時增加1023。計數器在不到15秒的時間內達到20,軟件包將被註冊 日誌 作為嘗試portscan。 仍然可以一次丟棄這些數據包,但是在這種情況下,我們打算使用 fail2ban,我們將在以後進行配置。

創建規則後,我們必須採取某些預防措施以使它們持久化,否則在重新啟動服務器時我們將丟失它們。 有幾種方法可以做到這一點。 在本教程中,我們將使用開始時安裝的iptables-persistent軟件包,該軟件包將規則存儲在 /etc/iptables/rules.v4 y /etc/iptables/rules.v6 對於ipv6。

iptables-save> /etc/iptables/rules.v4

實際上,儘管在古巴尚未廣泛使用ipv6,但我們可以製定一些基本規則:

IPT = $(其中ip6tables)$ IPT -P輸入下降$ IPT -P轉發下降$ IPT -P輸出接受$ IPT -A輸入-i lo -j接受$ IPT -A輸入! -i lo -m狀態-狀態已建立,相關-j接受未設置IPT

這些規則也可以持久化:

ip6tables-save> /etc/iptables/rules.v6

最後,為了提高安全性,我們清理防火牆的註冊表並重新啟動服務:

echo -n> /var/log/firewall.log服務logrotate重新啟動服務ulogd重新啟動服務iptables-永久重新啟動

Nginx的

我們將Nginx用作Web服務器,因為與真實服務器相比,VPS通常具有較少的RAM,因此通常比Apache輕便方便。

在配置Nginx之前,我們將創建一個證書(無密碼)以通過HTTPS使用:

cd / etc / nginx openssl genrsa -des3 -out cert.key 4096 cp -v cert.key cert.key.original openssl req -new -key cert.key -out cert.csr openssl rsa -in cert.key.original- outcert.key openssl x509 -req -days 365 -in cert.csr -signkey cert.key -out cert.crt

完成此操作後,我們將為用戶“ elusuario”創建一個密碼文件:

htpasswd -c .htpasswd用戶

接下來,我們將修改文件 在/ etc / nginx的/網站可用/默認 設置默認的網站首選項。 它可能看起來像這樣:

服務器{server_name localhost; index index.html index.htm default.html default.htm; root / var / www; location / {#設置驗證的順序和要加載的頁面,如果未找到URI try_files $ uri $ uri / /index.html; }}服務器{聽127.0.0.1:443; server_name localhost; index index.html index.htm default.html default.htm; root / var / www; ssl on; ssl_certificate cert.crt; ssl_certificate_key cert.key; ssl_session_timeout 5m; #僅通過TLS(比SSL更安全)啟用HTTPS ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #優先考慮高強度密碼[HIGH],#將中等強度密碼[MEDIUM]移到列表的末尾,#禁用低強度密碼[LOW](40和56位)#禁用具有導出算法的密碼[ EXP]#禁用空密碼[eNULL],不進行身份驗證[aNULL],SSL(版本2和3)和DSS(僅允許最大1024位的密鑰)ssl_ciphers HIGH:+ MEDIUM :! LOW :! EXP:!aNULL :! eNULL:!SSLv3:!SSLv2:!DSS; #優先使用服務器的加密方法(默認情況下使用客戶端的加密方法)ssl_prefer_server_ciphers on; location / {#啟用身份驗證auth_basic“登錄”; auth_basic_user_file /etc/nginx/.htpasswd; #如果未找到URI try_files $ uri $ uri / = 404,則設置驗證順序和要加載的頁面代碼; #允許為通過身份驗證的用戶自動創建索引; autoindex_exact_size關閉; autoindex_localtime on; }}

我們檢查配置是否正確:

nginx -t

最後,我們重新啟動服務:

服務nginx重啟

Fail2Ban

在開始配置Fail2Ban之前,為了提高安全性,我們停止了服務並清理了註冊表:

fail2ban-client停止echo -n> /var/log/fail2ban.log

接下來,我們創建配置文件 /etc/fail2ban/jail.local 具有以下自定義內容:

#自定義配置文件/etc/fail2ban/jail.local#[DEFAULT] findtime = 43200; 禁酒時間12小時= 86400; 1天maxretry = 3; 禁令將在第四次嘗試後生效[ssh] enabled = false [nginx-auth] enabled = true篩選器= nginx-auth action = iptables-multiport [name = NoAuthFailures,port =“ http,https”] logpath = / var / log / nginx * / *錯誤* .log [nginx-badbots]已啟用=真實過濾器= apache-badbots操作= iptables-multiport [名稱= BadBots,端口=“ http,https”] logpath = / var / log / nginx * /*access*.log bantime = 4; 604800週maxretry = 1 [nginx登錄]啟用=真正的過濾器= nginx登錄操作= iptables-multiport [名稱= NoLoginFailures,端口=“ http,https”] logpath = / var / log / nginx * / *訪問*。日誌禁止時間= 0; 1800分鐘[啟用nginx-noscript] =真實操作= iptables-multiport [名稱= NoScript,端口=“ http,https”]過濾器= nginx-noscript logpath = /var/log/nginx*/*access*.log maxretry = 30 [啟用nginx-proxy] = true操作= iptables-multiport [名稱= NoProxy,端口=“ http,https”]過濾器= nginx-proxy logpath = /var/log/nginx*/*access*.log bantime = 0 ; 604800週maxretry = 1 [啟用防火牆] =真實操作= iptables-multiport [名稱=防火牆]過濾器=防火牆日誌路徑= /var/log/firewall.log maxretry = 0

完成此操作後,我們將在目錄中創建 /etc/fail2ban/filters.d/ 以下文件:

#/etc/fail2ban/filter.d/nginx-auth.conf#身份驗證過濾器#阻止使用基本身份驗證失敗的IP#[定義] failregex =未提供用於基本身份驗證的用戶/密碼。 用戶*找不到*客戶端: 用戶*密碼不匹配*客戶端: ignoreregex =
#/etc/fail2ban/filter.d/nginx-login.conf#登錄過濾器#阻止使用Web應用程序登錄頁面進行身份驗證的IP#掃描HTTP 200 + POST /會話的訪問日誌=>登錄失敗#[定義] failregex = ^ -。* POST /會話HTTP / 1 \ ..“ 200 ignoreregex =
#/etc/fail2ban/filter.d/nginx-noscript.conf#Noscript過濾器#阻止試圖執行腳本的IP,例如.php,.pl,.exe和其他有趣的腳本。 #匹配,例如#192.168.1.1--“ GET /something.php#[定義] failregex = ^ -。* GET。*(\。Php | \ .asp | \ .exe | \ .pl | \ .cgi | \ scgi)ignoreregex =
#/etc/fail2ban/filter.d/proxy.conf#代理過濾器#阻止試圖將服務器用作代理的IP。 #匹配,例如#192.168.1.1--“獲取http://www.something.com/#[定義] failregex = ^ -。* GET http。* Ignoreregex =
#/etc/fail2ban/filter.d/firewall.conf#防火牆過濾器#[定義] failregex = ^。* IN_(INVALID | PORTSCAN | UDP | TCP |)。* SRC = * $ ignoreregex =

最後,我們啟動服務並加載配置:

fail2ban-service -b fail2ban-client重新加載

驗證

最後,我們可以使用 尾巴-f o 多尾–全部關注。 實際上,後一個應用程序具有以下優點:它允許您同時查看多個文件並提供基本語法突出顯示。

如果未在VPS中配置電子郵件帳戶,建議禁用啟動multitail時出現的警告消息,對此我們將執行以下命令:

echo“ check_mail:0”>〜/ .multitailrc

實際上,我們可以使用短命令(例如“ flog”)來創建別名(4)來快速查看日誌:

別名flog ='multitail --follow-all /var/log/firewall.log /var/log/fail2ban.log'

1)這些是虛擬的價值。
2)一旦了解其他服務的工作原理,啟用其他服務就很容易了。
3)有關更多詳細信息,請運行man sudoers。
4)可以選擇添加到〜/ .bash_aliases文件中


發表您的評論

您的電子郵件地址將不會被發表。 必填字段標有 *

*

*

  1. 負責數據:MiguelÁngelGatón
  2. 數據用途:控制垃圾郵件,註釋管理。
  3. 合法性:您的同意
  4. 數據通訊:除非有法律義務,否則不會將數據傳達給第三方。
  5. 數據存儲:Occentus Networks(EU)託管的數據庫
  6. 權利:您可以隨時限制,恢復和刪除您的信息。

  1.   MSX 他說:

    有一些有趣的事情,+ 1

  2.   友喜 他說:

    @Hugo這行在配置中:

    ssl_protocols SSLv3 TLSv1;

    我將取消SSLv3,因為該協議不再安全,即使在Debian Jessie中,由於該原因,許多服務都已配置為避免使用該協議。

    有關此主題的信息:

    https://www.linode.com/docs/security/security-patches/disabling-sslv3-for-poodle
    http://disablessl3.com/

    1.    雨果 他說:

      這個想法並不是真的通過HTTPS提供主要服務,而是說明如何在SSH上使用端口443,而又不會在必要時失去將其用於HTTPS的可能性,但是感謝您的警告。

      無論如何,我已經更新了該文章以對nginx配置進行一些修改,並且附帶一些註釋,以使用這種加密機制進一步澄清一些事情,並修復一些小錯誤。

  3.   丹尼爾·PZ 他說:

    非常感謝您的精彩教程,現在我將把它付諸實踐! :D,堅持下去 DesdeLinux,他們總是讓我驚訝,來自秘魯的問候。

  4.   安德庫拉 他說:

    非常感謝您的分享。

  5.   費爾南多 他說:

    很好的指南,它來自珍珠,現在我開始撰寫此博客,而現在,我將要安裝我的第一個vps時仍然遇到很多問題,但是這篇文章使我擺脫了許多疑問,感謝和問候。