Samba 網路芳鄰伺服器雜記

之前在配置這台CubieTruck時,頭一個設定的就是 Samba Server。因為那時要準備的服務很多,就沒多花心思在這上面,心想能運行就可以了。現在回頭看看之前的配置才發現,的確是草率了一些。現在補上一些文件以供後人使用參考。

首先安裝完  Samba 套件之後,一些重要的設置檔案都在 /etc/samba 目錄底下,裡面最重要的就是 /etc/samba/smb.conf 這個檔案了,幾乎所有的設置都在裡面,所以更改後要先使用 testparm 測試一下是否有問題,然後再重新啟動服務。

#testparm
#service smbd restart

在講/etc/samba/smb.conf檔案之前,我們得說說使用者密碼。Samba使用者帳號和密碼是與Linux本身的帳號系統分開的,所以必須另外設置,而且帳號密碼系統有兩套,必須先看看 /etc/samba/smb.conf 裡面 passdb backend是什麼來決定。新的 Samba 應該都是採用 tdbsam了,不會把密碼明碼方式寫到 smbpasswd檔案裡面了,所以建議各位把passdb backend改為 tdbsam。

passdb backend = tdbsam

如果改用tdbsam 帳號密碼系統後,那麼你要用 pdbedit 來處理新增帳號,密碼之類的。以下列舉其語法:

命令 功能
pdbedit -L 列出使用者列表。
pdbedit -Lv 列出詳細的使用者列表。
pdbedit -Lw 列出同 smbpasswd 格式的使用者列表。
pdbedit -a user 新增 user 這個帳號。
pdbedit -x user 刪除 user 這個帳號。
pdbedit -c "[D]" -u user 暫時停用 user 這個帳號。
pdbedit -c "[]" -u user 恢復使用 user 這個帳號。

例如新增一個叫 linaro 使用者的話,那麼就得輸入

pdbedit -a linaro

之後會讓你確認密碼的。之後就可以使用 pdbedit -Lv 來查看新增使用者的狀況。

我想很多人都忽略這一點,但是系統卻跑的好好的,其實真正的原因是 Samba 系統根本沒設好權限,所以連 guest 都可以使用。所以我們講講 /etc/samba/smb.conf 這個檔案的設定吧!

第一個部分就是 [global] ,屬於全域設定的參數。

參數 說明
workgroup 類似微軟網路芳鄰所採用的工作群組。
server string 主機的註解說明。
netbios name 主機的 NetBIOS 名稱,在同一工作群組中必須是唯一,否則會衝突,在微軟系統裡面可以採用 \\name來存取。
log file 登錄檔的存放位置。
max log size 登錄檔的最大容量 (單位:KBytes),若大於此容量,登錄檔會被取代掉。
security = share 使用者不需輸入帳號與密碼,即可登入 SAMBA 伺服器。
security = user 預設安全等級,使用者必須先輸入帳號與密碼,經 SAMBA 伺服器驗證通過後,才可登入使用分享的資源。
security = server 使用者需經登入驗證程序,但驗證工作會由另一台指定的 SAMBA 伺服器或 Windows 伺服器執行。
security = domain 若 SAMBA 伺服器要加入網域而非工作群組,則可使用此等級。使用者登入驗證工作則由網域中的 Windows 伺服器來執行。
security = ads 若 SAMBA 伺服器要加入網域,並使用 AD 目錄服務,則可使用此等級 (SAMBA 3.0 以上版本)。
encrypt passwords 等於 Yes 表示密碼要加密。
smb passwd file 密碼存放檔案,預設是 /etc/samba/smbpasswd。
passdb backend = smbpasswd 代表採用舊方式管理帳號密碼
passdb backend= tdbsam 代表使用pdbedit方式管理帳號密碼。
hosts allow 代表可以存取的機器範圍,可以更嚴格地管理機器能存取 Samba Server,例如 hosts allow=192.168.1.0/24

然後後面要分享的資料夾每一個都以 []包括著,例如我要在網路芳鄰中看到 sdcard 這個目錄,那麼一開頭就要寫 [sdcard]來表示,後面帶下面參數。

