星期六, 8月 31, 2019

Cloud Identity with GCP 小記

Cloud Identity with GCP 小記

最近因爲工作上有一個需求, 所以來嘗試 Cloud Identity 這個服務

先說一下動機
  • 想在 GCP 上面進行 IAM 人員管理, 不想讓專案的人員使用個人的 gmail 加入專案以免維護困難
    • 目前 GCP 上面人員要加入專案, 可以是 gmail / G suite / Cloud Identity 
      • 如果公司未導入 G suite 或是 Cloud Identity, 可能就是讓員工以個人或是新增 gmail 加入專案, 這樣造成管理上的困難 -- 因為成員調動組織或是離職的時候, 很難維護管理.
  • G Suite 爲付費服務, Cloud Identity 有免費版本 ( 人數爲 50 人以下 )
    • 目前的瞭解, 兩者的差異是 G Sutie 有 Google Drive 以及 Gmail 等服務, 所以如果只是要拿來驗證以及管理, 現階段 Cloud Identity 應該就足夠了.

Cloud Identity 官方網頁

條件
  • 必須要有網域管理權, 可以驗證網域

我這邊是使用 Gandi Taiwan 在 COSCUP 研討會發放的一年免費 .tw 網域註冊免費序號

  • 感謝 Haway Liang 經理給我免費序號


做法
先登入 GCP console 

點選 IAM 與管理員 -- > 身份識別與機構 
點選 Cloud Identity 下面的 註冊


這個時候會開一個新分頁 ( Cloud Identity 的歡迎頁 )
點選 下一頁




輸入公司名稱 以及規模 -- >  下一頁





輸入公司電話 ( 手機也可以 )
-- > 下一頁


輸入電子郵件 -- > 下一頁

 輸入網域名稱 -- > 下一頁

確認網域名稱 -- > 下一頁

輸入名稱 -- > 下一頁



輸入管理者帳號以及密碼 -- > 下一頁


選擇是否提供意見給 Google

點選 同意並建立帳戶 完成建立


接下來會被帶到管理控制台的登入頁面
  • admin.google.com

輸入剛剛建立的帳號以及密碼進行登入


在設定 Cloud Identity 頁面 點選 開始


接下來要進行驗證網域所有權的部分
因為我是使用 Gandi 管理的網域, GCP 偵測到之後, 只會出現一箇 Oauth 是否同意的視窗
點選同意之後, 就自動設定完成了
  • 不用手動設定 CNAME
  • 只是過程會比較久, 大概 20 ~ 30 mins



建立完成之後來進行相關實作

首先登入 Google Admin , 以剛剛建立的網域管理者登入

授權想法
  • 專案授權給 Cloud Identity Group, 以後如果有使用者調動或是離職, 就直接從群組調整即可

點選 群組


點選 建立群組


輸入 群組相關資料
  • 目前我的命名方式是 專案名稱_權限 
  • 點選 下一步

選取 存取類型 -- > 建立群組


點選 完成


回到 GCP 專案上面

點選 IAM 與管理員 -- > IAM 
點選 新增 



輸入 Cloud Identity Group e-mail
選取角色 -- > 儲存


驗證是否有相關權限

在剛剛建立的網域使用者, 登入 GCP 控制臺, 這個時候, 會發現有被加入剛剛的專案
點選 Compute Engine -- > VM 執行個體


這個時候會發現可以觀察 VM instance, 但是不能建立 instance 因為當初被授權的角色是 檢視者
:)

達成此次 Lab 要求
先記下來

~ enjoy it

星期四, 8月 22, 2019

Ansible with AWS EC2 配合 Tag 定時開關機處理

Ansible with AWS  EC2 配合 Tag 定時開關機處理


作法: 
  • 使用 ansible 搭配 crontab 來定時開關機
    • Playbook  使用 ansible-vault 加密,
      • Vault 密碼檔案放在 機器 local, 不放入工作目錄( S3 ), 使用 --vault-id 指定檔案進行非互動式解密

先來看用來改寫的範本 aws_start_ec2_by_tag_crontab_use.yml 內容

# 由 aws_start_ec2_by_tag.yml 改寫, 讓系統使用 Crontab 執行
# edit by sakana 2019/8/21
#
# 官方建議的方式
- hosts: localhost
  connection: local
  gather_facts: False
#

  tasks:
    - name: Start instance with tag
      ec2:
# 請將 access key 內容替代 aws_access_key_id
        aws_access_key: "aws_access_key_id"
# 請將 secret access key 內容替代 aws_secret_access_key
        aws_secret_key: "aws_secret_access_key"
# 請將要執行的 region 替代 YOUR_REGION, 例如 ap-northeast-1 東京
        region: "YOUR_REGION"
# 針對 Tag 爲 Env:Lab 
        instance_tags: {"Env":"Lab"}
# 啟動 instances
        state: running

複製範本到新檔案
# cp  aws_start_ec2_by_tag_crontab_use.yml    sakana_tokyo_auto_start_instance.yml

  • 名稱命名可以包含 AWS帳號_Region_功用.yml

將 Key 以及 Region 填入檔案
# vi   sakana_tokyo_auto_start_instance.yml

# 由 aws_start_ec2_by_tag.yml 改寫, 讓系統使用 Crontab 執行
# edit by sakana 2019/8/21
#
# 官方建議的方式
- hosts: localhost
  connection: local
  gather_facts: False
#

  tasks:
    - name: Start instance with tag
      ec2:
