docker安裝multiOTP, 讓windows登入更安全(MFA)

我們不屎用微軟的MFA(Multi Factor Authentication), 原因如下:

Azure AD MFA 免費使用, 但是很貴, 哈哈, 於是就pass

multiOTP(https://github.com/multiOTP/multiotp/wiki) 是個開源免費的 MFA server & client 專案,
其實我們也只是要讓登入更安全, 目標就是手上多個驗證器, 可以輸入動態密碼, 多個保障.
不囉嗦, 直接寫下我的安裝方法

安裝開源的 MFA Server

  1. 準備docker環境
  2. 下載最新檔案
    https://download.multiotp.net/multiotp_5.8.1.0.zip
    解開檔案
  3. 修改Dockerfile
    加上 RUN echo "deb http://ftp.de.debian.org/debian buster-backports main" | tee /etc/apt/sources.list.d/docker.list
    **這是5.8.1.0的bug

修改Dockerfile這步驟以後不需要做, 下個版本會解決


4. 編譯images
docker build . -t mymultiotp:latest

5. 啟動server

docker run --mount source=multiotp-data,target=/etc/multiotp -p 8080:80 -p 8443:443 -p 1812:1812/udp -p 1813:1813/udp -d mymultiotp:latest

8080 與 8443 請依實際情況修改

6. 網頁輸入 http://<docker serverr ip>:8080

登入後, 新增測試帳號 administrator (請注意, 這個帳號是windows 10本機可登入帳號 , 不限定administrator)

手機安裝google authenticator


安裝google驗證器, 刷入帳號的QR code , 請選擇帳號後點選 Print


在windows安裝Credential Provider

https://download.multiotp.net/credential-provider/
https://download.multiotp.net/credential-provider/multiOTPCredentialProvider-5.8.1.0.exe

輸入windows的帳號與密碼, 還有google驗證器的密碼

遠端登入

此時遠端登入第一次登入不用otp密碼, 但是會出現第二是要求輸入otp密碼,

這是原本遠端桌面連線並無法一開始就支援otp的緣故,目前無法解結

MFA server 與 網域主控連線

docker 登入已安裝好的 mfa server 然後輸入以下指令

 multiotp -config default-request-prefix-pin=0
 multiotp -config default-request-ldap-pwd=1
 multiotp -config ldap-server-type=1
 multiotp -config ldap-cn-identifier="sAMAccountName"
 multiotp -config ldap-cn-identifier="sAMAccountName"
 multiotp -config ldap-group-attribute="memberOf"
 multiotp -config ldap-ssl=1
 multiotp -config ldap-port=636
 multiotp -config ldap-domain-controllers=ldaps://網域主控伺服器:636
 multiotp -config ldap-base-dn="OU=xxxx,DC=test,DC=com"
 multiotp -config ldap-bind-dn="cn=ldap,cn=Users,dc=test,dc=com"
 multiotp -config ldap-server-password="password"
 multiotp -config ldap-network-timeout=10
 multiotp -config ldap-time-limit=30
 multiotp -config ldap-activated=1
 multiotp -config ldap_default_algorithm=totp
 multiotp -debug -display-log -ldap-users-sync
  1. 若成功, 網頁登入MFA server就能看到網域使用者, 也可以派送QR code給該使用者使用
  2. 定期執行同步指令
multiotp -debug -display-log -ldap-users-sync

nextcloud 安裝流程圖套件drawio注意事項

drawio 相容m$ visio , 而且免費, 支援nextcloud, 達到線上繪製流程圖的功能.

雖說drawio還不是很穩定,但是一直在更新, 已經能上線讓公司同仁使用,

透過官方安裝drawio套件並且啟用後, 以下為注意事項:

  1. drawio預設副檔名為xml(這超奇怪的), 請將副檔名改成drawio, 並且設定mimetype
複製設定檔cp resources/config/mimetypemapping.dist.json config/mimetypemapping.json
修改 config/mimetypemapping.json 加上以下設定
"drawio": ["application/x-drawio"]
然後執行更新指令
sudo -u www-data php occ maintenance:mimetype:update-js
sudo -u www-data php occ maintenance:mimetype:update-db
若是docker請執行
docker exec --user www-data nextcloud php occ maintenance:mimetype:update-js
docker exec --user www-data nextcloud php occ maintenance:mimetype:update-db
然後再到nextcloud的設定, 重新勾選drawio的相關設定

2. 若drawio檔案分享連結, 若想要讓大家直接開啟編輯畫面, 需要修改連結

https://xxx/s/YoJWBkg7EgiyXpPdd
改成
https://xxx/apps/drawio/s/YoJWBkg7EgiyXpPdd

讓jitsi meet需要密碼登入

以 主機名稱 meet.test.com 為例子, 以下只要是meet.test.com皆須改成真實的主機名字
1. 修改 /etc/prosody/conf.avail/meet.test.com.cfg.lua

VirtualHost "meet.test.com"
         authentication = "internal_plain"
         ...

VirtualHost "guest.meet.test.com"
         authentication = "anonymous"
         c2s_require_encryption = false
         modules_enabled = {
             "bosh";
             "pubsub";
             "ping";
             "speakerstats";
             "turncredentials";
             "conference_duration";
         }

2. 安裝module storage_memory模組(optional)

apt install -y mercurial
mkdir ~/temp && cd ~/temp
hg clone 'https://hg.prosody.im/prosody-modules/' prosody-modules
cp prosody-modules/mod_storage_memory/*.lua /usr/lib/prosody/modules/.

3. 修改 /etc/jitsi/meet/meet.test.com-config.js

var config = {
     …
     hosts: {
             …
             domain: 'meet.test.com',
             anonymousdomain: 'guest.meet.test.com',
             …
         },
         …
 }

4. 修改 /etc/jitsi/jicofo/sip-communicator.properties

org.jitsi.jicofo.auth.URL=XMPP:meet.test.com

5. 新增可登入的帳號密碼

prosodyctl register william meet.test.com mypassword

6. 重開服務

systemctl restart {prosody,jicofo,jitsi-videobridge2,nginx}

這樣一來, 只有第一個登入的人需要輸入帳號密碼, 其他使用相同網址不需要密碼就可以登入(來賓帳戶guest)

mail出現好奇怪的log ".... rip=::1, lip=::1, secured, session" problem

有時候出現就一大堆, 最後出現too many open files , 有夠怪異, 只好讓限制 imap 與 pop3 只 listen 特定的 ip (ipv4) , 這樣就可以避掉疑似ipv6嘗試入侵的問題, 我自己是覺得可能是系統與dovecot之前某段出了狀況.
請修改 /etc/dovecot/conf.d/10-master.conf

service imap-login {
   inet_listener imap {
     address = x.x.x.x y.y.y.y
     #port = 143
   }
   inet_listener imaps {
     address = x.x.x.x y.y.y.y
     #port = 993
     #ssl = yes
   } 
}
service pop3-login {
   inet_listener pop3 {
     address = x.x.x.x y.y.y.y
     #port = 110
   }
   inet_listener pop3s {
     address = x.x.x.x y.y.y.y
     #port = 995
     #ssl = yes
   }
} 


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的心得, 沒有多次驗證

誤刪docker 某個image, 重啟後, 相關連的container都無法使用了

真的手殘, 錯誤地停用某個 mariadb database 並且刪除了 image, 還好平常有記錄當時docker 執行的指令, 設定檔案也都在, 很快地就把該container 還原起來了.

但是參考到該container也跟著無法使用, 出現以下錯誤訊息:

 Cannot link to a non running container 

重開這些container, 也無法解決問題, 最後重新啟動 docker service ,才如願解決這個狀況.
我想應該是重啟docker時, 系統重新規劃這些container 內部ip, 就能順利參考到了.

docker安裝moodle線上學習初體驗

docker搜尋一下, 找到 bitnami 製作的moodle images , 照著做滿簡單就能架站


1. 下載docker compose yaml檔案

curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-docker-moodle/master/docker-compose.yml > docker-compose.yml

2. 修改yml如下

version: '2'
 services:
   mariadb:
     image: 'docker.io/bitnami/mariadb:latest'
     environment:
       - ALLOW_EMPTY_PASSWORD=yes
       - MARIADB_USER=bn_moodle
       - MARIADB_DATABASE=bitnami_moodle
       - MARIADB_CHARACTER_SET=utf8mb4
       - MARIADB_COLLATE=utf8mb4_unicode_ci
     volumes:
       - 'mariadb_data:/bitnami/mariadb'
   moodle:
     image: 'docker.io/bitnami/moodle:latest'
     ports:
       - '8088:8080'
       - '8445:8443'
     environment:
       - MOODLE_DATABASE_HOST=mariadb
       - MOODLE_DATABASE_PORT_NUMBER=3306
       - MOODLE_DATABASE_USER=bn_moodle
       - MOODLE_DATABASE_NAME=bitnami_moodle
       - ALLOW_EMPTY_PASSWORD=yes
     volumes:
       - 'moodle_data:/bitnami/moodle'
       - 'moodledata_data:/bitnami/moodledata'
     depends_on:
       - mariadb
     hostname:'<主機名稱>'
 volumes:
   mariadb_data:
     driver: local
   moodle_data:
     driver: local
   moodledata_data:
     driver: local

3. 這個moodle container 內部預設的http port 8080 , https port 8443, 我改成 80888445

docker-compose up -d

4. 瀏覽器輸入 https://ip:8445 登入, 預設帳號 user , 密碼 bitnami

5. 設定docker本體主機上面的let's enpcrypt後, 進行httpd apache 與container對應工作

<VirtualHost *:443>
  ServerName 主機名稱
  ErrorLog /var/log/httpd/ssl_error_log
  TransferLog /var/log/httpd/ssl_access_log
  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/<主機名稱>/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/<主機名稱>/privkey.pem
  SSLCACertificateFile /etc/letsencrypt/live/<主機名稱>/fullchain.pem
  SSLProxyEngine On
  ProxyRequests Off
  ProxyPreserveHost On
  RequestHeader set X-Forwarded-Proto "https"
  ProxyPass / http://localhost:8088/
  ProxyPassReverse / http://localhost:8088/
  <Location />
    Order allow,deny
    Allow from all
  </Location>
</VirtualHost>   

 

6. 若需要發email , 除了設定server ip 帳號密碼外, 還需要進入container , 安裝sendmail 這支程式 (2021/03/02)
另外需要進入container, 手動新增crontab規則(2021/03/04)

crontab -u www-data -e
####
*/15 * * * * /opt/bitnami/php/bin/php /bitnami/moodle/admin/cli/cron.php >/dev/null
#請確認php路徑,與moodle安裝路徑是否正確

1 2 3 ... 5