2011年1月10日 星期一

FreeBSD 更新、升級系統(8.0-RELEASE升級到8.1-RELEASE為例)

FreeBSD 更新、升級系統

之前,所分享的更新FreeBSD Port Tree是利用csup,可以參考[FreeBSD]使用csup更新port tree,現在,要分享的是如何更新FreeBSD的版本,例如要從8.0-RELEASE升級到8.1-RELEASE,FreeBSD從最早在1995年的2.0-RELEASE開始到現在8.1-RELEASE及9.0-CURRENT,在開發每個版本都會增加新功能,但是,有時候升級到最新的版本並不是最好的,如果在目前使用的版本上沒有太大的問題,還是要經過詳細考慮過比較好,畢竟,升級版本會動到核心的部份。


1.複製standard-supfile到/usr下
# cp /usr/share/examples/cvsup/standard-supfile /usr/


2.複製GENERIC
為了防止修改的GENERIC有問題,導致主機無法開機,可以先將原本正常的GENERIC複製一份出來
# cd /usr/src/sys/i386/conf
# cp GENERIC GENERIC.old


3.修改/usr/standard-supfile
# vi /usr/standard-supfile
修改以下內容
*default release=cvs tag=RELENG_8_1
                                          
備註:RELENG_8_1為版本名稱

4.將8.1的原始碼下載下來
# cd /usr/
# csup -g -L 2 standard-supfile

3.進行編譯核心
# cd /usr/src/
# make buildworld       //編譯系統中的程式
# make buildkernel KERNCONF=GENERIC > /home/aming/20100810buildker.log &  
//編譯新的核心

備註:GENERIC為核心設定檔的檔名

4.安裝新編譯的核心
# make installkernel KERNCONF=GENERIC > /home/aming/20100810installker.log &

5.重開機,並且進入單人模式
# mount -u /       //指定將根目錄掛載
# mount -a -t ufs        //將/etc/fstab裡的設定全部掛載起來
# mergemater -p       //更新設定檔
此時,系統會先將新的檔案暫存在/var/tmp/temproot,然後去跟舊的檔案進行比對
# make installworld > /home/aming/20100810.installwor.log &
# mergemaster
# reboot

補充1:
如遇到新核心經過編譯後,無法正常開機,以舊核心進行開機。
# unload kernel
# boot /boot/kernel.old/kernel

補充2:
在下mergemaster時,會跳出詢問
d:表示要保留舊的檔案,不使用新的設定檔
i:用新的檔案,將舊的檔案覆蓋掉
m:會將兩份新舊檔案顯示在左右兩邊,再進行詢問
v:會再看一次新舊檔案的比較

另外,mergemaster的選擇部份可以參考雄的FreeBSD筆記系統升級-make world 3-5部份

限制用戶使用 crontab

限制用戶使用 crontab
基於安全問題,在 Linux 下可以限制用戶使用 crontab 排程,而要設定的檔案分別有 /etc/cron.allow 及 /etc/cron.deny,它們的定義分別是:
/etc/cron.allow
如果 /etc/cron.allow 存在,只有這個檔案內的使用者才可使用 crontab。
/etc/cron.deny
在 /etc/cron.deny 內的使用者不可使用 crontab,未記錄的使用者才可以使用 crontab。
在使用時只會選擇以上其一個設定檔來限制,其中以 /etc/cron.allow 比 /etc/cron.deny 優先。而寫入的格式必須是每一個使用者一行。
另一點要注意的是,不管 root 是否在以上檔案內,都可以使用 crontab。

10 個 UNIX 良好使用習慣

10 個 UNIX 良好使用習慣
這是在 IBM developerWorks 的文章,列出了 10 個在 *NIX 下良好的使用習慣,其中有些也有犯下。以下是作者的10 個建議,並加上簡單中文簡介:
1. Make directory trees in a single swipe.
可以在用 mkdir 時加上 -p 選項,就可以遞迴建立目錄。
2. Change the path; do not move the archive.
在 tar 指令加上 -C 選項,指令解壓的目的地,不需把壓縮檔移動。
3. Combine your commands with control operators.
用 control operators 合拼指令,例如 ";", "&&" 及 "||"。
4. Quote variables with caution.
用雙引號括起變數。
5. Use escape sequences to manage long input.
用 escape sequences 處理較長的指令輸入。
6. Group your commands together in a list.
group 起一組指令。
7. Use xargs outside of find.
用 xargs 過濾從 find 得出的結果。
8. Know when grep should do the counting -- and when it should step aside.
grep 可以加上 -c 選項計算結果總數,不用透過 pipe 執行 wc。
9. Match certain fields in output, not just lines.
可以用類似 awk 這些工具配合 grep 使用,傳回指定欄位,不是一整行結果。
10. Stop piping cats.
不要用 cat 透過 pipe 報行 grep 搜索檔案,改用 grep 直接執行。
以上中文解釋可能寫得不好,詳細內容可參考原文: Learn 10 good UNIX usage habits

限制 MySQL 只接受 localhost 連線

限制 MySQL 只接受 localhost 連線
在預設的情況下 MySQL 接受所有連線,這個不是指 MySQL 的權限設定,而是 MySQL 有監聽它所使用的埠號。例如用 netstat 檢查會得出這個結果:
# netstat -an | grep 3306
tcp4 0 0 *.3306 *.* LISTEN

以下是在 FreeBSD 設定只接受 localhost 連線的方法:
1. 開啟 /etc/rc.conf
2. 加入 mysql_args:
mysql_enable="YES"
mysql_args="–bind-address=127.0.0.1"

3. 重新啟動 mysql
# /usr/local/etc/rc.d/mysql-server.sh restart

現在可以再用 netstat 檢查一下,可以見到 MySQL 只監聽 127.0.0.1 的 3306 埠號:
# netstat -an | grep 3306
tcp4 0 0 127.0.0.1.3306 *.* LISTEN
.htaccess 實用範例
以下是一些實用的 .htaccess 範例,可以不改動 php.ini 及 httpd.conf 便設定伺服器變數:
關閉 magic_quotes_gpc
# Only if you use PHP

php_flag magic_quotes_gpc off
減少 Bandwidth 使用量
# Only if you use PHP

php_value zlib.output_compression 16386
變更 scripts 副檔名
AddType application/x-httpd-php .php4
以上語句會將 .php4 當成 PHP 程式編譯。
禁止 .htaccess 開放瀏覽

order allow,deny
deny from all
變更預設頁面
DirectoryIndex myhome.htm index.htm index.php
自訂錯誤頁面
ErrorDocument 403 /forbidden.html
ErrorDocument 404 /notfound.html
ErrorDocument 500 /servererror.html
開放/禁止瀏覽目錄
# 禁止
Options All -Indexes
# 開啟
Options +Indexes

FreeBSD 開啟 quota 功能

FreeBSD 開啟 quota 功能
FreeBSD 預設沒有支援 quota 功能,如果需要支援 quota 便要重新編譯 kernel。以下是巨體實現方法:
cd /usr/src/sys/i386/conf
vi GENERIC
加上 options QUOTA(中間分隔的是 TAB 而非空白鍵)。
然後執行:
config GENERIC
cd ../../compile/GENERIC
make depend all install
編譯完成後,修改 /etc/fstab 檔案,例如要在 /home 這個分割區做空間管理,在 /home 的那行將 "rw" 改成 "rw,userquota"。
然後修改 /etc/rc.config,加入:
check_quotas="YES"
完成後輸入 "sync;sync;reboot" 重新開機。
在第一次執行 quota 時,請先執行以下指令:
cd /home
quotacheck -avug
最後建立 /usr/local/etc/rc.d/quota_on.sh 檔案,讓開機時自動執行 quota,以下是 /usr/local/etc/rc.d/quota_on.sh 的內容:
#!/bin/sh
# Check quota and then turn quota on.
if [ -x /sbin/quotacheck ]
then
echo "Checking quotas. This may take some time."
/sbin/quotacheck -avug
echo " Done."
fi
if [ -x /usr/sbin/quotaon ]
then
echo "Turning on quota."
/usr/sbin/quotaon -avug
fi

FreeBSD 列出開啟 sockets

FreeBSD 列出開啟 sockets

在 FreeBSD 除了可以用 netstat / lsof 列出已開啟的 internet 及 unix domain sockets 外,也可以用另一個較簡單的指令:sockstat,這個指令有以下不同的參數:
-4: 只顯出 ipv4 sockets.
-6: 只顯出 ipv6 sockets.
-c: 只顯示已連接 sockets.
-l: 只顯示正在監聽的 sockets.
使用上十分簡單,以下是使用例子:
# sockstat -4

FreeBSD 編譯核心問題

FreeBSD 編譯核心問題

今日將數台 FreeBSD 主機重新編譯核心,修改完 config 後,make buildkernel 成功沒有問題,但當執行 make installkernel 時便出現以下錯誤:
ERROR: Required audit group is missing, see /usr/src/UPDATING
看一看 /usr/src/UPDATING 沒有什麼作用,還是要靠 Google。解決方法是加入一個 audit 的 group,指令為:
pw group add audit

重新設定 MySQL root 密碼

重新設定 MySQL root 密碼

如果忘記了 MySQL 的 root 密碼,可以透過以下方法重新設定:
1. 停止 MySQL server。
# /etc/init.d/mysql stop
2. 啟動 MySQL server,並加上 –skip-grant-tables 參數,便可以略過輸入密碼的過程:
# mysqld_safe –skip-grant-tables &
3. 用 root 連接到 MySQL server,輸入:
mysql -u root
4. 進入 MySQL server 後,輸入以下幾行 SQL 語句:
mysql> use mysql;
mysql> update user set password=PASSWORD("newpass") where User=』root';
mysql> flush privileges;
mysql> quit
5. 重新啟動 MySQL 即可。

Apache 防止 DDoS 攻擊

Apache 防止 DDoS 攻擊


DDoS (distributed denial-of-service) 及 DoS (denial-of-service) 在網路上十分常見,而 DoS 攻擊所傳送的請求跟正常的請求一樣,分別在於每秒鐘發出大量請求到伺服器,使伺服器的負載增加,最常見的情況是伺服器暫停服務。
而 mod_evasive 則是一個預防 Apache 遭受 DDos 攻擊的模組,可以防止同一個 IP 對相同 URI 發出的大量請求,可設定的選項有:
– 限制同一個 IP 在一定秒數內請求一個頁面或檔案的次數。
– 限制同一個 IP 一秒內只可發出 50 個請求。
– 設定被禁止的 IP 封鎖時間。
以下是 mod_evasive 的安裝方法:
1. 先將原來的 httpd.conf 備份起來。
2. 到 http://www.zdziarski.com/projects/mod_evasive/ 下載 mod_evasive。
3. 在指令模式解壓及編譯 mod_evasive:
tar zxvf mod_evasive_1.10.1.tar.gz
cd mod_evasive/
apxs -cia mod_evasive20.c
以上的 apxs 會放在 Apache 的 bin 目錄內;如果 Apache 版本是 1.3 的話,指令要改為:
apxs -cia mod_evasive.c
安裝好 mod_evasive 後,便要修改 httpd.conf 內容。
4. 開啟 httpd.conf,加入以內容:
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600
DOSHashTableSize — 這是佔用記憶體的大小,如果伺服器比較繁忙,這個數值要設定大一點。
DOSPageCount — 同一 IP 在一個時段內可以存取同一頁面的次數,超過會被禁止。
DOSSiteCount — 同一 IP 在一個網站內可以佔用多少 Object,超過會禁止。
DOSPageInterval — DOSPageCount 內的時段設定。
DOSSiteInterval — DOSSiteCount 的時間設定,以秒為單位。
DOSBlockingPeriod — 當發現疑似攻擊後,使用者會收到 403 Forbidden,這是設定封鎖的時間,以秒為單位。
5. 最後重新啟動 Apache 即可。

netstat 檢查不尋常連線

netstat 檢查不尋常連線


netstat 是一個十分好用的網絡管理工具,而其中一個用途是查看不尋常連線,例如當一個 IP 發送大量連線到伺服器,那麼伺服器很大機會是否遭受 DoS 或 DDoS 攻擊。
以下是一些實用的 netstat 語法,可以檢查主機的連線數量:
netstat -na
顯示主機上所有已建立的連線。
netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。
netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。
netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。
netstat -n -p | grep SYN_REC | awk ‘{print $5}’ | awk -F: ‘{print $1}’
列出發送 SYNC_REC 的所有 ip 地址。
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。
netstat -anp |grep ‘tcp\|udp’ | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。
netstat -ntu | grep ESTAB | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。
netstat -plan|grep :80|awk {’print $5′}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。