docker container啟動管理supervisord設定心得

supervisord是常用的docker啟動管理程序, 通常我們都把一大堆服務寫進去supervisord.conf, 我最近弄的docker mail server (綁定AD) , 常常遇到container重啟時(docker restart) , supervisord裡面的service會出現already started字樣, 爬了文, 好像是這個參數搞的鬼, startsecs , 官網解釋如下

The total number of seconds which the program needs to stay running after a startup to consider the start successful (moving the process from the STARTING state to the RUNNING state)

也就是說這些service啟動成功後, supervisord預設會等個1秒才移除STARTING狀態, 但有可能造成service本身誤判, 誤以為已啟動,又再啟動一次, 所以service會重複跑個幾次 , 甚至有時候就再起不能了.

目前測試結果可以修改兩個參數, 一個是startsecs=0(立即更新成running狀態) , 另一個是startretries=0(重複啟動次數)
我是決定只改 startsecs=0 , 果然就沒出現already started字樣


ps. 這只是我個人測試自己docker mail server的心得, 沒有多次驗證

CEntOS 7 postfix 新增lmtp 與 managesieve功能

之前自己製作的mail server (綁定AD) , 休假功能使用的是 lda + sieve + managesieve 的方式進行, 可是在朋友公司運行時, 卻發生效率不彰的狀況(活躍的email帳號約500個).
查詢了一下, 發現官方已經建議使用 lmtp 的方式取代 lda , 原因是lda屬於觸發類型, 而 lmtp是常駐服務類型, 常駐服務類型效率較好.
於是將自己製作的 docker mail server 改良成 lmtp , 有機會再請朋友測試效率.

以下是讓centos啟用lmtp功能的設定文件(登入帳號密碼guest)

https://docs.kafeiou.pw/iammis/技術文章/HowTo/10033_(CEntOS7.9)新增lmtp_managesieve功能.txt

我的大意造成一件郵件資安事件

是這樣的, 我前幾個月, 在郵件服務器(postfix+dovecot)上面, 加上一個能支援vacation休假回覆功能的設定 managesieve
在 dovecot掌管認證的10-auth.conf, 開通支援靜態認證的設定 auth-static.conf.ext , 並且在該設定加上

passdb {
driver = static
args = nopassword=y
}

代表不需要密碼就能通過認證, 專門給 managesieve 休假功能使用的


但是沒想到這是個錯誤的設定, 居然讓所有的帳號以imap方式, 不需要密碼就能登入(發信會失敗, 因為發信一定要密碼正確) , 好險我這系統帳號與email是不一樣的, 很難猜到哪個帳號使用哪個EMAIL ,所以一直都沒有問題.
直到我發現改了自己帳號的密碼, 居然還是可以用舊密碼登入, 看了log 才驚覺問題大了, 趕緊研究問題所在, 本來誤以為是roundcubemail , 或是postfix 被入侵了, 但測試卻不是, 最後才發現是 auth-static.conf.ext 的設定出錯了, 改成以下這樣, 讓外面使用imap登入的帳號無法適用靜態登入, 就沒有安全上的問題了.

passdb {
driver = static
args = proxy=y host=localhost nopassword=y
}

spamassassin阻擋廣告信,請不要用 RDNS_NONE

https://pasztor.at/blog/fixing-rdns_none-with-spamassassin/

原本很開心找到這個判斷 RDNS_NONE , 可以透過檢查該ip是否有反解名稱reverse dns, 若沒有反解名稱, 大概就能確定絕對不是正規的郵件伺服器.

可是後來發現很多時候會造成誤判, 例如寄信的電腦ip是10.x.x.x 是內部ip, 本來就無法取得rdns, 但是還是被認定是RDNS_NONE, 無奈下, 只好把這判斷拿掉.

你必須懂的postfix+amavisd擋廣告順序

