Skip to content

连接配置参考

连接配置是 CLI 侧、kubeconfig 风格的文件,描述如何访问 remote cornus server: 一组命名 context,每个包含 endpoint、credential、TLS material 和可选 in-cluster port-forward target。它位于开发者机器,server 永远不会读取它 (server 使用独立的、位于 data directory 的 server-side config) 。

通常应使用 cornus config 管理此文件,而不是手工编辑;此处记录其格式。Canonical source of truth 是 pkg/clientconfig/clientconfig.go

文件位置

默认路径位于 platform user config directory 下的 cornus/config.yaml:

  • Linux/BSD: ~/.config/cornus/config.yaml
  • macOS: ~/Library/Application Support/cornus/config.yaml
  • Windows: %AppData%\cornus\config.yaml

显式设置的 $XDG_CONFIG_HOME所有 OS 上均被遵循 (为采用 XDG 的用户提供 opt-in) : 此时文件为 $XDG_CONFIG_HOME/cornus/config.yaml。全局 --config-file flag 和 CORNUS_CONFIG environment variable 完全覆盖此路径。

文件包含 bearer token 和 key path,因此以 0700 directory 下的 0600 mode 写入。缺失文件不是 error——CLI 将其视为空 config。

示例配置

yaml
current-context: staging
contexts:
  local:
    server: http://127.0.0.1:5000

  remote-docker:
    # 不使用静态服务器 URL: 通过 SSH 将 HTTP 传送到远程回环监听器。
    ssh-tunnel:
      addr: devbox
      user: ops
      remote-addr: 127.0.0.1:5000

  staging:
    server: https://cornus.staging.example.com
    # 这个环境里的镜像都基于 Debian; 优先尝试 bash。
    shells:
      - /bin/bash
      - /bin/sh
    key-auth:
      identity-file: /home/alice/.ssh/id_ed25519
      key-fingerprint: SHA256:example
      name: alice-laptop
    tls:
      ca-cert: /etc/cornus/staging-ca.pem
    conduit:
      mode: socks5
      socks5:
        listen: 127.0.0.1:1080
        service-host-suffix: .cornus.internal
      ingress:
        mode: emulate
        certificates:
          - certificate: /etc/cornus/web.pem
            key: /etc/cornus/web-key.pem

  prod-cluster:
    # No static server URL: dial the in-cluster Service via port-forward.
    port-forward:
      kube-context: prod
      namespace: cornus
      service: cornus
      remote-port: 5000
    kube-auth:
      audience: cornus
      expiration-seconds: 3600
    registry-host: registry.prod.example.com:5000

File

顶层 document。

FieldType默认值说明
current-contextstring未给出 --context flag 时使用的 context。空表示“未选 context”;CLI 随后依赖每 command flag 与 environment variable。
contextsmap[string]Context以名称为 key 的 connection profile。

Context

一个命名 remote endpoint,包含访问它所需 credential 与 transport setting。

