2010年6月2日

[轉載] 自己架一個安全的伺服器環境

來自娛網路上看到的文章 ,不過文章的時間很久了,參考看看

自己架一個安全的伺服器環境(一)
張貼:matt 發表於 Thursday, November 09 @ 17:50:01 CST
這一陣子看了很多與系統安全相關的文件,發現自己以前架的網站,真的真很不安全。所以就想花些時間,好好的架一個安全的伺服器。
我會把安裝的過程寫下來放在網站上,安裝的過程會分好幾部份,大家就慢慢看了。
我主要參考的文件的是Gerhard Mourani寫的Securing and Optimizing Linux: RedHat Edition v1.3
大家可以在文章、檔案下載這裡找到


安裝方式和方法

我們選擇「自定義」安裝,這樣你可以選擇安裝什麼伺服器軟體以及如何劃分你的硬碟。
我們的目標是安裝儘可能少的軟體,以保證系統的高效率。而且,安裝的軟體越少,安全漏洞也就越少。
選擇「Custom 」,繼續安裝。

劃分硬碟分區

我們使用三顆9GB的SCSI硬碟,並用RAID 3,所以有16GB左右可以使用。
劃分的Partitions如下:

/boot 15M 放Linux核心影像檔 (Kernal Image)
/usr 1024M 存放 Linux系統的許多軟體的所在分區。根據你要安裝軟體的數量來組態,這個分區一般在300MB到700MB之間。
/usr/local 2048M 存放與Red Hat Linux系統不同的軟體,例如,不是RPM包的軟體,而是TGZ或TAR的套裝軟體。其空間的大小取決於準備存放的這些軟體的數量。
/usr/src 512M 在一個Red Hat Linux系統中,/usr/src通常存放兩樣東西:
一個是核心的原始碼:Linux的所有原始碼都放在這裡,新的核心也在這裡建立。目前,核心原始碼大約佔50MB的空間。當你需要更多的空間來建立核心 時,或者要存檔幾個不同版本的核心的時候,就要考慮加大該分區的空間。
另一個是RPM包的原始程式:如果安裝了RPM的原始程式,文件將存放在這裡。這個分區的大小也取決於將在這裡安裝的套裝軟體的數量。
/home 2000M 衡量機器上會有多少使用者,每個配多少MB(例: 每個 users 50MB, 預計20個,共 = 1000MB)。這裡不考慮web與ftp的空間,因為不放這裡。
/chroot 9000M 配給要安裝在chroot環境執行的程式 (例:Apache、Mysql、Sendmail、ftp).
/cache 512M 給proxy server的chche空間 (i.e. Squid).
/var 1024M Red Hat Linux系統將把日誌寫在/var/log。列印佇列的文件通常寫在/var/spool。除非特別群群組態,/var將是根文件系統的一部分,通常不 佔很多空間。如果系統常做列印、寄郵件或者日誌,可以考慮專門建立一個/var分區。一般來講,只有多用戶或者伺服器才需要專門的/var分區。
256M swap partition, 交換分區用來負責系統的資料交換,相當於DOS/Windows下的虛擬記憶體,當記憶體不夠用時,系統就會把暫時的程式資料在交換分區上存取。在 Linux下,交換分區是必需的,不管你的記憶體有多大,即使你有128MB的記憶體,也需要至少一個交換分區。
/tmp 512M 用來存放臨時的文件。對於一個大型的、多用戶的系統或者網路伺服器,專門建立一個/tmp分區是一個好主意。對於一個專門的工作站,就不必專門建立一個 /tmp分區了。
/ 512M 根分區即根目錄(/)所在的分區。它只需要啟動系統所必需的文件(如核心文件)和系統群群組態文件,大多數系統50MB到100MB的根分區可以工作得很 好。

現在,選擇"Next"繼續安裝。分區建立完之後,安裝程式會讓你選擇要格式化的分區。選擇想要格式化的分區,選中"Check for bad blocks during format"選擇框,按"Next"繼續。

下一步如果選擇安裝LILO,你會看到LILO的組態。可以選擇把LILO裝在主開機磁區(MBR)或開機分區的第一個磁區。 在通常情況下,應該選擇把LILO安裝在主開機磁區。(如果你的電腦上裝有NT,或一些多重開機程式,如System Command、Boot Manager,你最好仔細看一遍LILO-HOWTO,以免不必要的損失)。

然後,開始組態網路和時鐘。選擇 Asia/Taipei

接著,要輸入root密碼、增加使用者和進行安全驗證的組態。不要忘了選上:

Enable MD5 passwords
Enable MD5 passwords

沒有必要選擇Enable NIS,因為我們不在這台伺服器上安裝NIS服務。

自己架一個安全的伺服器環 境(二)
張貼:matt 發表於 Wednesday, November 15 @ 00:42:15 CST

套件安裝(選擇套件群群組)

上面都完成了之後,該選擇安裝哪些套裝軟體了。在一般情況下,Linux是一個強大的作業系統,可以提供很多服務。但是,這些服務大多數都是沒有必要 的,而且會造成安全隱憂。





理想的情況下,每個台主機應專注與單一目的的提供網路服務。很多的Linux機器預設就被安裝了一堆的服務與應用程式,可是真正有使用到的只是某幾種 特定的網路服務。所以我們在設定時,會將系統內不需要的程式排除。只在特定用途的主機上安裝必須的服務可以確保你的網路安全,下列列舉幾項優點:

駭客無法使用其它有漏洞的服務來攻擊主機。
不同的人可以管理不同的服務與主機。透過分散與隔離服務的方式,減少與最小化不同服務與主機的管理者間發生衝突的可能性。
主機可以被最佳化設定成符合特定的服務。
經由減少服務,所以系統日誌的數量也跟著少了,那在檢查非預期事件的工作就變的簡單多了。
安裝Linux的正確方法是:安裝一個穩定和安全的系統。首先,你要選擇必須安裝的部件,也就是套裝軟體群群組。選擇"Select individual package"這個選項,在後面的安裝過程中,你可以選中或不選單獨的套裝軟體。

因為我們安裝的是Linux伺服器,所以沒有必要安裝圖形介面(XFree86)。在伺服器上安裝圖形介面意味著:更低的處理能力,更少的CPU時 間,更少的記憶體,更多的安全問題,以及等等。圖形介面一般只在工作站上使用。

選擇安裝下面的套裝軟體群群組:

Networked Workstation
Network Management Workstation
Utilities
選擇好套件群群組之後,就應該選擇單獨的軟體了。 注意:選上"Select individual package"單選框(非常重要),因為只有這樣才會讓你選擇安裝單獨的軟體。

選擇單獨的軟體

取消安裝下面列出的軟體。

Applications/File: git
Applications/Internet: finger, ftp, fwhois, ncftp, rsh, rsync, talk, telnet
Applications/Publishing: ghostscript, ghostscript-fonts, groff-perl, mpage, pnm2ppa, rhs-printfilters
Applications/System: arpwatch, bind-utils, rdate, rdist, screen, ucd-snmp-utils
Documentation: indexhtml
System Environment/Base: chkfontpath, yp-tools
System Environment/Daemons: XFree86-xfs, finger-server, lpr, nfs-utils, pidentd, portmap, rsh-server, rusers, rusers-server, rwall-server, rwho, talk-server, telnet-server, tftp-server, ucd-snmp, ypbind, ypserv
System Environment/Libraries: XFree86-libs, libpng