# 請將 access key 內容替代 aws_access_key_id
        aws_access_key: "BKIAZP37PNRIR5H6GB8F"
# 請將 secret access key 內容替代 aws_secret_access_key
        aws_secret_key: "BPQax9n2046byTXUYrUfsz+C8qiXoJk4am8KAFxj"
# 請將要執行的 region 替代 YOUR_REGION, 例如 ap-northeast-1 東京
        region: "ap-northeast-1"
# 針對 Tag 爲 Env:Lab 
        instance_tags: {"Env":"Lab"}
# 啟動 instances
        state: running


這個時候檔案儲存的方式是明碼, 感覺不太好
接下來建立一個 VaultFile 配合 ansible-vault 指令來進行加解密
# vim  VaultFile

testvault

使用 ansible-vault 指令來進行加密


# ansible-vault  encrypt --vault-id  VaultFile  sakana_tokyo_auto_start_instance.yml 

Encryption successful

使用 cat 指定觀察剛剛的檔案

# cat  sakana_tokyo_auto_start_instance.yml 

$ANSIBLE_VAULT;1.1;AES256
39653337666262383938313430633338643664663065653061336265613561306535386162326466
3963376139353865366662613136346664353865663434620a653962346530386466316433336531
64623032613863313436626637656435656565383935323863636630373439393530653136646235

現在 playbook 已經加密完成

嘗試執行 playbook 

# ansible-playbook  --vault-id  VaultFile  sakana_tokyo_auto_start_instance.yml

可以到 AWS 頁面觀察 intance 有沒有被啟動

關機的方式比照辦理

接下來就是透過 crontab -e 將想要執行的時間點配合 ansible playbook 來執行開關機



這樣的方式可以進行相關工作, 但是想到日後維護, 就會覺得有問題, 因為把所有的資訊就加密
感覺也不太對 :)

先把 剛剛加密的 playbook 解密, 等等使用另外一種方式來處理

解密的方式 
# ansible-vault  decrypt --vault-id  VaultFile  sakana_tokyo_auto_start_instance.yml 

ansible-vault 另外一個選項就是 encrypt_string

以剛剛的 playbook 來說, 最重要的就是 aws_secret_key

但是開始之前要先觀察一個變數, 就是 $HISTCONTROL , 在 /bin/bash 內, 各個 OS 的設定不一樣
  • CentOS 7 是 HISTCONTROL=ignoredups
    • 如果重複指令就不紀錄到 history
  • openSUSE 是 HISTCONTROL=ignoreboth
    • 如果指令第一個字元是空白, 或是重複指令

因為等等的做法, 如果不是 HISTCONTROL=ignoreboth 加密前的明文可能會被紀錄, 所以要先確認.
如果 # echo  $HISTCONTROL 出來不是 ignoreboth
可以嘗試 # vi  ~/.bashrc
加入
HISTCONTROL=ignoreboth

登出 shell , 重新登入 shell 檢查

#  ansible-vault  encrypt_string  --vault-id  VaultFile --name  aws_secret_key BPQax9n2046byTXUYrUfsz+C8qiXoJk4am8KAFxj

aws_secret_key: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          35396532613832633830363831386561306366323165383036373936396133383166666461363363
          3565353463386531633266633838396633383638343062610a386235626433333138343138323232
          65383437363965356264376134303130373937303834336162366631376131313335363665323261
          3938633665643733370a666638653438383938353433633663343835356666666632393435646661
          65366431646265373366666362646566623434663735303562313139656366343534643931353361
          3631646137326162336361333739666137663134353235383362
Encryption successful

  • 如果這個指令被 history 記錄了, 也可以使用 #history -d [ number ] 刪除該筆記錄

修改 playbook 內容, 讓加密的內容以變數的方式提供

檔案內容如下

# 由 aws_start_ec2_by_tag.yml 改寫, 讓系統使用 Crontab 執行
# edit by sakana 2019/8/21
#
# 官方建議的方式
- hosts: localhost
  connection: local
  gather_facts: False
#
  vars:
    aws_secret_key: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          33343431626565393138336165373631353536633164653934356533653666633061626664636132
          3861366633393036313835663836376135366336336365300a616431353461666232383865376430
          66643839396166366131366363343663363931323665343964363266323837616238326262623636
          6261653061336462650a356230333334653739653536353033646465663139663034303865316562
          36373633666336643066636236636430653338643039363765373062303634303637303864633664
          3734393764333835656464663139373139663534306433646531


  tasks:
    - name: Start instance with tag
      ec2:
# 請將 access key 內容替代 aws_access_key_id
        aws_access_key: "BKIAZP37PNRIR5H6GB8F"
# 請將 secret access key 內容替代 aws_secret_access_key
        aws_secret_key: "{{aws_secret_key}}"
# 請將要執行的 region 替代 YOUR_REGION, 例如 ap-northeast-1 東京
        region: "ap-northeast-1"
# 針對 Tag 爲 Env:Lab 
        instance_tags: {"Env":"Lab"}
# 啟動 instances
        state: running

  • 只能以變數的方式來使用 encrypt_string, 不可以直接放入 ec2 module 內

嘗試執行 playbook 

# ansible-playbook  --vault-id  VaultFile  sakana_tokyo_auto_start_instance.yml

可以到 AWS 頁面觀察 intance 有沒有被啟動

也算是又向 ansible 前進一小步

~enjoy it


Reference: