使用 Teleport 管理服务器集群

服务器多了,管理也是个麻烦,主流的集群运维工具——Ansible、Puppet、Saltstatck都是非常出色的工具。不过今天的主角是一个新秀——Teleport,这是一个使用Go语言编写的,高效的现代SSH管理工具。

源码:Teleport

Teleport 是一款可以替代 SSH 工具的新一代服务器集群管理工具,它不仅可以同时管理大量服务器还可以作为一个终端录制工具,它提供了一个直观的 Web 界面来显示终端,也就是说你可以在浏览器操作服务器,在浏览器录制、分享。它是开源的,它运行在你的服务器上。

0. 准备步骤

  • 一台服务器
  • 一个域名
  • 一个SSL证书

服务器自己买,域名自己挑。证书申请:

  1. 克隆仓库:
    首先你得安装git,然后把源码仓库拉回到服务器本地。
$ git clone https://github.com/certbot/certbot.git
  1. 申请证书:
    接下来,你需要关闭所有占用80和443端口的服务,比如Nginx、Apache等。然后执行下面命令,大概会等一会。
$ ./certbot-auto certonly -d shell.zuolan.me

然后会问你:

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端口没有被占用,那么选择第二种方式(简单),否则选择第一种,然后按照它的提示操作(祝你好运)。

如果你已经申请过证书会有这种提示(没有就算了):

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
解压之后就可以用了,你也可以使用它的安装脚本安装到系统相关 bin 目录,方便直接使用 Teleport 命令。

Teleport 一共有三个小工具,使用过程比较复杂,有机会单独写一篇文章介绍都可以。

直接启动即可:

$ 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

现在再运行一个 Nginx 前端负载,用于反代后端的Teleport,怎么作自己百度,毕竟每个人使用Nginx习惯都不一样,我直接贴配置意义不大(但我还是要贴上来)。

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界面了。

这个工具提供的 Web 界面是强制使用 HTTPS 访问的,使用 HTTP 将无法打开网页,此外它还使用了谷歌二步验证(离线工具,不用翻墙)作为登录验证,因此你需要手机安装谷歌二步验证应用。

留个链接给不会翻墙的小白:酷安

虽然使用麻烦,但是安全而且界面优雅。

如果你没有域名,也可以打开 Web 界面,输入 https://<你的IP地址>:3080 开头的地址会看到下面的界面:

直接使用 https 方式打开

点击继续前往就可以看到登录界面,如果你要建立私密连接,你必须购买一个域名和申请SSL证书。

打开之后二步验证工具扫描二维码,输入验证码就可以登录了。

登录之后

现在看到的是服务器列表,因为是一个集群管理工具,所以你可以添加很多服务器进来。

点击其中一台服务器,会直接连接到那台服务器(在这个工具中所有的操作都会被记录下来,你可以回放你的操作):

连接状态

Teleport 处理特殊符号效果不是很好的感觉,建议使用终端的tsh连接,网页这个只做为备选登录方式。

退出就结束本次会话,结束录制,你可以在界面中查看之前的录制内容:


录制结果

2. 创建一个用户

这里的用户是指Teleport的用户。

> tctl users add $USER

Signup token has been created. Share this URL with the user:
https://shell.zuolan.me/web/newuser/96c85ed60b47ad345525f03e1524ac95d78d94ffd2d0fb3c683ff9d6221747c2

在浏览器打开返回的链接,输入密码完成新用户注册。

3. 添加节点

> 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

在你的节点服务器执行:

teleport start --roles=node --token=n92bb958ce97f761da978d08c35c54a5c --auth-server=shell.zuolan.me

查看节点(在管理节点执行):

> 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     

修改节点信息(在节点服务器执行):

teleport start --roles=node \
    --auth-server=shell.zuolan.me \
    --nodename=db \
    --labels "location=virginia,arch=[1h:/bin/uname -m]"

4. 登录

登录到某个服务器

tsh --proxy=shell.zuolan.me ssh new-node

分享操作会话:

> 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

别人加入当前会话(简单来说就是围观你的操作):

> tsh --proxy=teleport.example.com join 7645d523-60cb-436d-b732-99c5df14b7c4

5. 本地分享

如果你是在一个需要认证网络的内网,申请SSL什么的不太方便。
自己电脑启动,指定服务器角色:

> teleport start --roles=node --proxy=teleport.example.com

然后继续在自己电脑执行:

> tsh --proxy=teleport.example.com ssh localhost
localhost> teleport status

和上面一样你会得到一个会话ID,把它分享给别人,然后你就可以在本地共享终端操作了。

这个办法可以用于分享一堆服务器,并且记录用户的操作。管理起来很方便~

你可能感兴趣的:(使用 Teleport 管理服务器集群)