Puppet 自動化部署 – 實作 Policy-based autosigning

2017-01-02 Puppet

前面介紹到了 Policy-based autosigning,在這邊依照官方所述來測試 Policy-based autosigning 的實作環境

 

首先必須先了解一下 Policy-based autosigning 的運作概念是在 csr 證書中加入參數供認證,由於在 Puppet 的認證關係中是由 Agent 發起,所以在 csr 動手腳的動作就落在 Agent 上面,

 

在 Master 中開啟 Policy-based autosigning 支援

可以在 puppet.conf 中加入 autosign 參數來開啟 Policy-based autosigning

To enable policy-based autosigning, set autosign = <policy executable file> in the [master] section of the CA Puppet master’s puppet.conf.

在這邊必須注意的是 autosign 參數帶的是一個 script 檔,他將會替你執行這個 script 去驗證 Agent 的 csr 資訊。

 

而且這個 script 必須是 puppet master 有執行的權限,script 必須 return 0 (成功) 或是 1 (失敗),來判別這是否為合法的 Agent。

The policy executable file must be executable by the same user as the Puppet master. If not, it will be treated as a certname whitelist file.

 

 

 

在 Agent 中的 csr 資訊加入認證資訊

 

可以加入設定檔 csr_attributes.yaml 來替 CSR 添加額外的驗證訊息:

Extra data for the CSR is read from the csr_attributes.yaml file in Puppet’s confdir. (The location of this file can be changed with the csr_attributes setting.)

 

在官方特別提到,csr_attributes.yaml 必須擁有 custom_attributes 或 extension_requests 其中一個類型的參數,其支援的類型可以參考 CSR attributes and certificate extensions

 

 

 

實作 Policy-based autosigning 工作

在這篇小弟有寫了一個 Policy-based autosigning 工作範例在 github,是採用 custom_attributes 類型中的 challengePassword 進行驗證,從下面這張工作流程圖了解一下在這個示範中的作業流程

 

 

在 Master 安裝 autosign script

# in master
$ git clone https://github.com/shazi7804/puppet-autosign
$ cd puppet-autosign
$ chmod +x setup.sh
$ ./setup.sh install

 

用 setup.sh 的安裝動作會將 autosign script 安裝在/etc/puppetlabs/autosign (預設),並且將 autosign 自動寫入在 puppet.conf

$ cat /etc/puppetlabs/puppet/puppet.conf | grep autosign

autosign =/etc/puppetlabs/autosign/bin/autosign-verify

 

用 autosign 產生 challengePassword 驗證檔案

$ /etc/puppetlabs/autosign/bin/autosign -c example.com

 

會產生一個 example.com 的檔案,裡面的 content 為隨機的 challengePassword 驗證碼,這隻檔案的用意是要給 autosign-verify 進行驗證 agent csr 的

$ cat /etc/puppetlabs/autosign/pks/example.com 

8e7e3c22ff92fc614e690a1a7c64b414

 

在 Agent 加入 challengePassword 的認證

# in agent
$ vim /etc/puppetlabs/puppet/csr_attributes.yaml

custom_attributes:
  challengePassword: "8e7e3c22ff92fc614e690a1a7c64b414"

 

然後主動提交測試是否可以驗證成功

$ puppet agent -t

Info: Creating a new SSL key for example.com
Info: csr_attributes file loading from /etc/puppetlabs/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for example.com
Info: Certificate Request fingerprint (SHA256): 70:8E:73:0C:51:5A:0F:D3:1A:D2:7C:8E:5D:9A:D2:F6:A9:B8:90:87:DA:4F:86:49:50:5F:A4:65:71:1B:A8:15
Info: Caching certificate for example.com
Info: Caching certificate for example.com
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Info: Caching catalog for example.com
Info: Applying configuration version '1483296913'

驗證成功,也收到 catalog 佈署完成。

 

驗證一下 Master,自動 sign certificate 囉

$ less /var/log/puppetlabs/puppetserver/puppetserver.log 

2017-01-02 08:40:55,432 INFO  [qtp959974316-68] [p.p.certificate-authority] Signed certificate request for example.com
2017-01-02 08:40:55,802 INFO  [qtp959974316-69] [puppetserver] Puppet Caching node for example.com
2017-01-02 08:40:58,634 INFO  [qtp959974316-70] [puppetserver] Puppet Caching node for example.com
2017-01-02 08:40:58,988 INFO  [qtp959974316-70] [puppetserver] Puppet Compiled catalog for example.com in environment production in 0.24 seconds

 

如何證明真的是使用 Policy-based autosigning 而不是只是在白名單內而已?!

我在 autosign-verify 裡面寫了一段,只要驗證成功,就會刪除在 waiting 中的 example.com 驗證檔案,所以在 /opt/autosign/pks 裡面只會存在尚未驗證的 node

$ ls -l /etc/puppetlabs/autosign/pks/

drwxr-xr-x 2 puppet puppet 4096 Jan  2 08:40 .
drwxr-xr-x 5 puppet puppet 4096 Jan  2 02:54 ..

# 因為驗證成功所以被 example.com 被刪除了。

 

這邊要特別注意,puppet 在進行驗證的時候完全是使用 puppet 的權限去進行動作,所以不管是 create, remove 等動作都必須要有權限,所以都採用 puppet:puppet 的權限。

The policy executable file must be executable by the same user as the Puppet master. If not, it will be treated as a certname whitelist file.

 

 

 

 

特別標註:

  • 要獲得 agent 的 csr stdin 訊息可以用 $(cat) 來取得,若是在測試階段要抓取字串可以用以下指令去擷取,requests 是存放 agent 等待 sign 的 csr 存放位置。
$ openssl req -noout -text -in /etc/puppetlabs/puppet/ssl/ca/requests/example.com.pem

 

 

 

 

 

 

參考資料:

autosigning certificate requests

CSR attributes and certificate extensions

Config files: csr_attributes.yaml

Upgrade to newer version of commons-exec (or switch to zt-exec) when STDIN bug is fixed

2 Replies to “Puppet 自動化部署 – 實作 Policy-based autosigning”

  1. Vince表示:

    想請問一下,
    1.autosign部分,我安裝完後,他的預設路徑為/etc/puppetlabs/autosign,如果路徑不是為/opt/autosign是否有關係呢?

    2.我已在master端安裝autosign了,且在安裝時,以下後面參數指令,將autosign資料夾位置為/opt/autosign,但我在agent端,試用了puppet agent –test,無法取得我在master端example.com的驗證,是否有哪些地方需要修改呢? 我是按照您上述步驟進行安裝的!

    謝謝!
    Cheers,
    Vince

    • shazi7804表示:

      Hi Vince

      Yes, you are right!! 是我修改 Github 的時候沒改文章,已修改。

給 Mr. 沙先生一點建議

彙整

分類

展開全部 | 收合全部

License

訂閱 Mr. 沙先生 的文章

輸入你的 email 用於訂閱