參數 說明
comment 註解,沒有設定沒有關係。
path 共用目錄在 Linux 主機的實際路徑。
public 是否讓登入者看到此分享目錄。
readonly 是否唯讀。
writable 是否可以寫入。若與 readonly 設定值相抵觸,以最後出現的設定為主。
browseable 是否可以讓微軟網路芳鄰看到。
create mode 設定新建檔案的預設權限。
directory mode 設定新建目錄的預設權限。
valid users 白名單,指定可以使用此分享目錄的使用者。
invalid users 黑名單,指定不可以使用此分享目錄的使用者。
force user 強制轉換成某個使用者
force group 強制轉換成某個族群

範例:

[sdcard]
path = /mnt/sdcard
available = yes
browseable = yes
writable = yes
guest ok = no
valid users = linaro, paulwang
create mask = 0755
directory mask = 0755
force user = root
force group = root

如果修改好之後,記得一定要先用 testparm 測試看看哪個地方是否有錯。若確定無誤,方能重起服務。

#testparm
#service smbd restart

隱藏 Apache2 HTTP表頭相關的資訊

根據 HTTP 協議,命令有 GET/POST/HEAD等等…其中 HEAD會告訴別人自己所有的資訊。當然有時候這是一件好事情,讓對方客戶端能夠根據自己的狀態送出客製化的網頁來,但是大部分時候很多駭客也透過這些資訊來攻擊你,例如:裡面已經告訴你 openssl的版本,好讓你遭受 heartbleed 攻擊,我想誰也不願意看到這樣的問題。

其實,我們可以開一個終端機來看看,自己的 Apache2 會吐出什麼東西來

# telnet localhost 80

Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
HEAD / HTTP/1.0

HTTP/1.0 200 OK
Date: Fri, 29 Aug 2014 11:30:23 GMT
Server: Apache/2.4.6 (Ubuntu) PHP/5.5.3-1ubuntu2 OpenSSL/1.0.1e
X-Powered-By: PHP/5.5.3-1ubuntu2
X-Pingback: http://www.dennysu.com/wordpress/xmlrpc.php
Connection: close
Content-Type: text/html; charset=UTF-8

Connection closed by foreign host.

紅色部分是自己輸入進去的,打入 HEAD / HTTP/1.0,然後按下兩次 Enter 鍵,你看…Apache2就把所有版本號碼資訊告訴別人了。若有心人士根據這些資訊來攻擊那就不妙了。所以我打算把他給隱藏住。

透過修改 /etc/apache2/apache2.conf 這個檔案,在這個檔案尾部輸入一行

ServerSignature Off
ServerTokens Prod

然後存檔,重啟服務。

#service apache2 restart

再試一次,看看結果如何?

# telnet localhost 80

Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
HEAD / HTTP/1.0
HTTP/1.0 200 OK
Date: Fri, 29 Aug 2014 11:33:27 GMT
Server: Apache
X-Powered-By: PHP/5.5.3-1ubuntu2
X-Pingback: http://www.dennysu.com/wordpress/xmlrpc.php
Connection: close
Content-Type: text/html; charset=UTF-8

看來好多了,至少 openssl 版本沒有透露出去了。

CubieTruck FTP 檔案伺服器 vsftpd 雜記

目前在Linux上用FTP的人越來越少了,大家都採用雲端了。但是少了FTP,自己心裡總是覺得怪怪的,似乎少了些什麼,所以還是安裝了 vsftpd 檔案伺服器。

apt-get install vsftpd

安裝細節就不累贅了,底下就列舉一些小細節來增強其 vsftpd 安全性。

首先,vsftpd安裝完之後,設定相關檔案都在 /etc 目錄下,組態檔案就在 /etc/vsftpd.conf 裡面,你可以使用任何編輯器修改 /etc/vsftpd.conf 檔案內容。

1. 不允許匿名使用者登入

  • anonymous_enable=NO

2. 允許擁有本機帳號的使用者登入使用FTP

  • local_enable=YES
  • write_enable=YES
  • local_umask=022

