服務(wù)器多了答姥,管理也是個(gè)麻煩莫鸭,主流的集群運(yùn)維工具——Ansible潦匈、Puppet阱高、Saltstatck都是非常出色的工具。不過今天的主角是一個(gè)新秀——Teleport茬缩,這是一個(gè)使用Go語言編寫的赤惊,高效的現(xiàn)代SSH管理工具。
源碼:Teleport
Teleport 是一款可以替代 SSH 工具的新一代服務(wù)器集群管理工具凰锡,它不僅可以同時(shí)管理大量服務(wù)器還可以作為一個(gè)終端錄制工具未舟,它提供了一個(gè)直觀的 Web 界面來顯示終端,也就是說你可以在瀏覽器操作服務(wù)器掂为,在瀏覽器錄制裕膀、分享。它是開源的勇哗,它運(yùn)行在你的服務(wù)器上昼扛。
0. 準(zhǔn)備步驟
- 一臺(tái)服務(wù)器
- 一個(gè)域名
- 一個(gè)SSL證書
服務(wù)器自己買,域名自己挑欲诺。證書申請(qǐng):
- 克隆倉庫:
首先你得安裝git抄谐,然后把源碼倉庫拉回到服務(wù)器本地。
$ git clone https://github.com/certbot/certbot.git
- 申請(qǐng)證書:
接下來扰法,你需要關(guān)閉所有占用80和443端口的服務(wù)蛹含,比如Nginx、Apache等塞颁。然后執(zhí)行下面命令浦箱,大概會(huì)等一會(huì)吸耿。
$ ./certbot-auto certonly -d shell.zuolan.me
然后會(huì)問你:
How would you like to authenticate with the ACME CA?
# -------------------------------------------------------------------------------
1: Place files in webroot directory (webroot)
2: Spin up a temporary webserver (standalone)
# -------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
如果你確保你的80和443端口沒有被占用,那么選擇第二種方式(簡(jiǎn)單)酷窥,否則選擇第一種咽安,然后按照它的提示操作(祝你好運(yùn))。
如果你已經(jīng)申請(qǐng)過證書會(huì)有這種提示(沒有就算了):
What would you like to do?
# -------------------------------------------------------------------------------
1: Keep the existing certificate for now
2: Renew & replace the cert (limit ~5 per 7 days)
# -------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
選擇E竖幔,回車板乙,搞定是偷。
1. 安裝Teleport
從下面地址中下載最新版本的 Teleport:
https://github.com/gravitational/teleport/releases
解壓之后就可以用了拳氢,你也可以使用它的安裝腳本安裝到系統(tǒng)相關(guān) bin 目錄,方便直接使用 Teleport 命令蛋铆。
Teleport 一共有三個(gè)小工具馋评,使用過程比較復(fù)雜,有機(jī)會(huì)單獨(dú)寫一篇文章介紹都可以刺啦。
直接啟動(dòng)即可:
$ sudo teleport start
[AUTH] Auth service is starting on 0.0.0.0:3025
[PROXY] Reverse tunnel service is starting on 0.0.0.0:3024
[PROXY] Web proxy service is starting on 0.0.0.0:3080
[SSH] Service is starting on 0.0.0.0:3022
[PROXY] SSH proxy service is starting on 0.0.0.0:3023
現(xiàn)在再運(yùn)行一個(gè) Nginx 前端負(fù)載留特,用于反代后端的Teleport,怎么作自己百度玛瘸,畢竟每個(gè)人使用Nginx習(xí)慣都不一樣蜕青,我直接貼配置意義不大(但我還是要貼上來)。
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name shell.zuolan.me;
server_tokens off;
location /generate_204 { return 204; }
# ssl on;
################
# SSL 配置
################
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
################
# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
################
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5:!MEDIUM:!LOW";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/nginx/certs/dhparam.pem;
################
# SSL END
################
add_header 'Access-Control-Allow-Origin' *;
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
location / {
client_max_body_size 50M;
proxy_pass http://172.16.168.200:3080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
}
}
打開shell.zuolan.me就可以訪問到UI界面了糊渊。
這個(gè)工具提供的 Web 界面是強(qiáng)制使用 HTTPS 訪問的右核,使用 HTTP 將無法打開網(wǎng)頁,此外它還使用了谷歌二步驗(yàn)證(離線工具渺绒,不用翻墻)作為登錄驗(yàn)證贺喝,因此你需要手機(jī)安裝谷歌二步驗(yàn)證應(yīng)用。
留個(gè)鏈接給不會(huì)翻墻的小白:酷安
雖然使用麻煩宗兼,但是安全而且界面優(yōu)雅躏鱼。
如果你沒有域名,也可以打開 Web 界面殷绍,輸入 https://<你的IP地址>:3080
開頭的地址會(huì)看到下面的界面:
點(diǎn)擊繼續(xù)前往就可以看到登錄界面染苛,如果你要建立私密連接,你必須購買一個(gè)域名和申請(qǐng)SSL證書主到。
打開之后二步驗(yàn)證工具掃描二維碼茶行,輸入驗(yàn)證碼就可以登錄了。
現(xiàn)在看到的是服務(wù)器列表镰烧,因?yàn)槭且粋€(gè)集群管理工具拢军,所以你可以添加很多服務(wù)器進(jìn)來怔鳖。
點(diǎn)擊其中一臺(tái)服務(wù)器,會(huì)直接連接到那臺(tái)服務(wù)器(在這個(gè)工具中所有的操作都會(huì)被記錄下來,你可以回放你的操作):
Teleport 處理特殊符號(hào)效果不是很好的感覺艾凯,建議使用終端的tsh連接,網(wǎng)頁這個(gè)只做為備選登錄方式懂傀。
退出就結(jié)束本次會(huì)話趾诗,結(jié)束錄制蹬蚁,你可以在界面中查看之前的錄制內(nèi)容:
2. 創(chuàng)建一個(gè)用戶
這里的用戶是指Teleport的用戶。
> tctl users add $USER
Signup token has been created. Share this URL with the user:
https://shell.zuolan.me/web/newuser/96c85ed60b47ad345525f03e1524ac95d78d94ffd2d0fb3c683ff9d6221747c2
在瀏覽器打開返回的鏈接犀斋,輸入密碼完成新用戶注冊(cè)贝乎。
3. 添加節(jié)點(diǎn)
> tctl nodes add
The invite token: n92bb958ce97f761da978d08c35c54a5c
Run this on the new node to join the cluster:
teleport start --roles=node --token=n92bb958ce97f761da978d08c35c54a5c --auth-server=shell.zuolan.me
在你的節(jié)點(diǎn)服務(wù)器執(zhí)行:
teleport start --roles=node --token=n92bb958ce97f761da978d08c35c54a5c --auth-server=shell.zuolan.me
查看節(jié)點(diǎn)(在管理節(jié)點(diǎn)執(zhí)行):
> tsh --proxy=shell.zuolan.me ls
Node Name Node ID Address Labels
--------- ------- ------- ------
localhost xxxxx-xxxx-xxxx-xxxxxxx 10.0.10.1:3022
new-node xxxxx-xxxx-xxxx-xxxxxxx 10.0.10.2:3022
修改節(jié)點(diǎn)信息(在節(jié)點(diǎn)服務(wù)器執(zhí)行):
teleport start --roles=node \
--auth-server=shell.zuolan.me \
--nodename=db \
--labels "location=virginia,arch=[1h:/bin/uname -m]"
4. 登錄
登錄到某個(gè)服務(wù)器
tsh --proxy=shell.zuolan.me ssh new-node
分享操作會(huì)話:
> tsh --proxy=teleport.example.com ssh db
db > teleport status
User ID : joe, logged in as joe from 10.0.10.1 43026 3022
Session ID : 7645d523-60cb-436d-b732-99c5df14b7c4
Session URL: https://teleport.example.com:3080/web/sessions/7645d523-60cb-436d-b732-99c5df14b7c4
別人加入當(dāng)前會(huì)話(簡(jiǎn)單來說就是圍觀你的操作):
> tsh --proxy=teleport.example.com join 7645d523-60cb-436d-b732-99c5df14b7c4
5. 本地分享
如果你是在一個(gè)需要認(rèn)證網(wǎng)絡(luò)的內(nèi)網(wǎng),申請(qǐng)SSL什么的不太方便览效。
自己電腦啟動(dòng),指定服務(wù)器角色:
> teleport start --roles=node --proxy=teleport.example.com
然后繼續(xù)在自己電腦執(zhí)行:
> tsh --proxy=teleport.example.com ssh localhost
localhost> teleport status
和上面一樣你會(huì)得到一個(gè)會(huì)話ID丁稀,把它分享給別人,然后你就可以在本地共享終端操作了但校。
這個(gè)辦法可以用于分享一堆服務(wù)器每强,并且記錄用戶的操作。管理起來很方便~