GH-200 數位教科書 開啟互動版

D5 模擬題:保護與最佳化自動化

D5「保護與最佳化自動化」10 題原創模擬題,附正確答案、解析與常見陷阱。選項順序在互動版會隨機排列。

第 63 題(D5-O1)

工作流程寫了 run: echo "${{ github.event.pull_request.title }}"。要防範有人把 PR 標題改成惡意指令,官方首選的做法是什麼?

單選題,選項:

  • 把整個運算式改用單引號包起來再交給 shell
  • 改在 pull_request_target 觸發,標題就會被視為可信
  • 把值設成環境變數,指令碼內用 $TITLE 引用
  • 先把標題做 URL 編碼,再把結果插進指令中
看答案與解析

正確答案:把值設成環境變數,指令碼內用 $TITLE 引用

解析:${{ }} 在 shell 執行前就被替換成文字;把值放進中間環境變數,再在指令碼中引用,值就不會被用來產生指令碼本身。更好的做法是改用 action 並把值當引數傳入。

常見陷阱:引號與編碼只是表面處理,攻擊字串仍可能跳脫;真正的修法是讓值不進入指令碼的語法層。

依據:Secure use reference

在互動版作答這題

第 64 題(D5-O1)

在工作流程設定 permissions: id-token: write,就會讓這個工作流程取得修改雲端資源的寫入權限。

是非題:判斷敘述是否正確。

看答案與解析

正確答案:錯誤

解析:id-token: write 只是允許工作流程向 OIDC 提供者請求 JWT,不會給它修改任何資源的權限;能做什麼取決於雲端端的信任條件與角色。

常見陷阱:權限名稱裡的 write 容易讓人以為是寫入資源;它只代表可以請求權杖。

依據:Configuring OpenID Connect in cloud providers

在互動版作答這題

第 65 題(D5-O1)

團隊設定了 OIDC,工作流程已有 id-token: write,但雲端端沒有設定任何信任條件。下列說明何者正確?

單選題,選項:

  • 沒問題,因為這個權杖只有該 job 自己能使用
  • 必須在雲端端定義至少一個信任條件,例如限定 sub
  • 只要在工作流程加上 environment 就會限制雲端存取
  • 信任條件由 GitHub 自動依 repository 名稱產生
看答案與解析

正確答案:必須在雲端端定義至少一個信任條件,例如限定 sub

解析:必須在雲端端至少定義一個信任條件,才能避免不受信任的 repository 向你的雲端資源請求存取權杖;sub 的預設格式例如 repo:組織/儲存庫:environment:環境名稱。

常見陷阱:權杖只供單一 job 使用,並不代表任何 repository 都能換得;缺少信任條件等於沒有限制來源。

依據:Configuring OpenID Connect in cloud providers、OIDC reference

在互動版作答這題

第 66 題(D5-O1)

環境的必要審核者最多可以指定幾個人或團隊,核准規則是什麼?

單選題,選項:

  • 最多 3 個,必須全部核准
  • 最多 10 個,過半數核准即可
  • 最多 6 個,必須全部核准
  • 最多 6 個,其中一人核准即可
看答案與解析

正確答案:最多 6 個,其中一人核准即可

解析:必要審核者最多可指定 6 個人或團隊,只要其中一人核准,job 就可以繼續;另可啟用防止自我審核。

常見陷阱:多人審核容易被想成需要多數同意;環境保護規則只要求其中一位核准。

依據:Manage environments

在互動版作答這題

第 67 題(D5-O1)

你把第三方 action 釘在 @v4 標籤,之後該 action 的 repository 被入侵,v4 標籤被移到惡意 commit。哪種做法能避免這個風險?

單選題,選項:

  • 改用 @v4 的主版本分支名稱,而不是標籤
  • 固定到完整 commit SHA,並確認來自原 repository
  • 把版本號改成 @v4.0.0 這樣更具體的標籤
  • 只使用 Marketplace 上有已驗證徽章的 action
看答案與解析

正確答案:固定到完整 commit SHA,並確認來自原 repository

解析:標籤可以被移動或刪除;固定到完整 commit SHA(並確認 SHA 來自原 repository 而不是 fork)才不會被改寫。已驗證徽章是有用訊號,但不能取代版本固定與檢視。

常見陷阱:更具體的標籤仍是標籤;已驗證徽章只代表身分已驗證,不代表程式碼沒被入侵。

依據:Secure use reference

在互動版作答這題

