瀏覽器的Unsafe port

之前很方便,自己寫個應用程式,去 listen 指定 port ,用瀏覽器存取,都沒什麼問題。

但現在瀏覽器守備範圍變寬了,怕你危險,所以當使用奇怪的 port 時,就會出現 unsafe port 的訊息。

每種瀏覽器有不同的解除限制方式。

Chrome

啟動 google chrome 時,加入參數

--explicitly-allowed-ports=xxx

例如

C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --explicitly-allowed-ports=6666

我想使用 Chrome 引擎的幾個瀏覽器應該也都適用,例如 Brave、Edge …

Firefox

firefox 處理方式比較簡單,開個新分頁,網址列輸入

about:config

然後輸入

network.security.ports.banned.override

然後填入

87,88,89,1050

或是範圍

10000-19999

完成以後,會立刻生效。

參考資料

結語

開發上,還是會需要使用到這些不安全的 port 來開發,所以知道怎麼繞過去會蠻有用的。

Hash Buster

在 Hackin9 看到這篇:Hash Buster – Why crack hashes when you can bust them?

這篇主要是在說 md5/sha1 是不安全的,透過目前電腦的強大能力,已經是可逆的了。用 Hash-Buster 這工具可以很快逆向取得雜湊前的結果。

安裝 Hash-Buster

方法1

git clone https://github.com/s0md3v/Hash-Buster.git
cd Hash-Buster
make install

方法2

wget https://raw.githubusercontent.com/s0md3v/Hash-Buster/master/hash.py -O /usr/local/bin/buster && chmod +x /usr/local/bin/buster

使用

把雜湊值當參數

buster -s "5e8ff9bf55ba3508199d22e984129be6"

把內有雜湊值的檔案當參數

buster -f with_hashed.txt

找目錄下所有內含有雜湊值的檔案

buster -d /somedir

Python 3 產生 md5 雜湊

import hashlib

print(hashlib.md5('sample'.encode('utf-8')).hexdigest())

結語

這工具蠻方便的,而且很小,但使用時必須要注意的一件事情,裡面的程式主要是使用外部的服務,所以是把雜湊值上傳到外部網站,然後取得結果。若是因為不小心遺忘密碼,那麼在取得結果後,要趕緊進行變更,以防萬一。

Powershell 找早於15天的檔案

這個需求在 linux 用 find 寫,很方便

find /tmp/location -type f -mtime +15 -delete

在 Windows Powershell 的話,可以參考這篇 Delete files older than 15 days using PowerShell

$limit = (Get-Date).AddDays(-15)
$path = "C:\Some\Path"

# Delete files older than the $limit.
Get-ChildItem -Path $path -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force

# Delete any empty directories left behind after deleting the old files.
Get-ChildItem -Path $path -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse

這是使用 Get-ChildItem -Path $path ,搭配 Where-Object ,Where-Object 裏面是做判斷, $_ 是每個項目,用每個項目的 CreationTime 去判斷,然後用 Remove-Item 去刪除。

hadolint

名字裡有 lint 的,通常表示這是個用來檢查語法的工具。所以 hadolint 是個檢查用的工具,主要是用來檢查 Dockerfile 。

安裝方法

hadolint 的原始碼放在 github 上,可以直接透過這個網址去找最新的編譯好的版本來下載:https://github.com/hadolint/hadolint/tags

下載以後,變更權限,然後搬到 /usr/local/bin ,就可以使用了。

chmod +x hadolint-Linux-x86_64
mv hadolint-Linux-x86_64 /usr/local/bin/hadolint

使用

使用很簡單,帶入 Dockerfile 即可。

hadolint Dockerfile

執行以後,會出現 hadolint 覺得有問題的地方,這時候就可以參考 hadolint rules (要往下捲,找到 Rules) 的說明去修改 Dockerfile。修改完可以再重新執行檢查。

其他使用方式

除了可以下載執行檔以外,也可以透過 container 方式來運行,簡單的說就是 hadolint 工具被包在 Container image 裡,那用 docker run 或 podman run 就可以檢查。

docker pull hadolint/hadolint
docker pull hadolint/hadolint:v2.12.0-debian
docker pull hadolint/hadolint:v2.12.0-alpine

docker run --rm -i hadolint/hadolint < Dockerfile
docker run --rm -i hadolint/hadolint:v2.12.0-debian < Dockerfile
docker run --rm -i hadolint/hadolint:v2.12.0-alpine < Dockerfile

最後一種方式,是搭配 Visual Studio Code (vscode) 的 extension,如果你剛好是把 Visual Studio Code 當作主力的話,這很方便。從 Visual Studio Code 的 marketplace 上找 hadolint ,就可以安裝。安裝以後,在編輯 Dockerfile 時,下方就會出現檢查結果,邊修改邊檢查。

結論

Dockerfile 的檢查可以導入 CI 的流程裡,一方面是可以讓 Dockerfile 標準化,一方面透過這些規則,也可以縮小 Container image 的大小,加快 docker pull 的速度。

參考資料

在IIS佈署asp.net應用程式小技巧

在 IIS 佈署 asp.net 應用程式基本上只要把檔案複製過去就可以,但如果沒有停止網站的話,檔案是可能會複製失敗的,這會導致佈署失敗。

第一個小技巧是使用 App_offline.htm ,在佈署位置新增 App_offline.htm 檔案以後,IIS 會自動讓網站進入維護模式,對來訪問網站的人會看到 App_offline.htm 檔案的內容。這時候 .dll 也會被卸載,就不會造成複製失敗。

第二個小技巧是 sleep,上面有提到可以新增 App_offline.htm 來讓 IIS 進入維護模式,但這需要一點點時間讓 IIS 去做出反應,那就會需要 sleep 。可是Windows 並沒有 sleep 這類的指令,所以沒辦法 sleep ,那麼可以怎麼做呢?這裡可以參考 如何在批次檔(Batch)中實現 sleep 命令讓任務暫停執行 n 秒 ,我後來是使用 ping 這個指令來作,ping 可以指定次數,也可以指定秒數,透過 ping 就可以達到 sleep 的目的。

ping -c 4 -w 1000 127.0.0.1

參考資料

k8s.gcr.io改為registry.k8s.io

新聞:k8s.gcr.io Redirect to registry.k8s.io – What You Need to Know | Kubernetes

簡單的說,k8s.gcr.io 要被關掉了,所以從 k8s.gcr.io 拉取的 image ,未來會有影響,例如砍掉 pod 以後,有可能拉不到 image 了。

所以要找出所有使用 k8s.gcr.io 的 deployment/statefulset/pod … 資源,方法有兩種。

第1種是用 kubectl 來找

kubectl get pods --all-namespaces -o jsonpath="{.items[*].spec.containers[*].image}" |\
tr -s '[[:space:]]' '\n' |\
sort |\
uniq -c

簡單的說,就是列出所有 pod 的 YAML,取出裡面的 image ,整理過以後,列出來。

第二種是用 kubectl krew 安裝 community-images plugin

kubectl krew install community-images
kubectl community-images

使用以上其中一種方法找到以後,該怎麼辦?

接下來就是用 kubectl edit 去修改 image 位址。

若是用 gitops 或 helm 的方法,作法也相似,就是去修改 manifest yaml ,然後重新佈署就可以了。

[Kubernetes]Pod rebalancing and allocations

文章來源:Pod rebalancing and allocations

簡單整理如下:

  • 應用程式是 deployment,有兩個 pod
  • 本來只有一個 node,兩個 pod 都會佈署在上面,所以如果一個 node 掛了,那麼應用程式就無法回應了。現在增加另外一個 node ,一般會預期 pod 移動一個到新的 node 上,但實際上 Kubernetes 不會做任何動作。

可以怎麼做?

Pod affinity

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: ellery-lab
spec:
  # 省略
  template:
    metadata:
      labels:
        app: MyTestApp
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disktype
                operator: In
                values:
                - ssd

pod topology spread constraints

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: ellery-lab
spec:
  # 省略
  template:
    metadata:
      labels:
        app: MyTestApp
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: zone
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            foo: bar

descheduler

這個是需要另外安裝的,安裝以後會在 kube-system 裏面找到,是一個 pod 。

The descheduler pod is run as a critical pod in the kube-system namespace to avoid being evicted by itself or by the kubelet

安裝完成以後,還需要設定 policy ,比較麻煩一些,但可以做到動態的處理,功能也比較多。

[Kubernetes]沒有downtime的佈署

來源:Zero-Downtime Rolling Deployments in Kubernetes | Rakuten Engineering Blog

以下是摘錄。

在刪除掉 Pod 之前,流量還是會導向 Pod,要處理這種狀況,就需要去處理 SIGTERM。

文章建議三種方法。

  • 在 pre-stop hook 裡用 sleep
  • 延遲應用程式中止
  • 動態延遲應用程式中止

在 pre-stop hook 裡用 sleep

spec:
  terminationGracePeriodSeconds: 60
  containers:
  - name: "{{APP_NAME}}"
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh","-c","sleep 20"]

缺點,sleep 的時間是要去測量跟估算的,每個應用程式不同。而且,pre-stop 的主要用途不是用來做這事情的。

延遲應用程式中止

這個是要改應用程式的程式碼。

這裡有舉一個 wrapper script 的例子

#!/bin/bash

HAPROXY_PID=-1

# wait for 10 seconds, then send a USR1 signal to HAproxy
kill_haproxy(){
  sleep 10
  kill -USR1 $HAPROXY_PID
}
 
# invoke kill_haproxy function when receives the TERM signal
trap kill_haproxy SIGTERM

# Support the user hitting Ctrl-C, but only in interactive shells
if [[ -t 1 ]] ; then
  trap 'kill -USR1 "$HAPROXY_PID"' SIGINT
fi
 
haproxy -f config.cfg & HAPROXY_PID=$!
 
if [ -z "$HAPROXY_PID" ]
then
  echo "haproxy: Haproxy failed to start"
else
  echo "haproxy: haproxy started"
fi

在 Dockerfile 就這樣用

FROM alpine:3.5

# install bash, tini and haproxy
RUN apk add --no-cache bash tini haproxy=2.0.14-r0
 
# Run tini
ENTRYPOINT ["/usr/local/bin/tini", "—"]
CMD ["/launcher.sh"]

缺點跟前者差不多。

動態延遲應用程式中止

這個說不一定可用,就跳過了。

結論

好好處理 SIGTERM 。

Shell Script 最佳實踐

來源:Shell Script Best Practice

這篇寫的很好,整理並摘錄裡面的內容

  1. 用 bash,不要用 zsh / fish
  2. 一開頭的 Sha-Bang 統一都寫 #!/usr/bin/env bash,這樣可以確保都是用相同的 shell 來執行,我自己是都寫 #!/bin/bash
  3. 副檔名用 .sh
  4. 第二行寫 set -o errexit,只要裏面有一行錯誤,就離開,不要繼續。
  5. 第三行寫 set -o nounset,只要有未設定的變數,就離開,不要繼續。
  6. 第四行寫 set -o pipefail,只要 pipe 過程中的指令有錯誤,就離開,不要繼續。
  7. 加上判斷 TRACE 環境參數是否存在的腳本,當有設定這個環境變數時,就加上 set -o xtrace,這可以幫助除錯。
  8. 儘量使用 [[ ]]取代 [ ],[[ ]]是 bash內建的關鍵字,基本上作用跟 []或 test 一樣,可以減少額外消耗,而且有更多功能。
  9. 存取變數時,前後都加上雙引號。
  10. 函式裏面用 local 宣告變數。
  11. 加上 -h或 --help來說明自己怎麼使用。
  12. 印出錯誤訊息時,要導向到 stderr :echo 'Something unexpected happened' >&2
  13. 呼叫指令若有帶參數,最好帶長的,例如用 --silent代替 -s,這樣可讀性比較高。
  14. 一開始就切換到腳本的目錄,例如: cd "$(dirname "$0")" 我想這個應該是要確定腳本所要作用的目錄,所以加上註解,或是印出當前所在目錄,都對於後續維護的人會很有幫助。
  15. 用 shellcheck來檢查腳本

作者有提供一個範本,可以直接複製來修改:

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail
if [[ "${TRACE-0}" == "1" ]]; then
    set -o xtrace
fi

if [[ "${1-}" =~ ^-*h(elp)?$ ]]; then
    echo 'Usage: ./script.sh arg-one arg-two

This is an awesome bash script to make your life better.

'
    exit
fi

cd "$(dirname "$0")"

main() {
    echo do awesome stuff
}

main "$@"

基本上就包含了前面所提到的重點,這裡額外一提的是有 main,這對於理解腳本來說,也是很重要的事情。

timemachineeditor

事情是在去年發生的,那時是在家辦公,卻發現 MBP 慢的要命,網速也變慢,後來查了一下,才發現是 MBP 一直在那邊做時光機備份。

這下就麻煩了,改為手動,又怕忘記,用自動又變慢,這可讓我好生困擾。請 Google 大神幫忙以後,找到有人推薦 timemachineeditor 這個工具。timemachineeditor 這個工具可以設定在不使用電腦的時間去做備份,這樣就解決我的問題了。

我是用 homebrew 安裝的

brew install --cask timemachineeditor

設定畫面很簡單,一看就會用了,這裡就不多說。