dushixiang / next-terminal

Next Terminal是一个简单好用安全的开源交互审计系统,支持RDP、SSH、VNC、Telnet、Kubernetes协议。

Home Page:https://next-terminal.typesafe.cn

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[bug]新建管理员账户无法导出资产

aaro-n opened this issue · comments

环境介绍

Next Terminal版本:1.3.9,Docker,amd64
数据库:Mysql或sqlite
浏览器:chrome 版本 115.0.5790.114(正式版本) (x86_64)

问题描述

Next Terminal新建一个用户并授予系统管理员权限,使用这个新建账户登陆并创建资产(使用SSH连接远程VPS),此时点导出备份,浏览器会弹出下载框,文件名为 export .json,内容为{"code":403,"message":"permission denied"},这是使用新建管理员账户发生的。
使用默认创建的admin账户,点击导出备份,此时能导出备份,但浏览器提示此文件存在危险,因此 Chrome 已将其拦截。,点击保留危险文件(加上自己的域名下载是安全的),这个文件名为backup_20230827054203.json,里边是正常的。

发生了什么

Next Terminal新建管理员账户无法导出备份,默认创建的admin账户能导出备份,但浏览器提示导出的文件危险

预期发生什么

Next Terminal新建管理员真能正常导出,浏览器不提示危险。

其他问题

因为想将Next Terminal部署在Fly.io上,但Next Terminal使用两个镜像文件,如何将两个镜像文件合并成一个?我尝试创建Dockerfile 部署过,只有dushixiang/next-terminal:latest镜像运行,dushixiang/guacd:latest这个镜像有什么用?没有guacd镜像对我使用SSH连接远程服务器有影响吗?
Next Terminal能使用证书连接mysql数据库吗?我想将数据库创建在planetscale上,planetscale数据库需要证书才能连接。
Dockerfile

FROM  dushixiang/guacd:latest

FROM  dushixiang/next-terminal:latest

可能与 #340 有关

next-terminal两个镜像合一

通过查询GPT3.5和在网上搜索资料,两个镜像已经可以运行起来了,运行镜像并查询端口占用,80884822已经被占用,说明dushixiang/guacd:latest已经运行起来,但guacd无法判断能不能正常工作。

Docker镜像制作

通过Dockerfile 将两个镜像和为一个

# 准备使用`dushixiang/next-terminal:latest`提取next-terminal二进制包
 FROM  dushixiang/next-terminal:latest AS builder1

# 使用`dushixiang/guacd:latest`作为基础镜像
 FROM  dushixiang/guacd:latest

# 设置默认环境变量
 ENV TZ Asia/Shanghai
 ENV DB sqlite
 ENV SQLITE_FILE './data/sqlite/next-terminal.db'
 ENV SERVER_PORT 8088
 ENV SERVER_ADDR 0.0.0.0:$SERVER_PORT
 ENV SSHD_PORT 8089
 ENV SSHD_ADDR 0.0.0.0:$SSHD_PORT
 ENV TIME_ZONE=Asia/Shanghai

# 将从`dushixiang/next-terminal:latest`提取的二进制文件复制到`dushixiang/guacd:latest`中
 COPY --from=builder1 /usr/local/next-terminal /usr/local/next-terminal

# 安装supervisord,这部分我折腾好久
#第二次修正,安装tzdata ,用于将VPS强制设置为北京时间
# 第三次修正,用于显示日志
 RUN apk --no-cache add \
    logrotate \
     tzdata \
     supervisor && \
     rm -rf /var/cache/apk/*

# 将supervisord配置文件复制到容器
 COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 将镜像启动脚本复制到容器
 COPY config/docker-entrypoint.sh /var/docker-entrypoint.sh 
# 第三次修正,用于显示日志
 COPY config/logrotate.conf  /etc/logrotate.d/logrotate.conf
 
# 为启动脚本设置运行权限并切将时间设置为北京时间
 RUN chmod +x /var/docker-entrypoint.sh && \
     cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
     echo 'Asia/Shanghai' > /etc/timezone

# 设置镜像运行时脚本路径
 ENTRYPOINT  /var/docker-entrypoint.sh

启动脚本和supervisord配置文件

在Dockerfile同目录下创建config文件夹,进入config文件夹创建supervisord.confdocker-entrypoint.sh,还有logrotate.conf

supervisord.conf

# 第三次修正,用于显示日志

[supervisord]
nodaemon=true
user=root
logfile=/dev/null
logfile_maxbytes=0
pidfile=/run/supervisord.pid

# 运行next-terminal二进制文件,占用8088端口
[program:next-terminal]
command=/usr/local/next-terminal/next-terminal
directory=/usr/local/next-terminal/
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/1
stderr_logfile_maxbytes=0
autorestart=true
startretries=0
priority=70

# 运行guacd,占用4822端口
[program:next-guacd]
command=/opt/guacamole/sbin/guacd -b 0.0.0.0 -f 
directory=/opt/guacamole/sbin/
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/1
stderr_logfile_maxbytes=0
autorestart=true
startretries=0
priority=150

docker-entrypoint.sh

#!/usr/bin/env sh
 /usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf

logrotate.conf

/dev/fd/1 {
    rotate 7
    daily
    compress
    missingok
    notifempty
}

我测试时使用的环境变量

  DB = "sqlite"

# 将数据和日志保存在`/home/terminal`,运行的时候注意把文件夹映射出来,否则容器删除重建,数据会全美的。
  SQLITE_FILE = "/home/terminal/sqlite/next-terminal.db"
  GUACD_RECORDING = "/home/terminal/recording"
  GUACD_DRIVE = "/home/terminal/drive"
  SSHD_KEY = "/home/terminal/id_rsa"

# `GUACD_HOSTNAME`要设置成127.0.0.1,否则VNC无法正常工作
#  GUACD_HOSTNAME = "guacd"
  GUACD_HOSTNAME = "127.0.0.1"
  GUACD_PORT = "4822"

问题

  • guacd是否正常工作?
    我不知道dushixiang/guacd:latest是做什么用的,我只使用SSH连接VPS,去掉dushixiang/guacd:latest镜像也可以连接vps。
  • 为什么要安装supervisord?
    这是重点,我将Dockerfile写好后,发现无论我怎么设置,镜像运行后监测端口占用,要么占用 8088要么占用4822,两者不能同时占用。
# 占用 4822
CMD ["/bin/sh", "-c", "/opt/guacamole/sbin/guacd -b 0.0.0.0 -L $GUACD_LOG_LEVEL -f && /usr/local/next-terminal/next-terminal"]
# 占用 8088
CMD ["/bin/sh", "-c", "/usr/local/next-terminal/next-terminal &&/ opt/guacamole/sbin/guacd -b 0.0.0.0 -L $GUACD_LOG_LEVEL -f"]

使用ENTRYPOINT命令也一样,Dockerfile只会执行第一条命令,第二条不执行
  • 为什么以dushixiang/guacd:latest基础镜像?
    因为通过问题和仓库代码发现guacd会有字体显示问题,dushixiang/guacd:latest里只有二进制文件,复制比较容易,并且还可以自动多架构。

next-terminal强制使用域名访问VPS

vps一般使用ssh通过IP访问,当VPS过多时继续使用IP访问识别就过于困难,因此通过域名访问VPS(Hosts方式)就比较容易解决这个问题。

Docker

docker-compose.yml

volumes:
      - /etc/localtime:/etc/localtime
      - ./data:/usr/local/next-terminal/data
      - ./ssh/id_rsa:/root/.ssh/id_rsa
    restart:
      always
    container_name: 
      next-terminal
    extra_hosts:
    #格式
    # - 想要的VPS域名:VPS IP 
    - mariadb.service.app:1.23.3.4

Dockerfile

# 将supervisord配置文件复制到容器
 COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 将镜像启动脚本复制到容器
 COPY config/docker-entrypoint.sh /var/docker-entrypoint.sh 
# 将VPS IP与域名映射导入镜像
 COPY config/hosts  /etc/hosts

config文件夹下创建hosts

# 格式  【VSP IP】   想要的域名
 1.23.3.4  mariadb.service.app

next-terminal 使用nginx反代,文档里的示例在某些情况下websocket连接有问题。

location / {
    proxy_pass http://127.0.0.1:8088/;
    proxy_set_header Host      $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
# 必须添加` proxy_http_version 1.1;`,否则代理Fly.io时Wss连接会出问题,无法SSH连接到VPS。
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
}

dushixiang/guacd:latest 是用于连接RDP、VNC、等图形协议的。

新建的管理员不能导出备份文件是一个已知的bug,尚未处理。

镜像二合一已经测试的项目

  • SSh连接远程服务器
  • SSH 连接上传文件
  • VNC连接vps,我在搬瓦工VPS测试过,可以连接,但显示字体有问题,我不用vnc,这个没管。

@dushixiang 新建管理员不能导出你既然已经知道,这个问题可以关闭,我就不关了。