就連我都會誤解!
以為只要在postfix的main.cf裡面設定各式各樣的擋廣告方式(包含參考黑名單網站),就可以高枕無憂了,
可是事情並不是我們憨人想得這麼簡單
擋廣告總有順序的.

  1. amavisd 優先
    這部分很重要,有時候很多廣告商,都利用gmail , amazons發送廣告信, amavisd 很容易直接pass, 要解決這問題, 就只能土法煉鋼, 將廣告的網域,email寫到amavisd的黑名單上.
  2. postfix 次要
    若amavisd認定pass , 這邊再怎麼設定都沒用, 因為根本不會跑到這裡來.
    若amavisd沒有認定pass, 也沒認定是廣告(分數不足), 就會跑到這裡來,

我的設定, 就是讓amavisd可以定義黑白名單, 接下來才是設定postfix本身的名單限制
推薦看一下我製作的docker mail server設定
https://github.com/WilliamFromTW/docker-Postfix-AD

啟用postgrey心得

因為postgrey的機制會造成收信延遲, 所以必須設定白名單,與自動白名單,讓常用的郵件不再受限制.
1.白名單可在/etc/postfix/postgrey_whitelist_clients.local 新增
2.自動白名單,以centos 7為例子, 可在 /etc/sysconfig/postgrey 新增, 意指35天內,只要成功三次,就會一直是白名單成員
POSTGREY_OPTS=”–delay=60 –auto-whitelist-clients=5 –max-age=35″

老派的outlook 使用習慣

我個人很喜歡老派這個字, 英文叫做 old school


周遭的人有好多好多老派的人, 他們不喜歡網頁版郵件, 只習慣使用單機版的outlook收發信件, 作業系統更是windows不做他想.
因為公司多了一個越南廠, 考量初期VPN自架, 不作為主力, 該廠的通訊錄就無法透過vpn, 以LDAP方式分享 .

可是outlook通訊錄就只有兩種 : MAPI, LDAP
MAPI可以是離線版, LDAP必須連線才能使用

偏偏老派的做風就是: 離線也要能寫寫郵件, 看看郵件(pop3完全下載), 與存取完整的通訊錄

這下好了, 我得準備離線版的通訊錄, 爬文好幾天, 終於找到一個方式跟大家分享:

  1. 網域伺服器新增排程, 可下指令自動產生csv版本的通訊錄
  2. 自己開發一個app , 方便老派的人使用, 將csv檔案自動匯入到outlook通訊錄

網域伺服器上, 可透過powershell執行指令,匯出csv通訊錄

Get-ADUser -Filter 'mail -like "*<domain>"' -SearchBase "<search base>" -Properties * | Select -Property DisplayName,GivenName,Surname,mail,Title,Department,Office | Export-CSV "<csv file location>" -NoTypeInformation -Encoding UTF8

以test.com為例子

Get-ADUser -Filter 'mail -like "*test.com"' -SearchBase "OU=taipei,DC=test,DC=com" -Properties * | Select -Property DisplayName,GivenName,Surname,mail,Title,Department,Office | Export-CSV "c:\aaa.csv" -NoTypeInformation -Encoding UTF8

我開發的windows app, 使用visual studio 2019 community version , 語言使用vb

https://github.com/WilliamFromTW/ImportFromCsvToOutlook
https://github.com/WilliamFromTW/ImportFromCsvToOutlook/releases

因為時間不多, 未來也不打算花太多時間在通訊錄上面, 爬文的過程只能找到零星vba for outlook版本或是程式片段, 四處碰壁, 無人可以解答, 頂多就是要你教老派的人, 使用outlook匯出匯入功能, 一堆步驟, 將csv檔案匯入到outlook, 這簡直是天方夜譚.
因此就自行開發,並且開源, 這樣直接編譯成可安裝執行的APP, 讓他們透過定期提供的csv檔案, 就能很方便匯入通訊錄了.

roundcubemail 加上Active Directory 通訊錄範例

修改config/config.inc.php
網域伺服器 192.168.1.1
網域: test.com

$config['address_book_type'] = 'ldap';

$config['ldap_public']['Global'] = array(
'name' => '台灣總公司',
'hosts' => array('192.168.1.1'),
'port' => 3268,
'user_specific' => false,
'base_dn' => 'dc=test,dc=com',
'bind_dn' => 'cn=administrator,cn=users,dc=test,dc=com',
'bind_pass' => 'password',
'ldap_version' => 3,
'search_fields' => array (
'mail','cn',),
'name_field' => 'cn',
'email_field' => 'mail',
'writable' => 'false',
'scope' => 'sub',
'sizelimit' => 6000,
'sort' => 'cn',
'filter' => '(&(mail=)(|(&(objectClass=user)(!(objectClass=computer)))))',
'fuzzy_search' => true,
'global_search' => true
);

2022/11/05

我後來使用docker doundcubemail 重新安裝, 因為用latest , 當時版本 1.6.x 版本 , 發現上面的設定已經不能用了, 改用以下設定(紅色部分需調整)

$config['address_book_type'] = 'ldap';
$config['ldap_debug'] = true;
$config['ldap_public'] = array(
    'MyAdLdap' => array (
        'name' => 'TW',
        'hosts' => array('網域主機IP'),
        'sizelimit' => 6000,
        'port' => 3268,
        'use_tls' => false,
        'user_specific' => false,
        'base_dn' => 'OU=group,DC=test,DC=com',
        'bind_dn' => 'user@test.com',
        'bind_pass' => 'password',
        'writable' => false,
        'ldap_version' => 3,
        'search_fields' => array(
           'mail',
           'cn',
        ),
        'fieldmap' => array(
            'name' => 'cn',
            'email' => 'mail',
            'surname' => 'sn',
            'firstname' => 'givenName',
        ),
        'sort' => 'sn',
        'scope' => 'sub', # or 'list'
        'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))',
        'global_search' => true,
        'fuzzy_search' => true,
        'vlv' => false,
    ),
);

詳請參考 https://github.com/roundcube/roundcubemail/wiki/Configuration:-LDAP-Address-Books#prerequisites

dovecot如何承接Active Directory的額外變數

這種小細節原本不想寫出來,但是很容易忘,又特別重要,
我在 dovecot v2.2發現的, 舉dovecot-ldap.conf.ext 為例子, 如何將AD的mail屬性值承接起來

user_attrs = mail=sieve=/home/vmail/%$/sieve/dovecot.sieve, mail=sieve_dir=/home/vmail/%$/sieve
上面粗黑體的 mail 傳送給sieve與sieve_dir這兩個變數(沒錯,你沒看錯,一堆等號,超怪異的), 
而這兩個變數利用 %$ 這個來承接最左邊的mail的數值:
例如AD上某帳號的數值為:test@kafeou.pw 
我們就能輕易變更整個dovecot系統的變數值,而且彈性很大,結果如下:
  sieve = /home/vmail/test@kafeiou.pw/sieve/dovecot.sieve
  sieve_dir = /home/vmail/test@kafeiou.pw/sieve

另外要注意的地方是, 這些變數原本所在的位置, 千萬不要移除, 就算預設值不對也沒關係(會被蓋過去),

否則會被當作沒此變數

CEntOS 7.8 postfix 新增lda 與 managesieve功能

2017 年曾經在centos 7.3版本讓postfix擁有vacation功能, 當時 dovecot 是1.x版 , 後來不慎直接upgrade 到2.x, 結果整個都不能用, 很慘,
之前2014年也在CentOS 6.x 新增過vacation, 也是耗了極大精神才弄出來. 這就是opensource的最大問題, 他可以直接停止更新舊版本, 新版本又必須大改才能相容.

現在我在 CentOS 7.8 再次挑戰lda managesieve功能, 請到這觀看,

帳密都是guest/guest

https://docs.kafeiou.pw/iammis/技術文章/HowTo/10031_(CEntOS7.8)新增lda_managesieve功能.txt

1 ... 3 4 5 6 7