3. 使用Log機制,記錄使用者存取FTP伺服器的情形

  • xferlog_enable=YES
  • xferlog_file=/var/log/vsftpd.log
  • xferlog_std_format=YES

4. 讓使用者只能待在自己的家目錄下,不允許使用者任意切換或瀏覽其他的目錄

  • chroot_list_enable=YES
  • chroot_list_file=/etc/vsftpd.chroot_list

/etc/vsftpd.chroot_list裡面就填入你可以 chroot 的使用者名稱,例如: linaro等等,千萬別填入 root。

5. 使用PAM機制,阻止root登入FTP SERVER

  • pam_service_name=vsftpd

6. 使用VSFTP內建的機制,阻止root登入FTP SERVER

  • userlist_deny=NO
  • userlist_enable=YES

而 /etc/vsftpd.user_list檔案裡面就填入你可以登入的使用者名稱,例如: linaro等等,千萬別填入 root。

7. FTP伺服器在同一時間,只允許讓多少個使用者連線登入使用,假設允許五個,便填入5。若是都不限制,則刪除此行,或是填入0都可以,預設值並沒有這行,使用者需自行加入。

  • max_clients=5

8. 利用#字號,註解掉以下各行

  • #anon_upload_enable=YES
  • #anon_mkdir_write_enable=YES
  • #chown_uploads=YES
  • #chown_username=whoever

9. 如果有使用 ufw 防火牆,記得要打開設定,必須要用 allow打開,試過用 limit 不行

  • ufw allow 21/tcp

10. 用 Windows DOS Prompt的ftp,可以登入ftp server,但是無法列出檔案,也無法進行任何讀寫動作,原因是採用 Passive方式,防火牆會擋。但如果採用其他FTP Client或直接使用Windows檔案總管上面直接打入 ftp://www.example.com,是可以運行的。

11. 如果登入有問題,有可能是 /etc/passwd 檔案內使用者的 shell 設定是 /bin/false之類不能登入的shell,必須改用 /bin/bash之類的shell。

12. FTP沒有採用加密,所以很多都是採用明碼溝通,連密碼也不例外。小心出門在外用免費的網路被人竊聽了,要時常檢查 /var/log/vsftpd.log的內容。

13. vsftpd 本身不帶硬碟容量配額 Quota 功能,所以要小心被使用者灌爆硬碟空間。如果要防止,必須採用 quota 配置。

14. 所有參數更改後,必須重啟服務。

  • service vsftpd restart

CubieTruck 郵件伺服器Postfix的一些雜項設定

Postfix是Linux裡面一項著名的SMTP寄信套件(POP3/IMAP是 dovecot,不要搞混了),一般安裝完套件就可以使用了。主要設定檔案在 /etc/postfix/main.cf 裡面。基本上預設值是夠用了,但是為了避免被 relay 而列入黑名單,我另外找了一些參數來增強它。

首先必須熟悉以下指令,方便控制 Postfix 正常運作

  1. service postfix reload –>重新載入 postfix 參數,更改任何相關參數都必須下這個指令來生效。
  2. postfix check –>檢查是否有錯誤發生,沒有顯示任何資訊就代表沒有錯誤。
  3. postconf –> 列出目前生效的參數,可以配合 grep 來找出自己想要知道的參數。

首先,為了避免有人試探密碼攻擊,我們可以在 /etc/postfix/main.cf 檔案內新增

  • smtpd_error_sleep_time = 1s
  • smtpd_soft_error_limit = 10
  • smtpd_hard_error_limit = 20

避免每封信件太大,例如每封信不得超過20MB,每人信箱總量不得超過400MB,我們可以新增

  • message_size_limit = 20480000
  • mailbox_size_limit = 400000000

限制每封信的收信人不得超過10個人,一般自己家用的郵件伺服器應該不會這樣。

  • smtpd_recipient_limit = 10

限制收信行程 postfix 不得超過5個行程,避免吃掉太多記憶體和效能。

  • default_process_limit = 5

