星期三, 5月 16, 2018

SSH Server on Windows

這篇所述,在 Windows 作業系統下,安裝微軟官方的 SSH Server,有些值得一記:
  • 不必堅持穩定版,最新會少些問題。
  • 看到錯誤代碼?快 Google 一下,早有許多先烈。
  • 安裝程序沒有考慮到各版本(Server / Desktop / 新 / 舊)的差異,因此很容易起不了服務。專門建帳號並給更高的權限,先通了再縮限會比較好處理。
  • 連進去之後並不接受 Linux bash 之類的指令,可用的是 PowerShell 精簡版。
衝著最後一點,與我原意要接 Jenkins Publish Over SSH 統一 Windows / Linux 指令,以解決部署需求不符,快改用 MobaSSH 吧!蠻有趣的,下載解壓後唯一的檔案,既是安裝精𩆜,又可做管理介面。

[2018/05/24]
如果在 Windows Server 環境,Free 的 MobaSSH Home Edition 並不支援,窮人們還是再想想微軟官方版的存在價值吧?在 Linux Shell 還沒統一天下之前,PowerShell 不容易閃躲,原來 Ansible 2.0 也是這麼玩的呀。

星期二, 3月 20, 2018

Auto sync CentOS server time

要讓眾 Client 向 Server 對時已是很多系統的基本需求,所以我們得先搞懂 Server 如何讓自己的時間準確?
  • yum install ntp
  • 根據這個網站挑選合適的時間伺服器列表,ping 確認網路通暢後,加在 /etc/ntp.conf
  • systemctl start ntpd
  • systemctl enable ntpd
  • timedatectl set-ntp true
  • 等五分鐘
以前不知要有點耐心,下完指令總以為還缺什麼,就是沒有校正時間?「等五分鐘」值得一記。

Testing your private key and certificate for HTTPS

雖然各種 Web Application Server 很容易安裝私鑰與憑證來支援 HTTPS,但如何確認安裝是成功的?連連看應該有分幾個層次,否則一旦連不上,也不知道要找誰求救:
  • check ip
    • ping <Host_IP>
  • check name resolution
    • nslookup <Host_Name>
  • check port from client
    • telnet <Host> <Port>
    • echo > /dev/tcp/<Host>/<Port> && echo open || echo closed
  • check port from server
    • ss -tnlp
    • firewall-cmd --list-all
  • check response
    • curl <Url>
    • Browser
其實在最後一關,有時也必須再細分 HTTP / HTTPS,若在 Server 端一好一壞,可以檢查:
  • 檔案路徑
  • 存取權限
  • 私鑰密碼
  • 憑證串鍊
  • 加密協定
若是 Server 端正常,但 Client 端一好一壞,只剩一招:
  • openssl s_client -connect <Host>:<Port>
至少有一次檔案傳壞了就是這麼找到的。

星期五, 3月 02, 2018

ngrok + NextCloud + WebDAV + cURL

過去常在用 SCP + bakop.com 做為沒有圖形介面、沒有 VPN 時的抓檔來源,但畢竟是外部資源,用得不太安心。雖然以前也對 OwnCloud 下過功夫研究,但苦於必須有圖形介面瀏覽器限制,這次終於有突破:
  • 檔案分享-NextCloud
  • 指令存取-WebDAV + cURL
  • 內網外露-ngrok
其實公司早就在推 NextCloud,但並非網管,我一直試不成功。這次差別是我自己在內網用 docker 開了有絕對管理權限的一台新的,才知原來整合 LDAP 之後,各使用者有個 UUID 代表 UserName,並不等於登入帳號,所以取檔案大約像這樣:
  • curl -u 'user:pass' -O http://nc.acme.com/remote.php/dav/files/UUID/path/to/file
[2018/03/14]
原來 UUID 還是可以改的,不至於太難用,可參考 Internal Username 這段。

[2018/03/30]
ngrok 取來的主機名稱可以保留蠻久的,直到最近一次斷電。因為重新連上一定會換名字,每次都要進 config/config.php 改 trusted_domain 也實在麻煩,尤其是 docker 裡面連 vi 都沒有。一個修改訣竅是:
  • 'trusted_domains' =>
  • array (
  • 0 => '*.ngrok.io',
  • ),
另外提到在 docker 裡面不容易編輯 config.php,可以運用 occ 這個工具:
  • ./occ config:system:set 0 --value=*.ngrok.io
  • ./occ config:system:get
[2018/04/04]
單開一組帳密給外人使用似乎是管理者的特權,那我們一般小老百姓呢?也是可以在自己的管理範圍內開出共享目錄,以 http://nc.acme.com/s/<shareLink> 允許讀寫、不設密碼保護為例,上傳:
  • curl -u '<shareLink>:' -T <fileName> http://nc.acme.com/public.php/webdav/ [--progress-bar -o /dev/null]
下載:
  • curl -u '<shareLink>:' -O http://nc.acme.com/public.php/webdav/<fileName>
查詢目錄內容:
  • curl -u '<shareLink>:' -X PROPFIND http://nc.acme.com/public.php/webdav/ | grep -o '<d:href>[^<]*</d:href>'
[2018/09/06]
共享匿名個別檔案有些不同:
  • curl http://nc.acme.com/s/<shareLink>/download -o <fileName>

星期三, 2月 14, 2018

DNS SRV record missing

在 CentOS 7 新裝的 Openfire 有這樣的問題

點進去看到的是

意思是 Openfire 本身希望能找到最下面兩行類似的資訊,所以來幫忙如願即可。首先需要安裝名稱解析伺服器:
  • sudo yum install bind bind-utils
裝好後先增加設定,依據網域名稱(假設是 acme.com)修改 /etc/named.conf,增加以下幾行新增一個區域:
  • zone "acme.com" {
  •     type master;
  •     file "/etc/named/acme.com.hosts";
  • };
依據該主機名為 openfire.acme.com,IP 位址為 10.1.2.3,管理者郵件位址為 root@mail.acme.com 的前提,再新增這個區域的設定檔 /etc/named/acme.com.hosts,內容如下:
  • $ORIGIN acme.com.
  • @ IN SOA openfire root.mail (
  • 180214 ; serial
  • 21600 ; refresh after 6 hours
  • 3600 ; retry after 1 hour
  • 604800 ; expire after 1 week
  • 86400 ) ; minimum TTL of 1 day
  • IN NS openfire
  • openfire IN A 10.1.2.3
  • _xmpp-client._tcp 86400 IN SRV 0 5 5222 openfire
  • _xmpp-server._tcp 86400 IN SRV 0 5 5269 openfire
其實最後兩行就是照抄管理介面上的提示,要特別注意的是很多結尾處的 . 不可省略。接著啟動服務並測試看看:
  • systemctl start named
  • nslookup -type=srv _xmpp-client._tcp.acme.com
如果找不到,可以試試指定本機擔任名稱伺服器:
  • nslookup -type=srv _xmpp-client._tcp.acme.com localhost
若這樣才行,代表預設的名稱伺服器在別處,不是剛裝的這套,可以修改 /etc/resolv.conf 以解決。

星期日, 2月 04, 2018

application as a service on CentOS 6 / 7

在部署要求中,常會希望某個指令啟動的應用程式,不會因重開機而停止服務。以 Single Sign-On CAS 為例,若在 CentOS 6,可參考這篇準備以下內容的 /etc/rc.d/init.d/<serviceName>:
  • #!/bin/bash
  • # chkconfig: 35 90 10
  • # description: CAS server

  • . /etc/init.d/functions

  • SERVICE=cas
  • WORKDIR=/opt/$SERVICE
  • LOCK=/var/lock/subsys/$SERVICE

  • start() {
  •   cd $WORKDIR
  •   /usr/bin/java -jar cas.war &
  •   touch $LOCK
  • }

  • stop() {
  •   killproc $SERVICE
  •   rm -f $LOCK
  • }

  • case "$1" in
  •   start)
  •     start
  •     ;;
  •   stop)
  •     stop
  •     ;;
  •   status)
  •     status $SERVICE
  •     ;;
  •   restart)
  •     stop
  •     start
  •     ;;
  •   *)
  •     echo "Usage: $0 {start|stop|restart|status}"
  •     exit 1
  • esac

  • exit 0
下指令載入為服務:
  • chmod +x /etc/rc.d/init.d/<serviceName>
  • chkconfig --add <serviceName>
  • service <serviceName> start
若是 CentOS 7 環境下,似乎更簡單一些,準備 /etc/systemd/system/<serviceName>.service
  • [Unit]
  • Description=CAS Service
  • After=network.target
  • [Service]
  • WorkingDirectory=/opt/cas
  • "ExecStart=/usr/bin/java -jar cas.war"
  • Restart=on-failure
  • [Install]
  • WantedBy=multi-user.target
下指令載入為服務:
  • chmod +x /etc/systemd/system/<serviceName>.service
  • systemctl enable <serviceName>
  • systemctl start <serviceName>

星期四, 1月 04, 2018

LDAP search result size limit

照預設的 OpenLDAP,查詢結果若很多時,會限制僅回傳 500 筆資料,這原本不是什麼大問題,不過最近遇到了查詢結果多於上限,且在交易中不得分批處理的問題。原來改變上限也不是什麼困難的事,可先準備以下的 changeSizeLimit.ldif:
  • dn: cn=config
  • changetype: modify
  • replace: olcSizeLimit
  • olcSizeLimit: nnn
再下指令執行:
  • sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f changeSizeLimit.ldif
更進一步,也可以把產 ldif 跟下指令都放在一個 shell script。