安裝完伺服器之後必須移除的軟體

RedHat Linux在一般情況下會安裝一些預設的軟體,而且在安裝的過程中,不能夠選擇不安裝。因此,必須在安裝完成之後移除下面這些軟體:

pump mt-st eject mailcap apmd kernel-pcmcia-cs linuxconf getty_ps isapnptools setserial kudzu raidtools gnupg redhat-logos redhat-release gd pciutils rmt

apmd、kudzu和sendmail是daemon程序,在移除它們之前最好先停止這些程序。 停止這些程序用如下的命令: [root@deep]# /etc/rc.d/init.d/apmd stop
[root@deep]# /etc/rc.d/init.d/sendmail stop
[root@deep]# /etc/rc.d/init.d/kudzu stop

移除這些套裝軟體。

[root@deep /]# rpm -e --nodeps pump mailcap apmd kernel-pcmcia-cs getty_ps isapnptools setserial gnupg redhat-logos redhat-release pciutils rmt

註:mt-st eject linuxconf kudzu raidtools gd 這幾個自己會用到所以沒有移除,為何要移除,請參見 SOL page31

kdbconfig、mouseconfig和timeconfig是用來設置鍵盤類型、滑鼠類型和時區的。在這些都設置好之後,就很少有機會再用到它們 了。所以,可以把它們移除掉。等需要改變鍵盤、滑鼠和時區的時候,可以再從CD-ROM用rpm命令安裝。

使用下面的命令移除
[root@deep /]# rpm -e kbdconfig mouseconfig timeconfig authconfig ntsysv setuptool

sendmail、procmail和mailx在通常情況下是必須要的。因為伺服器上運行的各種各樣的服務會用到這些程式送訊息給root用戶,以建立 系統日誌(syslog)。

sendmail是一個強大的郵件傳送代理(Mail Transport Agent,簡稱MTA),可以把郵件從一台電腦發送到另一台電腦。它實際上所起的作用就是通過網路或Internet把email傳送到email的目 的地。sendmail有很多不同的配置方式:可以做為一個把郵件轉給郵件集中伺服器(Mail Hub Server)的內部郵件伺服器,也可以做為單獨的mail伺服器,或者做為網路上所有sendmail伺服器的中央郵件集中伺服器(Central Mail Hub Server)。因此,可以根據需要配置不同的sendmail伺服器。所以,你要先把sendmail移除掉,根據需要建立自己的sendmail伺服 器。

sendmail並不是自己處理郵件的分發,它是通過運行其他程式來完成這項工作。procmail是RedHat Linux用於本地郵件分發的分發代理(delivery agent)。因此,procmail只要裝在中央郵件集中伺服器(Central Mail Hub Server)上就行了。所以,沒有必要在內部所有運行sendmail服務的電腦上都安裝procmail程式。因為,這些內部的電腦會通過"/bin /mail"或sendmail把郵件轉發到中央郵件集中伺服器上。

使用下面的命令移除 sendmail
[root@deep /]# rpm -e sendmail

安裝完伺服器之後必須安裝的軟體

為了讓我們可以伺服器上編譯軟體,還必須安裝下面的RPM套裝軟體。所有的這些軟體都在RedHat 6.2第一張光碟的"/RedHat/RPMS"目錄下,而且都是使你的Linux系統能夠編譯程序所必須要的。

◎第一步 首先 mount 上CD-ROM,並變換目錄"RPMS"子目錄下。

mount上CD-ROM驅動器和轉到RPMS目錄用下面的命令:

[root@deep]# mount /dev/cdrom /mnt/cdrom/
[root@deep]# cd /mnt/cdrom/RedHat/RPMS/

下面是我們需要安裝的套裝軟體,只有安裝了這些套裝軟體才在Linux系統上編譯程序。請記住,這不過是能夠編譯".tar.gz"軟體最少必須的套裝軟 體。有一些軟體的編譯可能還需要用到別的特殊的套裝軟體。這些特殊的套裝軟體在RedHat的光碟中都能找到。所以,編譯程序的時候,如果出錯了,可以先 看看需要編譯的套裝軟體的README文件。

autoconf-2.13-5.noarch.rpm
m4-1.4-12.i386.rpm
automake-1.4-6.noarch.rpm
dev86-0.15.0-2.i386.rpm
bison-1.28-2.i386.rpm
byacc-1.9-12.i386.rpm
cdecl-2.5-10.i386.rpm
cpp-1.1.2-30.i386.rpm
cproto-4.6-3.i386.rpm
ctags-3.4-1.i386.rpm
egcs-1.1.2-30.i386.rpm
ElectricFence-2.1-3.i386.rpm
flex-2.5.4a-9.i386.rpm
gdb-4.18-11.i386.rpm
kernel-headers-2.2.14-5.0.i386.rpm
glibc-devel-2.1.3-15.i386.rpm
make-3.78.1-4.i386.rpm
patch-2.5-10.i386.rpm

注意:最好把這些軟體一起全裝了,省得在安裝這些RPM包的時候總出現一些相關出錯的資訊。

◎第二步 安裝所有這些軟體只要用一個命令就夠了。這個命令是:

[root@deep RPMS]# rpm -Uvh autoconf-2.13-5.noarch.rpm m4-1.4-12.i386.rpm automake-1.4-6.noarch.rpm dev86-0.15.0-2.i386.rpm bison-1.28-2.i386.rpm byacc-1.9-12.i386.rpm cdecl-2.5-10.i386.rpm cpp-1.1.2-30.i386.rpm cproto-4.6-3.i386.rpm ctags-3.4-1.i386.rpm egcs-1.1.2-30.i386.rpm ElectricFence-2.1-3.i386.rpm flex-2.5.4a-9.i386.rpm gdb-4.18-11.i386.rpm kernel-headers-2.2.14-5.0.i386.rpm glibc-devel-2.1.3-15.i386.rpm make-3.78.1-4.i386.rpm patch-2.5-10.i386.rpm

◎第三步 為了讓所有的改變都生效,必須退出再重新登入。

退出的命令是:
[root@deep]# exit

安裝和編譯完在伺服器上需要的所有軟體之後,最好把上面幾步安裝的套裝軟體都移除,除非有什麼特殊的需要。這樣做,其中一個原因是:如果黑客成功地入侵了 你的伺服器,他也不可能用上面這些軟體來編譯軟體或改變二進位程式。同時,把它們移除掉也釋放了很多磁碟空間,這樣當進行系統的安全性和一致性檢查的時 候,可以加快掃瞄所有文件的時間(文件少了)。

當然,有很多建立伺服器的方法和策略,觀點如下:

第一:每台伺服器最好只安排一個特定的任務。你不應該把所有的服務都放在一台伺服器上,否則,這台伺服器的速度會受到影響(系統的資源要同時分給很多個程 序),而且會降低系統的安全(在同一台伺服器上運行太多的服務,黑客就有更多的機會找到系統的安全漏洞)。

第二:不同的伺服器完成不同的任務。這樣有利於簡化管理(你可以清楚地知道每台服務器具體的用途、運行哪些服務、客戶電腦(client)可以訪問哪些 埠,你也可以知道在日誌文件中會看到什麼,等等),而且還可以更好更靈活地控制每台伺服器(專門用於郵件、Web、資料庫、開發、備份,等等)。

