FreeBSD下構建安全的Web伺服器(3)

來源:互聯網
上載者:User
web|web服務|web伺服器|安全 對於使用php指令碼來進行互動,最好建立一個使用者只針對某個庫有 update、select、delete、insert、drop table、create table等許可權,這樣就很好避免了資料庫使用者名稱和密碼被駭客查看後最小損失。
比如下面我們建立一個資料庫為db1,同時建立一個使用者test1能夠訪問該資料庫。
mysql> create database db1;
mysql> grant select,insert,update,delete,create,drop privileges on db1.* to test1@localhost identified by ’admindb’;
以上SQL是建立一個資料庫db1,同時增加了一個test1使用者,口令是admindb,但是它只能從本地串連mysql,對db1庫有select,insert,update,delete,create,drop操作許可權。
(7) 限制一般使用者瀏覽其他使用者資料庫
如果有多個資料庫,每個資料庫有一個使用者,那麼必須限制使用者瀏覽其他資料庫內容,可以在啟動MySQL伺服器時加--skip-show-database 啟動參數就能夠達到目的。
(8) 忘記mysql密碼的解決辦法
如果不慎忘記了MySQL的root密碼,我們可以在啟動MySQL伺服器時加上參數--skip-grant-tables來跳過授權表的驗證 (./safe_mysqld --skip-grant-tables &),這樣我們就可以直接登陸MySQL伺服器,然後再修改root使用者的口令,重啟MySQL就可以用新口令登陸了。
(9) 資料庫檔案的安全
我們預設的mysql是安裝在/usr/local/mysql目錄下的,那麼對應的資料庫檔案就是在/usr/local/mysql/var目錄下,那麼我們要保證該目錄不能讓未經授權的使用者訪問後把資料庫打包拷貝走了,所以要限制對該目錄的訪問。
我們修改該目錄的所屬使用者和組是mysql,同時改變存取權限:
# chown -R mysql.mysql /usr/local/mysql/var
# chmod -R go-rwx /usr/local/mysql/var
(10) 刪除記錄
執行以上的命令會被shell記錄在曆史檔案裡,比如bash會寫入使用者目錄的.bash_history檔案,如果這些檔案不慎被讀,那麼資料庫的密碼就會泄漏。使用者登陸資料庫後執行的SQL命令也會被MySQL記錄在使用者目錄的.mysql_history檔案裡。如果資料庫使用者用SQL語句修改了資料庫密碼,也會因.mysql_history檔案而泄漏。所以我們在shell登陸及備份的時候不要在-p後直接加密碼,而是在提示後再輸入資料庫密碼。
另外這兩個檔案我們也應該不讓它記錄我們的操作,以防萬一。
# rm .bash_history .mysql_history
# ln -s /dev/null .bash_history
# ln -s /dev/null .mysql_history
(11) 其他
另外還可以考慮使用chroot等方式來控制mysql的運行目錄,更好的控制許可權,具體可以參考相關文章。

4. vsFTPd安全設定 
vsFTPd是一款非常著名的ftp daemon程式,目前包括Redhat.com在內很多大公司都在使用,它是一款非常安全的程式,因為它的名字就叫:Very Secure FTP Daemon (非常安全的FTP伺服器)。
vsftpd設定選項比較多,涉及方方面面,我們下面主要是針對安全方面進行設定。
目前我們的需求就是使用系統帳戶同時也作為是我們的FTP帳戶來進行我們檔案的管理,目前假設我只需要一個帳戶來更新我的網站,並且我不希望該帳戶能夠登陸我們的系統,比如我們的網站的目錄是在/usr/www下面,那麼我們建立一個使用者ftp,它的主目錄是/usr/www,並且它的shell是/usr/sbin/nologin,就是沒有shell,防止該使用者通過ssh等登陸到系統。
下面在進行系統詳盡的設定,主要就是針對vsftpd的設定檔vsftpd.conf檔案的配置。
(1) 禁止匿名使用者存取, 我們不需要什麼匿名使用者,直接禁止掉:
anonymous_enable=NO 
(2) 允許本機使用者登陸,因為我們需要使用ftp使用者來對我們網站進行管理:
local_enable=YES
(3) 只允許系統中的ftp使用者或者某些指定的使用者訪問ftp,因為系統中帳戶眾多,不可能讓誰都訪問。
開啟使用者檔案清單功能:
userlist_enable=YES
只允許使用者檔案清單中的使用者訪問ftp:
userlist_deny=NO 
使用者名稱檔案清單路徑:
userlist_file=/etc/vsftpd.user_list 
然後在/etc下建立檔案 vsftpd.user_list 檔案,一行一個,把使用者ftp加進去,同時也可以加上你允許訪問的系統帳戶名稱。
(4) 禁止某些使用者登陸ftp:
pam_service_name=vsftpd 
指出VSFTPD進行PAM認證時所使用的PAM設定檔名,預設值是vsftpd,預設PAM設定檔是/etc/pam.d/vsftpd。 
/etc/vsftpd.ftpusers 
VSFTPD禁止列在此檔案中的使用者登入FTP伺服器,使用者名稱是一行一個。這個機制是在/etc/pam.d/vsftpd中預設設定的。
這個功能和(3)裡的功能有點類似,他們倆能結合使用,那樣就最好了。
(5) 把本機使用者鎖定在自己的主目錄,防止轉到其他目錄,比如把/etc/passwd給下載了:
chroot_local_users=NO
chroot_list_enable=YES 
chroot_list_file=/etc/vsftpd.chroot_list
然後在/etc下建立vsftpd.chroot_list檔案,裡面把我們要限制的本地帳戶加進去,一行一個,我們加上ftp,防止它登陸到系統。
(6) 隱藏檔案真實的所有使用者和組資訊,防止駭客拿下ftp後查看更多系統使用者資訊:
hide_ids=YES
(7) 取消ls -R命令,節省資源,因為使用該命令,在檔案清單很多的時候將浪費大量系統資源:
ls_recurse_enable=NO 
(8) 上傳檔案的預設許可權,設定為022:
local_umask=022
如果要覆蓋刪除等,還要開啟:
write_enable=YES
(9) ftp的banner資訊,為了防止駭客擷取更多伺服器的資訊,設定該項:
ftpd_banner=banner string
把後面的banner string設為你需要的banner提示資訊,為了安全,建議不要暴露關於vsFTPd的任何資訊。
另外,如果你的資訊比較多的話,可以設定為提示資訊是讀取一個檔案中的資訊:
banner_file=/directory/vsftpd_banner_file 
(10) 開啟日誌功能:
xferlog_enable=YES
同時設定日誌的目錄:
xferlog_file=/var/log/vsftpd.log
啟用詳細的日誌記錄格式:
xferlog_enable=YES 
(11) 如果開啟虛使用者功能等,那麼建議關閉本機使用者登陸:
local_enable=NO 

vsFTPd還有很多安全設定,畢竟人家的名字就是:Very Secure FTP Daemon,反正它的溢出漏洞什麼的是很少的,如果要更安全,建議按照自己的需要設定vsftpd,設定的好,它絕對是最安全的。

5. SSH安全設定
SSH是一個基於SSL的安全連線遠端管理的服務程式,主要出現就是為瞭解決telnet、rlogin、rsh等程式在程式互動過程中存在明文傳輸易被監聽的問題而產生的,目前基本上是推薦使用ssh來代替telnet、rlogin、rsh等遠端管理服務。
ssh能夠直接在windows平台下通過Secure SSH Client等用戶端工具進行串連管理,目前最流行的伺服器端就是OpenSSH程式,目前最新版本是OpenSSH4.0版,詳細可以參考www.openssh.com網站。
OpenSSH在FreeBSD下已經整合安裝了,FreeBSD5.3下的OpenSSH版本是3.8.1,建議ports升級到4.0。

主要的安全設定檔是/etc/ssh/sshd_config檔案,我們編輯該檔案。
(1) 使用protocol 2代替protocol 1,SSH2更加安全,可以防止攻擊者通過修改攜帶的版本banner來劫持(hijacking)啟動會話進程並降低到protocol 1。注釋掉protocol 2,1 改用下面語句代替:
protocol 2 
(2) 合理設定最大串連數量, 防止DOS攻擊 
  MaxStartups 5:50:10 
(3)關閉X11forwording ,防止工作階段劫持
  X11Forwarding no 

(4)建議不使用靜態密碼,而使用DSA 或RSA KEY,修改如下內容可以關閉使用密碼認證: 
  PasswordAuthentication no 
(5)可以限制某個組或光是單個使用者訪問shell 
  AllowGroups wheel 
或者
  AllowUsers heiyeluren 
(6) 限制root使用者登陸,主要是為了防止暴力破解
    PermitRootLogin no
(7) 不允許口令為空白的使用者登陸
    
    PermitEmptyPasswords no
