使用 certbot 申請 SSL 憑證 with openSUSE in Azure 小記

使用 certbot 申請 SSL 憑證 with openSUSE in Azure 小記


OS: openSUSE Leap 15.2 in Azure

Nginx: 1.16.1

DNS provider: gandi.net


今天來測試使用 certbot 這個 ACME 客戶端來進行 Let’s Encrypt 憑證的申請.


Let’s Encrypt  官網入門網頁


參考 Certbot 網頁上, openSUSE leap 15 與 nginx 的文件




先來安裝 certbot 套件


使用 zypper 指令安裝

# zypper  install  python3-certbot


  • 這邊我是指定 python3-certbot, 因為如果是裝 certbot 會裝到 python2 的版本, 希望 certbot 用 python3 就要進行指定


因爲今天是要透過 certbot 來申請 SSL 憑證, 所以會執行 certonly 方式來執行



# certbot  certonly  --manual  --preferred-challenges=dns  -d   ines.tw


Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator manual, Installer None

Enter email address (used for urgent renewal and security notices)

 (Enter 'c' to cancel):  sakana@study-area.org ( 聯絡信件 )


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please read the Terms of Service at

https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must

agree in order to register with the ACME server at

https://acme-v02.api.letsencrypt.org/directory

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(A)gree/(C)ancel: A (同意協議)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Would you be willing to share your email address with the Electronic Frontier

Foundation, a founding partner of the Let's Encrypt project and the non-profit

organization that develops Certbot? We'd like to send you email about our work

encrypting the web, EFF news, campaigns, and ways to support digital freedom.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y (同意分享 email, 這個看個人)

Obtaining a new certificate

Performing the following challenges:

dns-01 challenge for ines.tw


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

NOTE: The IP of this machine will be publicly logged as having requested this

certificate. If you're running certbot in manual mode on a machine that is not

your server, please ensure you're okay with that.


Are you OK with your IP being logged?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y (同意 IP 被記錄, 一樣看個人)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please deploy a DNS TXT record under the name

_acme-challenge.ines.tw with the following value:


gVIVkBS2LLHzu1HSqOTUwE3LOddA3jhtAgPkDL1wosw


Before continuing, verify the record is deployed 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Press Enter to Continue (按下 Enter 之前, 要確認 DNS 供應商那邊已經設定 TXT 紀錄, value 是上面紫色的內容)

Waiting for verification...

Cleaning up challenges


IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at:

   /etc/letsencrypt/live/ines.tw/fullchain.pem

   Your key file has been saved at:

   /etc/letsencrypt/live/ines.tw/privkey.pem

   Your cert will expire on 2020-12-06. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot

   again. To non-interactively renew *all* of your certificates, run

   "certbot renew"

 - Your account credentials have been saved in your Certbot

   configuration directory at /etc/letsencrypt. You should make a

   secure backup of this folder now. This configuration directory will

   also contain certificates and private keys obtained by Certbot so

   making regular backups of this folder is ideal.

 - If you like Certbot, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le


  • certonly 只申請憑證

  • --manual  手動方式

  • --preferred-challenges=dns 

    • 使用 DNS 進行驗證 

  • -d   ines.tw

    • 要申請的網域名稱

  • 相關憑證會存放在 /etc/letsencrypt/live/你的網域下

  • 一次簽發 90 天


觀察相關資訊


# ls  -lh  /etc/letsencrypt/live/ines.tw/


total 4.0K


-rw-r--r-- 1 root root 692 Sep  7 15:01 README

lrwxrwxrwx 1 root root  31 Sep  7 15:01 cert.pem -> ../../archive/ines.tw/cert1.pem

lrwxrwxrwx 1 root root  32 Sep  7 15:01 chain.pem -> ../../archive/ines.tw/chain1.pem

lrwxrwxrwx 1 root root  36 Sep  7 15:01 fullchain.pem -> ../../archive/ines.tw/fullchain1.pem

lrwxrwxrwx 1 root root  34 Sep  7 15:01 privkey.pem -> ../../archive/ines.tw/privkey1.pem


主要有 4 個檔案


cert.pem: 申請的網域的SSL憑證 (Your domain's certificate)

  • 可以對應到之前sslforfree的 certificate.crt - 公鑰


chain.pem: Let's Encrypt 的 鏈證書 (The Let's Encrypt chain certificate)

  • 可以對應到之前sslforfree的ca_bundle.crt - 中繼憑證

 

fullchain.pem: 公鑰與中繼憑證合併 (cert.pem and chain.pem combined)

  • Nginx 如果要設定 ssl, 就會使用這個檔案 


privkey.pem: SSL憑證的私鑰 (Your certificate's private key)

  • 可以對應到之前sslforfree的private.key - 私鑰


這樣就算申請完畢, 但是要如何知道目前申請了那些憑證呢?

可以使用下列指令列出相關資訊


# certbot  certificates


Saving debug log to /var/log/letsencrypt/letsencrypt.log


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Found the following certs:

  Certificate Name: ines.tw

    Serial Number: 4c5679bc25190a70e2e9072885094771114

    Domains: ines.tw

    Expiry Date: 2020-12-06 14:01:32+00:00 (VALID: 89 days)

    Certificate Path: /etc/letsencrypt/live/ines.tw/fullchain.pem

    Private Key Path: /etc/letsencrypt/live/ines.tw/privkey.pem

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


接下來思考, 如果要加入其他的 FQDN或是想要加入 *.ines.tw 呢?


加入 *.ines.tw


# certbot  certonly  --manual  --preferred-challenges=dns --cert-name  ines.tw  -d ines.tw,*.ines.tw


Saving debug log to /var/log/letsencrypt/letsencrypt.log

Plugins selected: Authenticator manual, Installer None


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

You are updating certificate ines.tw to include new domain(s):

+ *.ines.tw


You are also removing previously included domain(s):

(None)


Did you intend to make this change?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(U)pdate cert/(C)ancel: U

Renewing an existing certificate

Performing the following challenges:

dns-01 challenge for ines.tw


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

NOTE: The IP of this machine will be publicly logged as having requested this

certificate. If you're running certbot in manual mode on a machine that is not

your server, please ensure you're okay with that.


Are you OK with your IP being logged?

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

(Y)es/(N)o: Y


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Please deploy a DNS TXT record under the name

_acme-challenge.ines.tw with the following value:


AFatx1Qx8ylhYIPmnSFIAFktRQ00GI7SbzUtHqTADJc


Before continuing, verify the record is deployed.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Press Enter to Continue  (按下 Enter 之前, 要確認 DNS 供應商那邊已經設定 TXT 紀錄, value 是上面紫色的內容)

Waiting for verification...

Cleaning up challenges


IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at:

   /etc/letsencrypt/live/ines.tw/fullchain.pem

   Your key file has been saved at:

   /etc/letsencrypt/live/ines.tw/privkey.pem

   Your cert will expire on 2020-12-06. To obtain a new or tweaked

   version of this certificate in the future, simply run certbot

   again. To non-interactively renew *all* of your certificates, run

   "certbot renew"

 - If you like Certbot, please consider supporting our work by:


   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate

   Donating to EFF:                    https://eff.org/donate-le


觀察憑證資訊


# certbot  certificates


Saving debug log to /var/log/letsencrypt/letsencrypt.log


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Found the following certs:

  Certificate Name: ines.tw

    Serial Number: 4d2c4a18b7d8f375fca8d127cefc677e152

    Domains: ines.tw *.ines.tw

    Expiry Date: 2020-12-06 14:21:22+00:00 (VALID: 89 days)

    Certificate Path: /etc/letsencrypt/live/ines.tw/fullchain.pem

    Private Key Path: /etc/letsencrypt/live/ines.tw/privkey.pem

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Lab2 : 驗證 SSL 憑證


那如果驗證真的有效呢?

我使用 nginx 來驗證, 先設定好預設網頁

可以參考 http://sakananote2.blogspot.com/2020/02/nginx-with-opensuse-leap-151-in-azure.html 


為了管理方便我在 /etc/nginx 目錄下建立一個 ssl  目錄

# mkdir  /etc/nginx/ssl


將之前產出的憑證複製到資料夾


# cp  /etc/letsencrypt/live/ines.tw/fullchain.pem  /etc/nginx/ssl/

# cp  /etc/letsencrypt/live/ines.tw/privkey.pem  /etc/nginx/ssl/


修改 nginx 設定檔

# vim  /etc/nginx/nginx.conf


worker_processes  1;

events {

    worker_connections  1024;

    use epoll;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    include conf.d/*.conf;

    server {

        listen       80;

        listen       443 ssl;

        server_name  ines.tw;

ssl_certificate /etc/nginx/ssl/fullchain.pem;

ssl_certificate_key /etc/nginx/ssl/privkey.pem;

        location / {

            root   /srv/www/htdocs/;

            index  index.html index.htm;

        }

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   /srv/www/htdocs/;

        }

    }

    

    include vhosts.d/*.conf;

}



  • 加入上面紅色部分


將 nginx 服務 reload


# systemctl   reload   nginx


因為是走 HTTPS, 所以記得要開 port 443 


在 Azure 該 VM 的網路設定內, 點選 新增輸入連接埠規則,設定 port 443 可以連線


開啟瀏覽器, 輸入 https://YOUR_DOMAIN

就可以看到可愛的鎖頭符號了



又前進一步了 :)



Reference:





Aug 16th, 2020

GCP 平臺建立 Managed instance groups 與 Load balancing 小記

GCP 平臺建立 Managed instance groups 與 Load balancing 小記


今天來整理 GCP 上面使用 Managed instance group 與 Load balancing 的一些操作與想法


情境如下



使用者透過 Load balancer IP 來進行存取, 後端連接 Managed instance group 來提供服務


==== 準備服務主機 ====


先使用 gcloud 指令建立 openSUSE Leap GCE

使用 Portal 上面的 SSH 登入主機

  • 使用 zypper 指令安裝 apache2, 啟用並設定開機啟動 

    • # zypper  install apache2

    • # systemctl start  apache2

    • # systemctl enable apache2


參考網路上網頁顯示主機名稱或是 URL 的方式


將相關網頁存成 /srv/www/htdocs/index.html

網頁呈現如下



  • 這個方法目前沒有很好, 因為在後續 LB 測試的時候只會顯示 LB 的 IP, 後面再找其他的方式來顯示後端主機的 hostname or IP


將主機關機, 等等建立為映像檔


==== 建立主機映像檔 ====


點選 Compute Engine -- > Images -- > CREATE IMAGE



輸入名稱 / 選取 Source disk / 選取 Location ( 我這邊選 Taiwan )

點選 Create 建立



觀察資訊



==== 建立 Instance templates  ====


點選 Compute Engine -- > 點選 Instance templates

點選 Create Instance template



輸入 名稱 / 選取機器的規格



點選 Boot disk 的 change



點選 Custom images

點選 剛剛建立的 image

點選 Select



可以觀察到剛剛的 image 已經被選取

是專案狀況看看要不要調整 networking 或是 security

點選 Create



  • 這邊要注意, 如果 firewall 是採取 tag 的方式, 記得按照需求加上 network tag

  • 也要注意 VPC 的選定是否正確


觀察資訊



==== 建立 Health check  ====


點選 Compute Engine -- > 點選 Health checks

點選 CREATE A HEALTH CHECK



輸入 名稱 -- > 選取 Scope / Protocol 與 port

輸入 檢查區間

點選 CREATE



  • Check Interval 按照實際需求來調整, 但是最好是超過 10 秒以上, 不然後面建立 Instance group 也會被警告

  • Unhealthy threshod 最好也是超過 3 次, 不然也會被警告


觀察相關資訊



==== 建立 Managed instance Group 與設定 Auto scaling  ====


點選 Compute Engine -- > 點選 Instance groups

點選 Create instance group



點選 New managed instance group

輸入 名稱 -- > 選取 Location

選取 剛剛建立的 Instance template


這邊按照需求選取 Auto scaling 的條件, 預設是 CPU 使用率超過 60%

設定 最少最大的 instance 數量

選取 Health check 方式 (使用剛剛建立的 Health check )

點選 Create


觀察相關資訊

Instance groups:


VM instances:



如果有遇到 Health check 沒過的問題


  • 官方文件有提到要針對 130.211.0.0/22 與 35.191.0.0/16 要設定防火牆規則允許通過

    • https://cloud.google.com/load-balancing/docs/https/ext-http-lb-simple

    • 我是設定 Target 針對所有 instance, 然後 130.211.0.0/22 與 35.191.0.0/16 的 TCP port 80 allow, 比較嚴謹的方式當然也可以下 tag 來處理, 但是還要個別打上 tag, 然後 130.211.0.0/22 與 35.191.0.0/16 又是 google 宣告的網段, 所以就先這樣處理


Firewall 的規劃可能考量

  • 參考 https://cloud.google.com/load-balancing/docs/https

  • Load Balancer + Instance Group內的GCE 都允許 port 80 存取

    • 設定 130.211.0.0/22 與 35.191.0.0/16 可以存取 tcp port 80

    • 使用 tag 方式, 設定 0.0.0.0/0 可以存取 tcp port 80, 在 instance group template 內加入該 tag

    • 效果

      • 存取 LB IP -- > Pass

      • 存取 後端 Instance Group 產生的 GCE IP -- > Pass

  • 只允許 Load Balancer 轉發 port 80 到 Instance Group 內的 GCE 

    • 設定 130.211.0.0/22 與 35.191.0.0/16 可以存取 tcp port 80

    • 效果: 不希望使用者直接打後端的 node, 避免程式寫死存取某一個 node IP, 只允許存取 Load Balancer 的 IP

      • 存取 LB IP -- > Pass

      • 存取 後端 Instance Group 產生的 GCE IP -- > ERR_CONNECTION_TIMED_OUT


對於 Source IP 說明的截圖 


==== 建立 Load balancing ====


點選 Network services 點選 Load balancing

點選 Create load balancer



點選 HTTP(S) Load Balancing 的 Start configuration

  • 這邊就以實際的狀況來選取



選取外部還是內部的 Load Balancer

點選 Continue


輸入名稱

點選 Backend configuration

下拉選單, 點選 Backend services -- > 點選 Create a backend service



輸入 名稱

New Backend:

選取 剛剛建立 Instance Group

輸入要連接的 port

設定 Balancing mode

點選 Done


  • Backend service 有個 Named port 就是從外部接入的 port 是那一個, 然後 instance group 可以設定 Named port 連接進來後, 要到 instance group 內的機器的對應 port


會觀察到剛剛建立的 Backend 顯示到資訊內

選取 剛剛建立的 Health Check

點選 Create 




點選 Fronted configuration

輸入名稱 / Protocol / Port

點選 Done



觀察資訊

確認 Frontend 已經被建立

點選 Create



觀察資訊



點選剛剛建立的 Load balancer

觀察 LB 的 IP



觀察是否可以存取



最後來聊聊 Load balancing 的組成

這個也是剛接觸最讓我迷惑的部分 :p


Load balancing 組成分為 4 個部分

  • Forwarding rule

    • 如果是透過 portal 設定, 是在 Frontend configuration 被設定, 但是沒有在界面提到這個關鍵字

  • Target HTTP proxy

    • 如果是透過 portal 設定, 是在 Frontend configuration 被設定, 但是沒有在界面提到這個關鍵字

  • URL map

    • 如果是透過 portal 設定, 大部分在建立 Backend Service 的時候就被設定預設,但是沒有在界面提到這個關鍵字

  • Backend Service

    • 非常清楚


如果不是使用 gcloud 指令建立 Load balancer 而是使用 portal 建立的話

會看到 Load balancing 介面預設顯示爲

  • Load balancers

    • 這邊想法上會認為是主體, 這個部分不會有問題

  • Backends

    • 這邊是後端服務, 這個部分不會有問題

  • Frontends

    • 這邊比較會產生困惑, 因為可以看到上面顯示的是 Forwarding rule name



點選 Load balancing 的 advanced menu, 觀察界面

  • Forwarding rules

  • Target proxies

  • Backend services

  • Backend buckets

  • Certificates

  • Target pools



  • Advanced menu 可以觀察 Forwarding rules 與 Target proxies ( Frontend ), Backend 被拆分成 Backend services 與 Backend buckets

  • 可以從剛剛建立的 test20200815-front 觀察

    • Forwarding rule: test20200815-front 有 IP address, 然後指向 test20200815-lb-target-proxy

    • Target Proxy 會對應到 URL map ( 某一個 LB 主體內的 Host and Path )

    • URL map ( LB 主體內的 Host and Path ) 會指定 Backend

    • 指定的 Backend 會對應到後端的服務


如果是透過 gcloud 指令建立, 就比較清楚, 分別爲

  • # gcloud compute health-check create

  • # gcloud compute backend-services create

  • # gcloud compute backend-service add-backend

  • # gcloud compute url-maps create

  • # gcloud compute target-proxies create

  • # gcloud compute forwarding-rule create


今天也算是好好整理之前想整理的部分了


~ enjoy it



Reference:


openSUSE Leap 15.2 安裝小記

openSUSE Leap 15.2 安裝小記


openSUSE Leap 15.1 Lifetime 到 2020/11 


三個月前才認命的動手安裝 openSUSE Leap 15.2


安裝前處理

  • 使用 imagewriter 建立 openSUSE 安裝USB

  • 整理 /home/sakana 目錄

    • 使用 du -h --max-depth=1 /home/sakana 檢查

    • 清掉不要的檔案, 特別是 ~/.cache , ~/.config 內兩大瀏覽器內有站很大空間的 cache

    • 因為有很多相關的 config 在個人家目錄內, 所以先把舊的 openSUSE Leap 15.1 的 /home 目錄, 使用# tar    cvf   home.tar  /home 進行打包到隨身碟 ( 不要使用 .gz 方式, 會比較快速 )

    • 新機器再使用 tar 指令還原回來


這次也是使用 USB 來進行安裝,  


== 安裝過程小記==


這次建立的時候我還是選擇 GNOME 桌面


磁碟區分割的部分, 使用引導的方式安裝, 因為一直出線開機分割區的警告, 所以我就用引導式

  • 刪除所有分割區

  • 建立獨立分割區 XFS

  • 根目錄取消 Btrfs 快照


===============


Network Manager:


openSUSE Leap 15.2 預設為 Network Manager



Google Chrome:84.0

https://www.google.com/intl/zh-TW/chrome/browser/ 


還是會有驗證性問題, 但是功能沒有差異

為了進行google 登入,先使用 Google 驗證App,  後面來處理yubikey


home 資料回覆:


因為有很多相關的 config 在個人家目錄內, 所以先把舊的 openSUSE Leap 15.0 的 /home 目錄, 使用# tar    cvf   home.tar  /home 進行打包到隨身碟 ( 不要使用 .gz 方式, 會比較快速 )

新機器再使用 tar 指令還原回來


Notes

  • Ifconfig 預設沒有安裝, 要使用 ip  address show


關閉GNOME裡面的搜尋功能預設關閉 (點選右上角的設定按鈕), 因為我覺得用不到



中文輸入法問題:


在系統內新增中文輸入法, 目前使用 ibus

  • system_key( windows ) + 空白鍵 切換輸入法



取消 USB 為安裝來源

# yast2  repositories 



Freemind:

使用one click install 安裝 http://software.opensuse.org/package/freemind 

我是使用 editors 那個來源的 ymp 檔案安裝


.mm 的檔案指定用 freemind  開啟



新增 Packman 套件庫:


使用 #yast2  repositories 加入社群版本的Packman 


#yast2  repositories


Firefox Sync:

登入 Firefox Sync, 會處理之前有下載的 Plugin

例如 https://addons.mozilla.org/zh-TW/firefox/addon/video-downloadhelper/ 



flash-player:

# zypper   install   flash-player


Telegram desktop:



播放器:


# zypper  install   vlc vlc-codecs


  • Mp4 codec 應該是要安裝 vlc-codecs,  需要 Packman  套件庫

  • 過程會安裝 ffmpeg-3


並將 .rmvb 以及 .mp4 預設播放器設定為  VLC


安裝  ffmpeg ( 會把提供者從 openSUSE 換成 Packman )

# zypper  install   ffmpeg-3


這樣的好處是使用 youtube-dl  可以轉換  mp3 格式


參考之前的文章 http://sakananote2.blogspot.tw/2014/06/opensuse-131.html 


透過 youtube-dl  -F 來觀察可以下載的格式


# zypper  install youtube-dl


> youtube-dl  -F  http://www.youtube.com/watch?v=13eLHrDcb1k

[youtube] Setting language

[youtube] 13eLHrDcb1k: Downloading video webpage

[youtube] 13eLHrDcb1k: Downloading video info webpage

[youtube] 13eLHrDcb1k: Extracting video information

Available formats:

22 : mp4 [720x1280]

18 : mp4 [360x640]

43 : webm [360x640]

5 : flv [240x400]

17 : mp4 [144x176]


指定要下載的格式進行下載 (請注意 -f 是小寫)


> youtube-dl  -f  22  http://www.youtube.com/watch?v=13eLHrDcb1k


下載為 mp3

首先要安裝 ffmpeg 套件


>youtube-dl    http://www.youtube.com/watch?v=13eLHrDcb1k --extract-audio --audio-format mp3



Skype:

目前的版本是 8.51.0.72 的版本


https://www.skype.com/zh-Hant/download-skype/skype-for-linux/downloading/?type=weblinux-rpm


下載 RPM 版本用軟體安裝就裝好了 :)


使用 #yast2 sound 調整音效



GNOME Extension:


參考調校小記


主要是裝 chrome 內的 GNOME Shell integration


然後到 https://extensions.gnome.org/

選想裝的 Extension, 調爲 on 就好

裝了

  • TopIcons Plus 

  • NetSpeed


可以用下列指令觀察

> gnome-tweak-tool


不過我覺得從  https://extensions.gnome.org/ 最快


.7z 支援:

# zypper  install  p7zip


imagewriter:

# zypper  install  imagewriter

用來製作開機 USB


rdesktop 安裝與測試:

#zypper  install  freerdp


執行方式

#xfreerdp  -g  1280x1024  -u administrator  HOST_IP


修改 LS_OPTIONS 變數

# vi   /etc/profile.d/ls.bash

把 root 的 LS_OPTIONS 的 -A 移除


修改 HISTSIZE 變數

# vi   /etc/profile

修改 HISTSIZE 的筆數



Yubico Key:

如果 linux 沒有抓到 Yubico 的 U2F Key可以使用以下步驟

讓 linux 支援 Yubico , 我是參考 https://www.yubico.com/faq/enable-u2f-linux/  

作法

https://raw.githubusercontent.com/Yubico/libu2f-host/master/70-u2f.rules  另存新檔

存到 /etc/udev/rules.d/70-u2f.rules

將 linux 重開機, 接下來就可以使用了 :-)


ansible 安裝:


目前版本 2.9.6

#zypper  install  ansible


Docker 安裝:


目前版本 19.03.11

#zypper  install  docker


將使用者 sakana  加入 docker  群組 

# usermod -a -G docker sakana

#systemctl  start  docker

#systemctl  enable   docker


Dropbox 103.4.383版 :


openSUSE Leap 15.2 預設不支援 dropbox

參考官方網站上面斷頭的安裝方式來安裝


> cd  ~  && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -


接下來,請從新建立的 .dropbox-dist 資料夾執行 Dropbox 精靈。


> ~/.dropbox-dist/dropboxd


順便安裝 Nautilus 相關套件

# zypper  install  nautilus-extension-dropbox



變更主機名稱:


#yast2 lan



Filezilla 安裝:


#zypper  install  filezilla



smartgit 安裝:

參考 http://sakananote2.blogspot.tw/2016/01/opensuse-leap421-smartgit.html


下載 smartgit-linux-20_1_4.tar.gz

http://www.syntevo.com/smartgit/download 


解壓縮到 /opt

# tar  zxvf   smartgit-linux-*.tar.gz  -C   /opt/


建立 link 讓一般使用者也能使用

# ln  -s   /opt/smartgit/bin/smartgit.sh   /usr/local/bin/smartgit


安裝 git

# zypper  install  git


建立 個人的 ssh key ( 這次沒有作, 因為將舊的 /home 還原回來 )

> ssh-keygen  -t  dsa


將 ssh 的公鑰 id_dsa.pub 新增到 Github 的 Settings -- >  SSH and GPG Keys  ( 這次沒有作, 因為將舊的 /home 還原回來 )


接下來就是以一般使用者的身份執行 smartgit 指令

> smartgit


這次沒有發生 一般使用者發生找不到 jre 路徑


解法, 目前是在 ~/.smartgit/smartgit.vmoptions 檔案內

將 jre 指向 /opt/smartgit/jre


> cat   ~/.smartgit/smartgit.vmoptions 

jre=/opt/smartgit/jre


按照上面的參考設定


# zypper  install  alacarte

設定 smart git icon 使用 alacarte


> alacarte

在設定好之後如果發現無法直接開啟資料夾 ( 資料夾上面按右鍵 -- > Open )

Edit -- > Preferences --> 點選  Tools -- > 點選 Re-Add Defaults 得到解決

2016-11-24 15-48-28 的螢幕擷圖.png




Azure-cli 安裝:


版本: 2.10.1

參考 http://sakananote2.blogspot.com/2018/07/kubernetes-in-azure-with-opensuse-leap.html


匯入 rpm key

# rpm --import   https://packages.microsoft.com/keys/microsoft.asc


新增 Azure CLI 的 repo

# zypper  addrepo --name 'Azure CLI' --check https://packages.microsoft.com/yumrepos/azure-cli azure-cli


安裝 azure-cli 套件

# zypper  install --from azure-cli  -y  azure-cli


使用互動的方式登入 azure ( 現在已經不需要輸入機器碼, 直接驗證帳號就可以  )

> az  login


AWS Cli 安裝:


版本: 2.0.39



# curl  "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"  -o  "awscliv2.zip"


# unzip  awscliv2.zip


# ./aws/install


# aws --version


aws-cli/2.0.39 Python/3.7.3 Linux/5.3.18-lp152.19-default exe/x86_64.opensuse-leap.15


將補齊的指令 寫到或是修改到個人家目錄的 .bashrc 內

  • echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc



Google Cloud SDK ( gcloud )安裝:


參考 http://sakananote2.blogspot.com/2019/04/gsutil-google-cloud-storage-in-opensuse.html

安裝 gcloud

  • 但是目前實務上是使用容器的方式來執行


使用一般使用者安裝

> wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-305.0.0-linux-x86_64.tar.gz 


> tar  zxvf  google-cloud-sdk-305.0.0-linux-x86_64.tar.gz


> ./google-cloud-sdk/install.sh



Visual Studio Core 相關 :


參考 http://sakananote2.blogspot.com/2019/01/visual-studio-code-with-opensuse-leap-15.html


安裝 vscode


# rpm  --import   https://packages.microsoft.com/keys/microsoft.asc


# sh  -c  ' echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ntype=rpm-md\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc"  >  /etc/zypp/repos.d/vscode.repo '


# zypper  refresh


# zypper  install  code


安裝 vscode extension ( 這次沒有作, 因為將舊的 /home 還原回來 )

  • AWS Toolkit for Visual Studio Code

  • Bracket Pair Colorizer

  • Code Time

  • Git Graph

  • GitHub Pull Requests

  • GitLens

  • Kubernetes

  • Python

  • REST Client

  • GitHub Pull Requests and Issues



PPSSPP 安裝:


#zypper  install ppsspp




這個版本沒有安裝的, 以後要安裝就看之前的筆記



這樣又可以再戰一年 :p


~ enjoy it


參考


 




使用 tcpdump 確認 custom header 小記

使用 tcpdump 確認 custom header 小記



工作上面, 因為業務需求, 可能會在 CDN 設定上加入自訂的 header

但是要如何證明這個 custom header 真的有生效呢?


可能的做法

  • Origin Server 將 header 記錄到 log 內

  • 在後端的 Origin Server 使用 tcpdump 觀察封包


本次的做法就是在 Origin Server 上面使用 tcpdump 方式觀察

參考網路上的做法


# tcpdump -n -v dst host 192.168.1.64 and tcp dst port 80 and 'tcp[tcpflags] & (tcp-push) !=0'


  • -n 不使用名稱解析, 用 IP 表示

  • -v 顯示詳細訊息, 也有看到其他人用 -vvvs 1600 來顯示更多的訊息

  • dst host 目的主機 192.168.1.64, 這個部分請換成 Origin Server 的 IP, 或是調整為自己的條件

  • tcp dst port 80 針對目的 port 80

  • 'tcp[tcpflags] & (tcp-push) !=0'

    • 針對符合 TCP Flag 為 push, 前後要加上單引號


這樣就可以觀察 CDN 設定的 custom header 有沒有生效


~ enjoy it



Reference


使用 vscode 同步 gitlab 專案小記

使用 vscode 同步 gitlab 專案小記


OS: opeSUSE Leap 15.1

GitLab: gitlab.com

vscode: 1.47.3


上次寫 GitLab 在 openSUSE Leap 的安裝


今天要來小記, 在 gitlab 上面建立帳號與專案之後, 如何簡案的在 vscode 內進行 git commit 與 push 來同步檔案


首先要來處理 GitLab 上面的 SSH Key, 這邊是以 gitlab.com 為例


登入 https://gitlab.com 

到 GitLab 的 SSH Key 頁面


將 SSH 的公鑰 ( id_rsa.pub 之類 ) 貼到 Key 區域內

加入名稱

選取有效日

點選 Add Key




開啟自己的專案頁面 https://gitlab.com/dashboard/projects

點選要同步的專案


點選 Clone

複製 git 的 URL




回到自己的機器上面, 在終端機上進入到想要 clone 的目錄

使用 git clone 指令複製目錄到本機


> git  clone  git@gitlab.com:sakanamax/testgitlab.git


正複製到 'testgitlab'...

remote: Enumerating objects: 3, done.

remote: Counting objects: 100% (3/3), done.

remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0

接收物件中: 100% (3/3), 完成.


  • 將 git clone 後面的 URL 換成自己專案的 URL


接下來進行測試

vscode 內含 git 相關功能, 如果單純以 git 功能來說, 我比較喜歡 smartgit , 但是現在 vscode 是自己的主要編輯器, 所以大部分的行為希望可以在 vscode 內完成


開啟 vscode

點選 File -- > 點選 Open Folder

開啟剛剛 clone 下來的目錄




嘗試編輯檔案, 這邊以編輯 README.md 為例

儲存檔案之後, 就會發現

左邊的 source control 就會出現有 pending change


點選左邊的 source control 按鈕

點選 + 符號進行 Stage Change



觀察資訊

檔案從 Changes 移動到 Stage Changes



接下來就是進行 commit

輸入 Message 

點選 Commit (打勾符號)



推送到遠端的 GitLab

點選 SOURCE CONTROL 的選項按鈕 ...

點選 PUSH


到 GitLab 觀察檔案有沒有更新

大功告成 :)


Notes: 

  • 這邊紀錄一個小插曲, 在 Push 到遠端的時候 pending, 雖然有顯示 git output 還是資訊不足, 後來是使用 smartgit 去進行 push 動作的時候, 出現了遠端的主機 沒有記錄到 ~/.ssh/knowhost , 然後 smartgit 也讓我選我的 SSH 私鑰是那一把, 成功在 smartgit push 完之後,  vscode 這邊就沒有問題了 


往 gitlab 又前進一步

~ enjoy it


Reference

三大雲平台工具容器升級小記 - 使用 openSUSE Leap 15.2 Container

三大雲平台工具容器升級小記 - 使用 openSUSE Leap 15.2 Container


OS: container with openSUSE Leap 15.2



上次升級是 2020/5/31 , 這次會來升級的原因是 

  • 使用 openSUSE Leap 15.2

  • 升級 gcloud 版本

  • 升級 azure-cli 版本

  • 升級 aws cli 版本


先整理結果


升級前

OS: openSUSE Leap 15.1

awscli:  aws-cli/2.0.17 Python/3.7.3

gcloud: Google Cloud SDK 290.0.1

azure-cli: 2.6.0


升級後

OS: openSUSE Leap 15.2

awscli:  aws-cli/2.0.36 Python/3.7.3

gcloud: Google Cloud SDK 303.0.0

azure-cli: 2.9.1


AWS CLI v2 安裝文件


GCP Cloud SDK 版本




這次的做法還是會透過 docker build 指令來進行

  • 我有比較過 docker build 以及使用現有的 docker image 修改後再使用 docker commit 建立的 image 大小還是很有差異的


Dockerfile 的部分我是拿之前 openSUSE Leap 15.1 來修改


修改細節

  • Update time

  • 使用 openSUSE Leap 15.2

  • 修改 pip3 安裝 boto 而非 boto3

  • Google SDK 版本還有下載的檔案路徑以及檔案名稱



列出 diff 的結果給大家參考



> diff opensuseLeap152_ansible_20200802_Dockerfile  opensuseLeap151_ansible_20200531_Dockerfile 


1,2c1,2

< # openSUSE Leap 15.2 with ansible, azure-cli, aws cli, gcloud

< FROM opensuse/leap:15.2

---

> # openSUSE Leap 15.1 with ansible, azure-cli

> FROM opensuse/leap:15.1

6c6

< # update: 20200802

---

> # update: 20200509

12c12

< # Install python3-pip, upgrade pip, ansible[azure], boto

---

> # Install python3-pip, upgrade pip, ansible[azure], boto3

16c16

<   pip3 install boto

---

>   pip3 install boto3

64c64

< # Install google cloud SDK 303.0.0

---

> # Install google cloud SDK 290.0.1

66,67c66,67

< RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-303.0.0-linux-x86_64.tar.gz && \

<   tar zxvf google-cloud-sdk-303.0.0-linux-x86_64.tar.gz && \

---

> RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-290.0.1-linux-x86_64.tar.gz && \

>   tar zxvf google-cloud-sdk-290.0.1-linux-x86_64.tar.gz && \









Dockerfile 內容如下


# openSUSE Leap 15.2 with ansible, azure-cli, aws cli, gcloud

FROM opensuse/leap:15.2


# Author

# MAINTAINER 已經棄用, 之後要使用 LABEL 方式

# update: 20200802

LABEL maintainer="sakana@cycu.org.tw"


# Set LANG for UTF-8 - for Chinese

ENV LANG C.UTF-8


# Install python3-pip, upgrade pip, ansible[azure], boto

RUN zypper install -y python3-pip && \

  pip3 install --upgrade pip && \

  pip3 install ansible[azure] && \

  pip3 install boto


# Install openssh, set ls alias

RUN zypper install -y openssh

RUN echo "alias ls='ls --color=tty'" >> /root/.bashrc


# Install wget, download azure_rm.py, set permission

RUN zypper install -y wget


# azure_rm.py no need to download 

# Starting with Ansible 2.8, Ansible provides an Azure dynamic-inventory plug-in

# https://docs.ansible.com/ansible/latest/plugins/inventory/azure_rm.html

# old azure_rm.py URL https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py


# Create working directory in /root

RUN mkdir /root/.azure && \

  mkdir /root/.aws && \

  mkdir /root/playbook && \

  mkdir -p /root/.config/gcloud && \

  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/ansible.cfg && \

  mv /ansible.cfg /root && \

  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/hosts && \

  mv /hosts /root


#### Azure #### 

# Install azure-cli

RUN zypper install -y curl && \

  rpm --import https://packages.microsoft.com/keys/microsoft.asc && \

  zypper addrepo --name 'Azure CLI' --check https://packages.microsoft.com/yumrepos/azure-cli azure-cli && \

  zypper install --from azure-cli -y azure-cli


#install vim tar gzip jq unzip less bind-utils iputils groff

RUN zypper install -y vim tar gzip jq unzip less bind-utils iputils groff

RUN echo "set encoding=utf8" > /root/.vimrc


#### AWS ####

# Install awscli v1

#RUN pip3 install awscli

#RUN echo "source /usr/bin/aws_bash_completer" >> /root/.bashrc


# Install awscli v2

RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \

  unzip awscliv2.zip && \

  /aws/install

RUN echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc


#### GCP ####

# Install google cloud SDK 303.0.0

ENV CLOUDSDK_CORE_DISABLE_PROMPTS 1

RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-303.0.0-linux-x86_64.tar.gz && \

  tar zxvf google-cloud-sdk-303.0.0-linux-x86_64.tar.gz && \

  /google-cloud-sdk/install.sh && \

  echo "if [ -f '/google-cloud-sdk/path.bash.inc' ]; then . '/google-cloud-sdk/path.bash.inc'; fi" >> /root/.bashrc && \

  echo "if [ -f '/google-cloud-sdk/completion.bash.inc' ]; then . '/google-cloud-sdk/completion.bash.inc'; fi" >> /root/.bashrc




 

使用 docker build 指令建立 image


> docker build  -t  sakana/ansible_opensuse152:20200802  -f  ./opensuseLeap152_ansible_20200802_Dockerfile   .


  • 使用 -f 指定 Dockerfile 名稱

  • 最後是 ” . “ 目前的目錄



測試 container image


> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse152:20200802  /bin/bash


測試結果 OK, 建立  tag


觀察資訊

> docker  images


REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE

sakana/ansible_opensuse152   20200802            d1bb9da2d2e1        14 seconds ago      1.66GB

opensuse/leap                15.2                b02baf32bb00        4 days ago          105MB

sakana/ansible_opensuse151   latest              0fcb15bb33a0        2 months ago        1.78GB


建立 tag 

> docker  tag  d1bb9da2d2e1  sakana/ansible_opensuse152:latest


登入 docker

> docker  login


上傳 image

> docker  push  sakana/ansible_opensuse152:20200802


> docker  push  sakana/ansible_opensuse152:latest


完工, 以後使用就用


> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse152  /bin/bash



~ enjoy it


Reference:

Aug 1st, 2020

使用 AWS WAF v2 Web ACL 限制存取小記

使用 AWS WAF v2 Web ACL 限制存取小記


有時候在業務上會碰到一些超量存取的狀況, 

所以今天要來測試 AWS WAF v2 Web ACL 來限制存取


情境:

使用 AWS Web ACL 對 ALB 限制存取超過一定門檻的行為



建立 ELB 以及 EC2


參考之前的筆記來建立


這邊有變化的大概就是目前 openSUSE Leap 已經出道 15.2 

所以這次是使用 openSUSE Leap 15.2


查詢 image id 方式

  • # aws  ec2  describe-images --filters  "Name=name,Values=openSUSE-Leap-15.2*"


但是也是碰到找到的 image id 要先接受協議而無法非互動安裝

  •  所以最快的方式就是先用 console 裝一個然後看他的 image id :)


我是用 ansible playbook 的方式建立 2 台 EC2

  • 指派 default 與 ssh 的 security group





根據得到的 IP 進行連線測試


> ssh  -i  test-key.pem  ec2-user@18.223.195.175


連入 2 台 openSUSE Leap 15.2 安裝 apache 並啟動服務, 編輯基本網頁, 建立 port 80 的 security Group, 確認可以存取


使用參考筆記的指令

  • 建立 Load Balancer , 可以觀察 Type : application ( 所以是 ALB )

  • 建立 Target Group, 建立 listener , 讓 ALB 可以存取到後端的 2 台 openSUSE Leap


確認 ALB 可以順利存取後端的服務



好的, 現在終於要進入本番角色 WAF 了 :)


在 AWS console 搜尋 WAF 服務, 登入 WAF 主控台


點選 Create web ACL



選取 Region

輸入 名稱

點選 Next


在 Rules: 點選 Add rules

點選 Add my own rules and rule groups


預設的 Rule type 爲 Rule builder

輸入 名稱

Type: 選取 Rate-based rule

Rate limit: 輸入要設定的門檻, 這邊輸入 1000 (1000 / 5 mins)

Action : Block

點選 Add rule 



確認規則建立

點選 Next


點選 Next ( 如果沒有調整 )



點選 Next


確認相關資訊

點選 Create web ACL



接下來要來套用 WAF 到剛剛建立的 LB

點選剛剛建立的 Web ACL



點選 Associated AWS resources

點選 Add AWS resources



點選 Resource type: Application Load Balancer

選取剛剛建立的 ELB

點選 Add



觀察資訊



這樣就建立完成



接下來進行驗證, 我在外部使用 ab 指令 來進行測試


確認 ab 版本


# ab  -V


This is ApacheBench, Version 2.3 <$Revision: 1826891 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/



使用 ab 指令 打LB 900次


# ab  -n  900  -c  1  http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html


This is ApacheBench, Version 2.3 <$Revision: 1826891 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/


Benchmarking test-elb-757822458.us-east-2.elb.amazonaws.com (be patient)

Completed 100 requests

Completed 200 requests

Completed 300 requests

Completed 400 requests

Completed 500 requests

Completed 600 requests

Completed 700 requests

Completed 800 requests

Completed 900 requests

Finished 900 requests



打完之後測試是否可以存取


# curl  http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html


<html>This is site 2 </html>


  • 因為沒有超過門檻 1000 / 5 mins 所以沒有問題


接下來打 1100 次


# ab -n 1100 -chttp://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html


This is ApacheBench, Version 2.3 <$Revision: 1826891 $>

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Licensed to The Apache Software Foundation, http://www.apache.org/


Benchmarking test-elb-757822458.us-east-2.elb.amazonaws.com (be patient)

Completed 110 requests

Completed 220 requests

Completed 330 requests

Completed 440 requests

Completed 550 requests

Completed 660 requests

Completed 770 requests

Completed 880 requests

Completed 990 requests

Completed 1100 requests

Finished 1100 requests


再次測試存取


# curl  http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html


<html>

<head><title>403 Forbidden</title></head>

<body bgcolor="white">

<center><h1>403 Forbidden</h1></center>

</body>

</html>


  • 這邊就會觀察到, 目前無法進行存取


同場加映: 使用 IP sets 建立白名單, 允許連線


點選 WAF 控制台的 IP sets



點選 Create IP set



輸入名稱與 IP address

點選 Create IP set



點選剛剛建立的 Web ACL



點選 Rules

點選 Add rules

點選 Add my own rules and rule groups



Rule type: 選取 IP set

輸入名稱

選取剛剛建立的 IP set

Action: 點選 Allow

點選 Add rule


將 白名單的規則 priority 向上調整

點選 Save




再次以 ab 指令進行測試, 這次就會發現不會被 WAF 阻擋了



同場加映: 用 aws 指令列出 Web ACL 內容以及目前被阻擋的 IP


列出 WAF 在單一 region 的 web acl


# aws  wafv2  list-web-acls --scope  REGIONAL  --region  us-east-2  --profile  default


{

    "NextMarker": "test20200801",

    "WebACLs": [

        {

            "Name": "test20200801",

            "Id": "32f779c2-1c2b-4069-a625-b7d216802012",

            "Description": "",

            "LockToken": "34194f29-b629-4df3-b57c-f3d0f79e7619",

            "ARN": "arn:aws:wafv2:us-east-2:783127631924:regional/webacl/test20200801/35e779c2-1c2b-4089-a615-b7d217801012"

        }

    ]

}


  • 這邊主要需要的資訊是 Name 與 Id


列出該 Web ACL 相關資訊


# aws  wafv2  get-web-acl  --scope  REGIONAL --id  32f779c2-1c2b-4069-a625-b7d216802012 --name  test20200801 --region  us-east-2  --profile  default

{

    "WebACL": {

        "Name": "test20200801",

        "Id": "32f779c2-1c2b-4069-a625-b7d216802012",

        "ARN": "arn:aws:wafv2:us-east-2:783127631924:regional/webacl/test20200801/35e779c2-1c2b-4089-a615-b7d217801012",

        "DefaultAction": {

            "Allow": {}

        },

        "Description": "",

        "Rules": [

            {

                "Name": "test20200801",

                "Priority": 0,

                "Statement": {

                    "RateBasedStatement": {

                        "Limit": 1000,

                        "AggregateKeyType": "IP"

                    }

                },

                "Action": {

                    "Block": {}

                },

                "VisibilityConfig": {

                    "SampledRequestsEnabled": true,

                    "CloudWatchMetricsEnabled": true,

                    "MetricName": "test20200801"

                }

            }

        ],

        "VisibilityConfig": {

            "SampledRequestsEnabled": true,

            "CloudWatchMetricsEnabled": true,

            "MetricName": "test20200801"

        },

        "Capacity": 2,

        "ManagedByFirewallManager": false

    },

    "LockToken": "34194f29-b629-4df3-b57c-f3d0f79e7619"

}


列出目前被阻擋的 IP


# aws  wafv2  get-rate-based-statement-managed-keys  --scope REGIONAL --region us-east-2 --web-acl-name  test20200801 --web-acl-id  32f779c2-1c2b-4069-a625-b7d216802012 --rule-name  test20200801  |  jq '.ManagedKeysIPV4'


{

  "IPAddressVersion": "IPV4",

  "Addresses": [

    "210.85.244.94/32"

  ]

}


  • 這邊我使用 jq 來搭配過濾 IP v4 的部分, 原本會顯示 IPv4 與 IPv6



又前進了一步

~ enjoy it




Reference:

GitLab with openSUSE Leap 15.1 in Azure 安裝小記

GitLab with openSUSE Leap 15.1 in Azure 安裝小記


OS: openSUSE Leap 15.1 in Azure

GitLab: gitlab-ee-13.1.4


上次寫 GitLab 文章竟然是 2019 年 5 月的事情了 ~ ( 其實也只有那篇 XD )


今天要來寫 GitLab 在 openSUSE Leap 的安裝, 安裝的環境在 Azure (實驗在雲端比較方便)


GitLab 官方建議規格

  • 可以嘗試使用 Spot  執行個體, 因為只是測試安裝, 所以用 Spot 會比較經濟

  • 目前我的測試, 如果你用的是 Azure in open, 好像無法建立 Spot VM …. QQ 


首先登入 Azure Portal 


新增虛擬機器



  • 這邊在影像的部分當然是選擇 openSUSE Leap 系列, 覺得開心的是 openSUSE Leap 15.2 已經可以在 Azure 上被選取了



在佈署的時間, 來看看 GitLab 要如何在 openSUSE 上面安裝


GitLab CE (Community Edition)



GitLab EE (Enterprise Edition)


如果仔細比對上面兩份文件, 差別只有

  • zypper  install  gitlab-ce

  • zypper  install  gitlab-ee


那到底要裝 社群版本還是企業版呢?

  • Community Edition or Enterprise Edition ? https://about.gitlab.com/install/ce-or-ee/

    • 上面官方文件, 簡單一句話就是, 請你裝企業版, 以免你之後要升級還有可能要停機, 但是沒有做很多的解釋與比較


藉由 GitLab Taipei 社群的幫助, 給了我一些連結來釐清相關細節, 整理如下


首先就功能來說, 有分爲


  • 所以就功能來說 

    • CE 的版本就是只有 CORE 功能, 

    • 用 EE 版本但是你沒有 subscription 也是 CORE 功能

    • 其他功能就是買 subscription 才有


好了, 那下一步是... 功能的差異細節是 ??

參考官方網頁



  • 說好的 CE 與 EE 呢? 這八個格子是啥 ???

    • CORE, STARTER, PREMIUM, ULTIMATE

    • FREE, BRONZE, SILVER, GOLD

  • 然後好像還在哪邊看過部分字眼 ?


好像是這邊 https://about.gitlab.com/pricing/



這個時候你會想, 上面 8 個, 也只符合 7 個啊 ~~ 那 CORE 去哪邊了 ???


要從 2 份官方的文件整理出來


GitLab 的使用方式有兩種

  • 自架 GitLab ( self-hosted )

    • CE

      • 100% open source , 然後只有 CORE 功能

    • EE

      • 根據 subscription 來決定功能, STARTER, PREMIUM, ULTIMATE

  • 在 GitLab 上使用

    • Public project

      • 提供 GOLD 功能

    • Private project

      • 根據 subscription 來決定功能, FREE, BRONZE, SILVER, GOLD


官方整理表格如下




所以分界線大概就是

  • 要 100 % open source, 日後不會用到額外功能, 可以裝 CE

  • 不確定會不會用到額外功能, 裝 EE 或是在 GitLab.com 上面使用


我其實真的沒想到光選版本就可以讓我寫 4 頁的說明 Orz….


GitLab 也可以使用容器的方式安裝, 不過要考慮 Volume 的問題


整理這些資訊, VM 肯定裝好了 ..

使用 SSH 連線到 剛剛建立的 Azure VM

為了測試方便, 我透過 > sudo  su  -  切換為 root


參考 GitLab EE 安裝文件


加入 GitLab 的套件庫


# curl  -sS  https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh  |  sudo bash


接下來準備安裝 GitLab, 不過要先來處理 URL ( Domain Name ) 以及 防火牆的部分


在 Azure Portal 上面, 剛剛建立的 VM 概觀

點選 DNS 名稱的 設定



輸入 DNS 名稱後 點選 儲存



接下來處理防火牆


在 Azure Portal 上面, 剛剛建立的 VM 網路

點選 新增輸入連接埠規則



  • 建立針對 port 80 / port 443 的開放



準備安裝 GitLab 


# sudo  EXTERNAL_URL="http://test20200711.japaneast.cloudapp.azure.com"  zypper  install gitlab-ee


  • URL 請換成自己的 Domain Name

  • 安裝的輸出蠻可愛的



    

           *.                  *.

          ***                 ***

         *****               *****

        .******             *******

        ********            ********

       ,,,,,,,,,***********,,,,,,,,,

      ,,,,,,,,,,,*********,,,,,,,,,,,

      .,,,,,,,,,,,*******,,,,,,,,,,,,

          ,,,,,,,,,*****,,,,,,,,,.

             ,,,,,,,****,,,,,,

                .,,,***,,,,

                    ,*,.

      

    

    

         _______ __  __          __

        / ____(_) /_/ /   ____ _/ /_

       / / __/ / __/ /   / __ `/ __ \

      / /_/ / / /_/ /___/ /_/ / /_/ /

      \____/_/\__/_____/\__,_/_.___/

      

    

    Thank you for installing GitLab!



接下來連接 GitLab

http://YOUR_DOMAIN



  • 會被要求更改密碼



改完之後, 使用 root 與剛剛設定的密碼登入




使用雲端平臺的好處就是不用處理 DNS 與 SSL 的問題 :p

GitLab 安裝完成, 就可以往下一個關卡邁進了 :p


也算是前進一步


~ enjoy it




Reference



May 4th, 2020

Azure Dynamic Inventory with Ansible 小記

Azure Dynamic Inventory with Ansible 小記

上次寫 Azure Dynamic Inventory 是 2018/2 的事情了 :)

在 Azure 的官方文件上說明, 如果 Ansible 版本 >= 2.8 , Dynamic Inventory 使用 plug-in 方式, 而不是使用之前的 azure_rm.py


今天就是來實驗 azure_rm – Azure Resource Manager inventory plugin

OS: container with openSUSE Leap 15.1

Ansible: 2.9.7

先來看看  Ansible 官方上面的說明

以及剛剛看到的微軟官方說明文件

不過在這之前先寫個小插曲
就是剛好又遇到 client secret keys are expired, 所以先寫一下, 更換認證檔案的部分

參考之前的文章

認證的資訊是透過 az ad sp create-for-rbac 指令來建立的

但是現在舊的認證資訊過期了, 想要先找出來

Azure 認證檔案的內容, 如下

~/.azure/credentials

[default]
subscription_id=6a2bdf3b-XXXX-XXXX-XXXX-3371d3401feb
client_id=d06f8905-XXXX-XXXX-XXXX-3e0bcf22a853
secret=b7f0df5b-XXXX-XXXX-XXXX-8aaca284f706
tenant=4cd326d7-XXXX-XXXX-XXXX-df56dc9dabd4


如何找出舊的認證呢? 下面的指令可以列出所有的資訊
>  az  ad  sp  list  --output  table

但是我們要過濾出我們建立的

# az  ad  sp list --output table | grep azure-cli

True              azure-cli-2018-02-14-06-03-46                                d06f8905-ad21-425b-9da5-3e0bcf22a853  False                        azure-cli-2018-02-14-06-03-46                                0c2d3a46-847a-4292-a9ad-8b72baf02fb7  ServicePrincipal  Microsoft.DirectoryServices.ServicePrincipal  Application                                  4cd336d7-b5ad-40a7-83cc-df57dc9dabd4  sakana              http://azure-cli-2018-02-14-06-03-46

  • 我的做法是過濾 azure-cli 關鍵字
  • 從輸出的 azure-cli-201x-xx-xx-xx-xx-xx 就可以知道建立的時間
  • 比對輸出的第三欄位 AppId~/.azure/credentials 內的 client_id 就可以知道是那一個了

刪除舊的認證

# az  ad  sp delete --id d06f8905-ad21-425b-9da5-3e0bcf22a853

Removing role assignments

  • --id 後面接 AppId

接下來建立新的認證資訊

# az  ad  sp  create-for-rbac --query  '{"client_id": appId, "secret": password, "tenant": tenant}'

Retrying role assignment creation: 1/36
{
  "client_id": "d06f8905-XXXX-XXXX-XXXX-3e0bcf22a853",
  "secret": "b7f0df5b-XXXX-XXXX-XXXX-8aaca284f706",
  "tenant": "4cd326d7-XXXX-XXXX-XXXX-df56dc9dabd4"
}

接下來還要有 subscription_id
使用 az account 指令取得

$ az  account  show  --query  "{ subscription_id: id }"
{
 "subscription_id": "6a2bdf3b-XXXX-XXXX-XXXX-3371d3401feb"
}

修改 ~/.azure/credentials , 主要是修改 client_id 與 secret

#vi  ~/.azure/credentials

[default]
subscription_id=6a2bdf3b-XXXX-XXXX-XXXX-3371d3401feb
client_id=新的_client_id
secret=新的_secret
tenant=4cd326d7-XXXX-XXXX-XXXX-df56dc9dabd4

解決完認證問題之後就可以來進行小測試

首先用微軟官方的測試方式

建立一個 myazure_rm.yml  檔案
內容如下:

# vi  myazure_rm.yml

plugin: azure_rm
include_vm_resource_groups:
- sakanastudy
auth_source: auto

keyed_groups:
- prefix: tag
  key: tags

  • sakanastudy 請換成自己的 Resource Group 名稱

# ansible  all  -m ping -i  ./myazure_rm.yml  -u  YOUR_USER  --ask-pass

SSH password: 
test01_b7be | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3.6"
    },
    "changed": false,
    "ping": "pong"
}

  • 這邊可以觀察到 有抓到 resource group 內的機器 test01
  • 我的測試機不是用 key, 是用 password 方式, 所以我指定 -u 使用者, 以及 --ask-pass 來輸入密碼, 如果要這樣的方式, 機器要裝 sshpass 套件, 所以下次要來更新容器版本 :)

如果要更進一步
建議叄考官方的文件內容


這樣也算是又前進一步

~enjoy it



Reference:



May 1st, 2020

三大雲平台工具容器升級小記 - 使用 AWS CLI v2 with openSUSE Leap 15.1 Container

三大雲平台工具容器升級小記 - 使用 AWS CLI v2  with openSUSE Leap 15.1 Container

OS: container with openSUSE Leap 15.1

上次升級是 2020/1/5 , 這次會來升級的原因是 

先整理結果

升級前
OS: openSUSE Leap 15.1
awscli:  aws-cli/1.16.310 Python/3.6.9
gcloud: Google Cloud SDK 274.0.1
azure-cli: 2.0.78

升級後
OS: openSUSE Leap 15.1
awscli:  aws-cli/2.0.10 Python/3.7.3
gcloud: Google Cloud SDK 290.0.1
azure-cli: 2.5.1

AWS CLI v2 安裝文件

GCP Cloud SDK 版本



這次的做法還是會透過 docker build 指令來進行
  • 我有比較過 docker build 以及使用現有的 docker image 修改後再使用 docker commit 建立的 image 大小還是很有差異的

Dockerfile 的部分我是拿之前 openSUSE Leap 15.1 來修改

修改細節
  • Update time
  • 加入 LANG C.UTF-8
  • 不需下載 azure_rm.py , 因為現在是用 plug-in 方式
  • 安裝 unzip 與  AWS CLI v2 
  • Google SDK 版本還有下載的檔案路徑以及檔案名稱


列出 diff 的結果給大家參考


> diff opensuseLeap151_ansible_20200501_Dockerfile opensuseLeap151_ansible_20200105_Dockerfile 

6c6
< # update: 20200501
---
> # update: 20200105
9,12c9
< # Set LANG for UTF-8 - for Chinese
< ENV LANG C.UTF-8
< # Install python3-pip, upgrade pip, ansible[azure]
---
> # Install python2-pip, upgrade pip, ansible[azure]
22,28c19,22
< RUN zypper install -y wget
< # azure_rm.py no need to download 
< # Starting with Ansible 2.8, Ansible provides an Azure dynamic-inventory plug-in
< # https://docs.ansible.com/ansible/latest/plugins/inventory/azure_rm.html
< # old azure_rm.py URL https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py
< # 
---
> RUN zypper install -y wget && \
>   wget  https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py && \
>   chmod a+x azure_rm.py && \
>   mv azure_rm.py /root
40d33
< #### Azure #### 
47,48c40,41
< #install vim tar gzip jq unzip
< RUN zypper install -y vim tar gzip jq unzip
---
> #install vim tar gzip jq
> RUN zypper install -y vim tar gzip jq
51,60c44,47
< #### AWS ####
< # Install awscli v1
< #RUN pip3 install awscli
< #RUN echo "source /usr/bin/aws_bash_completer" >> /root/.bashrc
< # Install awscli v2
< RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
<   unzip awscliv2.zip && \
<   /aws/install
< RUN echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc
---
> # Install awscli
> RUN pip3 install awscli
> RUN echo "source /usr/bin/aws_bash_completer" >> /root/.bashrc
62,63c49
< #### GCP ####
< # Install google cloud SDK 290.0.1
---
> # Install google cloud SDK 274.0.1
65,66c51,52
< RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-290.0.1-linux-x86_64.tar.gz && \
<   tar zxvf google-cloud-sdk-290.0.1-linux-x86_64.tar.gz && \
---
> RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-274.0.1-linux-x86_64.tar.gz && \
>   tar zxvf google-cloud-sdk-274.0.1-linux-x86_64.tar.gz && \






Dockerfile 內容如下

# openSUSE Leap 15.1 with ansible, azure-cli
FROM opensuse/leap:15.1

# Author
# MAINTAINER 已經棄用, 之後要使用 LABEL 方式
# update: 20200501
LABEL maintainer="sakana@cycu.org.tw"

# Set LANG for UTF-8 - for Chinese
ENV LANG C.UTF-8

# Install python3-pip, upgrade pip, ansible[azure]
RUN zypper install -y python3-pip && \
  pip3 install --upgrade pip && \
  pip3 install ansible[azure]

# Install openssh, set ls alias
RUN zypper install -y openssh
RUN echo "alias ls='ls --color=tty'" >> /root/.bashrc

# Install wget, download azure_rm.py, set permission
RUN zypper install -y wget

# azure_rm.py no need to download 
# Starting with Ansible 2.8, Ansible provides an Azure dynamic-inventory plug-in
# https://docs.ansible.com/ansible/latest/plugins/inventory/azure_rm.html
# old azure_rm.py URL https://raw.githubusercontent.com/ansible/ansible/devel/contrib/inventory/azure_rm.py

# Create working directory in /root
RUN mkdir /root/.azure && \
  mkdir /root/.aws && \
  mkdir /root/playbook && \
  mkdir -p /root/.config/gcloud && \
  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/ansible.cfg && \
  mv /ansible.cfg /root && \
  wget https://raw.githubusercontent.com/sakanamax/LearnAnsible/master/template/hosts && \
  mv /hosts /root

#### Azure #### 
# Install azure-cli
RUN zypper install -y curl && \
  rpm --import https://packages.microsoft.com/keys/microsoft.asc && \
  zypper addrepo --name 'Azure CLI' --check https://packages.microsoft.com/yumrepos/azure-cli azure-cli && \
  zypper install --from azure-cli -y azure-cli

#install vim tar gzip jq unzip
RUN zypper install -y vim tar gzip jq unzip
RUN echo "set encoding=utf8" > /root/.vimrc

#### AWS ####
# Install awscli v1
#RUN pip3 install awscli
#RUN echo "source /usr/bin/aws_bash_completer" >> /root/.bashrc

# Install awscli v2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
  unzip awscliv2.zip && \
  /aws/install
RUN echo "complete -C '/usr/local/bin/aws_completer' aws" >> /root/.bashrc

#### GCP ####
# Install google cloud SDK 290.0.1
ENV CLOUDSDK_CORE_DISABLE_PROMPTS 1
RUN wget https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-290.0.1-linux-x86_64.tar.gz && \
  tar zxvf google-cloud-sdk-290.0.1-linux-x86_64.tar.gz && \
  /google-cloud-sdk/install.sh && \
  echo "if [ -f '/google-cloud-sdk/path.bash.inc' ]; then . '/google-cloud-sdk/path.bash.inc'; fi" >> /root/.bashrc && \
  echo "if [ -f '/google-cloud-sdk/completion.bash.inc' ]; then . '/google-cloud-sdk/completion.bash.inc'; fi" >> /root/.bashrc



使用 docker build 指令建立 image

> docker build  -t  sakana/ansible_opensuse151:20200501  -f  ./opensuseLeap151_ansible_20200501_Dockerfile   .

  • 使用 -f 指定 Dockerfile 名稱
  • 最後是 ” . “ 目前的目錄


測試 container image

> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse151:20200105  /bin/bash

測試結果 OK, 建立  tag

觀察資訊
> docker  images

REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE
sakana/ansible_opensuse151   20200501            c8899a7046f8        About a minute ago   1.32GB
sakana/ansible_opensuse151   latest              3d76040b20fb        6 weeks ago          1.19GB
opensuse/leap                15.1                fef5ad254f63        2 months ago         103MB

建立 tag 
> docker  tag  c8899a7046f8  sakana/ansible_opensuse151:latest

登入 docker
> docker  login

上傳 image
> docker  push  sakana/ansible_opensuse151:20200501

> docker  push  sakana/ansible_opensuse151:latest

完工, 以後使用就用

> docker  run  -v  ~/.aws:/root/.aws  -v  ~/.azure:/root/.azure  -v ~/.config/gcloud:/root/.config/gcloud  -it  sakana/ansible_opensuse151  /bin/bash


~ enjoy it

Reference: