分類: 筆記x備忘

  • 開放原始碼防毒軟體 ClamAV

    開放原始碼防毒軟體 ClamAV

    ClamAV 是 Linux 相當知名的防毒軟體,參考官網:

    安裝的部分在網路上非常多:

    CentOS 7

    Debian 11 / Ubuntu 20.04

    Install ClamAV Antivirus in Debian 11 Bullseye and Ubuntu 20.04 – LinuxStoney
    ClamAV is an open-source Antivirus tool available for Linux distributions. It integrates Mail servers to scan attachments received. In addition to scanning

    MacOS

    How to Install ClamAV
    Learn to install and use ClamAV, an open source antivirus software. This tutorial shows how to install it on macOS, Ubuntu, and Windows.

    這裡也有 Linode 的教學文章:

    Scanning for Vulnerabilities with ClamAV
    If you suspect your Linode might be compromised by malware, you can boot into rescue mode and scan your system with ClamAV. Learn more with our guide.

    因為自己Mac 是用付費防毒,尚未測試過,不未來如果有需要可以試試看。另外有一款圖形介面的沿伸軟體 ClamTK,介紹如下:

    GitHub – ivangabriele/clamav-desktop: Cross-platform Desktop GUI for ClamAV antivirus.
    Cross-platform Desktop GUI for ClamAV antivirus. Contribute to ivangabriele/clamav-desktop development by creating an account on GitHub.

    幾點注意事項分享:

    1. 參考,建議  2 GB RAM ,否則掃描時會內存不足崩潰,這意味著如果買最小單位的 VPS 主機(如 Linode Nanode 1 GB 方案),基本上裝不起來的。
    2. 掃描位置需要特別注意下,不一定是掃描 application 的位置,常見包含 /tmp 和 /opt ,或是 user 權限所及的目錄要掃。萬一是救援狀況下,mont 新的磁碟使用救援的模式,不同 VPS 廠商有不同作法,Linode 參考這裡這裡
    3. 掃描可依照參數匯出文件,也可以直接顯示。因為 sesssion 的問題,可用 screen 之類的套件保持 session,也可以放到 crontab 中定時掃描,定時請參考這裡
    4. 記得定時更新病毒庫,參考這裡
    5. 有時掃毒是臨時性的,或是手動測試,動作後需要移除,如果是用套件管理的方式安裝,移除也是使用對應移除的指令即可。

    似乎很多人不太有習慣在 linux 上安裝掃毒軟體,一個原因是因為 linux 有較為嚴格的權限管理,通常影響到範圍有限,不過之前有遇過在 VPS 上安裝的 panel 有漏洞,導致整個被全面入侵。我認為通常在 linux 上掃到後門或木馬等惡意軟體的時候,要特別注意會產生惡意軟體的原因,現在比較不常見插旗的攻擊模式,大多都是透過漏洞/弱點建立後門,植入惡意軟體後躲一下,然後塞檔案或是感染其他部位,達到蒐集資料、修改資料、控制流程與詐騙等目的,或是使其成為僵屍網路之一。

    所以在資安上需要筆記幾個大方向,權當廢話練習:

    1. 異常流量、異常行為、亦嘗事件的監控警報
    2. 資訊安全的衛生教育與習慣,要對 NG 行為有敏感的小心思
    3. 平時要多注意資安新聞,小心注意 0Day 攻擊
    4. 重要檔案與資料備援的機制要處理
    5. 不同網站發現威脅時要做好各自客製的 SOP 。如果能夠多人合作較能減輕壓力,也不容易隱瞞原因

    以上。

  • 將現成的 git repo 添加現成的專案資料夾

    將現成的 git repo 添加現成的專案資料夾

    這是一個 git 小技巧,其實滿常用的,但是每次要用的時候都要查一次有點小麻煩,紀錄一下。

    主要的應用場景是在我們在伺服器/本地已經有一個現成的資料夾,要把他添加至一個遠端新創的 git repo中,但是因為環境設定原因,我不想要移動資料夾的路徑。

    要注意的是:

    1. 如果是用 Github 創建,預設都不要選擇 .gitignore 等檔案,會出現一個教學可添加,照著作即可。讚!
    2. 確保目前伺服器/本地可以 push/clone/pull git 伺服器(廢話),推薦使用 ssh 連線,參考這裡
    3. 這是使用的流程以空的 git repo 為主,雖然不影響,但是還是建議拿空的 repo 比較不容易有衝突。
    4. 資料夾中會生成一的 .git 資料夾,有些資料夾是從別人那拉下來的。請先把這個資料夾刪除。也要記得先檢查 .gitignore 是不是你要的。

    流程上:

    1. 記得先安裝好 git 套件。進入到目標資料夾,確保沒有存在其他 .git/ ,以及 .gitignore 設定正確。
    2. 建立一個新的 git
      git init

    3. 添加檔案至 git,並且 commit
      git add .; git commit -m "initial commit"
    4. 注意遠端的 branch 是什麼,在 Github 上通常是 master
      git branch -M master
    5. 添加到遠端 git。 <remote-repo-url> 要替換成 git repo
      git remote add origin <remote-repo-url>

    6. 檢查網址
      git remote -v

    7. git push 資料到遠端 repo
      git push -f origin master

    提醒一下,現在有些 Git 平台使用 main 作為預設的主要 branch。

    以上。

    參考:

  • 透過 phpdoc 套件生成 PHP 文件

    前後端分離的實作中,會有遇到後端需要給前端 API 文件的需求,透過 phpdoc 的 PHP 工具可以將註解轉換成可讀的文件網頁,這樣基本只要把註解寫好文件也就差不多完成了(?)。

    有幾點要注意:

    1. 執行的環境需要能夠使用 PHP,不推薦使用 composer 安裝(據官方稱很容易衝突)。
    2. 我建議先把設定檔做好,再依照設定檔案跑會比較輕鬆,這邊提供一組範例
    3. 把設定檔放在根目錄外面是好習慣。
    4. 配置完成後,於相同目錄下執行以下指令產生文件:
      phpdoc
    5. 文件中關於設定標籤 visibilities 有些錯誤,設定檔案的配置上建議還是要多試看看才知道。
    6. API 中常用的 post/get 方法,參數的引用不太適合用 @param,即便註解了也會顯示不出來,我查 stackoverflow 是推薦用 @uses 。
    7. 因為這是 php 文件,不是 HTTP API 文件,所以還是會存在溝通成本的,包含呼叫路徑的操作,這可能有賴於後續研究和嘗試自定義的調整。如果要生成 OpenAPI 格式,可以參考這個套件(有夠麻煩)。

    我使用的是 phpdoc  3.0 版本。

    安裝操作的部分,我使用的是 phar 安裝,好處就是可以裝到 global 環境:

    首先先把 phar 檔案下載下來:

    wget https://phpdoc.org/phpDocumentor.phar

    變更權限:

    chmod +x phpDocumentor.phar

    然後改名,移動到 global 的環境上(這裡以 Mac 為例):

    mv phpDocumentor.phar /usr/local/bin/phpdoc

    是否要移動到 global 環境取決於看有沒有要 project base ,這和 composer 的安裝類似,如果不是 mac 但不知道要移動到哪裡可以參考這個文件

    接著有基本參考 phpdoc 的文件就能運作了。他有很多功能,以下附上不負責翻譯:

     

    而我是在 Codeigniter4 中實作,所以我會把路徑放在 ci4 的根目錄外面,假設 ci4 在 www/ 之中,我就放在外面,此時 source 的 dsn 會設定:

    "./www/app/Controllers/"

    而生成文件的設定也相對會設定在根目錄之外,參考範例。好處是避免文件因人為疏失變成公開的資安危機,壞處則是必須要額外設定路徑或網域來指向他提供給其他人閱讀。

    而我的策略則是將該份生成文件納入版本控制之中,提供給前端,讓前端 pull 下來以後就直接用本地電腦打開來閱讀使用。

    附上設定檔案範例(最後更新 2023-05-13):

    推廣一下,要養成打註解的好習慣,不只是給未來的自己看,如今加上一個可以給前端看的服務,這樣打註解的動力應該會更高了。

    參考資料:

    PHP 註解的 tag 參考:

    Phpdoc 設定文件:

    Phpdoc 設定文件說明:

     

  • DNSSEC Cloudflare 與 Godaddy 設定

    DNSSEC 中文全名是:網域名稱系統安全擴充程式(Domain Name System Security Extension,DNSSEC)主要用途可以簡單理解為 DNS 的加密簽名資訊,防止 DNS Server 有劫持或污染的動作。細節可以參考財團法人台灣網路資訊中心文章 或是 Cloudfalre 的文章,而在網域的 DNS 配置的狀況下,會牽涉到的有三個層面: 網域註冊商、名稱伺服器( Name Server)、客戶端(瀏覽器),客戶端扮演的角色是作驗證 DNS 指向真偽的動作,而我們做設置的部分就會有網域註冊商與名稱伺服器。

    這邊介紹比較常用的, Cloudflare 和 Godaddy 兩家配合操作,如果是直接使用 Godaddy 的 DNS 的話,依照官網說明,會需要開啟頂級 DNS (Premium DNS)服務,這次介紹的應用場景是使用 Godaddy 註冊的網域,透過 Cloudfalre 作為 Name Server 來啟用 DNSSEC 的功能。

    p.s. 如果是用 Cloudflare 註冊的話,據官方稱,他們會自動申請註冊 DNSSEC 服務。

    https://developers.cloudflare.com/dns/additional-options/dnssec
    https://developers.cloudflare.com/dns/additional-options/dnssec

    在開始之前先講注意事項:

    1. 其實已經有很詳盡的說明了,Cloudflare 請參考這裡,Godaddy 參考這裡
    2. 注意有Godaddy 有部分網域後綴是無法使用 DNSSEC 服務的,網域列表請參考這裡
    3. 設定完成後,可以透過這裡,輸入網域來做檢查。

    流程以下:

    在進入 Cloudflare 的網域後,找到 DNS 的 Settings 裡面。點擊 Enable DNSSEC 按鈕。
    點擊後會跳出 DS 紀錄,會有的欄位有:

    DS Record, Digest, Digest Type(這邊後面一般會帶 2), Algorithm, Public Key, Key Tag, Flags,如果不小心把 popup 視窗關閉了也不用擔心,在 Enable 按鈕的下方會多一個「DS Record」的連結可以展開相同的資訊。這些資訊我們等等會用到的有 Key Tag, Algorithm, Digest Type, Digest 這幾個欄位。先紀錄起來,要注意 Digest Type 等等要輸入的是 2

     

    紀錄好資料以後,就是到 Godaddy 註冊 DA 資料,不得不抱怨一下, Godaddy 的操作體驗真的不太好。首先,登入 Godaddy 以後進入到 Domain Portfolio 頁面,也就是顯示全部網域的頁面,找到你要的網域,右邊會有一個三個橫向點點的圖案,點擊展開之後會有一個 Edit DNS (編輯 DNS)的選項,點進去。

    https://ph.godaddy.com/help/add-a-ds-record-23865

    在網域名稱的下面會有一個「DNSSEC」的連結,點下去填寫資料。

    https://ph.godaddy.com/help/add-a-ds-record-23865

     

    這時會需要新增 DS 紀錄,我們需要新增一個 DS 紀錄,把剛剛 Cloudflare 資料填入,會有這些資料:

    • Key Tag: A number between 1 and 65536 that quickly identifies this DS record.
    • Algorithm: An identifier of the cryptographic algorithm that generates the signature. Choose an option from the menu.
    • Digest Type: This determines the algorithm type that constructs the digest. Choose 1 or 2 from the menu.
    • Digest: The digest is an alpha-numeric value that specifies a cryptographic hash value of the referenced DNSKEY Record.

    如果 Cloudfalre 使用的是中文的話,可能會有些資料對不齊,附上 Godaddy 中文的對應:

    • 金鑰標籤:Key Tag
    • 算法:Algorithm 一般會是 13
    • 摘要類型:Digest Type 在這個 case 請輸入 2
    • 摘要:Digest

    輸入完成後儲存就行的,稍等 10 – 60 分鐘。可以用這個網站輸入網域來檢測。沒問題就行啦!

    同場加映:

    因為我滿多網域用 Hover 註冊的,可以參考:

    參考資料:

    DNSSEC · Cloudflare DNS docs
    DNS Security Extensions (DNSSEC) adds an extra layer of authentication to DNS, ensuring requests are not routed to a spoofed domain.

    DNSSEC Analyzer
    The DNSSEC Analyzer from VeriSign Labs is an on-line tool to assist with diagnosing problems with DNSSEC-signed names and zones.

  • ZeroTier 在 Mac 中安裝

    ZeroTier 是一個取代 hamachi 的區域連線服務,建立虛擬區域網路的概念。 hamachi 真的是時代的眼淚,以前玩世紀帝國還是創世神必須用的。兩套軟體優劣參考這裡這裡

    這次嘗試安裝 ZeroTier ,這款支援許多平台的安裝,我是在 mac 上安裝。

    除了 GUI 的介面可以使用之外,也支援 CLI 的操作方式,安裝完後輸入

    zerotier-cli status

    就可以看見一套自己 zerotier 的狀態,其中會有十位數的英數字串就是這台電腦的地址:

    200 info xxxxxxxxxx 1.10.6 ONLINE

    同樣的也可以輸入 zerotier-cli help 指令查看能夠使用哪些 cli 命令。

    這軟體花了一些時間研究,主要是因為一直沒辦法正常使用 GUI 介面,而且這種以網路為主軸的軟體,不是自己 host 的還要裝在自己電腦上有點兒可怕。所以特別研究了一下。

    要注意的有:

    1. 安裝完這台電腦的 ID 儲存在 /Library/Application Support/ZeroTier/One 這裡,如果 uninstall 之後,以後不再需要使用,或是想要更換地址,把這個資料夾刪掉就完事了。
    2. 安裝完,在系統設定->隱私權與安全性->自動化 中會看到 ZeroTier 的開關,預設 System Events 會是開啟的,如果沒開啟表示之前沒有允許。
      我得吐嘈一下,即便打開了,從 mac 上方 tool bar 點擊 Start UI at Login 時,還是會不斷要我資料,可能是因為 root 權限的關係,豪煩阿!
    3. 因為 Start UI at Login 設定點擊開關失效,建議從系統設定-> 一般->登入項目,在登入時打開選項中,直接把 ZeroTier 拿掉。
    4. 開啟關閉有點問題,因為他是 root 權限使用,如果硬用 cli 執行的話,直接用 launchctl 來處理,參考以下指令:
      # 開啟
      sudo launchctl load /Library/LaunchDaemons/com.zerotier.one.plist 
      # 關閉
      sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
    5. 我安裝時一直沒有辦法執行 GUI 介面,所以解除安裝很多次,他本身有提供 uninstall 的 shell,執行:
      sudo "/Library/Application Support/ZeroTier/One/uninstall.sh"
    6. 要讓 GUI 介面跑起來需要一些魔法,參考這裡
      1. 開啟終端機,停止 Zerotier :
        sudo launchctl unload /Library/LaunchDaemons/com.zerotier.one.plist
      2. 下咒語:
        rm -rf ~/Library/Application\ Support/ZeroTier
      3. 從 mac 應用程式介面直接點,就行了。

    那個咒語有點莫名其妙。為您點播,潘美辰,〈不要問我為什麼〉

  • 無效爬蟲、垃圾蜘蛛的阻擋方法

    我發現當紅俱樂部有許多爬蟲的 log ,於是蒐集了一些無效爬蟲,以及阻擋方法。

    無效的爬蟲又有人稱之為「垃圾蜘蛛」,這些爬蟲機器人大多是 SEO 優化公司,或是沒有價值的爬蟲機器人,會毫無節制的訪問你的網站,造成網站 loading 遽增。滿惱人的,效能來說是還好,但是產生一大堆 access.log ,資料在查找上頗令人不耐。

    處理方式有兩個方向:

    1. 當作是壓力測試,想辦法優化網站效能。
    2. 阻擋這些爬蟲的「攻擊」。

    以下列出阻擋的方法,這邊主要是使用 useragent 來判斷,在 nginx 中設定阻擋。其中有一個 python 的 useragent ,如果自身有使用 python 處理 curl 等動作的話,要記得排除:

    if ($http_user_agent ~* (SemrushBot|python|MJ12bot|AhrefsBot|hubspot|opensiteexplorer|leiki|webmeup|DotBot|petalbot)) {
    return 400;
    }
    

    另外針對爬蟲設定 rotbot.txt :

    User-agent: SemrushBot
    Disallow: /
    
    User-agent: python
    Disallow: /
    
    User-agent: MJ12bot
    Disallow: /
    
    User-agent: AhrefsBot
    Disallow: /
    
    User-agent: hubspot
    Disallow: /
    
    User-agent: opensiteexplorer
    Disallow: /
    
    User-agent: leiki
    Disallow: /
    
    User-agent: webmeup
    Disallow: /
    
    User-agent: DotBot
    Disallow: /
    
    User-agent: petalbot
    Disallow: /
    

    不過這個檔案的設定就要看爬蟲本身是否尊重該設定了。

  • PHP Codeigniter 4 框架速度優化

    會選擇 Codeigniter 有一個很大的需求是因為要能快速入手,簡單好用,從 3.x 個位數版本開始,現在推出 4 大改版,結構和其他框架也越來越像。

    最近修改一份無框架的專案程式碼,在不更改業務邏輯、資料庫結構的狀況下,移植到 ci4 上面以後才發現,速度變的奇慢無比。想到要追蹤 ci4 的執行速度,才發現 composer 下來的 core 還挺複雜的阿! 功能強大結果變慢,屠龍的少年,終將變成惡龍呀……。

    於是開始研究 Ci4 優化的方法,這邊記錄下來。

    在優化之前,以兩個檔案讀取作為指標。

    讀取名叫 init 的頁面 2.3 sec

    Ajax 讀取前端設定 JSON 資料 3.41 sec

    處理的動作

    • 在 app/Config/Modules.php 中,把 $enabled 和 $discoverInComposer 設定為 false ,參考文件。( init 頁面 828ms, ajax load settings json 2.11 sec)
    • 同一個檔案中,把 $aliases 設定為空集合。( init 頁面 761.82ms, ajax load settings json 1.8 sec)
    • 在 app/Config/Toolbar.php 中,把 $collectors 設定為空集合。在 app/Config/Events.php 中,有一段標記 ‵Debug Toolbar Listeners.‵ 的程式碼,刪除或註解起來。 ( init 頁面 640.70ms, ajax load settings json 1.54 sec)
    • 在 app/Config/Filters.php 中,預設有幾個 class 開啟,分別是:csrftoolbarhoneypotinvalidcharssecureheaders。這幾個有些是安全設定,自行確認檢查哪些要移除。
    • 檢查 app/Config/Autoload.php 裡面有哪些用不到的,儘量在只需要使用時才用。

    效果顯著。

    init 頁面從 2.3 秒到 683豪秒
    AJAX 讀取前端設定從 3.41 秒到 1.65 秒

    但是無框架的原始程式碼呼叫速度還是非常的快的。在相同資料庫、相同 php 運行環境的狀況下,速度是框架 3 倍以上。

    init 頁面 208.03 豪秒
    AJAX 讀取前端設定 354.94 豪秒

    這沒辦法比,革命尚未成功就是。

  • 在 Mac 上,大型 CSV 檔案切割方法

    匯出 SQL 中的資料,如果需要避免過多的指令碼,要精簡可提供給其他業務閱讀的格式,通常會使用 CSV 檔案的格式匯出,這是一種以檔案形式匯入匯出時很高效的格式,通常副檔名以「 .csv」作為檔案後綴。

    但有時下載下來的 CSV 檔案格式過大,電腦記憶體不足時打不開,這時 MacOS 系統可以用命令提示字元的方式進行切割。

    切割指令如下:

    split [-l line_count] [-b byte_count] [-n chunk_count] [file [prefix]]

    常用的指令操作範例:

    split -l 100 old_file.csv new_file_

    翻譯:舊檔案名稱為 old_file.csv 以每 100 行作為新檔案切割,切割檔案前綴為 new_file_ 。新檔案就會切格為 new_file_a、new_file_b ….. new_file_aa、new_file_ab … 這樣。

    通常也會需要搭配把新檔案名稱後面貼上 .csv 後綴,這樣才方便交付時對方打開。可以用以下指令:

    for i in $(find new_file_*); do mv $i "$i.csv"; done

    其實就是 bash 指令寫在同一行,意思就是逐步調整指定的檔案前綴來添加副檔名。新檔案就會變成 new_file_a.csv、new_file_b.csv ….. new_file_aa.csv、new_file_ab.csv … 這樣。

    要注意的是:

    1. 建議把檔案放在一個空的資料夾中操作。
    2. 在操作前,先計算好需要的分割新檔案大小,以及預計會產生多少檔案。太多檔案或是太大太小的分割檔案都會造成接下來的操作不易。
    3. 操作檔案必須確認是 csv 格式,不推薦 json 或是 sql 格式來做切割。也不推薦以 -b 參數作為操作,不確定一行(一筆資料)會包含多少字元,使用 -b 分割很容易切到同一行資料。

    參考:

    Split big CSV file using Linux or Mac OS Terminal – Datablist
    You have a very big CSV file, and you want to split it into several files of n lines. Smaller files let you open them with CSV editors without reaching their limits. If …

  • Line API v2.1 產生 Channel Access Token

    參考官方新聞連結 ,在 2021 年 6 月之後官方推薦使用 API 的方式生成 CAT(Channel Access Token),操作方式有夠複雜。如果想要一個沒有期限、只需要一個,可以放置 play 的 Long-lived channel access token,後台依然是可以選擇申請的(for Messaging API, Login API 從 v2 開始就已經使用 API 呼叫)。短期的話就會有個數和天數的限制。

    先說幾個 short-lived channel access token 特點:

    1. 後台註冊註冊 key-pair 最多 2 個(後面會提到流程),所以公鑰私鑰你各位要保管好阿!
    2. 驗證部分,如果是透過 v2.1 產生的 token 需要用 v2.1 的 API 驗證。
    3. JWT (後面會提到流程),exp 最長是 30 分鐘,動態生成的意思;而 token_exp 最長是 30 天。
    4. token 最多生成 30 個,所以要定期更換。目前看來沒有 refresh 的 API,所以需要 revoke 後再 issue
    5. 注意 v2.1 和 v2 issue token 差別是如果 30 個滿了, v2 會替換舊的, v2.1 會阻止你發。

    大致上操作就是生成 key-pair 註冊公鑰得到 kid ,透過規定的 private key, header, payload 生成有效JWT (參考文章),最後透過 API 呼叫(參考)產生 token,如下圖:

    ref: https://developers.line.biz/en/docs/messaging-api/generate-json-web-token/#issue_a_channel_access_token_v2_1
    來源:https://developers.line.biz/en/docs/messaging-api/generate-json-web-token/#issue_a_channel_access_token_v2_1

    完整流程如下:

    來源:https://developers.line.biz/en/docs/messaging-api/generate-json-web-token/#issue_a_channel_access_token_v2_1

     

    未來 v2 會逐步淘汰,如果以 v2.1 處理的話,如果 SDK 有做好那就最棒了,沒的話建議搞一個套件來用會比較保險。而 token 的部分可能要做一個 cron job 來定時更新,保持單一 token 可用會比較好。有遇到再說嘍。

    這裡有技術說明參考,其中還有包括 retry 的機制說明:

    LINE Bot 開發者指南詳解 – 3 發送 API 請求時的注意事項
    前言:各位好, 我是 LINE Taiwan 資深開發技術推廣工程師 – Evan Lin。 今天這篇文章為各位詳細解釋 「 LINE Bot …

  • Git Push 太久解決方法

    Git Push 太久解決方法

    Git 有時 push 太久一直無法結束,可以參考以下原因:

    1. Git Server 限制,不同 git 供應商會有不同限制,建議參考看看有沒有限制檔案大小、數量等。
    2. buffer 問題,參考以下配置指令:
      1. git config –global http.postBuffer 524288000

    以下是 Bitbucket 的限制與解決方法,請參考