歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux服務器

Linux 服務器安全配置

第一部分:RedHat Linux篇
  1.概述
  Linux服務器版本:RedHat Linux AS
  對於開放式的操作系統---Linux,系統的安全設定包括系統服務最小化、限制遠程存取、隱藏重要資料、修補安全漏洞、采用安全工具以及經常性的安全檢查等。本文主要從用戶設置、如何開放服務、系統優化等方面進行系統的安全配置,以到達使Linux服務器更安全、穩定。
  2.用戶管理
  在 Linux系統中,用戶帳號是用戶的身份標志,它由用戶名和用戶口令組成。系統將輸入的用戶名存放在/etc/passwd文件中,而將輸入的口令以加密的形式存放在/etc/shadow文件中。在正常情況下,這些口令和其他信息由操作系統保護,能夠對其進行訪問的只能是超級用戶(root)和操作系統的一些應用程序。但是如果配置不當或在一些系統運行出錯的情況下,這些信息可以被普通用戶得到。進而,不懷好意的用戶就可以使用一類被稱為“口令破解”的工具去得到加密前的口令。
  2.1 刪除系統特殊的的用戶帳號和組帳號:
  #userdel username
  userdel adm
  userdel lp
  userdel sync
  userdel shutdown
  userdel halt
  userdel news
  userdel uucp
  userdel operator
  userdel games
  userdel gopher
  以上所刪除用戶為系統默認創建,但是在常用服務器中基本不使用的一些帳號,但是這些帳號常被黑客利用和攻擊服務器。
  #groupdel username
  groupdel adm
  groupdel lp
  groupdel news
  groupdel uucp
  groupdel games
  groupdel dip
  同樣,以上刪除的是系統安裝是默認創建的一些組帳號。這樣就減少受攻擊的機會。
  2.2 用戶密碼設置:
  安裝linux時默認的密碼最小長度是5個字節,但這並不夠,要把它設為8個字節。修改最短密碼長度需要編輯login.defs文件(vi /etc/login.defs)
  PASS_MAX_DAYS 99999 ##密碼設置最長有效期(默認值)
  PASS_MIN_DAYS 0 ##密碼設置最短有效期
  PASS_MIN_LEN 5 ##設置密碼最小長度
  PASS_WARN_AGE 7 ##提前多少天警告用戶密碼即將過期。
  2.3 修改自動注銷帳號時間:
  自動注銷帳號的登錄,在Linux系統中root賬戶是具有最高特權的。如果系統管理員在離開系統之前忘記注銷root賬戶,那將會帶來很大的安全隱患,應該讓系統會自動注銷。通過修改賬戶中“TMOUT”參數,可以實現此功能。TMOUT按秒計算。編輯你的profile文件(vi /etc/profile),在"HISTSIZE="後面加入下面這行:
  TMOUT=300
  300,表示300秒,也就是表示5分鐘。這樣,如果系統中登陸的用戶在5分鐘內都沒有動作,那麼系統會自動注銷這個賬戶。
  2.4 給系統的用戶名密碼存放文件加鎖:
  chattr +i /etc/passwd
  chattr +i /etc/shadow
  chattr +i /etc/gshadow
  chattr +i /etc/group
  注:chattr是改變文件屬性的命令,參數i代表不得任意更動文件或目錄,此處的i為不可修改位(immutable)。查看方法:lsattr /etc/passwd
  3.服務管理
  在Linux系統的服務管理方面,如果想做到服務的最好安全,其中主要的就是升級服務本身的軟件版本,另外一個就是關閉系統不使用的服務,做到服務最小化。
  3.1 關閉系統不使用的服務:
  cd /etc/init.d ##進入到系統init進程啟動目錄
  在這裡有兩個方法,可以關閉init目錄下的服務,一、將init目錄下的文件名mv成*.old類的文件名,即修改文件名,作用就是在系統啟動的時候找不到這個服務的啟動文件。二、使用chkconfig系統命令來關閉系統啟動等級的服務。
  注:在使用以下任何一種方法時,請先檢查需要關閉的服務是否是本服務器特別需要啟動支持的服務,以防關閉正常使用的服務。
  第一種:修改文件名的方法
  Cd /etc/init.d/
  mv apmd apmd.old ##筆記本需要
  mv netfs netfs.old ## nfs客戶端
  mv yppasswdd yppasswdd.old ## NIS服務器,此服務漏洞很多
  mv ypserv ypserv.old ## NIS服務器,此服務漏洞很多
  mv dhcpd dhcpd.old ## dhcp服務
  mv portmap portmap.old ##運行rpc(111端口)服務必需
  mv lpd lpd.old ##打印服務
  mv nfs nfs.old ## NFS服務器,漏洞極多
  mv sendmail sendmail.old ##郵件服務, 漏洞極多
  mv snmpd snmpd.old ## SNMP,遠程用戶能從中獲得許多系統信息
  mv rstatd rstatd.old ##避免運行r服務,遠程用戶可以從中獲取很多信息
  mv atd atd.old ##和cron很相似的定時運行程序的服務
  第二種:使用chkcofig命令來關閉不使用的系統服務
  chkconfig ?Clevel 35 apmd off
  chkconfig ?Clevel 35 netfs off
  chkconfig ?Clevel 35 yppasswdd off
  chkconfig ?Clevel 35 ypserv off
  chkconfig ?Clevel 35 dhcpd off
  chkconfig ?Clevel 35 portmap off
  chkconfig ?Clevel 35 lpd off
  chkconfig ?Clevel 35 nfs off
  chkconfig ?Clevel 35 sendmail off
  chkconfig ?Clevel 35 snmpd off
  chkconfig ?Clevel 35 rstatd off
  chkconfig ?Clevel 35 atd off
  注:以上chkcofig 命令中的3和5是系統啟動的類型,3代表系統的多用啟動方式,5代表系統的X啟動方式。
  3.2 給系統服務端口列表文件加鎖
  主要作用:防止未經許可的刪除或添加服務
  chattr +i /etc/services
  3.3 修改ssh服務的root登錄權限
  修改ssh服務配置文件,使的ssh服務不允許直接使用root用戶來登錄,這樣建設系統被惡意登錄攻擊的機會。
  vi /etct/ssh/sshd_config
  PermitRootLogin yes
  將這行前的#去掉後,修改為:PermitRootLogin no
  4.系統文件權限
  Linux 文件系統的安全主要是通過設置文件的權限來實現的。每一個Linux的文件或目錄,都有3組屬性,分別定義文件或目錄的所有者,用戶組和其他人的使用權限(只讀、可寫、可執行、允許SUID、允許SGID等)。特別注意,權限為SUID和SGID的可執行文件,在程序運行過程中,會給進程賦予所有者的權限,如果被黑客發現並利用就會給系統造成危害。
  4.1 修改init目錄文件執行權限:
  chmod -R 700 /etc/init.d/*
  4.2 修改部分系統文件的SUID和SGID的權限:
  chmod a-s /usr/bin/chage
  chmod a-s /usr/bin/gpasswd
  chmod a-s /usr/bin/wall
  chmod a-s /usr/bin/chfn
  chmod a-s /usr/bin/chsh
  chmod a-s /usr/bin/newgrp
  chmod a-s /usr/bin/write
  chmod a-s /usr/sbin/usernetctl
  chmod a-s /usr/sbin/traceroute
  chmod a-s /bin/mount
  chmod a-s /bin/umount
  chmod a-s /bin/ping
  chmod a-s /sbin/netreport
  4.3 修改系統引導文件
  chmod 600 /etc/grub.conf
  chattr +i /etc/grub.conf
  5.系統優化
  5.1 虛擬內存優化:
  一般來說,linux的物理內存幾乎是完全used。這個和windows非常大的區別,它的內存管理機制將系統內存充分利用,並非windows無論多大的內存都要去使用一些虛擬內存一樣。
  在/proc/sys/vm/freepages中三個數字是當前系統的:最小內存空白頁、最低內存空白頁和最高內存空白。
  注意,這裡系統使用虛擬內存的原則是:如果空白頁數目低於最高空白頁設置,則使用磁盤交換空間。當達到最低空白頁設置時,使用內存交換。內存一般以每頁4k 字節分配。最小內存空白頁設置是系統中內存數量的2倍;最低內存空白頁設置是內存數量的4倍;最高內存空白頁設置是系統內存的6倍。
  以下以1G內存為例修改系統默認虛擬內存參數大小:
  echo "2048 4096 6444" >/proc/sys/vm/freepages
  6.日志管理
  6.1 系統引導日志:
  dmesg
  使用 dmesg 命令可以快速查看最後一次系統引導的引導日志。通常它的
  內容會很多,所以您往往會希望將其通過管道傳輸到一個閱讀器。
  6.2 系統運行日志:
  A、Linux 日志存儲在 /var/log 目錄中。這裡有幾個由系統維護的日志文件,但其他服務和程序也可能會把它們的日志放在這裡。大多數日志只有 root 才可以讀,不過只需要修改文件的訪問權限就可以讓其他人可讀。
  以下是常用的系統日志文件名稱及其描述:
  lastlog 記錄用戶最後一次成功登錄時間
  loginlog 不良的登陸嘗試記錄
  messages 記錄輸出到系統主控台以及由syslog系統服務程序產生的消息
  utmp 記錄當前登錄的每個用戶
  utmpx 擴展的utmp
  wtmp 記錄每一次用戶登錄和注銷的歷史信息 wtmpx 擴展的wtmp
  vold.log 記錄使用外部介質出現的錯誤
  xferkig 記錄Ftp的存取情況 sulog 記錄su命令的使用情況
  acct 記錄每個用戶使用過的命令
  aculog 撥出自動呼叫記錄
  B、/var/log/messages
  messages 日志是核心系統日志文件。它包含了系統啟動時的引導消息,以及系統運行時的其他狀態消息。IO 錯誤、網絡錯誤和其他系統錯誤都會記錄到這個文件中。其他信息,比如某個人的身份切換為 root,也在這裡列出。如果服務正在運行,比如 DHCP 服務器,您可以在 messages 文件中觀察它的活動。通常,/var/log/messages 是您在做故障診斷時首先要查看的文件。
  C、/var/log/XFree86.0.log
  這個日志記錄的是 Xfree86 Xwindows 服務器最後一次執行的結果。如果您在啟動到圖形模式時遇到了問題,一般情況從這個文件中會找到失敗的原因。
  D、在/var/log 目錄下有一些文件以一個數字結尾,這些是已輪循的歸檔文件。日志文件會變得特別大,特別笨重。Linux 提供了一個命令來輪循這些日志,以使您的當前日志信息不會淹沒在舊的無關信息之中。 logrotate 通常是定時自動運行的,但是也可以手工運行。當執行後,logrotate 將取得當前版本的日志文件,然後在這個文件名最後附加一個“.1”。其他更早輪循的文件為“.2”、“.3”,依次類推。文件名後的數字越大,日志就越老。
  可以通過編輯 /etc/logrotate.conf 文件來配置 logrotate 的自動行為。通過 man logrotate 來學習 logrotate 的全部細節。
  其中:
  # rotate log files weekly
  weekly
  這裡代表每個日志文件是每個星期循環一次,一個日志文件保存一個星期的內容。
  # keep 4 weeks worth of backlogs
  rotate 4
  這裡代表日志循環的次數是4次,即可以保存4個日志文件。
  E、定制日志
  可以通過編輯 /et/syslog.conf 和 /etc/sysconfig/syslog 來配置它們的行為,可以定制系統日志的存放路徑和日志產生級別。
  6.3 系統各用戶操作日志:
  last
  單獨執行last指令,它會讀取位於/var/log目錄下,名稱為wtmp的文件,並把該給文件的內容記錄的登入系統的用戶名單全部顯示出來。
  history
  history 命令能夠保存最近所執行的命令。如果是root命令所保存的命令內容在/root/.bash_history文件中,如果是普通用戶,操作所命令保存在這個用戶的所屬目錄下,即一般的/home/username/.bash_history。這個history的保存值可以設置,編輯/etc /profile文件,其中的HISTSIZE=1000的值就是history保存的值。
  7.防火牆
  7.1 iptables類型防火牆:
  7.1.1 iptables概念:
  Iptalbes(IP包過濾器管理)是用來設置、維護和檢查Linux內核的IP包過濾規則的。
  可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。
  通過使用用戶空間,可以構建自己的定制規則,這些規則存儲在內核空間的信息包過濾表中。這些規則具有目標,它們告訴內核對來自某些源、前往某些目的地或具有某些協議類型的信息包做些什麼。如果某個信息包與規則匹配,那麼使用目標 ACCEPT 允許該信息包通過。還可以使用目標 DROP 或 REJECT 來阻塞並殺死信息包。對於可對信息包執行的其它操作,還有許多其它目標。
  根據規則所處理的信息包的類型,可以將規則分組在鏈中。處理入站信息包的規則被添加到 INPUT 鏈中。處理出站信息包的規則被添加到 OUTPUT 鏈中。處理正在轉發的信息包的規則被添加到 FORWARD 鏈中。這三個鏈是基本信息包過濾表中內置的缺省主鏈。另外,還有其它許多可用的鏈的類型(如 PREROUTING 和 POSTROUTING),以及提供用戶定義的鏈。每個鏈都可以有一個策略,它定義“缺省目標”,也就是要執行的缺省操作,當信息包與鏈中的任何規則都不匹配時,執行此操作。
  建立規則並將鏈放在適當的位置之後,就可以開始進行真正的信息包過濾工作了。這時內核空間從用戶空間接管工作。當信息包到達防火牆時,內核先檢查信息包的頭信息,尤其是信息包的目的地。我們將這個過程稱為路由。
  如果信息包源自外界並前往系統,而且防火牆是打開的,那麼內核將它傳遞到內核空間信息包過濾表的 INPUT 鏈。如果信息包源自系統內部或系統所連接的內部網上的其它源,並且此信息包要前往另一個外部系統,那麼信息包被傳遞到 OUTPUT 鏈。類似的,源自外部系統並前往外部系統的信息包被傳遞到 FORWARD 鏈。
  7.1.2 iptables實例1:
  #!/bin/sh
  # 禁止系統的轉發包功能
  echo 0 > /proc/sys/net/ipv4/ip_forward
  # 清楚iptables原有規則,並設置iptables默認規則
  iptables -t nat -F POSTROUTING
  iptables -t nat -F PREROUTING
  iptables -t nat -F OUTPUT
  iptables -F
  iptables -P INPUT DROP
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT ACCEPT
  # 在input規則中需要打開的tcp、upd端口
  iptables -A INPUT -j ACCEPT -p tcp --dport 80
  iptables -A INPUT -j ACCEPT -p tcp --dport 22
  iptables -A INPUT -j ACCEPT -p tcp --dport 25
  iptables -A INPUT -j ACCEPT -p tcp --dport 1352
  iptables -A INPUT -p udp --destination-port 53 -j ACCEPT
  # 在input規則中狀態為:STATE RELATED 的包都接受
  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  # 啟用系統ip轉發功能
  echo 1 > /proc/sys/net/ipv4/ip_forward
  < --end-- >
  7.1.3 iptables實例2:
  注:這個實例中,只需要設置tcp、udp端口和服務器網絡段ip范圍即可,其他已經默認設置好。
  #!/bin/sh
  # make:yongzhang
  # time:2004-06-18
  # e-mail: [email protected]
  PATH=/sbin:/bin:/usr/sbin:/usr/bin
  ##tcp allow ports
  TPORTS="80 22"
  ##udp allow ports
  UPORTS="53"
  ##internal server_ip range
  SERVER_IP="172.18.10.0/24"
  ##disable forwarding
  echo 0 > /proc/sys/net/ipv4/ip_forward
  ##reset default policies
  iptables -P INPUT ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT ACCEPT
  iptables -t nat -P PREROUTING ACCEPT
  iptables -t nat -P POSTROUTING ACCEPT
  iptables -t nat -P OUTPUT ACCEPT
  ##del all iptables rules
  iptables -F INPUT
  iptables -F FORWARD
  iptables -F OUTPUT
  ##clean all non-default chains
  iptables -X
  iptables -t nat -X
  ##iptables default rules
  iptables -P INPUT DROP
  iptables -P FORWARD DROP
  iptables -P OUTPUT ACCEPT
  ##allow ping packets
  iptables -A INPUT -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
  iptables -A INPUT -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
  iptables -A INPUT -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
  iptables -A INPUT -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
  iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
  #iptables -A INPUT -p ICMP -s 0/0 --icmp-type 11 -m limit --limit 5/s -j ACCEPT
  iptables -A FORWARD -p ICMP -j ACCEPT
  ##enable forwarding
  iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  ##STATE RELATED for router
  iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  ##accept internal packets on the internal i/f
  iptables -A INPUT -s $SERVER_IP -p tcp -j ACCEPT
  ##open ports on router for server/services
  ##TCP PORTS
  for ATP in $TPORTS
  do
  iptables -A INPUT ! -s $SERVER_IP -d $SERVER_IP -p tcp --destination-port $ATP -j ACCEPT
  iptables -A FORWARD -p tcp --destination-port $ATP -j ACCEPT
  done
  ##UDP PORTS
  for AUP in $UPORTS
  do
  iptables -A INPUT -p udp --destination-port $AUP -j ACCEPT
  iptables -A FORWARD -p udp --destination-port $AUP -j ACCEPT
  done
  ##bad_packets chain
  ##drop INVALID packets immediately
  iptables -A INPUT -p ALL -m state --state INVALID -j DROP
  ##limit SYN flood
  #iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
  #iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
  ##deny all ICMP packets,eth0 is external net_eth
  #iptables -A INPUT -i eth0 -s 0.0.0.0/0 -p ICMP -j DROP
  ##allow loopback
  iptables -A INPUT -i lo -p all -j ACCEPT
  iptables -A OUTPUT -o lo -p all -j ACCEPT
  ##enable forwarding
  echo 1 > /proc/sys/net/ipv4/ip_forward
  < --end-- >
  7.2 ipchains類型防火牆:
  7.2.1 ipchains概念:
  Ipchains 被用來安裝、維護、檢查Linux內核的防火牆規則。規則可以分成四類:IP input鏈、IP output鏈、IP forward鏈、user defined 鏈。
  一個防火牆規則指定包的格式和目標。當一個包進來時, 核心使用input鏈來決定它的命運。 如果它通過了, 那麼核心將決定包下一步該發往何處(這一步叫路由)。假如它是送往另一台機器的, 核心就運用forward鏈。如果不匹配,進入目標值所指定的下一條鏈,那有可能是一條user defined鏈,或者是一個特定值: ACCEPT,DENY,REJECT,MASQ,REDIRECT,RETURN。
  ACCEPT意味著允許包通過,DENY 扔掉包就象沒有受到過一樣,REJECT也把包扔掉,但(假如它不是 ICMP 包)產生一個 ICMP 回復來告訴發包者,目的地址無法到達(請注意DENY和REJECT對於ICMP包是一樣的)。
  MASQ 告訴核心偽裝此包,它只對forward 鏈和user defined鏈起作用,想讓它起作用, 編譯核心時必需讓 IP Masquerading 起作用。
  REDIRECT只對input鏈和user defined鏈起作用。它告訴核心把無論應送到何處的包改送到一個本地端口. 只有 TCP 和 UDP 協議可以使用此指定. 任意用 '-j REDIRECT' 指定一個端口(名字或編號)可以使送往此的包被重定向到某個特殊的端口, 即使它被標記為送到其它端口。想讓它起作用,編譯內核時,必須讓CONFIG_IP_TRANSPARENT_PROXY起作用。
  最後的一個目標指定是 RETURN, 它跳過它下面的所有規則, 直到鏈的末尾。
  任何其它的目標指定表示一個用戶自定義的鏈。包將在那個鏈中通過. 假如那個鏈沒有決定此包的命運, 那麼在那個鏈中的傳輸就完成了,包將通過當前鏈的下一個規則。
  7.2.2 ipchains實例:
  ##清除input規則的規則,並改變input默認的規則鏈策略為REJECT
  -F input
  -P input REJECT
  ##以下是允許input規則鏈的tcp端口為:80 81 22 123
  -A input -s 0/0 -d 0/0 80 -p tcp -y -j ACCEPT
  -A input -s 0/0 -d 0/0 81 -p tcp -y -j ACCEPT
  -A input -s 0/0 -d 0/0 22 -p tcp -y -j ACCEPT
  -A input -s 0/0 -d 0/0 123 -p udp -j ACCEPT
  ##設置除了以上允許的input規則鏈以為,拒絕0-1023、2049、6000-6009、7100的tcp和upd端口,
  -A input -p tcp -s 0/0 -d 0/0 0:1023 -y -j REJECT
  -A input -p tcp -s 0/0 -d 0/0 2049 -y -j REJECT
  -A input -p udp -s 0/0 -d 0/0 0:1023 -j REJECT
  -A input -p udp -s 0/0 -d 0/0 2049 -j REJECT
  -A input -p tcp -s 0/0 -d 0/0 6000:6009 -y -j REJECT
  -A input -p tcp -s 0/0 -d 0/0 7100 -y -j REJECT
  ##允許系本身統網卡上發生的所有包通過
  -A input -s 0/0 -d 0/0 -i lo -j ACCEPT
  -A input -s 0/0 -d 0/0 -i eth0 -j ACCEPT
  -A input -s 0/0 -d 0/0 -i eth1 -j ACCEPT
  ##清除output規則的規則,並改變output默認的規則鏈策略為ACCEPT
  -F output
  -P output ACCEPT
  ##清除forward規則的規則,並改變forward默認的規則鏈策略為DENY,設置了forward規則鏈允許對10.10.11.0/24網段的包可以轉發並且做偽裝處理。
  -F forward
  -P forward DENY
  -A forward -s 10.10.11.0/24 -j MASQ
Copyright © Linux教程網 All Rights Reserved