FieldType默认值说明
serverstringcornus server base URL (例如 https://cornus.example.comhttp://127.0.0.1:5000) 。设置 port-forwardserver 为空时,CLI forward 至 in-cluster Service,并改为 dial local end。
registry-hoststring从 server 派生覆盖 build image tag 与 deploy pull ref 所带的 host[:port]。通常为空,此时 CLI 向 server 请求 (GET /.cornus/v1/info) ,再 fallback 到 server endpoint host。仅在 server 无法 introspect 的 topology 设置。
tokenstringCORNUS_TOKEN env作为 Authorization: Bearer 发送的 bearer token / JWT。空时回退到 CORNUS_TOKEN environment variable。
tlsTLSsystem defaultHTTPS endpoint 的可选 custom-CA / mTLS / insecure setting。
port-forwardPortForward设置时,CLI 在 dial 前 forward 至的 in-cluster Service。
kube-authKubeAuth设置时,从 cluster (经 Kubernetes TokenRequest API 的 short-lived ServiceAccount token) 派生 bearer token,而非 static token。优先于 token,但低于显式 CORNUS_TOKEN override。
key-authKeyAuth设置时,证明持有已注册的 SSH 密钥并签发短期会话。优先于 kube-authtoken,但低于 CORNUS_TOKENkey-authkube-auth 互斥。
via-serverbool (nullable)unset (direct)强制 workload stream operation (compose log、port-forward) 经 cornus server proxy,而非 CLI 用开发者 kubeconfig 直接访问 workload pod。仅对 cluster profile 有意义。最低优先级,低于 CORNUS_VIA_SERVER env var 和 --via-server flag。仅改变 transport,不禁用 kube-auth token minting。
conduitConduitport-forwardClient session 向调用方暴露 deployment port 的方式。最低优先级,低于 CORNUS_CONDUIT env var 和 --conduit flag。见网络与 conduit
ssh-tunnelSSHTunnelserver 为空时,通过 SSH 访问 cornus 服务器。这相当于主机后端的 port-forward;两种自动传输方式互斥。显式的 server 会使此块失效。
tunnelTunnel公共隧道 (cornus tunnelcornus ingress-tunnel) 的默认值,避免每次调用都重复指定。
shells字符串列表通过此配置到达的工作负载的交互 shell 候选,按优先顺序排列。由 cornus web 的终端读取,它先探测工作负载自身的 x-cornus-shells:,然后是这些,最后才是浏览器自己的列表。每个条目是命令字符串而不是预先切分好的参数列表 (/bin/busybox sh 是一个条目)。安全敏感: 它指定了一个会在你的工作负载内部执行的二进制文件,因此项目覆盖只有在受信任时才能提供它。

KeyAuth

选择用于短期 Cornus 客户端会话的 SSH 签名者。配置文件只保存路径与公钥指纹,绝不保存私钥内容或签发的会话令牌。

FieldType默认值说明
identity-filestring本地 SSH 私钥路径。加密密钥使用常规交互式输入或 SSH_ASKPASS
key-fingerprintstringSHA256 公钥指纹。没有私钥文件时从 SSH_AUTH_SOCK 选择密钥;有文件时固定预期公钥,并允许后台代理在不解锁密钥的情况下查询会话缓存。
namestring指纹易读的注册名称及生成的调用方身份。
scopestringapi请求的会话 scope。
ttlstring1h请求的 Go duration 格式有效期,最长 24h

Conduit

Context 的 session conduit preference: mode 以及 SOCKS5 proxy setting。

FieldType默认值说明
modestringport-forwardport-forward (每 port automatic forwarding,Compose-like) 或 socks5 (单个 client-side SOCKS5 split-tunnel proxy) 。
socks5Socks5调整 SOCKS5 proxy;仅在 modesocks5 时使用。
ingressIngress配置原生或模拟的 ingress 处理以及可选的用户提供服务器证书。

Socks5

配置 SOCKS5 split-tunnel proxy。

FieldType默认值说明
listenstring127.0.0.1:1080Proxy bind 的 local address。
service-host-suffixstring.cornus.internal构造日常默认 resolution rule: 带此 suffix 的 CONNECT host 被剥离为 service name 并 tunnel 向内,其余直接 egress。设置 resolve 时忽略。
resolve[]ResolveRule完全替代 suffix 默认行为的高级、有序 resolution rule list;首个匹配 rule 获胜。
bare-service-namesbool (nullable)enabled是否将命名 live service 的 bare、single-label host (例如 web,除了 web.cornus.internal) 向内路由。若 service name 会遮蔽应直接访问的真实 single-label host,设为 false 禁用。

SSHTunnel

描述用于访问远程容器主机上 cornus 服务器的 SSH 连接。该传输与后端无关——它承载的是通往 cornus 服务器的原始字节,因此同一个块可以原封不动地访问 dockerhostcontainerdbareincus 服务器。配置后,普通命令会透明使用它,无需逐个命令指定隧道 flag。addr 可以是 ssh_config 主机 alias,因此除非 no-ssh-config 将其禁用,否则会继续应用常规的用户、端口、身份、代理和主机密钥设置。

字段类型默认值说明
addrstringSSH 目标: ssh_config Host alias 或字面量 host[:port]
userstringssh_config,然后是当前用户SSH 登录用户。
remote-addrstring127.0.0.1:5000从远程主机看到的 Cornus 监听地址。
identity-filestringSSH agent / ssh_config用于公钥身份验证的显式 PEM 私钥路径。
no-agentboolfalse禁用通过本地 SSH_AUTH_SOCK 进行身份验证。
known-hostsstringssh_config,然后是 ~/.ssh/known_hosts用于主机密钥验证的显式 known_hosts 文件。
host-keystring将预期的一个主机密钥固定为 authorized_keys 格式的一行。
insecure-host-keyboolfalse禁用主机密钥验证。仅供开发使用。
remote-tlsboolfalse通过 SSH 隧道使用 HTTPS,因为远程 cornus 进程会终止 TLS。通常与 tls.server-name 配合使用。
no-ssh-configboolfalse跳过用户和系统 SSH 配置文件;仅使用此块中的显式字段。
use-ssh-binaryboolauto强制使用持久的 ssh -N -L 回退传输。当解析后的主机带有 ProxyCommand 时,Cornus 会自动选择它,并遵循包括 Match 在内的完整 OpenSSH 配置。

Ingress

配置通过 SOCKS5 conduit 访问的 ingress。其证书规则还会在原生 Kubernetes 部署 (包括分离部署) 之前用于创建并接入托管 TLS Secret;此具体化过程无需 conduit 保持运行。

字段类型默认值说明
modestringoffnative 使用集群 ingress controller;emulate 在本地终止 ingress;空或 off 禁用 ingress 处理。
controllerIngressController自动发现原生 ingress controller Service 覆盖。
ca-filestring自动生成用于签发 emulate 模式回退叶证书的 CA 证书。必须与 ca-key-file 配对。
ca-key-filestring自动生成ca-file 配对的私钥。
certificates[]IngressCertificate模拟 ingress 与原生 ingress 共用的有序用户提供服务器证书规则。

Tunnel

公共隧道的按配置文件默认值。它不保存任何凭据——只保存其路径——因此被共享或提交到仓库的配置文件绝不会泄露 authtoken。

类型默认值含义
authtoken-filestring保存隧道后端凭据的文件路径,用作 --authtoken-file 的默认值。为空表示每次运行时传入,或依赖服务器自身的默认值 (服务器环境中的 CORNUS_TUNNEL_AUTHTOKEN)。
ingress-host-modestringautocornus ingress-tunnel--host-mode 默认值: autopassthroughaliasrewrite。参见 Host 处理

显式 flag 始终优先于这些默认值。cornus setup会在探测服务器实际能够托管的能力后,提示你填写它们。

IngressCertificate

字段类型默认值说明
patternstring证书 DNS SAN精确 DNS 名称或形如 *.example.com 的单标签通配符。显式 pattern 必须被证书 SAN 覆盖。精确规则优先于通配符;通配符之间以最长后缀优先。
certificatestringPEM 证书链路径。必须与 key 一起指定。
keystring匹配的 PEM 私钥路径。必须与 certificate 一起指定。

对于模拟 ingress,SNI 选择规则,未匹配的名称使用已配置或已生成的回退 CA。对于原生 Kubernetes ingress,每个显式的具体 ingress host 都必须匹配一条规则。Cornus 会将选择同一证书的 host 分组,创建由工作负载 Deployment 拥有的稳定 kubernetes.io/tls Secret,在证书轮换时更新它们,将它们接入 Ingress,并删除已过时的托管 Secret。使用托管证书时,必须将自动派生的 host 和 @ token 展开为具体主机名。

由于原生具体化会在部署请求中发送私钥字节,因此 Cornus 仅允许通过 HTTPS、SSH 隧道 / custom dialer 或回环上的明文 HTTP (包括本地 Kubernetes 端口转发) 发送。它会在序列化请求之前拒绝远程明文 HTTP。

IngressController

字段类型默认值说明
kube-contextstring配置文件的集群 context用于原生 controller 端口转发的 kubeconfig context。
namespacestringingress controller Service 所在的 namespace。
servicestring自动发现ingress controller Service 名称。
http-portint自动发现Controller HTTP Service port。
https-portint自动发现Controller HTTPS Service port。

ResolveRule

一条 SOCKS5 resolution rule。

FieldType默认值说明
patternstring用于测试 host:port CONNECT subject 的 regexp。
replacestring产生 service:port 的 template (接受 sed-style \1 backreference) 。

TLS

HTTPS endpoint 的 client-side TLS material。未设置任何内容时,Config() 返回 system default。client-certclient-key 必须同时设置。

FieldType默认值说明
ca-certstringsystem trust store验证 server certificate 的 PEM CA bundle path,适用于 server CA 不在 system trust store 的情形。
server-namestringURL 主机名覆盖 SNI 和证书主机名,例如 remote-tls 通过 127.0.0.1 访问带证书的服务器时。
insecure-skip-verifyboolfalse禁用 server certificate verification。仅测试。
client-certstringmTLS 的 PEM client certificate path。
client-keystringmTLS 的匹配 PEM client key path。

Server 侧 mTLS 和 bearer authentication 见安全与认证

PortForward

Dial 前要 forward 至的 in-cluster Service (由 CLI service-forwarder 消费) 。

FieldType默认值说明
kube-contextstringcurrent kube context要使用的 kubeconfig context。
namespacestringService namespace。
servicestring要 forward 的 Service name。
remote-portintService port;CLI 将其解析为 ready backing pod 及其 target port。

KubeAuth

作为 cornus bearer credential 签发的 cluster-issued ServiceAccount token。

FieldType默认值说明
kube-contextstringport-forward block 值要针对其签发的 kubeconfig context。
namespacestringport-forward block 值ServiceAccount namespace。
service-accountstring要为其签发 token 的 ServiceAccount。
audiencestringToken audience。必须匹配 server 的 CORNUS_JWT_AUDIENCE
expiration-secondsint64cluster default请求的 token lifetime。

TokenExchange

通过 OAuth 2.0 Token Exchange,把上面各字段产生的凭据换成短期的 Cornus 凭据,并在命令之间缓存。

字段类型默认说明
enabledboolfalse执行交换。
scopestring收窄签发的凭据 (例如 registry:pull)。留空则接受服务器 scope map 所授予的全部内容。
sh
cornus config set-context cluster \
  --pf-namespace cornus --pf-service cornus --pf-remote-port 5000 \
  --kube-auth-service-account cornus-client --kube-auth-audience cornus \
  --token-exchange --token-exchange-scope registry:pull
  • 它与哪个字段产生了 subject token 无关,因此集群 ServiceAccount token、OIDC token 和静态 token 都以相同方式交换。
  • scope 只能收窄。服务器策略未授予的 scope 会被拒绝,而不是被悄悄缩减 —— 因此固定了 scope 的 profile 在其下策略发生变化时会明确失败,而不是无声地获得访问权。
  • key-auth profile 不受影响: 该凭据本就由 Cornus 签发并标明其 scope,没有可交换的内容。
  • 没有 exchange endpoint 的服务器 (较旧的 Cornus,或未配置 JWT/JWKS verifier 的服务器) 不算错误。凭据会像以前一样直接发送。

签发的凭据会被缓存,因此交换按 token 生命周期发生一次,而不是每条命令一次;参见 CORNUS_TOKEN_CACHE

项目 context 覆盖

项目可以放置 bare Context 文档,文件名为 cornus-context.jsoncornus-context.yamlcornus-context.ymlcornus-context.toml。Cornus 从工作目录向上搜索,使用最近的文件,并在仓库根目录或主目录停止。其字段会覆盖选定的已存 context;显式命令 flag 和环境变量仍优先。未选择已存 context 时,它也可以提供连接。

yaml
server: https://cornus.staging.example.com
via-server: true
conduit:
  mode: socks5

显式指定文件请使用 --context-file PATHCORNUS_CONTEXT_FILE=PATH。显式指定的文件不存在会报错。--no-context-file 会禁用发现,且不能与 --context-file 一起使用。

信任边界

自动发现的文件是工作树输入,而非受信任的 credential store。默认仅应用 via-server;endpoint、token、TLS、registry、port-forward、kube-auth、SSH-tunnel、conduit 和 shells 设置都会忽略。在 Unix 上,Cornus 还会忽略由其他用户拥有的文件,或位于 world-writable 且 non-sticky 目录中的文件。

shells 虽不携带任何凭证,却也在被剥除之列: 它指定了 web 终端在你的工作负载内部执行的二进制文件,而任何能提交 pull request 的人都能写入的文件不应替你做这个选择。

仅在信任工作树时使用 --trust-context-file / CORNUS_TRUST_CONTEXT_FILE=1。显式命名的 --context-file 也会受信任。改变 endpoint 的覆盖必须提供自己的 tokenkube-auth;否则会丢弃选定 context 的 credential。Cornus 会在跳过或剥离项目覆盖时发出警告。

另请参阅

Released under the Apache-2.0 License.