在CubieTruck下限制特定使用者才能執行 su

之前使用 Slackware Linux Distribution時,可以限定某些使用者方可執行 su,轉變成 root。到了 Ubuntu,怎麼預設值是任意使用者都可以執行 su 轉換成 root,這看起來有點危險。所以我要在 Ubuntu 修改一下讓只有某些特定使用者才能執行 su。

首先,我發現到 Ubuntu 連 wheel 這個族群都沒有了,所以得在 /etc/group 下複製一個 wheel 族群。

# nano /etc/group

然後在第一行 root 下,添加一行一樣group id=0的 wheel 使用者族群,讓它看起來像是

root:x:0:root
wheel:x:0:root

然後存檔,這個檔案之後我們還要再改改。然後到 /etc/pam.d 目錄下找到 su 這個檔案,然後編輯它。

# nano /etc/pam.d/su

然後找到下面這一行

# auth       required   pam_wheel.so deny group=nosu

把它改成為

auth required pam_wheel.so group=wheel

存檔後不需要重啟機器或是任何服務,然後回到剛剛的 /etc/group 檔案裡面,把你要的特定人士加到 wheel 這個群族裡面,看起來像是

wheel:x:0:root,user1,user2

存檔後,只有user1user2才能通過su密碼認證,其他使用者即便密碼正確,也無法轉換成 root。

幫 Dovecot 手動加上 Logrotate

安裝了收信套件 dovecot,記錄檔案在 /var/log/dovecot.log,但卻發現這個記錄檔案異常的大,原來 LogRotate 沒有把這個檔案做處理,所以任由它增大下去,所以只好手動幫 dovecot 寫一個 Logrotate 的腳本。

先到 /etc/logrotate.d 目錄底下

# cd /etc/logrotate.d
# touch dovecot
# nano dovecot

然後編輯這個檔案,寫上

/var/log/dovecot*.log {
  weekly
  missingok
  copytruncate
  rotate 7
  compress
  notifempty
  sharedscripts
  postrotate
  if [ -f /var/run/dovecot/master.pid ]; then \
    /etc/init.d/dovecot reload > /dev/null 2>&1 || true ; \
  fi;
  endscript
}

存檔,這樣系統就可以自動每週幫 /var/log/dovecot.log Logrotate 一次了。如果要測試一次,可以手動讓 logrotate 執行一次

# logrotate -vf /etc/logrotate.conf

這樣就可以知道這個腳本是否有正確運行。

/proc/sys/net目錄解說

所有的TCP/IP的參數都位於/proc/sys/net虛擬目錄下(請注意,對/proc/sys/net目錄下內容的修改都是臨時的,任何修改在系統重啟後都會丟失)。

參數(路徑) 描述 默認值 優化值
/proc/sys/net/core/rmem_default 默認的TCP資料接收窗口大小(位元組)。 229376 256960
/proc/sys/net/core/rmem_max 最大的TCP資料接收窗口(位元組)。 131071 513920
/proc/sys/net/core/wmem_default 默認的TCP資料發送窗口大小(位元組)。 229376 256960
/proc/sys/net/core/wmem_max 最大的TCP資料發送窗口(位元組)。 131071 513920
/proc/sys/net/core/netdev_max_backlog 在每個網路接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數目。 1000 2000
/proc/sys/net/core/somaxconn 定義了系統中每一個通訊埠最大的監聽隊列的長度,這是個全局的參數。 128 2048
/proc/sys/net/core/optmem_max 表示每個套接字所允許的最大緩衝區的大小。 20480 81920
/proc/sys/net/ipv4/tcp_mem 確定TCP緩衝區應該如何反映記憶體使用,每個值的單位都是記憶體頁(通常是4KB)。第一個值是記憶體使用的下限;第二個值是記憶體壓力模式開始對緩衝區使用應用壓力的上限;第三個值是記憶體使用的上限。在這個層次上可以將封包丟棄,從而減少對記憶體的使用。對於較大的BDP可以增大這些值(注意,其單位是記憶體頁而不是位元組)。 94011 125351 188022 131072 262144 524288
/proc/sys/net/ipv4/tcp_rmem 為自動調優定義socket使用的記憶體。第一個值是為socket接收緩衝區分配的最少位元組數;第二個值是默認值(該值會被rmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是接收緩衝區空間的最大位元組數(該值會被rmem_max覆蓋)。 4096 87380 4011232 8760 256960 4088000
/proc/sys/net/ipv4/tcp_wmem 為自動調優定義socket使用的記憶體。第一個值是為socket發送緩衝區分配的最少位元組數;第二個值是默認值(該值會被wmem_default覆蓋),緩衝區在系統負載不重的情況下可以增長到這個值;第三個值是發送緩衝區空間的最大位元組數(該值會被wmem_max覆蓋)。 4096 16384 4011232 8760 256960 4088000
/proc/sys/net/ipv4/tcp_keepalive_time TCP發送keepalive探測消息的間隔時間(秒),用於確認TCP連接是否有效。 7200 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 探測消息未獲得響應時,重發該消息的間隔時間(秒)。 75 30
/proc/sys/net/ipv4/tcp_keepalive_probes 在認定TCP連接失效之前,最多發送多少個keepalive探測消息。 9 3
/proc/sys/net/ipv4/tcp_sack 啟用有選擇的回應(1表示啟用),通過有選擇地回應亂序接收到的封包來提高性能,讓發送者只發送丟失的封包段,(對於廣域網通信來說)這個選項應該啟用,但是會增加對CPU的佔用。 1 1
/proc/sys/net/ipv4/tcp_fack 啟用轉發回應,可以進行有選擇回應(SACK)從而減少擁塞情況的發生,這個選項也應該啟用。 1 1
/proc/sys/net/ipv4/tcp_timestamps TCP時間戳(會在TCP包頭增加12個位元組),以一種比重發超時更精確的方法(參考RFC 1323)來啟用對RTT 的計算,為實現更好的性能應該啟用這個選項。 1 1
/proc/sys/net/ipv4/tcp_window_scaling 啟用RFC 1323定義的window scaling,要支持超過64KB的TCP窗口,必須啟用該值(1表示啟用),TCP窗口最大至1GB,TCP連接雙方都啟用時才生效。 1 1
/proc/sys/net/ipv4/tcp_syncookies 表示是否打開TCP同步標籤(syncookie),核心必須打開了CONFIG_SYN_COOKIES項進行編譯,同步標籤可以防止一個套接字在有過多試圖連接到達時引起過載。 1 1
/proc/sys/net/ipv4/tcp_tw_reuse 表示是否允許將處於TIME_WAIT狀態的socket(TIME_WAIT的通訊埠)用於新的TCP連接 。 0 1
/proc/sys/net/ipv4/tcp_tw_recycle 能夠更快地回收TIME_WAIT套接字。 0 1
/proc/sys/net/ipv4/tcp_fin_timeout 對於本端斷開的socket連接,TCP保持在FIN_WAIT_2狀態的時間(秒)。對方可能會斷開連接或一直不結束連接或不可預料的行程死亡。 60 30
/proc/sys/net/ipv4/ip_local_port_range 表示TCP/UDP協議允許使用的本地通訊埠號 32768 61000 1024 65000
/proc/sys/net/ipv4/tcp_max_syn_backlog 對於還未獲得對方確認的連接請求,可保存在隊列中的最大數目。如果伺服器經常出現過載,可以嘗試增加這個數字。 2048 2048
/proc/sys/net/ipv4/tcp_low_latency 允許TCP/IP緩衝區適應在高吞吐量情況下低延時的情況,這個選項應該禁用。 0
/proc/sys/net/ipv4/tcp_westwood 啟用發送者端的擁塞控制算法,它可以維護對吞吐量的評估,並試圖對頻寬的整體利用情況進行優化,對於WAN 通信來說應該啟用這個選項。 0
/proc/sys/net/ipv4/tcp_bic 為快速長距離網路啟用Binary Increase Congestion,這樣可以更好地利用以GB速度進行操作的鏈接,對於WAN通信應該啟用這個選項。 1

在 CubieTruck 上如何增加 Apache 和 MySQL 連結數目

這台 CubieTruck 剛安裝完 Ubuntu 之後才發現,即便 Ubuntu 伺服器版本,Apache 預設最大連結數目只有 100 個, 資料庫 MySQL 只有 50 個。換言之,只能支援最多 50 個人同時可以同時查詢 MySQL。老實說,我不知道這台 CubieTruck 的能耐倒底到哪裡,同時50個人查詢會不會造成問題,我只是覺得有點少,所以打算把這個數目增加到 100 個。

Apache 的設定在 /etc/apache2/apache2.conf 檔案裡面

# nano /etc/apache2/apache2.conf

修改這一行

MaxKeepAliveRequests 100

MySQL 的設定在 /etc/mysql/my.cnf 檔案裡面

# nano /etc/mysql/my.cnf

然後找到這一行改為

max_connections = 100

然後重啟兩個服務即可

# service apache2 restart
# service mysql restart

這些數值僅供參考,作為一台伺服器,同時提供 200 人服務應該是沒有什麼問題才是。

如何縮短網路連結關閉時間

我們使用 netstat 指令觀看網路連結時候,常常會看到一堆 TIME_WAIT 的 socket 等待被關閉,而這些 socket 必須等待一段時間後才會被釋放重新被使用,底下是一張 TCP 完整的機制圖(state machine)。

1

一般而言,網路 socket 關閉時比建立時還要複雜很多,原因很多,其中一個是等待 keepalive 再次送訊息來,但是事實上很多時候 socket 是可以被關閉了,所以會有很多 TIME_WAIT 的 socket 殘留在系統中,這一篇我們來說說怎麼修改這些時間,縮短時間,好讓這些 socket 被釋放讓系統可以重新使用。

在 Linux 裡面,這些參數都不是寫死在系統裡面,相反的而是在 /proc/sys/net/ipv4 虛擬檔案目錄裡面,在 /etc/sysctl.conf 裡面可以有其對應的數值,只要修改這個數值,socket 結束的等待時間就可以被改變了。

# nano /etc/sysctl.conf

在檔案後面增加

net.ipv4.netfilter.ip_conntrack_generic_timeout = 120
net.ipv4.tcp_tw_recycle = 1 ; socket 可以重新被使用
net.ipv4.tcp_tw_reuse = 1 ; socket 可以重新被使用
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
net.ipv4.tcp_keepalive_intvl = 30 ; 預設值是75,建議在15-30秒內
net.ipv4.tcp_keepalive_probes = 5 ; 預設值是9,建議可以試探5次即可。
net.ipv4.tcp_timestamps = 0 
net.ipv4.tcp_sack = 1 
net.ipv4.tcp_window_scaling = 1

這些數值都是可以修改的,是有關於 socket 的狀態時限的。修改完可以輸入下面命令立刻生效。重新開機後也會自動被載入。

# sysctl -p

注意:每個系統都有其獨特性,所以上面數值僅供參考。一般而言,我們當伺服器的話,當然希望無用的 socket 趕快結束重新可以被使用,相反的如果是當做桌機,這些數值就沒有那麼敏感了。

如何增大 Apache 上傳檔案大小限制

之前架設 ownCloud 時,雖然 ownCloud 已經把上傳檔案大小限制改為 512MB,但是有時候還是上傳不了,後來查了一下原來在 PHP5裡面是有限制的,必須修改一下,設定檔案在 /etc/php5/apache2/php.ini 裡面。

# nano /etc/php5/apache2/php.ini

找到下面兩行,改成你要的檔案大小,

upload_max_filesize = 512M ;預設值是 2M
post_max_size= 512M ;預設值是 2M

然後重新啟動 Apache2 服務即可。

# service apache2 restart

如何取消 CubieTruck IPv6 的功能

雖然去年已經正式啟動了 IPv6 的協議,但是這台 CubieTruck 我估計用到除役前,IPv6也還不會流行,所以索性把它給取消了,取消的方法很簡單,在 /etc/ 目錄下的 sysctl.conf 有一些設定

# nano /etc/sysctl.conf

在這個檔案後面增加

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.br0.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.wlan0.disable_ipv6 = 1

然後再命令中輸入

# sysctl -p

讓它立刻生效即可!然後在 /etc/modprobe.d 目錄下編輯 blacklist.conf 檔案

# nano /etc/modprobe.d/blacklist.conf

然後在檔案後面增加一行

blacklist ipv6

然後重新開機方能生效。如果要查看是否真的取消 IPv6功能,則可以在命令列輸入

# ip a | grep inet6

如果沒有任何輸出文字,那就代表你真的取消了 IPv6 的功能了。

CubieTruck簡易式阻擋DDoS防禦方式

DDoS是一種討厭的攻擊方式,駭客會在短時間內利用建立新連線方式阻擋他人連線的一種攻擊手法。這種攻擊手法相當難防禦,殊不見各大Server常常碰到此類型跳板式的DDoS攻擊,所以這裡用iptables做一個最簡易的防禦方式。

iptables -N WEB_SRV_DOS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j WEB_SRV_DOS
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --rcheck --second 20 --hitcount 100 -j LOG --log-prefix "[Possible DOS Attack]"
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --rcheck --second 20 --hitcount 100 -j REJECT
iptables -A WEB_SRV_DOS -p tcp --syn -m multiport --dports 80,443 -m recent --set
iptables -A WEB_SRV_DOS -p tcp -m multiport --dports 80,443 -j ACCEPT

上面這段會把80/443(HTTP/HTTPS)Port新連線記錄下,最近20秒內如果想要建立連線超過100次,則會記錄下來並且丟棄封包進而阻擋DoS,因為  hitcount 超過 20,所以請參考這一篇文章來加大 xt_recent 的數值,以方便偵測。

如何在 Ubuntu 系統下微調網路參數

現在台灣光纖到府(FTTH/FTTB)十分普遍,雙向100M也不是天方夜譚了,所以理論上在網路傳送上可以採用比較大的緩衝區來傳遞,但是 Ubuntu 的預設值是給普羅大眾使用的,一般人可能是用 ADSL,或是更慢的撥接上網,所以 Ubuntu 在傳送的預設值是 128KB。因為筆者的網路是光纖到府,所以我就微調一下這些數值為512KB,讓傳送可以快一點。 但是理論上必須根據你自己的網路頻寬去做調整,我這裡只是作個筆記,把我自己的設定值列出來而已,並不對裡面的數值作任何解釋,而且也許會對你的系統造成副作用。 這個參數檔案在 /etc/sysctl.conf 裡面,

# nano /etc/sysctl.conf

在這個檔案後面加入

net.core.rmem_default = 524288 # default is 163840 
net.core.rmem_max = 524288 # default is 131071
net.core.wmem_default = 524288 # default is 163840
net.core.wmem_max = 524288 # default is 131071
net.ipv4.tcp_wmem = 4096 87380 524288 # default is 4096 16384 4194304
net.ipv4.tcp_rmem = 4096 87380 524288 # default is 4096 87380 6165056

然後輸入

# sysctl -p

就可以立刻生效,如果要看是否有設定成功可以輸入

# sysctl -a | grep rmem

看看數值是否是自己設定的數值相符合。

在 Ubuntu 下如何增大 iptables 的 rt_recent 記錄表格大小

最近在研究如何使用 iptables 限制每個 IP 位址每分鐘可以連線多少次,以避免有人利用DDOS進行服務阻斷攻擊。但是發現不是出現錯誤訊息(使用 dmesg 觀看錯誤訊息),就是根本無法工作正常,錯誤訊息如下:

xt_recent: hitcount (200) is larger than packets to be remembered (20)

在網路上查了一下發現原來系統 iptables 也是有限制的,例如 Ubuntu 作業系統預設值是只能記錄最近的 100 個 IP 位址,而每個 IP 只能記錄最近的 20 筆記錄,所以你要 iptables 記錄最近 200 筆資料已經遠遠超出它可以記錄的預設值 20 筆了。而這些數值都在 /sys/module/xt_recent/parameters 目錄底下的,ip_list_tot (記錄最近幾個 IP位址),和 ip_pkt_list_tot(每個IP位址記錄最近的幾個封包)。

/sys/module/xt_recent/parameters/ip_list_tot = 100 --> 所以只能記錄最近 100 個 IP 位址
/sys/module/xt_recent/parameters/ip_pkt_list_tot = 20 --> 所以只能記錄每個IP位址最近 20 個封包

如果要更改這些設定,我找了很久,因為Linux版本很多,我尚無一個明確的方法,更糟糕的是這兩個虛擬檔案預設值只能讀取,不能寫入。所以還必須更改其寫入權限,所以我把它寫到 /etc/rc.local ,讓系統一開機時就可以更改。

# nano /etc/rc.local

在檔案尾部增加

chmod 600 /sys/module/xt_recent/parameters/ip_list_tot
chmod 600 /sys/module/xt_recent/parameters/ip_pkt_list_tot
echo "200" > /sys/module/xt_recent/parameters/ip_list_tot
echo "200" > /sys/module/xt_recent/parameters/ip_pkt_list_tot

這樣每次開機時就可以使 iptables 記錄 200 個 IP 位址,每個 IP 位址可以記錄 200 個封包記錄,但是這肯定會增加記憶體用量以及 CPU 的負載,所以副作用還不得而知,先試試看。建議各位不要設定太大!

我有看過核心 Kernel 編譯時的一些參數,這兩個數值不要超過 255,不然可能導致系統崩潰。而且此方法只能適用在 Ubuntu,其他的版本尚無驗證過!