iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 7
0
Kubernetes

在地端建置Angular+ASP.NET Core的DevOps環境系列 第 7

day07_補充說明:SSH設定_星期一累累der,先過渡一下

星期一過渡一下,就是可能很多老司機都很熟了,
但個人覺得很重要的SSH

SSH有很多種用途,這裡只講用來SSH作遠端連線的那個

常常會看到一組3個檔案的東西,Google了很久才找到,順便分享一下:

ca.pem # 認證機構憑證
(如果是自簽的,那CA就是自己啦,ca.pem就是ca簽的憑證,理論上應該也拿ca的public key)
cert.pem # 用戶公錀憑證
key.pem # 用戶私錀憑證

設定 PRIVATE_KEY_FILE
這邊參考:

為什麼打這一篇,因為我覺得加密、憑證是非常重要的,在就像車子的主備動安全配備(ABS、ACC、AEB、BSM)
不管你是再怎麼會開車的老司機,還是要繫上安全帶一樣。
有完整的安全設定都可能被駭客利用已知漏洞attack了,更何況遑論沒設定憑證,就像脫光光在裸奔
先講求不傷身體,再講求藥效。

一般我們都會先求讓服務先起來,再加安全性

若有機會重新建置時,說不定可以先把一堆憑證什麼的都納進來,再從hello world開始開發

指令幾乎都是參考網路文章的,中文的部分是個人註解,希望能幫助到大家理解。
如果解理有誤也請指教,避免誤導更多人。

為什麼建詳SSH用非對稱金鑰的方式來驗證?
因為打個8~16碼的密碼,相對來說是不安全,所以ssh建議關掉密碼驗證
而based on PKCS的數位簽章相對是較難偽造及暴力破解的

只適用於 ubuntu

(mac也有ssh-agent,windows直接放生)

mac也有ssh-agent

不過實務上通常會用ubuntu來管理,所以mac的部份請自行參考網路教學
http://wjp2013.github.io/tool/ssh-agent/

  • 1.產生 rsa key pair (public key/private key)
$ ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -P "" # no passphrase 保哥的方式
# -P passphrase
# -C comment 會在id_rsa.pub,不給的話id_rsa.pub會放 account@domain 不知道有沒有什麼效力
# -f krl_file

沒給passphrase會問你,所以自動化要-P

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa)
Enter passphrase (empty for no passphrase): [Type a passphrase]
# 輸入密碼短語(安全密碼)
Enter same passphrase again: [Type passphrase again]
$ touch ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

id_rsa.pub 大概會長這樣

ssh-rsa AAAAB3NzaC1ASGWE1234234asf+klqjwrgSFGBW322...Q3GNuDON4+Q== your_email@example.com
  • 2.列出ssh keys
$ ls ~/.ssh/
authorized_keys # 授權的key,裡面放的是 允許遠端連到「這一台電腦」的public key
id_rsa # private key,所以如果ansible要連managed node的話,ansible.cfg的private_key_file要指來這裡
id_rsa.pub # public key

當我們要跟遠端Server驗證時,要用我們的private key來驗證,我們的private key可能會有很多把,
「我猜」private key應該放在一個安全的地方,不是任何程式都能存取,每次要用的話要打passphrase才行。
當我們要進行驗證時,讓ssh-agent來當「代理人」,拿相對應的private key來跟「遠端服務」作驗證。

當我們授權ssh-agent幫我們做苦力後,即可免除user整天打passphrase的麻煩。
參考:
(1)https://help.github.com/articles/working-with-ssh-key-passphrases/

在~/.bash_profile或~/.bashrc中加入

SSH_ENV="$HOME/.ssh/environment"
function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

手動執行

# start the ssh-agent in the background
eval $(ssh-agent -s) # 把 ssh-agent 的輸出交給 eval 執行
Agent pid 59566

Ubuntu的ssh-agent預設應該是自動執行的

  • 檢查ssh-agent是否啟動
$ echo $SSH_AGENT_PID
$ echo $SSH_AUTH_SOCK
# 2個指令都有值就代表有啟動

macOS可能只有$SSH_AUTH_SOCK有值

  • 4.把key加到ssh-agent
$ ssh-add ~/.ssh/id_rsa # 把 private key 加到 ssh-agent
# 如果有設passphrase,ssh-add時要輸入passphrase

macOS Sierra 10.12.2以後,修改~/.ssh/config
自動把private key讀到ssh-agent,以及把passphrases存到keychain

我的機器 -ssh-> 要遠端連線的機器

  • 1.「我的機器」要產生一組key pair(public key、private key)
  • 2.「我要遠端連線的機器」的authorized_keys要加入「我的機器」的public_key
  • 3.「我的機器」要用ssh agent使用private key跟「要遠端連線的機器」驗證
Host *
 AddKeysToAgent yes
 UseKeychain yes
 IdentityFile ~/.ssh/id_rsa
# =======分隔線======
$ ssh-add -K ~/.ssh/id_rsa # -K 是 Apple's standard version of ssh-add

依據爬文的結果,mac沒有ssh agent(這點可能有錯喔),用這一篇試看看
https://gist.github.com/atl/4525323

少有一個最小的工作.ssh/config文件

# persistently add default keys to Keychain  
# 持續添加默認鍵鑰匙扣  
$ ssh-add -K
# prepend ForwardAgent to existing ssh_config, meaning `ssh -A` is the effective default 
# 將 ForwardAgent添加到現有的ssh_config,這意味著`ssh -A`是有效的默認值
$ echo "ForwardAgent yes" | cat - ~/.ssh/config > /tmp/out && mv /tmp/out ~/.ssh/config

手動設定遠端電腦 SSH 連線認證

參考:will保哥,我的 Windows Subsystem for Linux (WSL) 終極開發人員配置 - 2018 版

$ cat ~/.ssh/id_rsa.pub | ssh user@remoteip tee -a ~/.ssh/authorized_keys
# cat ~/.ssh/id_rsa.pub 本地端的public key
# 透過 ssh 加到 遠端 ~/.ssh/authorized_keys,所以authorized_keys裡面放的是允許連線的public_key
# 透過 tee 把終端的內容加到檔案中
# 把local端產生的public key 加到 遠端電腦的~/.ssh/authorized_keys

SSH Agent Forwarding

情境大概是這樣

  • 先ssh到remote1,要再從remote1 ssh到 remote2
    例如:app server 去 github.com clone一個private repository
    local -ssh-> remote1(app server) -ssh-> remote2(github.com)

原理

  • remote1(app server)並沒有github的金鑰,所以forwarding到local
    local <-問帳密金鑰之類的- remote1(app server) <-問帳密金鑰之類的auth req- remote2(github.com)

好處

不用把private key放到中間server(remote1)

這個部分就請自行參考原文囉
SSH 免除重複輸入金鑰密碼教學:SSH Agent 與 Forwarding
https://blog.gtwang.org/linux/using-ssh-agent-forwarding-to-avoid-being-asked-passphrase/

不好意思,今天先過度一下,
有些部分其實是我自己猜測的,尤其是macOS的部分,若有錯誤再麻煩高手指教

本日結語

完蛋,文章快用完了,匯報一下進度

  • angular的測試根本還沒學
  • 本來想帥氣的在gitlab commit完就自動build、test、release的說…
  • ansible有點問題,只好再退用kubeadm建k8s了(ansible的學習文章還是會po)
    如果k8s有建成功,後面可能就簡單玩玩k8s的操作指令
    如果文章來不及生產,可能就一直過度到30天了~

依照這種進度,可能撐不了30天了,
預告未來幾天會再回到docker image的介紹:
gitlab、gitlab-ci、gitlab-ci-runner

jenkins只是順便介紹的,其實個人喜歡的是gitlab
因為作為市占率老二的gitlab,
它可以自架在內網(相較於github),
UI看起來又令人感覺它很「年輕」


上一篇
day06_docker05_.Net Core
下一篇
day08_docker06_GitLab01_上集
系列文
在地端建置Angular+ASP.NET Core的DevOps環境31

1 則留言

1
Sergeyau
iT邦研究生 3 級 ‧ 2018-10-22 09:36:53

加油!才第7天,都還沒過一半呢~繼續努力

嗯嗯,謝謝大大鼓勵呢~^^~
繼續來趕稿,大家都加油!!

我要留言

立即登入留言