舉一個例子,一台專門用作開發和測試的伺服器,就沒有必要像上面介紹的那樣,每一次裝軟體之前都要先裝編譯器,裝完軟體之後又把編譯器移除,完全可以把編 譯器保留著。如果想知道更多的編譯器的資訊,請參考Securing and Optimizing Linux -- Chapter 9 Compiler Functionality。

自己架一個安全的伺 服器環境(三)
張貼:matt 發表於 Wednesday, November 15 @ 00:45:18 CST

保持軟體最新(最安全)的版本

為了使你的軟體保持最新的版本,請定期查看RedHat Linux的勘誤網頁:http://www.redhat.com/support/errata/。勘誤網頁通常可以解決90% RedHat Linux的系統問題。而且,RedHat在得到安全漏洞的通知之後,如果已經找到解決方案了,就會在24小時之內,在勘誤網站上發佈出來。必須經常查看 這個地方。




在我們安裝的RedHat Linux6.2伺服器內,現在必須更新的軟體是(2000/11/13止):

dump-0.4b19-5.6x.i386.rpm
glibc-2.1.3-21.i386.rpm
glibc-devel-2.1.3-21.i386.rpm
gpm-1.19.3-0.6.x.i386.rpm
iputils-20001010-1.6x.i386.rpm
mailx-8.1.1-16.i386.rpm
man-1.5h1-2.6.x.i386.rpm
pam-0.72-20.i386.rpm
popt-1.5-9.6x.i386.rpm
sysklogd-1.3.31-17.i386.rpm
textutils-2.0e-6.i386.rpm
tmpwatch-2.6.2-1.6.2.i386.rpm
traceroute-1.4a5-24.6x.i386.rpm
kernel-2.2.16-22.i386.rpm(*4)
kernel-smp-2.2.16-22.i386.rpm(*4)
kernel-headers-2.4.0-0.26.i386.rpm(*4)
kernel-utils-2.2.16-22.i386.rpm(*4)

註:

在安裝完時,我才突然發現竟然沒有方式可將我要加裝的軟體拷貝這台機器上,所以我又把 samba 這程式給裝了上去了,這樣我才能將要加裝或更新的軟體拷到伺服器上。記得在您不需要安裝軟體到伺服器時,最好將 samba 移除。當然還有其它方式可以透過網路將軟體拷貝到伺服器上(例如:ftp),不管你用何種方式,記得不用時,將之移除。
為了用更安全的方式來安裝與設定軟體,所以當您至RedHat網站的勘誤網頁,上面列出需要更新的軟體中,有些我們用自行編譯方式安裝,並不使用RPM來 安裝。例如:wu-ftpd 、sendmail、bind
查詢尚未安裝套件的摘要資訊時,可利用 rpm -qpi
更新Kernel-2.2.14版本的漏洞
更新Redhat6.2的核心版本(RPM方式)

由於我們安裝的redhat6.2內含的核心版本是 kernel-2.2.14-14-5.0 ,Linux 核心至 2.2.15 以前的版本﹐都含有一個嚴重的臭蟲,這個漏洞只要系統裡有 setuid root 的程式,就可能被利用。主要問題發生在一個少有說明的函式 - setcap,setcap 函式可以讓使用者獲得任意 setuid 程式的能力,進而入侵系統。全文出處將有詳細的說明。 Linux 2.2.16 核心改版摘要 、下面的比較粗略的安裝方式,詳細的安裝參見 upgrading the kernel How To 。

第一步:做一片緊急開機磁片(假如沒有做過)

先查看 /etc/lilo.conf 的內容,依照你原本使用的核心版本,即預設映印象的 image=/boot/vmlinuz-2.x.x.x 設定,決定開機磁片的核心版本。

[root@deep /]# cat /etc/lilo.conf

boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
linear
default=linux
image=/boot/vmlinuz-2.2.14-5.0smp
label=linux
initrd=/boot/initrd-2.2.14-5.0smp.img
read-only
root=/dev/sda10

image=/boot/vmlinuz-2.2.14-5.0
label=linux-up
initrd=/boot/initrd-2.2.14-5.0.img
read-only
root=/dev/sda10
執行下列命令來建立
[root@deep /]# mkbootdisk --device /dev/fd0 2.2.14-5.0smp
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press to continue or ^C to abort:

建議你利用做好的這一片磁片重開機 ,確定它是沒問題的。

第二步:下載新版的核心

下面這幾個檔案是在2000/11/14止,我所找到穩定且最新的版本。
kernel-2.2.16-22.i386.rpm
kernel-headers-2.4.0-0.26.i386.rpm
kernel-smp-2.2.16-22.i386.rpm (for 雙CPU的kernel)
kernel-utils-2.2.16-22.i386.rpm

註:您可以依機器CPU的等級,下載586或686的版本。

第三步:Installing the Kernel

使用下列的命令來檢查RPM是否沒有問題

[root@deep /tmp]# rpm -K --nogpg kernel-2.2.16-22.i386.rpm kernel-headers-2.4.0-0.26.i386.rpm kernel-smp-2.2.16-22.i386.rpm kernel-utils-2.2.16-22.i386.rpm

kernel-2.2.16-22.i386.rpm: md5 OK
kernel-headers-2.4.0-0.26.i386.rpm: md5 OK
kernel-smp-2.2.16-22.i386.rpm: md5 OK
kernel-utils-2.2.16-22.i386.rpm: md5 OK

使用下列的命令來安裝
[root@deep /tmp]# rpm -Uvh kernel-2.2.16-22.i386.rpm kernel-headers-2.4.0-0.26.i386.rpm kernel-smp-2.2.16-22.i386.rpm kernel-utils-2.2.16-22.i386.rpm

第四步:建立開機時要載入的 ramdisk 映像檔

再次確認要建立 ramdisk 的核心檔名
[root@deep /]#ls -l /boot/vmlinuz*
lrwxrwxrwx 1 root root 20 Nov 13 22:01 /boot/vmlinuz -> vmlinuz-2.2.16-22smp
-rw-r--r-- 1 root root 627392 Aug 23 04:56 /boot/vmlinuz-2.2.16-22
-rw-r--r-- 1 root root 655177 Aug 23 04:47 /boot/vmlinuz-2.2.16-22smp


使用下列的命令來建立
[root@deep /]#mkinitrd /boot/initrd-2.2.16-22.img 2.2.16-22
[root@deep /]#mkinitrd /boot/initrd-2.2.16-22smp.img 2.2.16-22smp

第五步:修改 lilo.conf

修改 /etc/lilo.conf,變成如下的內容:

boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
linear
default=linux-2.2.16smp
image=/boot/vmlinuz-2.2.16-22smp
label=linux-2.2.16smp
initrd=/boot/initrd-2.2.16-22smp.img
read-only
root=/dev/sda10

image=/boot/vmlinuz-2.2.16-22
label=linux-2.2.16
initrd=/boot/initrd-2.2.16-22.img
read-only
root=/dev/sda10
註:因為我們的機器是雙CPU、SCSI的HD,所以上面的設定會出現 smp 與 sda 等字眼,若您的機器是單CPU、IDE HD,則設定檔內容會有些不同。

第六步:將 lilo 設定的變更寫入開機磁區

使用下列的命令
[root@deep /]#lilo -v


LILO version 21, Copyright 1992-1998 Werner Almesberger

Reading boot sector from /dev/sda
Merging with /boot/boot.b
Boot image: /boot/vmlinuz-2.2.16-22smp
Mapping RAM disk /boot/initrd-2.2.16-22smp.img
Added linux-2.2.16smp *
Boot image: /boot/vmlinuz-2.2.16-22
Mapping RAM disk /boot/initrd-2.2.16-22.img
Added linux-2.2.16
/boot/boot.0800 exists - no backup copy made.
Writing boot sector.
第七步:重新開機

重新開機前,記得確認一下之前的步驟都做對了,不然開不了機就麻煩了。要是真的開不了機,請利用緊急開機磁片開機,重新設定。


自己架一個安全的伺 服器環境(四)
張貼:matt 發表於 Tuesday, November 21 @ 00:51:23 CST

安裝完後的系統安全概要

現在我們己經安裝了一台基本的Linux服伺器該有的環境了,再來就是一些系統安全的設定了。
在Securing and Optimizing Linux的第三章講了很多,主要是在討論一些保證伺服器安全的一般方法。書中有些部份是觀念上的說明,我就不寫了,下面是實作如何避免來自外部和內部的 攻擊相關的作法。繼續做下去了喔!




1. BIOS安全,設定開機密碼

2. 密碼

◎密碼至少要有6個字元,最好包含一個以上的數位或特殊字元。

◎密碼不能太簡單,所謂的簡單就是很容易猜出來,也就是用自己的名字,電話號碼、生日、職業或者其他個人資訊作為密碼。

◎密碼必須是有有效期的,在一段時間之後就要更換密碼。

◎密碼在這種情況下必須作廢或者重新設定:如果發現有人試圖猜測你的密碼,而且已經試過很多次了。

3. 密碼長度

編輯"/etc/login.defs"檔案,把最小密碼長度由5改成8。

找到 PASS_MIN_LEN 5 這一行,改為:PASS_MIN_LEN 8 。

"login.defs"是很重要的設定檔。可以在這個檔案中設定一些其他的安全策略,比如:密碼的有效期。

4. 設定 root 帳號的 login timeout 時間

編輯"/etc/profile"檔案,找到 HISTSIZE=XXXX 這行,並在下面加入

TMOUT=1800

這個參數是用來設定 root 帳號的 login timeout 時間,其以秒為單位,如1800便是表示30分(60秒*30分)。

5. 禁止使用控制臺程式與禁止控制臺的存取

在 Securing and Optimizing Linux 的 45 頁有提到之兩項,但我實在看不太懂這樣做的真正原因,看的懂的人可以告訴我一知嗎? 請來信 mattli@mxtpa.biglobe.net.tw

6. 修改"/etc/inetd.conf"檔案

inetd,也叫作"super demon",它會根據網路上來的請求載入相對應的網路服務程式。"inetd.conf"檔案告訴inetd監聽哪些網路埠,為每個埠啟動相對應的服 務。

把Linux系統放在任何的網路環境中,第一件要做的事就是瞭解一下伺服器到底要提供哪些服務。不需要的那些服務應該被停掉,最好將該服務的程式移除,這 樣黑客就更少了一些攻擊系統的機會。

查看"/etc/inetd.conf"檔案,瞭解一下inetd提供哪些服務。用加上註釋的方法(在一行的開頭加上#號),停止任何不需要的服務,再送 給inetd程序一個SIGHUP信號(即重新啟動inetd)。

第一步:把檔案的權限改成600。

[root@deep]# chmod 600 /etc/inetd.conf

第二步:確定檔案的所有者是root。

[root@deep]# stat /etc/inetd.conf

這個命令顯示出來的資訊應該會如下:

File: "/etc/inetd.conf"
Size: 3027 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,10 Inode: 26596 Links: 1
Access: Fri Nov 17 11:08:06 2000(00000.00:33:37)
Modify: Mon Nov 13 11:43:28 2000(00003.23:58:15)
Change: Fri Nov 17 11:40:34 2000(00000.00:01:09)


第三步:編輯"inetd.conf"檔案(vi /etc/inetd.conf),停止所有不需要的服務,如:ftp、 telnet、 shell、 login、 exec、talk、ntalk、 imap、 pop-2、pop-3、finger、auth、linuxconf,等等。如果你真的需要某些服務,可以不停止這些服務。但是,把這些服務停止,系統 受攻擊的可能性就會小很多。

改變了"inetd.conf"檔案之後,別忘了重新啟動 inetd 程序。

[root@deep /root]# killall -HUP inetd



[root@deep /root]# /etc/rc.d/init.d/inetd restart

第四步: 為了保證"inetd.conf"檔案的安全,可以用chattr命令把它設成不可改變。

把檔案設成不可改變的只要用下面的命令:

[root@deep]# chattr +i /etc/inetd.conf

這樣可以避免"inetd.conf"檔案的任何改變(意外或是別的原因)。一個有"i"屬性的檔案是不能被改動的:不能刪除或重命名,不能建立這個檔案 的鏈結,不能往這個檔案裡寫資料。只有系統管理員才能設置和清除這個屬性。如果要改變inetd.conf檔案,你必須先清除這個不允許改變的標誌:

[root@deep]# chattr -i /etc/inetd.conf

註:現在有一個比較安全且有效率的 Xinetd ,可以用來取代 inetd,它有下列的優點

Provide access control mechanisms

Prevent denial of service attacks

Extensive logging abilities

Offload services to a remote host

Make services available based on time

Limits on the number of servers that can be started

IPv6 support

User interactio

你可以在 http://www.xinetd.org/ 找到更多的資訊。

7. TCP_WRAPPERS

在"/etc/hosts.deny"檔案中加入"ALL: ALL@ALL, PARANOID"以拒絕所有電腦訪問你的伺服器,然後在"/etc/hosts.allow"檔案中一個一個加入允許訪問你的伺服器的電腦。這種作法是 最安全的。

第一步:編輯hosts.deny檔案(vi /etc/hosts.deny)加入下面這些行:

ALL: ALL@ALL, PARANOID

第二步:編輯"hosts.allow"檔案(vi /etc/hosts.allow)。例如,可以加入下面這些行(被授權訪問的電腦要被明確地列出來):

sshd: 208.164.186.1 gate.openarch.com

第三步:執行tcpdchk檢查TCP_WAPPERS配置的程式。

[root@deep]# tcpdchk

8. "/etc/aliases"檔案

編輯aliases檔案(vi /etc/aliases),刪除或註釋掉下面這些行:

#games: root
#ingres: root
#system: root
#toor: root
#uucp: root
#manager: root
#dumper: root
#operator: root
#decode: root
#root: marc

別忘了運行"/usr/bin/newaliases"使改變生效。

9. 不要顯示系統提示資訊

如果你不想讓遠端登錄的用戶看到系統的提示資訊,你可以改變"/etc/inetd.conf"檔案中的telnet設置:

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

在末尾加上"-h"參數可以讓daemon不顯示任何系統資訊,只顯示登錄提示。當然,只有在伺服器上裝了telnet伺服器才有這樣做的必要。

10. "/etc/host.conf"檔案

編輯"host.conf"檔案(vi /etc/host.conf)加入下面這些行:

# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We have machines with multiple IP addresses.
multi on
# Check for IP address spoofing.
nospoof on

11. "/etc/services"檔案

[root@deep]# chattr +i /etc/services

12. "/etc/securetty"檔案

註釋掉(在這一行的開頭加上#號)所有你想不讓root登錄的tty設備。
編輯securetty檔案(vi /etc/securetty)象下面一樣,註釋掉一些行:

#tty1
#tty2
#tty3
tty4
#tty5
#tty6
#tty7
#tty8


上面這樣做的意思是只允許root在tty4上登錄。我建議只允許root在一個tty設備上登錄,如果從其他tty上登錄,用"su"命令把身份轉 成"root"。


13. 特殊的帳號

停止作業系統中不必要的預置帳號(每次升級或安裝完都要檢查一下)。Linux系統中就提供這樣一些你可能不需要的預置帳號。如果確實不需要這些帳號,就 把它們刪掉。系統中有越多的帳號,就越容易受到攻擊。

第一步
用下面的命令刪除一些不必要的用戶:

[root@deep]# userdel adm
[root@deep]# userdel lp
[root@deep]# userdel sync
[root@deep]# userdel shutdown
[root@deep]# userdel halt
[root@deep]# userdel news
[root@deep]# userdel uucp
[root@deep]# userdel operator
[root@deep]# userdel games (如果不用X Window伺服器,可以刪除這個用戶)
[root@deep]# userdel gopher
[root@deep]# userdel ftp (如果沒安裝匿名ftp伺服器,可以刪除這個用戶)
第二步
輸入下面的命令刪除一些不必要的群組:

[root@deep]# groupdel adm
[root@deep]# groupdel lp
[root@deep]# groupdel news
[root@deep]# groupdel uucp
[root@deep]# groupdel games (如果不用X Window伺服器,可以刪除這個群組)
[root@deep]# groupdel dip
[root@deep]# groupdel pppusers
[root@deep]# groupdel popusers (如果不用pop 伺服器,可以刪除這個群組)
[root@deep]# groupdel slipusers

第三步
在系統中加入必要的用戶:

例如:
[root@deep]# useradd admin
[root@deep]# passwd admin
這些命令的輸出是這樣的:
Changing password for user admin
New UNIX password: somepasswd
passwd: all authentication tokens updated successfully

第四步
"不允許改變"位可以用來保護檔案使其不被意外地刪除或重寫,也可以防止有些人建立這個檔案的符號連接。刪除"/etc/passwd"、"/etc /shadow"、"/etc/group"或"/etc/gshadow"都是黑客的攻擊方法。
替密碼檔案和群組設定檔設置不可改變屬性,可以用下面的命令:

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

注意:如果將來要在密碼或群組設定檔中增加或刪除用戶,就必須先拿掉這些檔案的不可改變屬性,否則就不能做任何改變。如果沒有清除這些檔案的不可改變屬 性,安裝那些會自動在密碼檔案和組檔案中加入新用戶的rpm套裝軟體的時候,在安裝過程中就會出現出錯的提示。




13. 防止任何人都可以 su 成為root

第一步

編輯su文件(vi /etc/pam.d/su)在文件的頭部加入下面兩行:
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
加入這兩行之後,"/etc/pam.d/su"文件變成:
#%PAM-1.0
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_wheel.so group=wheel
auth required /lib/security/pam_pwdb.so shadow nullok
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so shadow use_authtok nullok
session required /lib/security/pam_pwdb.so
session optional /lib/security/pam_xauth.so
這兩行的意思是只有"wheel"群組的成員才能用su命令成為root。注意,"wheel"群組是系統中用於這個目的的特殊帳號。不能用別的群組 名。

第二步

我們在"/etc/pam.d/su"配置文件中定義了"wheel"群組,現在介紹一下怎樣讓一些用戶可以用"su"命令成為"root"。下面是一個 例子,讓admin用戶成為"wheel"群組的成員,這樣就可以用"su"命令成為"root":
[root@deep]# usermod -G10 admin
"G"是表示用戶所在的其他群組。"10"是"wheel"群組的ID值,"admin"是我們加到"wheel"群組的用戶。用同樣的命令可以讓其他的 用戶可以用su命令成為root。




14. 加強 PAM 記錄登入錯誤訊息

編輯 /etc/pam.d/other 加入下面粗體的那兩行

auth required /lib/security/pam_warn.so
auth required /lib/security/pam_deny.so
account required /lib/security/pam_deny.so
password required /lib/security/pam_warn.so
password required /lib/security/pam_deny.so
session required /lib/security/pam_deny.so 未完,續待......^_^


自己架一個安全的伺 服器環境(五)
張貼:matt 發表於 Monday, November 27 @ 17:42:07 CST
繼續之前的自己架一個安全的伺服器環境(四)--安裝完後的系統安全概要
15. 資源限制 ~ 21. 建立所有重要的日誌文件的硬拷貝




15. 資源限制

第一步

編輯"limits.conf"檔案(vi /etc/security/limits.conf),加入或改變下面這幾行:

* hard core 0
* hard rss 5000
* hard nproc 20

這些行的的意思是:"core 0"表示禁止建立core檔案;"nproc 20"把最多程式數限制到20;"rss 5000"表示除了root之外,其他用戶都最多只能用5M記憶體。上面這些都只對登入到系統中的用戶有效。通過上面這些限制,就能更好地控制系統中的用 戶對程式、core檔案和記憶體的使用情況。星號"*"表示的是所有登入到系統中的用戶。

第二步

必須編輯"/etc/pam.d/login"檔案,在檔案末尾加入下面這一行:
session required /lib/security/pam_limits.so
加入這一行後"/etc/pam.d/login"檔案是這樣的:

#%PAM-1.0
auth required /lib/security/pam_securetty.so
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_nologin.so
account required /lib/security/pam_pwdb.so
password required /lib/security/pam_cracklib.so
password required /lib/security/pam_pwdb.so nullok use_authtok md5 shadow
session required /lib/security/pam_pwdb.so
session required /lib/security/pam_limits.so
#session optional /lib/security/pam_console.so




16. 對 mount 的檔案系統做更好的控制

可以用一些選項,如:noexec、nodev和nosuid,對 mount 的檔案系統做更好的控制,如:"/home"和"/tmp"。這些都在"/etc/fstab"檔案中設定。fstab檔案包含了各個檔案系統的描述資 訊。如果想知道在這個檔案中可以設定哪些選項,請用man命令查看關於mount(8)的輔助敘述。

編輯 fstab檔案(vi /etc/fstab),並根據需要把這兩行:

/dev/sda9 /tmp ext2 defaults 1 2
/dev/sda6 /home ext2 defaults 1 2


/dev/sda11 /chace ext2 defaults 1 2

改變成:

/dev/sda9 /tmp ext2 defaults,rw,nosuid,nodev,noexec 1 2
/dev/sda6 /home ext2 defaults,rw,nosuid,nodev 1 2


/dev/sda11 /chace exe2 defaults,rw,nosuid,nodev,noexec 1 2





"nodev"表示不允許在這個檔案系統上有字元或特殊的塊設備。
"nosuid"表示不允許設定具有 suid(set-user-identifier)和 sgid(set-group-identifier)權限的檔案。
"noexec"表示不允許檔案系統上有任何可執行的二進位檔案。

注意:上面的例子中,"/dev/sda9"mount到"/tmp"目錄上,而"/dev/sd6"mount到"/home"目錄上。當然這和你的實 際情況會有所不同,這些取決於你是怎麼劃分的以及用什麼樣的硬碟,例如:IDE硬碟是hda、hdb,等等,而SCSI硬碟是sda、sdb,等等。

17. 把rpm程式轉移到一個安全的地方,並改變預設的檔案執行權限

◎把rpm程式移到軟碟上,用下面的命令:


[root@deep]# mount /dev/fd0 /mnt/floppy/
[root@deep]# mv /bin/rpm /mnt/floppy/
[root@deep]# umount /mnt/floppy

注意:千萬不要把rpm程式從系統中移除掉,否則以後就不能重新安裝它,因為安裝rpm程式或其他套裝軟體本身就要用rpm命令。
還有一點要注意的是,把rpm命令的存取權限從預設的755改成700。這樣非root用戶就不能使用rpm命令了。特別是考慮到萬一在安裝完新軟體之 後,忘了把rpm程式移到一個安全的地方,這樣做就更有必要了。

◎改變"/bin/rpm"預設的存取權限,用下面這個命令:

[root@deep]# chmod 700 /bin/rpm


18. Shell 下的命令記錄

第一步

編輯 profile 檔案(vi /etc/profile),把下面二行改成:

HISTFILESIZE=20
HISTSIZE=20

這樣每個用戶家目錄下的".bash_history"就最多只能存20個命令。如果黑客試圖在用戶的"~/.bash_history"文件中發現一些 口令,他就沒有什麼機會了。

第二步

編輯 .bash_logout 檔案 (vi /etc/skel/.bash_logout) ,並加入下面一行:

rm -f $HOME/.bash_history

注意:若之前己經新增過使用者,記得要手動替他們加入上面那一行。

19. "/etc/lilo.conf" 檔案

第一步


編輯lilo.conf檔案(vi /etc/lilo.conf),加上或改變下面說明的三個設定:

boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=00 <- 將此行改成 00
Default=linux
restricted <-新增此行
password= <- 新增此行並輸入你的密碼
image=/boot/vmlinuz-2.2.16-22smp
label=linux
initrd=/boot/initrd-2.2.16-22smp.img
root=/dev/sda10
read-only

第二步

因為"/etc/lilo.conf"組態檔案裡,存在沒有經過加密的密碼,所以只有root才能有讀的權限。用下面的命令改變檔案的權限:
[root@deep]# chmod 600 /etc/lilo.conf

第三步

使改變後的"/etc/lilo.conf"組態檔案生效:
[root@deep]# /sbin/lilo -v (to update the lilo.conf file).

第四步

為了更安全一點,可以用chattr命令給"lilo.conf"檔案加上不可改變的權限。
◎讓檔案不可改變用下面的命令:
[root@deep]# chattr +i /etc/lilo.conf

這樣可以避免"lilo.conf"檔案因為意外或其他原因而被改變。如果想要改變"lilo.conf"檔案,必須先清除它的不可改變標誌。

◎清除不可改變的標記用下面的命令:
[root@deep]# chattr -i /etc/lilo.conf

20. 使Control-Alt-Delete關機鍵無效

編輯 inittab 檔案(vi /etc/inittab)把這一行:

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

加上 # 改為:

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

用下面的命令使改變生效:
[root@deep]# /sbin/init q

21. 建立所有重要的日誌文件的硬拷貝

保證在"/var/log"目錄下的不同日誌檔案的完整性是保證系統安全所要考慮的非常重要的一個方面。如果我們在伺服器上已經加上了很多安全措施,黑客 還是能夠成功入侵,那麼日誌檔案就是我們最後的防範措施。因此,很有必要考慮一下用什麼方法才能保證日誌檔案的完整性。如果伺服器上或網路中的其他伺服器 上已經裝設了印表機,就可以把重要的日誌檔案列印出來。這要求有一個可以連續列印的印表機,並用syslog把所有重要的日誌檔案傳到 "/dev/lp0"(列印設備)。黑客可以改變伺服器上的檔案、程式,等等,但是,把重要的日誌檔案列印出來之後,他就無能為力了。


在 Securing and Optimizing Linux v1.3的第57頁講了很多,我只用下面的方式來做:

假定現有一台 Log Server、一台郵件伺服器、一台DNS伺服器、一台 Web 伺服器 。我採用的策略是服務分散在不同的機器上,logserver 是接收日誌檔案的電腦主機名。如果有人試圖黑你的電腦並且威脅把所有重要的系統日誌檔案都刪掉,你就不用怕了,因為你已經列印出來或者在別的地方還有一個 拷貝。這樣就可以根據這些日誌檔案分析出黑客在什麼地方,然後理出這次入侵事件。


設定方式如下:

◎Log Server 的設定(host name為 logserver):

這台機器只開啟 syslog daemon ,其它的 Services 全部關掉。
除了必需的帳號外,不建立其它帳號,讓這台Log Server 只有 root 可以登入,且root 的密碼,千萬不可以與其它主機相同,因為若其它台主機被入侵了,這台也會跟著遭殃。
編輯syslog腳本檔案(vi +24 /etc/rc.d/init.d/syslog),把這一行:

daemon syslogd -m 0

改為:

daemon syslogd -r -m 0

重新啟動syslog daemon使改變生效:

[root@mail]# /etc/rc.d/init.d/syslog restart

讓這台主機接到印表機上, 編輯 "syslog.conf"檔案(vi /etc/syslog.conf),在檔案的末尾加入下面這一行

authpriv.*;mail.*;local7.*;auth.*;daemon.info /dev/lp0


如果這台接收日誌檔案的伺服器上還要加上防火牆,可以檢查一下防火牆的腳本檔案中有沒有下面幾行(沒有就加上):

ipchains -A input -i $EXTERNAL_INTERFACE -p udp -s $SYSLOG_CLIENT -d $IPADDR 514 -j ACCEPT

在這個例子中防火牆的腳本檔案中定義了

EXTERNAL_INTERFACE="eth0"。

IPADDR="208.164.186.2"; <-- Log Server 的 IP

SYSLOG_CLIENT="208.164.168.0/24" <-- 要將 Log 資訊送到Log Server 的 IP範圍

重新啟動接收日誌檔案的伺服器上的防火牆,使改變生效:

[root@mail]# /etc/rc.d/init.d/firewall restart


當然如果在這台 Log Server 再加上 LogCheck 類似的軟體,那就更好了。



◎Mail Server 、DNS Server、Web Server 的設定都相同:

編輯syslog.conf檔案(vi /etc/syslog.conf),在檔案末尾加入下面這一行:


authpriv.*;mail.*;local7.*;auth.*;daemon.info @logserver

(logserver 為 hostname,需要DNS或 各主機的 /etc/hosts內有記錄)


重新啟動syslog daemon使改變生效:

[root@deep]# /etc/rc.d/init.d/syslog restart

注意:千萬不要用閘道伺服器來收集和管理所有的系統日誌資訊。有關syslogd程式的其他一些參數和策略,可以用man命令查看輔助敘 述:syslogd(8)、syslog(2)和syslog.conf(5)。


結語:這樣的作法可將 Log File 都送到 Log Server 上,但並沒有將不同主機的Log分開在不同的檔案,若要查也不太好查。在印象中好像有方法可以分開,但我不知道如何做,有人知道嗎? 與大家分享一下吧!
mail to me : matt@mxtpa.biglobe.net.tw

安裝完後的系統安全概要,這部份還沒做完呢? 再接再厲了....p(^o^)q



自己架一個安全的伺 服器環境(六)
張貼:matt 發表於 Tuesday, November 28 @ 12:08:07 CST
繼續之前的自己架一個安全的伺服器環境(五)--安裝完後的系統安全概要
22. 改變 "/etc/rc.d/init.d/" 目錄下,腳本檔案的存取權限~ 26. /proc/sys 網路安全選項的調整




22. 改變 "/etc/rc.d/init.d/" 目錄下,腳本檔案的存取權限

改變啟動和停止daemon的腳本檔案的存取權。


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

這樣只有root可以讀、寫和執行這個目錄下的腳本。我想一般用戶沒有什麼必要知道腳本檔案的內容。

注意:如果你裝設或升級了一個程式,要用到"/etc/rc.d/init.d/"中system V腳本,不要忘記再檢查一下改變和檢查這個腳本檔案的權限。

23. "/etc/rc.d/rc.local"檔案

在預設情況下,當登入裝有Linux系統的電腦時,系統會告訴你Linux發行版的名字、版本號、核心版本和伺服器名稱。這洩漏了太多的系統資訊。最好只 顯示一個"Login:"的提示資訊。


第一步

編輯"/ect/rc.d/rc.local"檔案,在下面這些行的前面加上"#":

--
# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" > /etc/issue
#echo "$R" >> /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >> /etc/issue
--

第二步

解除"/etc"目錄下的"issue.net"和"issue"檔案:

[root@deep]# rm -f /etc/issue

[root@deep]# rm -f /etc/issue.net

注意:"/etc/issue.net"檔案是用戶從網路登入電腦時(例如:telnet、SSH),看到的登入提示。同樣在"/etc"目錄下還有一個 "issue"檔案,是用戶從本地登入時看到的提示。這兩個檔案都是文字檔案,可以根據需要改變。但是,如果想刪掉這兩個檔案,必須向上面介紹的那樣把 "/etc/rc.d/rc.local"腳本中的那些行註解掉,否則每次重新啟動的時候,系統又會重開新文件立這兩個檔案。

24. 帶"s"位元的程式

用ls -l命令列出來的檔案,如果檔案的權限位中出現"s",則這些檔案的SUID(-rwsr-xr-x)或SGID(-r-xr-sr-x)位被設定了。 因?這些程式給執行它的用戶一些特權,所以如果不需要用到這些特權,最好把這些程式的"s"位移去。可以用下面這個命令"chmod a -s <檔案名>"移去相應檔案的"s"位。


可以清除"s"位元的程式包括但不限於:

從來不用的程式
不希望非root用戶執行的程式
偶爾用用,但是不介意先用su命令變成root後再執行。

下面移除了SUID的程式,是作者(Gerhard Mourani)認為有必要移去"s"位。注意,系統可能需要一些SUID的程式才能正常執行,所以要千萬小心。

用下面的命令找到所有帶"s"位元的程式:





[root@deep]# find / -type f ( -perm -04000 -o -perm -02000 ) -exec ls -lg {}


用下面的命令將下面的程式除去 SUID:


[root@deep /]# chmod a-s /usr/bin/chage
[root@deep /]# chmod a-s /usr/bin/gpasswd
[root@deep /]# chmod a-s /usr/bin/wall
[root@deep /]# chmod a-s /usr/bin/chfn
[root@deep /]# chmod a-s /usr/bin/chsh
[root@deep /]# chmod a-s /usr/bin/newgrp
[root@deep /]# chmod a-s /usr/bin/write
[root@deep /]# chmod a-s /usr/sbin/usernetctl
[root@deep /]# chmod a-s /usr/sbin/traceroute
[root@deep /]# chmod a-s /bin/mount
[root@deep /]# chmod a-s /bin/umount
[root@deep /]# chmod a-s /bin/ping
[root@deep /]# chmod a-s /sbin/netreport


如果你想知道這些程式到底有什麼用,可以用man命令查看幫助。


例如:

[root@deep]# man netreport

25. /proc/sys 網路安全選項的調整

讓系統對 ping 沒有反應
讓系統對廣播沒有反應
取消 IP source routing
開啟 TCP SYN Cookie 保護
取消 ICMP 接受 Redirect
開啟錯誤訊息保護
開啟 IP 欺騙保護
記錄Spoofed Packets, Source Routed Packets, Redirect Packets
Redhat 6.1 的做法:

[root@deep /]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
[root@deep /]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
[root@deep /]# for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
> echo 0 > $f
> done
[root@deep /]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies
[root@deep /]# for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
> echo 0 > $f
> done
[root@deep /]# echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
[root@deep /]# for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
> echo 0 > $f
> done
[root@deep /]# for f in /proc/sys/net/ipv4/conf/*/log_martians; do
> echo 0 > $f
> done



Redhat 6.2 的做法:

編輯 "/etc/sysctl.conf" 檔案,並加入下面幾行,

# Enable ignoring ping request
net.ipv4.icmp_echo_ignore_all = 1
# Enable ignoring broadcasts request
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Disables IP source routing
net.ipv4.conf.all.accept_source_route = 0
# Enable TCP SYN Cookie Protection
net.ipv4.tcp_syncookies = 1
# Disable ICMP Redirect Acceptance
net.ipv4.conf.all.accept_redirects = 0
# Enable bad error message Protection
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Enable IP spoofing protection, turn on Source Address Verification
net.ipv4.conf.all.rp_filter = 1
# Log Spoofed Packets, Source Routed Packets, Redirect Packets
net.ipv4.conf.all.log_martians = 1

最後重新啟動 network

[root@deep /]# /etc/rc.d/init.d/network restart



結語:安裝完後的系統安全概要,我在(四)、(五)、(六)這三篇中列出我有做的部份,這些也是我覺的要設定的地方,在 Securing and Optimizing Linux: RedHat Edition v1.3 中的第三章寫了很多,有些我沒有列出來是因為有些是觀念上、有些是平常要做的檢查,若各位想要進一步瞭解,請看一下原文了喔!

自己架一個安全的伺 服器環境(七)
張貼:matt 發表於 Wednesday, November 29 @ 18:58:48 CST

提供伺服器一個透過網路的安全入口(SSH2)

作者:matt (mattli@mxtpa.biglobe.net.tw)
序言
在照著「安裝一台安全的伺服器(一)~(六)」的方式,安裝了一個安全的伺服器環境後,一定會覺得有個地方很奇怪,不知道大家有無注意到,那就是除了在主 機前操作外,我們如何透過網路來維護這台主機、如何將東西傳到這台「安全」的主機上,而且還是在安全的前提下進行呢? 答案就是 SSH ,可能有些人有聽過或現在正在使用了,它可以通過網絡登錄到遠程主機並執行命令。它提供了很強的安全驗證可以在不安全的網絡中進行安全的通訊,而這正是我 們需要的。




SSH 在 Linux 上有兩個軟體可以用,一是 OpenSSH (免費) 二是 SSH2 (商業),我現在使用的是 SSH2,雖然OpenSSH是免費的,而且功能上與 SSH 是類似,但個人覺的在 Client 的工具,還是沒有ssh.com公司提供的 SSH Client_win32 好用 (因為我的日常使用平台還是Windows),它除了遠端登入外,還提供拷貝檔案到主機上的功能,這項功能是我常需要使用的,而 OpenSSH 的 Windows Client 工具中卻沒有 for SSH2 的 scp,所以我只有先用SSH2了,反正自己又不是拿來做商業上的用途,好用為何不用呢?

註:在這裡有一篇文章說明,如何在Windows 下利用 Secure Shell Tunnelling 來與 OpenSSH 做到安全的FTP,可是我試不出來,有人會嗎?這樣就可以真的用OpenSSH了。

更新(2001/01/06):
OpenSSH也可以和SSH Client_win32 相通,只要將 /etc/ssh/sshd_config 內的
Subsystem sftp /usr/libexec/sftp-server
這行打開就可以了。嘿嘿 ,在Window下終於有好用的工具與OpenSSH通了。不過我只試出只用 password 來連,用個人私key 來連,還沒試出來。

注意事項


原始路徑都為「/var/tmp」(當然在實際情況中也可以用其它路徑)。

安裝在RedHat Linux 6.1和6.2下測試通過。

要用「root」用戶進行安裝。

SSH2的版本是2.3.0

軟體的來源


SSH的主頁:http://www.ssh.com
ftp://ftp.ssh.com/pub/ssh/ 或
ftp://ftp.wiretapped.net/wd2a/security/cryptography/ssh/SSH/rpms


1. SSH2 Server :

for redhat: ssh-2.3.0-1nox.i386.rpm (因為伺服器不需X-Window,所以下載不包含X-window 的版本)


2.SSH2 Client : (http://www.ssh.com 要註冊才能下載)

for linux : 在SSH2 Server的RPM內就有了

for window: SSHWin-2.3.0.exe

安裝步驟

A. 下載軟體

SSH2 Server
由於我們要安裝的主機上沒有ftp程式,先從RedHat6.2光碟中,將FTP Client裝起來。再利用 ftp 程式將軟體下載回來。最後再將 ftp 程式移除。

[root@deep tmp]# mount /dev/cdrom /mnt/cdrom
[root@deep tmp]# rpm -ivh /mnt/cdrom/RedHat/RPMS/ftp-0.16-3.i386.rpm
ftp #########################
[root@deep tmp]# ftp ftp.ssh.com
Name (ftp.ssh.com:root): anonymous
Password: abc@abc.net
ftp> cd /pub/ssh/rpms
ftp> get ssh-2.3.0-1nox.i386.rpm
ftp> quit
[root@deep tmp]# rpm -e ftp-0.16-3

SSH2 Windows Client

SSHWin-2.3.0.exe 想辦法下載回來吧!
記得還要到SSH網站上申請 license(非商業的免費),再將 license.dat 下載回來!
B. 安裝

SSH2 Server
[root@deep tmp]# rpm -ivh ssh-2.3.0-1nox.i386.rpm
[root@deep /]# rm /etc/ssh2/hostkey*
[root@deep /]# /usr/local/bin/ssh-keygen2 -P /etc/ssh2/hostkey (為 Server 產生新的 hostkey)


SSH2 Windows Client
在Windows下執行 SSHWin-2.3.0.exe

C. 設定 SSH2 Server (deep:192.168.0.20)

以root身份啟動 sshd

[root@deep /]# /usr/local/sbin/sshd


建一個新的使用者帳號 (若沒有的話)
[root@deep /]# useradd test
[root@deep /]# passwd test


D. 設定 SSH2 Window Client (mynb:192.168.0.100)

啟動 SSH Secure Shell Client
利用 [Help] -> [Import License File] 將下載下來的license.dat 匯入
按一下 Enter 鍵,連接到 SSH2 Server,Host Name: 192.168.0.20、User Name: test
稍微等一下,會出現一個警告視窗,按 "是",再來輸入 Password,這樣便連上SSH2 Server主機了。

選擇 [Edit] -> [Settings...] -> [Global Settings] -> [User Keys] ,按下 [Generate New Keypair] 按鈕。
出現一個 Key Generation 視窗,按二次 [下一步] ,等它產生Key,再按 [下一步] ,輸入
File Name:就是Key的檔案名稱
Comment:隨便給個註解
PassPhrase:就是登入密碼,打入自己要的密碼吧!不要太簡單喔
PassPhrase:再打一次
打完後,再按 [下一步] ,最後按下 [Upload Public Key] 按鈕,出現一個 Upload Public Key 視窗,
再按下 [Upload] 按鈕,等一下後公鑰就傳到 SSH2 Server 上了。
最後按完成,然後你就可以在 User Key 這視窗中看到你剛剛產生的Key。再按 [OK] 離開 settings 視窗。

你也利用可以看一下 test 的 Home 目錄下,有個 .ssh2 目錄,裡面有你的公鑰喔!
[test@deep test]$ ls -al

由於 SSH2 提供兩種連線方式,一種是「使用密碼」,一種是「使用 Key」, SSH2 Server 的預設是判斷有無「Key」,有就使用,若無便「使用密碼」。為了讓系統更安全,我們需要將設定改成「使用Key」,這樣子只有在這台主機上有帳號且有公 鑰的人,才能利用自己的私鑰連上來,因為密碼太簡單還是會便猜出來。

E. 再次設定 SSH2 Server

編輯 /etc/ssh2/sshd2_config,更改設定如下:
## sshd2_config
## SSH 2.0 Server Configuration File
##

# The "*" defines for all hosts
*:

## General settings
VerboseMode no
AllowCshrcSourcingWithSubsystems no
ForcePTTYAllocation no
SyslogFacility DAEMON
## Network settings
Port 22
ListenAddress 0.0.0.0
RequireReverseMapping no
MaxBroadcastsPerSecond 0
KeepAlive yes
NoDelay yes
MaxConnections 5
## Crypto settings
Ciphers AnyCipher
MACs AnyMAC
## User settings
PrintMotd yes
CheckMail yes
UserConfigDirectory "%D/.ssh2"
UserKnownHosts yes
## Public key configurations
HostKeyFile hostkey
PublicHostKeyFile hostkey.pub
RandomSeedFile random_seed
IdentityFile identification
AuthorizationFile authorization
AllowAgentForwarding no
## Tunneling configurations
AllowX11Forwarding no
AllowTcpForwarding no
## Authentication methods
PasswordGuesses 3
AllowedAuthentications publickey,password
RequiredAuthentications publickey,password
## Host restrictions
QuietMode no
## User restrictions
PermitRootLogin no
## SSH1 compatibility
Ssh1Compatibility no
subsystem-sftp sftp-server


重新啟動 sshd2
[root@deep /]# /usr/local/sbin/sshd

這樣子設定後,就只有利用 publickey & privatekey 才能連到主機上,這樣主機也就更安全了。

配置sshd2使其使用TCP-WRAPPERS(inetd超級伺服器)

第一步

編輯"inetd.conf"文件(vi /etc/inetd.conf)並加入這一行:

ssh stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/sshd -i

注意:"-i"參數很重要,它說明sshd是被inetd運行的。在加入這一行後,通過發送一個SIGHUP信號(killall -HUP inetd)來更新"inetd.conf"文件。

[root@deep /root]# killall -HUP inetd

第二步

編輯"hosts.allow"文件(vi /etc/hosts.allow)並加入這一行:

sshd: 192.168.1.

這一行表示IP地址為"192.168.1.X"的主機都可以連接上來。

確定一下 "hosts.deny" 檔案內有下面這一行:

ALL: ALL@ALL

結語:

有關 SSH2 Server與 Client 的相關文件,在 Securing and Optimizing Linux: RedHat Edition v1.3 的第11章有詳細的安裝步驟、或在你安裝的地方就有 Server 在 /usr/doc/ssh-2.3.0,Client 就看 Help 就好了、或是在 SSH 的網站上也有非常詳細的文件可以看(要錢的就是文件比較齊一點....)。

大家看完或試完了後,若有錯誤的地方,告訴我一下吧!

沒有留言: