pip-audit

github 會針對套件去做安全檢核並發出通知或是 pull request,如果本地端想要做這件事,該怎麼做呢?

剛好前幾天看到這篇:How to find third-party vulnerabilities in your Python code ,文章裡就介紹了 pip-audit 這個工具。使用這個工具,就可以對使用的套件來做安全檢核,並給予建議。

安裝方法很簡單,用 pip 安裝就可以

pip install --upgrade pip-audit pip

安裝完成後,就可以使用 pip-audit 指令了。

要對使用的套件檢查,可以用

pip-audit -r requirements.txt

檢查需要花一段時間,檢查後的結果大致會類似這樣子:

Found 1 known vulnerability in 1 package                                              
Name    Version ID             Fix Versions
------- ------- -------------- ------------
urllib3 1.25.11 PYSEC-2021-108 1.26.5

你會看到有幾個已知漏洞,套件的名稱跟修正的版本。

若要即時的修正,pip-audit 也可以做修正。

pip-audit --fix

要注意的是,這個修正只是幫你安裝已經沒有漏洞的版本,requirements.txt 裡還是要自己去修正。

後續思考:

  1. 可以在 CI 流程裡使用 pip-audit 來做安全檢核,避免使用到有漏洞的版本。
  2. 使用 poetry 的話,可以把 pip-audit 列為 dev dependencies ,就不需要在正式環境裡也裝上這工具了。

Python inspect

之前在用 c# 時,可以使用 reflection 來查找類別可以使用的方法或屬性,甚至是函式庫裡有什麼類別、函式可以使用。在 Python 可以用 inspect 模組來達成這件事情:How to list all functions in a Python module?

例如要列出模組裡所有的函式,可以這樣用:

from inspect import getmembers, isfunction
from somemodule import foo

print(getmembers(foo, isfunction))

或是要找出名字裡有 castle 的成員,像是函式、類別等等的:

import inspect
import example

for name, data in inspect.getmembers(example):
    if 'castle' not in name:
        continue
    print('{} : {!r}'.format(name, data))

或是要找類別名稱是 XXXManager 的類別:

import inspect
import example

for name, data in inspect.getmembers(example, inspect.isclass):
    if name.endswith('Manager'):
      print('{} : {!r}'.format(name, data))

要撈 docstring 也可以,更多的用法可以參考 PyMOTW: inspect — Inspect Live Objects

Python 網站上的文件:inspect – Inspect Live Objects

Registry Mirror

最近在建置 container image 時,常會踩到 exceeded 的錯誤,這是因為 docker 在 2020 時,公告了新的收費機制,並為拉取 container image 的 API 加上了限制,沒有登入的使用者現在每6個小時只能有 100 個 pull requests可用;有登入且採用免費方案的使用者,每6個小時有 200 個 pull requests 可用。這在初期測試 pipeline 時,根本很容易就用超過。

上網搜尋看有沒有方法可以避過這限制,後來在 gitlab 網站上找到文章:Caching Docker images to reduce the number of calls to DockerHub from your CI/CD infrastructure | GitLab

文章裡有提到兩個方法,第一個簡單的方法就是登入,這樣可以提升到 200 個 pull requests。

因為大部分的 executor 都是使用 docker 或 docker + machine,所以設定方法可以單純的在 pipeline 裏面作 docker login,但這樣還要多塞指令跟 credential 。gitlab 很貼心的提供了一個內建的變數,要用這個變數,需要在 gitlab 專案的 settings > CI/CD > Variables 裡,去增加 DOCKER_AUTH_CONFIG ,那在執行 pipeline 時,gitlab-runner 看到有這個變數,就會自動做 login 的動作。

DOCKER_AUTH_CONFIG 的內容可以透過以下方式取得:

  1. 在終端機用指令先登入 index.docker.io: docker login
  2. 用 docker 指令登入後,在家目錄的 .docker 目錄下就會出現 config.json : cat ~/.docker/config.json
  3. 用 jq 指令讓內容變成一行: jq -c "." ~/.docker/config.json

輸出的結果,就可以拿來填了。

第二個方法,則是建置 Registry mirror。

找一台已經安裝 docker 的主機,然後使用 docker 啟動 registry container。在啟動的時候帶入環境參數 REGISTRY_PROXY_REMOTEURL

docker run -d -p 6000:5000 \
    -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
    --restart always \
    --name registry registry:2

然後登入到 gitlab-runner 所在的主機,修改 /etc/docker/daemon.json ,內容如下

{
  "registry-mirrors": ["http://<your-registry-mirror-server:6000"]
}

修改完以後,讓 dockerd 重新載入設定:

sudo systemctl reload docker

再用 docker info | grep -A 1 -B 1 Mirror 確認。

這樣就設定完成了。

那要怎麼知道 gitlab-runner 在建置時有使用這個 registry mirror 呢?這時可以用 curl 指令來檢查

watch -n 60 curl -s http://<your-registry-server>:6000/v2/_catalog

輸出結果大致會是這樣

{"repositories":["library/docker","library/python"]}

至此,就可以算是解決了 exceeded 的問題啦。

刪除TimeMachine備份

一般來說,空間足夠就不用特別管,但如果空間緊迫時,可能就會需要去處理。因為自己遇到了,就上網找看看有沒有人遇過,有找到這些方法,第一種方法是全部重來,第二種方法是用 MacOS 內建的 tmutil 指令。

參考資料:

使用 tmutil 這方法,需要先知道 TimeMachine 掛載到那邊,這時候需要先點選選單列裡的時光機圖示 (若沒有圖示,請到「設定」>「時光機」去勾選選單列中顯示「時光機」),然後選:進入「時光機」