(8)使用TCP wrappers來限制一些訪問,修改/etc/hosts.allow檔案,注釋掉"ALL : ALL : allow",增加如下內容: 
  sshd:localhost:allow 
  sshd:friendlcomputer:allow 
  sshd:all : deny 
  #相關命令: 
  #chsh -s /sbin/nologin user 

四、防火牆的安裝和設定
FreeBSD內建有一個基於包過濾的防火牆--ipfw,雖然功能沒有專業防火牆那麼強大,但是應付一個Web網站的安全還是足夠的,所以我們決定選用該防火牆來保護我們的Web伺服器。

1. 安裝ipfw
IPFW 的主要部分是在核心中啟動並執行, 因此會需要在FreeBSD核心設定檔中添加部分選項。(注意,如果你沒有安裝FreeBSD核心原始碼,是無法進入以下目錄的,所以運行之前一定要先安裝核心原始碼)我們先進入核心設定檔:
# cd /sys/i386/conf 
# cp GENERIC ./kernel_fw
開啟核心設定檔:
# ee ./kernel_fw
添加四個選項,不需要後面的注釋資訊:
options IPFIREWALL # 將包過濾部分的代碼編譯進核心。
options IPFIREWALL_VERBOSE 
# 啟用通過syslogd記錄的日誌。如果沒有指定這個選項,即使您在過濾規則中指定記錄包, 也不會真的記錄它們
options IPFIREWALL_VERBOSE_LIMIT=10 
# 限制通過 syslogd(8) 記錄的每項包規則的記錄條數。在惡劣的環境中如果您想記錄防火牆的活動, 而又不想由於 syslog 洪水一般的記錄而導致拒絕服務的攻擊, 那麼這個選項將會很有用。
options IPFIREWALL_DEFAULT_TO_ACCEPT 
# 這將把預設的規則動作從 ``deny’’ 改為 ``allow’’。這可以防止在沒有配置防火牆之前使用啟用過 IPFIREWALL 支援的核心重啟時把自己鎖在外面。 另外, 如果您經常使用 ipfw(8) 來解決一些問題時它也非常有用。 儘管如此,在使用時應該小心, 因為這將使防火牆敞開, 並改變它的行為。

編譯核心:
# /usr/sbin/config kernel_fw
# cd ../compile/kernel_fw (注意你的版本,如果是低於5.0的版本用../../compile/kernel_fw)
# make depend 
# make 
# make install 
重啟系統。注意,我們沒有選擇options IPFIREWALL_DEFAULT_TO_ACCEPT該選項,就是說預設系統啟動後是開啟防火牆的,並且防火牆預設是不允許任何串連的(deny from any to any),所以一定要在本地操作,否則你將被“鎖在門外”,如果你選擇了該選項則可以使用ssh等串連不受影響,不過這相對不安全。

2. 配置ipfw
如果配置普通情況下的規則,使用命令配置的模式:
ipfw的配置命令:ipfw [-N] 命令 [編號] 動作 [log(日誌)] 協議 地址 [其它選項]
例如:
# ipfw add allow tcp from any to 10.10.10.1 80 #允許外界訪問我的web服務
# ipfw add allow tcp from any to 10.10.10.1 21 #允許外面訪問我的ftp服務
# ipfw add allow tcp from any to 10.10.10.1 22 #允許外界訪問我的ssh服務
如果使用規則包的形式,那麼查看下面內容。
系統啟動後,我們還要配置rc.conf檔案來運行我們的防火牆:
# ee /etc/rc.conf
加入如下內容:
gateway_enable="YES" # 啟動網關 
firewall_enable="YES" # 啟用firewall防火牆 
firewall_script="/etc/rc.firewall" # firewall防火牆的預設指令碼 
firewall_type="/etc/ipfw.conf" # firewall自訂指令碼 
firewall_quiet="NO" # 起用指令碼時,是否顯示規則資訊。現在為“NO”假如你的防火牆指令碼已經定型,那麼就可以把這裡設定成“YES”了。 
firewall_logging_enable="YES" # 啟用firewall的log記錄。 
設定完成後我們再編輯/etc/syslog.conf檔案:
# ee /etc/syslog.conf
加入以下行: 
!ipfw 
*.*                 /var/log/ipfw.log 
現在到了最重要的編輯規則包了:
# ee /etc/ipfw.conf
我們添加一下規則:(注意 10.10.10.1是我們伺服器的IP)
######### TCP ##########
add 00001 deny log ip from any to any ipopt rr 
add 00002 deny log ip from any to any ipopt ts 
add 00003 deny log ip from any to any ipopt ssrr 
add 00004 deny log ip from any to any ipopt lsrr 
add 00005 deny tcp from any to any in tcpflags syn,fin 
# 這5行是過濾各種掃描包 
add 10001 allow tcp from any to 10.10.10.1 80 in  # 向整個Internet開放http服務。 
add 10002 allow tcp from any to 10.10.10.1 21 in  # 向整個Internet開放ftp服務。 
add 10000 allow tcp from 1.2.3.4 to 10.10.10.1 22 in 
# 向Internet的xx.xx.xx.xx這個IP開放SSH服務。也就是只信任這個IP的SSH登陸。
# 如果你登陸伺服器的IP不固定,那麼就要設為:add 10000 allow tcp from any to 10.10.10.1 22 in
add 19997 check-state 
add 19998 allow tcp from any to any out keep-state setup 
add 19999 allow tcp from any to any out #這三個組合起來是允許內部網路訪問出去,如果想伺服器自己不和Internet進行tcp串連出去,可以把19997和19998去掉。(不影響Internet對伺服器的訪問) 
########## UDP ##########
add 20001 allow udp from any 53 to 10.10.10.1 # 允許其他DNS伺服器的資訊進入該伺服器,因為自己要進行DNS解析嘛~ 
add 29999 allow udp from any to any out # 允許自己的UDP包往外發送。 
########## ICMP #########
add 30000 allow icmp from any to any icmptypes 3 
add 30001 allow icmp from any to any icmptypes 4 
add 30002 allow icmp from any to any icmptypes 8 out 
add 30003 allow icmp from any to any icmptypes 0 in 
add 30004 allow icmp from any to any icmptypes 11 in
#允許自己ping別人的伺服器。也允許內部網路用router命令進行路由跟蹤。 

五、Unix/Linux上的後門技術和防範
對駭客來講,入侵一個系統只是萬裡長征的開始,最主要的是長期佔有一個肉雞(傀儡機),所以,後門技術往往非常重要。對於我們來講,總是處於被動的地位,百密一疏,總有沒有做到位的地方,誰都不能保證自己的系統是絕對安全的,所以不能避免我們可能會被入侵。駭客入侵後肯定會留後門,當然,除了那些高手,境界非常高,入侵只是為了測試或者技術挑戰,對於一般駭客來講,入侵之後留個後門是很重要的,我們要防範,當然就要瞭解常用的後門技術,下面就簡單的講將在Unix/Linux系統中比較常見的後門技術。
1. 帳號後門
最普通和原始的後門技術,一般就是在系統中添加一個系統管理員帳戶。
# echo "heiyeluren:*:0:0::/root:/bin/sh" >> /etc/passwd 
# echo "heiyeluren::0:0::0:0::/root:/bin/sh" >> /etc/shadow
給系統增加一個 uid和gid都為0(root)的帳號,無口令。
FreeBSD的密碼是儲存在 /etc/master.passwd裡面的,那麼後面的命令就應該改成:
# echo "heiyeluren:::::::::" >> /etc/master.passwd
也可以使用程式來實現:
/* Add super user */
#include "stdio.h"
#define PASSWD_PATH "/etc/passwd"
#define SHADOW_PATH "/etc/master.passwd"
main()
{
FILE *fd;
fd = fopen(PASSWD_PATH, "a+");
fprintf(fd, "heiyeluren:*:0:0::/root:/bin/sh\n");
fclose(fd);
fd = fopen(SHADOW_PATH, "a+");
fprintf(fd, "heiyeluren::0:0::0:0::/root:/bin/sh\n");
fclose(fd);
}
# gcc -o adduser adduser.c
# ./adduser
這種方法比較傻,一般比較容易發現,特別是系統帳戶不多的時候。也有的使用者名稱起的比較迷惑人,比如起個r00t的使用者名稱,uid和gid都是0,這樣如果不注意,可能就會被矇混過關了。
* 防範方法:
這種方法雖然比較容易發現,但是我們還是要防範,要多注意觀察系統的帳戶情況,本來我們系統帳戶就不多,檢查起來比較方便,另外也要注意那些比較少使用的帳戶是不是被更改過,比如預設的帳戶有bind,它的shell是 /usr/sbin/nologin,就是不能登陸的,但是駭客入侵後把它改了,比如改為/bin/csh,那麼對方就能登陸了,但是你確不知道。所以最好辦法是把/etc/passwd另外備份一份,不週期性檢查,同時把/etc/passwd和/etc/master.passwd設為只有root才能查看。

  

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。