另外新增黑名單的位址

  • maps_rbl_domains = relays.ordb.org, opm.blitzed.org

上述的 relays.ordb.org, opm.blitzed.org 機構可以自己Google一下。

另外設置 disable_vrfy_command 為yes可避免外界使用vrfy命令來探測收信位置的有效性(防止垃圾郵件),以及防止別人用vrfy命令去測試你的本機郵件用戶是否存在。

  • disable_vrfy_command = yes

避免有心人士沒有用 ehlo 命令跳過檢查

  • smtpd_helo_required = yes

再來就是收信人和信件主體的限制,細節請上網查詢。允許和拒絕與設定先後順序有關,請小心設定,最好先拒絕再允許

smtpd_recipient_restrictions =
reject_unauth_destination, ←拒絕「收件人」不在Postfix 所轄的網域(由$mydestination定義),此選項避免你的伺服器變成一部開放式轉信站,讓別人利用你的mail server 亂發信
reject_non_fqdn_sender, ←拒絕「寄信人」沒有 FQDN
reject_non_fqdn_recipient, ←拒絕「收信人」沒有 FQDN
reject_unknown_sender_domain, ←拒絕「寄信人」網域不存在
reject_unknown_recipient_domain , ←拒絕「收件人」網域不存在
reject_invalid_hostname, ←拒絕「寄信人」「收信人」FQDN 不合網域名稱規則
permit_mynetworks, ←允許來自 $mynetworks 的「寄信人」
permit_sasl_authenticated, ←允許經本機 SASL 驗證過的「寄信人」
reject_rbl_client bl.spamcop.net, ←線上的黑名單資料庫,可自行定義
reject_rbl_client dnsbl.njabl.org, ←線上的黑名單資料庫,可自行定義
reject_rbl_client xbl.spamhaus.org ←線上的黑名單資料庫,可自行定義

smtpd_data_restrictions =
reject_unauth_pipelining,← 拒絕寄件人email是null但卻有多個收件人的信和只能設定在smtpd_data_restrictions 或是smtpd_end_of_data_restrictions裏面
reject_multi_recipient_bounce ←阻止那些進行大量郵寄的軟件濫用流水線來加快發送電子郵件

另外Postfix 用戶端判別規則檢查順序如下: 

  1. smtpd_client_restrictions
  2. smtpd_helo_restrictions
  3. smtpd_sender_restrictions
  4. smtpd_recipient_restrictions
  5. smtpd_data_restrictions
  6. header_checks
  7. body_checks

記住,所有設定更改完必須重啟服務才能生效

service postfix restart

 

如何取消 Crontab 寄信功能

眾所皆知,Linux裡面irqbalance這個服務會吃掉很多的記憶體和CPU執行時間,所以我每隔一個小時就會重啟一次這個服務,試了幾天沒有太大問題,所以就把方法給貼出來。

排程工作在Linux裡面可以用 crontab 或是 at 兩種來做,這次我用 crontab 來實現這個想法,首先轉換成 root 的角色執行

# sudo crontab -e

這時候他會使用你慣用的編輯器來編輯 crontab 的腳本,檔案前面有 # 符號的代表是註解,不用理會。指令格式就像

* * * * * cmdline

六個欄位,前面五個欄位我就不詳細說明了,第一個是指幾分時執行,第二個是指每天哪一個小時執行,以此類推。第六個以後就是指令,可以含有空白符號。我寫的是

0 * * * * /usr/bin/service irqbalance restart

這行代表每小時零分時(*是指任何時間),會重啟 irqbalance 這個服務,進而減低記憶體和CPU附載。這樣運作的很好,可以在 /var/log/syslog 裡面看到都有服務重啟的訊息,但唯一美中不足的是,crobtab 會寄信給 root,這樣一來,我每個小時都會收到執行完訊息的信件,就像垃圾信件。所以我要把這個取消掉。一樣輸入指令,

#sudo crontab -e

在檔案前面新增

MAILTO=””

再把原來的改為

0 * * * * /usr/bin/service irqbalance restart > /dev/null 2>&1

這樣就不會有任何信件寄到你的帳號,甚至 syslog都會看不到執行結果。但要怎麼確認是否正確執行呢?輸入

ps aux | grep irqbalance

就會顯示出這個行程執行開始的時間,剛好整點執行,所以命令無誤。

root 27085 0.0 0.1 5248 2980 ? Ss 13:00 0:00 /usr/sbin/irqbalance –pid=/var/run/irqbalance.pid

如何在CubieTruck郵件伺服器內,一個帳號收取多個郵件信箱

目前利用 Postfix + Dovecot 架設 mail server 十分方便,不像十幾年之前 sendmail 裡面的 sendmail.cf 無字天書一般。這一講我們說說,在CubieTruck裡面一個帳號,如何收到多個郵件信箱(同一個網域)的做法。

例如:你的CubieTruck裡面有 administrator這個帳號,CubieTruck的網域是 example.org,所以預設的信箱是 administrator@example.org,但是你希望 root@example.org 也寄到 administrator帳號裡面的話,那麼可以修改 /etc/postfix/aliases 這個檔案

#nano /etc/postfix/aliases

administrator: administrator
root: administrator

修改完之後要使用 postalias 指令建立 .db 檔案

postalias /etc/post/aliases

然後重新啟動 postfix 服務即可

service postfix reload

這樣寄到 root@example.org 的信件也可以透過 administrator@example.org收到了。

如何知道自己CubieTruck的郵件伺服器被列入黑名單

很多自己架設的郵件伺服器往往因為設定不佳,被有心人士當作跳板轉寄大量垃圾廣告信件,而被列入黑名單。這篇文章不是告訴你如何避免列入黑名單,這必須靠自己設定mail server來避免。這裡只是提供兩個網站來查看自己的網站是否已經被列入黑名單。至於如果已經被列入,老實說,我也不知道怎麼移除。

如何在CubieTruck Mail Server內增加SMTP認證方式

當CubieTruck的郵件(postfix+dovecot)服務器架設好了之後,往往很容易被當成廣告信伺服器來轉垃圾信,利用SMTP Auth認證方式,只有透過帳號密碼認證過的使用者才能寄信,進而避免淪為跳板。流程如下:

  • 1. 安裝SASL相關套件,這個套件在安裝Postfix並未自動安裝,可以使用 ps aux | grep sasl 查看是否已經安裝,如果沒有就得安裝。

#apt-get install sasl2-bin

  • 2. 編輯 SASL 的組態檔案

#nano /etc/postfix/sasl/smtpd.conf

應該沒有這個檔案,新增這個檔案並增加下述描述

log_level: 3
pwcheck_method: saslauthd
mech_list: plain login

  • 3. 編輯 postfix套件的 main.cf

#nano /etc/postfix/main.cf

修改裡面參數

smtpd_sasl_path = smtpd

  • 4. 編輯saslauthd的組態檔案

#nano /etc/default/saslauthd

找到下述三個指令並修改它

START=yes
MECHANISMS=”pam”
OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd”

  • 5.把postfix加入sasl群組

#addgroup postfix sasl

  • 6.修改 postfix 的 main.cf檔

#nano /etc/postfix/main.cf

# 設定 Postfix 使用 SASL 認証
smtpd_sasl_auth_enable = yes
# 設定 SASL 支援非標準 E-mail Client 的認証動作
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
# 不使用 ANONYMOUS 這個認証
smtpd_sasl_security_options = noanonymous
# 設定 SASL 的認証方法
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

  • 7.重新啟動

#service saslauthd  start
#service postfix reload

  • 8. Microsoft Outlook 裡面,選擇不要勾選和勾選 “我的外寄伺服器(SMTP)需要驗證,然後試著寄兩封信試試看是否有作用。

1

 

如果發生任何問題,試著去 /var/log 目錄裡面看看 mail.log和mail.err裡面有報什麼錯誤。

至於SSL認證,不用想了,認證費很貴。免費的StartSSL,Outlook一些郵件客戶端軟體無法識別的!