此時,MacOS 會去掛載,然後就可以在 /Volumes 資料夾裡找到「時光機」備份的路徑,時光機備份是以年月日來作為目錄名稱,很容易就可以識別。

要刪除的時候,需要指定完整的路徑,以我的環境為例,就是

sudo tmutil delete /Volumes/「時光機」備份/Backups.backupdb/XXX的\ MacBook\ Pro/xxxxxx

刪除時,有幾點要注意:

  1. 刪除有可能需要不少時間,要視時光機備份儲存媒體的速度而定。像我用的 NAS 比較慢,就會花不少時間。
  2. 刪除有機率導致整個時光機備份都毀掉,我自己就遇到一次,還好是沒關係。

補充一個:https://github.com/emcrisostomo/Time-Machine-Cleanup

關掉 Windows 2019 裡 Internet Explorer 的安全設定

我只是想下載微軟自家的 Edge,想不到 Internet Explorer 一直在那邊該該叫,好像在跟使用者抗議說不應該換掉我的感覺。因為一直跳對話視窗出來說要列入白名單,這實在是太浪費時間,上網找了一下看怎麼關掉。

方法還蠻簡單的:Disable Internet Explorer Enhanced Security Configuration in Windows Server 2019 | by Sumit | Tensult Blogs | Medium

步驟如下

  1. 從開始,找到 Server Manager。
  2. Server Manager 的左邊選擇 Local Server。
  3. 從右邊可以看到「IE Enhanced Security Configuration」,點選這個,此時會跳出對話視窗。
  4. 把對話視窗裡的兩個選項都改為 Off 以後就可以了。

客製化sshd的ciphers (RHEL8)

很多 Linux 系統參數檢核表都有一個項目,就是在 /etc/ssh/sshd_config 裡加入下面這兩行,以禁用 sshd 不安全的 cipher。

Ciphers aes128-ctr,aes192-ctr,aes256-ctr
MACs hmac-sha1,hmac-ripemd160,hmac-sha2-256,hmac-sha2-512

但很有趣的是,RHEL8 sshd_config 裡的 comment 是這樣寫的

# This system is following system-wide crypto policy. The changes to
# crypto properties (Ciphers, MACs, ...) will not have any effect here.
# They will be overridden by command-line options passed to the server
# on command line.
# Please, check manual pages for update-crypto-policies(8) and sshd_config(5).

他說,這系統是依照系統的 crypto 原則,所以在這個設定檔裡加 Ciphers, MACs 是沒有效果的,會被傳遞給 sshd 的 command-line 選項給覆蓋掉。

來看看 sshd.service 的內容

# ...省略...
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
# ...省略...

首先載入 /etc/crypto-policies/back-ends/opensshserver.config 裡的環境變數,然後再載入 /etc/sysconfig/sshd 裡的環境變數,所以後者蓋掉前者。

那修改方法就很清楚了,就是修改 /etc/sysconfig/sshd 這個檔案就可以,把裏面 CRYPTO_POLICY= 前面的 # 拿掉,加入參數:

CRYPTO_POLICY="-oCiphers=aes128-ctr,aes192-ctr,aes256-ctr -oMACs=hmac-sha1,hmac-sha2-256,hmac-sha2-512"

然後重新啟動 sshd 就可以。

附帶一提,OpenShift CoreOS 也是用類似的方式修改,只是需要透過 MachineConfig。

參考資料:

如何使用VLC存取網路上的UPnP/DLNA伺服器上的媒體

資料來源:How to Access Media from UPnP or DLNA using VLC

該怎麼如何使用VLC存取網路上的UPnP/DLNA伺服器上的媒體呢?打開 VLC 找半天沒找到選單在哪裡,只好求助 Google 大神。

找到的步驟如下:

  1. 開啟 VLC
  2. 在選單上選擇「察看(View)」
  3. 再選「播放清單 (Playlist)」
  4. 在左邊窗格選「通用隨插即用服務(UPnP)」
  5. 右邊窗格就會出現網路上的 UPnP/DLNA 伺服器,再點進去就可以看到囉。

Huge Page與Transparent Huge Page

簡單的說,都跟記憶體分頁管理有關係。要用 Huge Page ,程式需要做調整,為了簡化使用方式,Red Hat 在 RHEL6 引入 Transparent Huge Page ,預設啟用,主要是要讓程式可以不需要更動,就可以使用 Huge Page。

詳情可以參考:

一般來說,若主機主要是執行資料庫,例如 Oracle, Redis, MongoDB, PostgreSQL,就不要使用 Transparent Huge Page。

在 RHEL 6 以後 Transparent Huge Page 預設是啟用,可以用以下指令檢查

cat /sys/kernel/mm/transparent_hugepage/enabled

輸出是 always ,就表示有啟用。若為 never ,就沒有啟用。madvise 是什麼意思呢?

當有啟用 Transparent Huge Page 時,Huge Page 就被禁用,可以用以下指令檢查,若為 0,表示禁用。

cat /proc/sys/vm/nr_hugepages

要禁用 Transparent Huge Page,用以下指令就可以

echo never > /sys/kernel/mm/redhat_transparent_hugepage/enabled

在 RHEL8 裡,有 tuned,當使用上面設定無法生效時,有可能就是這個 tuned 在搞鬼。這時可以建立一個新的 tuned profile: /etc/tuned/nothp_profile/tuned.conf

內容是

[main]
include= throughput-performance

[vm]
transparent_hugepages=never

執行以下指令就可以生效。

chmod +x /etc/tuned/nothp_profile/tuned.conf
tuned-adm profile nothp_profile

若要永久禁用,可以在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 加入 transparent_hugepage=never

執行 grub2-mkconfig -o 之後,重開機即可。