第 68 題(D5-O1)

團隊把 actions 都釘在 SHA 後,不再收到 Dependabot 警示。為了持續得到更新,應該怎麼做?

單選題,選項:

  • 啟用 Dependabot version updates 開 PR 更新
  • 改回用標籤參照,讓警示可以重新被產生
  • 關閉 SHA 固定,改由組織政策強制允許清單
  • 在 CODEOWNERS 加入工作流程目錄,改由審核者手動更新
看答案與解析

正確答案:啟用 Dependabot version updates 開 PR 更新

解析:Dependabot alerts 不涵蓋釘在 SHA 的 actions,所以不會產生警示;用 version updates 開 PR 把 actions 更新到新版,security updates 則把有弱點的版本升到最低修補版。

常見陷阱:沒有警示不代表沒有弱點;SHA 固定只是讓警示機制看不到這些 actions。

依據:Secure use reference

在互動版作答這題

第 69 題(D5-O1)

在自管 runner 上有一個長達數天的 job,用 GITHUB_TOKEN 呼叫 API 到後半段失敗。最可能的原因是什麼?

單選題,選項:

  • 權杖在 job 開始 6 小時後固定過期,與 runner 類型無關
  • 自管 runner 上的 GITHUB_TOKEN 預設只有唯讀權限
  • 權杖最多只能更新到 24 小時,更長的要改用其他驗證
  • 權杖最多只能更新到 12 小時,更長的要改用其他驗證
看答案與解析

正確答案:權杖最多只能更新到 24 小時,更長的要改用其他驗證

解析:自管 runner 的 job 可長達 5 天,但 GITHUB_TOKEN 最多只能更新到 24 小時;更長的 job 要改用 PAT 或其他驗證方式。GitHub 代管 runner 的 job 最長 6 小時。

常見陷阱:權杖壽命綁在 job 與 runner 類型;代管 runner 最長 6 小時,自管 runner 的權杖最多更新到 24 小時,不是固定一個時間。

依據:GITHUB_TOKEN (concepts)

在互動版作答這題

第 70 題(D5-O1)

要為建置出來的二進位檔產生 artifact attestation,工作流程至少需要哪組權限?

單選題,選項:

  • id-token: write、contents: write、attestations: read
  • id-token: write、contents: read、attestations: write
  • id-token: read、contents: read、attestations: read
  • id-token: write、contents: read、security-events: write
看答案與解析

正確答案:id-token: write、contents: read、attestations: write

解析:官方範例的權限是 id-token: write、contents: read、attestations: write;容器映像還要加 packages: write。消費者再用 gh attestation verify 驗證。

常見陷阱:attestation 要簽章,需要 OIDC 權杖與寫入證明的權限;只有讀取權限無法產生。

依據:About artifact attestations、Use artifact attestations

在互動版作答這題

第 71 題(D5-O2)

工作流程用了 concurrency,想讓同一群組排隊最多 100 個等待中的執行,同時又設定 cancel-in-progress: true。結果如何?

單選題,選項:

  • 兩者可並用,新執行會取消舊執行後再排隊
  • 兩者可並用,但 queue 的上限會降為 1
  • queue: max 不能與 cancel-in-progress: true 同時使用
  • queue: max 優先,cancel-in-progress 會被忽略
看答案與解析

正確答案:queue: max 不能與 cancel-in-progress: true 同時使用

解析:queue: max 最多允許 100 個等待中的執行,但不能與 cancel-in-progress: true 同時使用,否則工作流程驗證失敗;群組名稱不分大小寫。

常見陷阱:「取消舊的」與「排隊等待」是相反的策略,兩者不能同時選。

依據:Workflow syntax

在互動版作答這題

第 72 題(D5-O2)

批次作業需要連續執行 8 小時。下列哪種做法符合限制?

單選題,選項:

  • 用自管 runner,單一 job 上限是 5 天
  • 用 GitHub 代管 runner,上限是 24 小時
  • 用 GitHub 代管 runner,上限是 35 天
  • 用 GitHub 代管 runner,上限是 12 小時
看答案與解析

正確答案:用自管 runner,單一 job 上限是 5 天

解析:GitHub 代管 runner 的單一 job 上限是 6 小時,自管 runner 是 5 天;35 天是整個工作流程執行的上限,不是單一 job。

常見陷阱:35 天看起來最寬鬆,但那是整個執行的總長;單一 job 還是受 runner 類型的限制。

依據:Actions limits

在互動版作答這題