标签 Linux 下的文章

Go 1.25新提案:GOMAXPROCS默认值将迎Cgroup感知能力,终结容器性能噩梦?

本文永久链接 – https://tonybai.com/2025/04/09/gomaxprocs-defaults-add-cgroup-aware

Go官方出手!新提案自动优化容器内GOMAXPROCS,告别性能噩梦!

在Kubernetes等容器环境中运行Go应用时,一个常见的性能陷阱悄然存在:默认的GOMAXPROCS值基于节点CPU核心数,而非Pod的CPU限制(limit),导致资源争抢和性能下降。近期一篇广受关注的博客文章“Golang Performance Penalty in Kubernetes”通过实测数据揭示了这一问题带来的显著延迟增加(高达65%+)和吞吐量降低(近20%)。

不过近期,Go核心团队带来一则好消息,Go Runtime团队的Michael Pratt已正式提出一项提案(#73193),旨在让Go运行时默认感知Linux Cgroup的CPU quota限制并自动调整GOMAXPROCS值,该提案有望在Go 1.25中为开发者带来开箱即用的性能优化,告别在容器或Kubernetes中手动配置GOMAXPROCS的烦恼。

在这篇文章中,我会对当前GOMAXPROCS默认值在云原生环境引发的性能问题以及Pratt的提案做一个详细说明,供广大Gopher们参考。

1. 容器中GOMAXPROCS的“水土不服”与性能代价

Go 1.5版本起,GOMAXPROCS默认设置为“可用的CPU核心数”(综合考虑机器核心数和CPU亲和性设置)。这在单租户或资源不受严格限制的环境下工作良好。然而,在普遍使用Cgroup进行资源隔离的容器化部署场景中,这一默认行为却常常与Pod的实际CPU限制limits.cpu)产生严重错位,引发一系列性能问题。

想象一下:一个Go应用部署在拥有32个vCPU的K8s节点上,但其Pod的limits.cpu被设置为1。Go运行时看到的是32核,于是默认将GOMAXPROCS设为32。这意味着Go运行时会尝试并发运行多达32个操作系统线程来执行Go代码,而Kubernetes(通过Cgroup的CPU Quota机制)却严格限制该Pod在每个调度周期内(如100ms)只能使用相当于1个CPU的计算时间。

这会带来什么后果? 正如Mansoor Majeed在其博客文章《Golang Performance Penalty in Kubernetes》中通过基准测试所生动展示的:

  • 过度的上下文切换

32个活跃的Go线程争抢远少于此的可用CPU时间片(在此例中仅相当于1个CPU的时间),迫使操作系统内核进行大量、且低效的线程上下文切换。在他的测试中,错误配置GOMAXPROCS的场景下,上下文切换次数(context_switches_total)相比正确配置时飙升了近4倍(从约6.5k/s 增加到30k/s)。

  • CPU配额扼杀(Throttling)与调度延迟

应用(尤其CPU密集型任务,如博客中的Fibonacci计算)的并发线程迅速耗尽Cgroup分配的CPU时间配额(cpu.cfs_quota_us)。一旦耗尽,内核将强制暂停该Cgroup内所有线程的执行,直到下一个调度周期(cpu.cfs_period_us)开始。这直接导致了请求处理的延迟尖峰。博客中的”Process Schedule Stats”图表也显示,错误配置下,进程等待CPU的时间(Waiting for CPU)出现了高达34秒的峰值,而正确配置下仅约900毫秒。

  • 应用性能显著下降

过度的上下文切换和频繁的CPU Throttling共同作用,导致应用端到端的性能大幅降低。博客的wrk基准测试显示,在CPU密集场景下,与正确设置GOMAXPROCS=1相比,使用默认GOMAXPROCS=32(基于节点而非Pod限制)导致的性能下降如下图所示:

我们看到:平均请求延迟增加了65% (从 20ms 上升到 33ms),最大请求延迟增加了82% (从255ms飙升到465ms)。整体RPS (每秒请求数) 下降了近20% (从50213减少到40356)。

  • GC 放大问题

Go的并发垃圾回收器(GC)的工作量与GOMAXPROCS挂钩。GC目标是使用25%的P(对应GOMAXPROCS数量)进行后台标记工作,并在空闲的P上运行额外的 idle worker。过高的GOMAXPROCS会导致GC期间产生远超实际可用CPU资源的并发请求,极易触发或加剧CPU配额扼杀,即使在非GC期间应用本身运行平稳。极端情况下,由于内核调度,可能出现大量GC worker同时运行,短暂“冻结”用户goroutine的执行。

  • 运行时扩展性成本

运行更高的GOMAXPROCS会带来额外的运行时开销,例如每个P的本地缓存(如mcache)导致的内存占用增加,以及P之间进行工作窃取、GC协调等所需的同步成本。当GOMAXPROCS远大于实际可用CPU时,这些成本被白白支付,却无法带来相应的并行处理收益。

容器中GOMAXPROCS默认设置为节点CPU数量这个问题在Go社区存在已久,相关讨论见于#33803。目前,开发者通常采用以下方式规避:

  • 手动设置环境变量

比如:在Kubernetes Deployment YAML中,通过valueFrom: resourceFieldRef将GOMAXPROCS环境变量显式设置为Pod的limits.cpu值,下面是一个示例:

spec:
  containers:
  - name: my-go-app
    image: my-go-app:latest
    env:
    - name: GOMAXPROCS
      valueFrom:
        resourceFieldRef:
          # Ensure the resource name matches your limit spec
          resource: limits.cpu
          # Use divisor 1 for whole cores, or adjust if using millicores
          # and need integer conversion logic (though GOMAXPROCS needs integer)
          # Often, just referencing limits.cpu works if it's a whole number.
          # For fractional limits resulting in non-integer GOMAXPROCS,
          # manual calculation or automaxprocs might be better.
          divisor: "1"
    resources:
      limits:
        cpu: "2" # Example limit
      requests:
        cpu: "100m"
  • 使用第三方库

在Go代码中引入如uber-go/automaxprocs这样的库,它会在应用启动时自动检测Cgroup v1或v2的CPU限制,并相应地调用runtime.GOMAXPROCS()进行设置。

import _ "go.uber.org/automaxprocs"

func main() {
    // automaxprocs automatically adjusts GOMAXPROCS during init
    // ... rest of your application
}

虽然有解决方案,但这需要开发者意识到问题的存在并主动采取措施,增加了配置负担和潜在的疏漏风险。近期Go官方终于有针对此问题的动作了,我们来详细看看官方的方案。

2. 官方提案:让GOMAXPROCS自动适配CPU Limit

为了一劳永逸地解决这个问题,并提供更优的开箱即用体验,Go核心团队成员pratt在#73193中提出了一个具体的解决方案,旨在将Cgroup CPU limit感知能力内置到Go运行时中。下面也简单说一下Pratt给出的方案的核心机制,包括以下几点:

  • 自动检测CPU Limit

在程序启动时,如果用户未通过环境变量GOMAXPROCS指定值,Go运行时(仅在Linux 上)将主动检测以下三项:

(a) 机器的总CPU核心数: 通过runtime.NumCPU()的底层机制获取。
(b) CPU亲和性限制: 通过sched_getaffinity(2) 系统调用获取当前进程允许运行的CPU核心集合大小。
(c) Cgroup CPU Quota限制: 运行时会查找进程所属的Cgroup层级结构(支持v1和v2,以及混合模式)。对于每一层级,它会读取cpu.cfs_quota_us 和cpu.cfs_period_us(v1) 或cpu.max(v2) 文件。计算出每一层的CPU limit(等效核心数=quota/period)。最终取整个层级路径上的最小值作为该进程的“有效CPU limit”。

  • 计算新的默认GOMAXPROCS

新的默认GOMAXPROCS值将是上述(a)、(b)、(c)三者计算结果中的最小值。特别地,由(c)计算出的Cgroup limit值在用于最终比较前会经过一个调整:adjusted_cgroup_limit = max(2, ceil(effective_cpu_limit))。即,先向上取整,然后确保结果至少为2。

  • 自动更新

为了适应CPU限制或亲和性可能在运行时发生变化的情况(例如 Kubernetes的 “in place vertical scaling” 特性允许动态调整Pod的limits.cpu),Go运行时将引入一个后台机制(可能在sysmon协程中实现),以较低频率(例如,提案建议最小周期30秒,最长1分钟)定期重新检查CPU亲和性设置和Cgroup的CPU quota文件。如果检测到变化导致计算出的默认GOMAXPROCS值改变,运行时将自动调用内部的GOMAXPROCS设置函数进行更新。

  • 引入新的API

该提案还引入了一个新的公共API:runtime.SetDefaultGOMAXPROCS()。调用此函数会立即触发一次上述默认值的计算和设置过程,忽略GOMAXPROCS 环境变量的影响。这可以用于覆盖启动时通过环境变量设置的值,恢复到运行时自动检测的行为。同时,在得知外部环境(如Cgroup 配置)发生变化后,主动强制进行一次更新,而不必等待后台的自动扫描。

  • 兼容性控制

这是一个可能改变现有程序行为的变更。为了提供平滑的过渡和控制能力,该新行为将由一个GODEBUG标志cgroupgomaxprocs=1控制。根据Go的GODEBUG兼容性策略,对于go.mod文件中指定的Go语言版本低于引入该特性的版本(预计是Go 1.25),该标志默认为0 (禁用新行为,保持现状)。只有当项目将其go.mod中的Go版本升级到1.25或更高时,默认值才会变为1 (启用新行为)。开发者仍然可以通过设置GODEBUG=cgroupgomaxprocs=0 来显式禁用新行为。

3. 其他设计考量与细节

经过#33803几年的讨论,Pratt在新提案中也谈及了一些设计考量和细节,这里也就一点典型的问题做一下梳理:

  • 为何是Limit而非Shares/Request?

Cgroup的cpu.shares(v1)或cpu.weights(v2)(对应Kubernetes的CPU Request)定义的是资源竞争时的相对优先级,而不是硬性的CPU使用上限。当系统负载不高时,仅设置了Request 的容器可能使用远超其Request值的CPU。因此,Shares/Weights不适合作为限制并行度的GOMAXPROCS的依据。Java和.NET在其运行时中进行容器资源感知的实践也得出了类似的结论,它们都选择基于CPU Quota(Limit)。

  • 处理分数Limit(Rounding)

Cgroup Quota可以设置成分数形式(如limits.cpu:”1500m”对应1.5核)。由于GOMAXPROCS必须是整数,提案选择向上取整 (ceil)。例如,1.5会变成2。这样做的考虑是,允许应用利用Cgroup提供的突发能力,并且可能更好地向监控系统指示CPU饥饿状态。然而,这与uber-go/automaxprocs默认向下取整 (floor) 的策略不同。后者认为分数部分的配额可能是为容器内的辅助进程(如sidecar、监控agent)或C库线程预留的,向下取整更保守,避免Go进程完全用尽配额。这是一个开放的讨论点,最终实现可能会根据社区反馈调整。

  • 最小值为2的理由

提案建议将通过Cgroup limit计算出的值(向上取整后)与2比较,取较大者。即,即使CPU limit小于1(如0.5),最终也会至少设置为2。这样做的主要原因是GOMAXPROCS=1会完全禁用Go调度器的并行性,可能导致一些意想不到的性能问题或行为怪异,例如GC worker可能在运行时暂时“暂停”用户Goroutine(因为只有一个P可以运行,需要在用户代码和GC代码间切换)。设置至少为2可以保留基本的并行能力,更好地利用Cgroup允许的突发性。当然,如果物理核心数或CPU亲和性限制本身就是1,那么根据前面的计算规则,最终GOMAXPROCS仍然会是1。

  • 日志

与automaxprocs提供可选的日志输出不同,该提案的内置实现默认不打印关于GOMAXPROCS被自动调整的日志信息,以保持运行时输出的简洁性。

4. 小结

这项针对Go运行时的提案(#73193) 若能在Go 1.25实现,将为容器化环境中的Go应用带来实质性改进。其核心优势在于开箱即用的性能优化:通过自动将GOMAXPROCS与Cgroup CPU Limit对齐,避免了因配置不当导致的常见性能瓶颈(如高延迟、低吞吐)。这将极大简化开发者的运维工作,无需再手动设置GOMAXPROCS或依赖automaxprocs等第三方库。同时,其自动更新机制也使应用能更好地适应K8s等平台的动态资源调整。

当然,该提案并非万能。它主要解决了设置了CPU Limit的场景。对于仅设置CPU Request(旨在利用空闲资源)的Pod,此变更目前不会带来直接改善,GOMAXPROCS仍将基于节点或亲和性设置。如何优化这类场景下的资源利用率,仍是未来值得探索的方向。

总而言之,#73193提案是Go社区直面云原生环境中一个长期痛点的关键举措。它有望将更智能、更自动化的资源感知能力内置到运行时,显著提升Go应用在容器中的默认性能表现和易用性。我们期待该提案的最终落地,并建议开发者关注其后续进展。

你是否也在K8s中遇到过GOMAXPROCS的困扰?欢迎在评论区分享你的经验和看法!

5. 参考资料


Gopher部落知识星球在2025年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。并且,2025年将在星球首发“Gopher的AI原生应用开发第一课”、“Go陷阱与缺陷”和“Go原理课”专栏!此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格6$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily
  • Gopher Daily Feed订阅 – https://gopherdaily.tonybai.com/feed

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

Go安全版图再添利器:OpenPubkey SSH开源,用SSO彻底改变SSH认证

本文永久链接 – https://tonybai.com/2025/03/31/openpubkey-ssh-open-source

对于许多开发者和运维工程师而言,管理SSH密钥是一项繁琐且易出错的任务。正如SSH发明者、芬兰计算机科学家Tatu Ylonen所指出的,许多组织中过时授权密钥的数量甚至远超员工人数,这带来了巨大的安全隐患。现在,一个基于Go语言生态的创新项目——OpenPubkey SSH (OPKSSH),旨在彻底改变这一现状。近日,随着Cloudflare将OPKSSH代码捐赠给Linux基金会下的OpenPubkey项目并将其开源,开发者们终于可以拥抱一种更便捷、更安全的SSH认证方式:使用熟悉的单点登录(SSO)系统。本文将简要介绍OPKSSH项目及其技术基石OpenPubkey技术。

1. 核心看点:OPKSSH 开源与价值解读

OPKSSH (OpenPubkey SSH) 是一个巧妙的工具,它将OpenID Connect (OIDC) 等现代SSO技术与SSH协议集成起来,其核心目标是消除手动管理和配置SSH公私钥的需求,同时不引入除身份提供商(IdP)之外的任何新的可信第三方

此前,虽然底层的OpenPubkey协议已于2023年成为Linux基金会的开源项目,但OPKSSH作为BastionZero(现已被Cloudflare收购)的产品,一直是闭源的。Cloudflare的此次捐赠,使得整个OpenPubkey技术栈的关键应用层实现也完全开放,这对于Go社区和整个基础设施安全领域都是一个重要进展。

2. OPKSSH解决了什么痛点?

通常,我们在进行远程服务器管理和运维操作时会使用SSH免密登录,即通过生成SSH密钥对并将公钥复制到远程服务器来实现。但这种传统方式的SSH密钥管理存在诸多问题:

  • 密钥分发与轮换困难:需要手动将公钥部署到目标服务器,密钥泄露或员工离职后的吊销流程复杂。
  • 长期密钥风险:长期存在的私钥增加了泄露风险,一旦泄露,影响范围广。
  • 可见性差:难以清晰追踪谁拥有对哪些服务器的访问权限,公钥本身缺乏身份信息。

这些问题常常困扰企业的IT运维团队和安全管理人员,他们需要确保访问控制的安全性和可管理性,同时降低操作复杂性和人力成本。

那如何解决这些问题呢?OPKSSH带来了新的解决方案。

3. OPKSSH如何解决这些问题?

OPKSSH基于OpenPubkey协议,带来了革命性的改进:

  • 使用临时性密钥(Ephemeral Keys)提升安全性

OPKSSH使用按需生成的临时SSH密钥对取代长期密钥。用户通过SSO登录后,OPKSSH自动生成有效期较短(默认为24小时,可配置)的密钥。这大大缩短了密钥泄露的风险窗口。

  • 通过单点登录(SSO Login)增强易用性

用户只需运行opkssh login,通过熟悉的IdP (如Google, Azure AD等) 进行SSO认证,即可自动获取所需的SSH密钥。无需手动生成、复制或管理私钥文件,即可在任何安装了opkssh的机器上进行SSH连接。

  • 通过Identity-based Auth提升可见性与简化管理

授权不再基于难以管理的公钥列表(比如~/.ssh/known_hosts),而是基于易于理解和审计的用户身份(如Email地址)。管理员只需在服务器配置中指定允许访问的电子邮件地址列表即可。

到这里你可能会问:这么好用的OPKSSH是如何工作的呢?别急,我们下面就来介绍一下OPKSSH的工作原理。

4. OPKSSH的工作原理

Cloudflare的文章中有一个很好的介绍Opkssh工作原理的例子和示意图,这里也借用过来:

如图所示,当用户alice@example.com使用OPKSSH登录服务器,这个过程大致如下:

  • 用户本地执行命令opkssh login触发OIDC流程,用户向IdP认证。
  • OpenPubkey协议介入,在OIDC流程中巧妙地将用户临时生成的公钥与用户的身份信息绑定,生成一个PK Token(本质上是一个增强的ID Token,包含了公钥信息并由IdP签名)。
  • OPKSSH将此PK Token打包进一个临时的SSH 公钥文件(利用SSH证书的扩展字段)。
  • 当用户发起SSH连接时,这个特殊的公钥文件被发送到服务器。
  • 服务器配置了AuthorizedKeysCommand指令,调用opkssh verify(OpenPubkey验证器)。
  • 验证器检查PK Token的有效性(签名、有效期、颁发者),提取公钥和用户身份(Email),并根据服务器配置判断该用户是否有权访问。

关键在于,这一切无需修改现有的SSH客户端或服务器软件本身,仅需在服务器端sshd_config中添加两行配置即可启用,这个我们在本文后面会详细说明。

OPKSSH的魔力源于其底层的OpenPubkey协议。OpenPubkey本身是一个基于Go语言实现的Linux基金会项目 (github.com/openpubkey/openpubkey)。

OpenPubkey的核心创新在于,它通过一种客户端修改的方式,将用户持有的公钥(PKu)与OIDC的ID Token进行了加密绑定,而无需 OIDC 提供商(OP)作任何修改。这是通过巧妙利用OIDC流程中的nonce参数实现的。客户端不再生成完全随机的nonce,而是生成一个包含其公钥等信息的客户端实例声明(cic),并将cic的哈希值作为nonce发送给OP。OP在签发ID Token时会包含这个nonce。这样,最终得到的PK Token就同时承载了OP 对用户身份的认证以及用户对其公钥的所有权声明(通过客户端的额外签名防止身份误绑定攻击)。

这一机制将OIDC的认证模型从持有者认证(Bearer Authentication) 升级到了持有证明(Proof-of-Possession, PoP)。在Bearer模型下,任何窃取到ID Token的人都可以冒充用户;而在PoP模型下,用户需要证明自己持有与PK Token中公钥对应的私钥,从而有效抵御令牌重放(Token Replay)令牌泄露(Token Export) 攻击,安全性显著提高。

OpenPubkey的设计还考虑了可扩展性,例如引入MFA-Cosigner概念,可以进一步增强安全性,甚至在OP本身被攻陷的情况下也能提供保护。关于OpenPubkey协议设计的详细内容,可以参见参考资料中OpenPubkey的论文,这里就不赘述了。

了解了原理之后,下面我们来实际验证一下opkssh通过IdP实现SSO一键登录服务器的效果。

5. 使用opkssh实现免密登录服务器

这次验证的环境是这样的:

  • 客户端:macOS
  • 服务端:Ubuntu 22.04.1 LTS
  • IdP:microsoft (注:国内访问microsoft的服务器成功率高)

我们先来看看客户端的操作步骤:

5.1 opkssh在客户端的操作

首先在客户端安装opkssh,你可以选择直接下载编译好的opkssh二进制文件:

$curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-osx-amd64 -o opkssh; chmod +x opkssh

由于opkssh是纯Go实现的,如果你本地有Go工具链,也可以选择通过源码安装(在国内,可能选择源码安装的速度更快):

$go install github.com/openpubkey/opkssh@latest

安装完成后,我们就来进行客户端的IdP认证。输入下面命令:

$opkssh login
INFO[0000] Opening browser to http://127.0.0.1:59638/chooser

该命令会打开本地浏览器,并展示下面页面:

截止到目前,opkssh支持选择Google、Microsoft或Gitlab作为IdP,这里我们选择Sign in with Microsoft

之后浏览器将跳转到下面页面:

这里使用我的Microsoft账号进行身份认证,点击“接受”,即完成认证,之后你可以关闭页面!

而命令行也会提示下面信息:

INFO[0002] listening on http://127.0.0.1:3000/
INFO[0002] press ctrl+c to stop
Writing opk ssh public key to /Users/tonybai/.ssh/id_ed25519.pub and corresponding secret key to /Users/tonybai/.ssh/id_ed25519Keys generated for identity
Email, sub, issuer, audience:
bigwhite.cn@hotmail.com AAAAAAAAAAAAAAAAAAAAAP5YMhbf2Ufl_eI1PdK12VE https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0 096ce0a3-5e72-4da8-9c86-12924b294a01

接下来,我们再来看看服务端要进行的操作与配置。

5.2 opkssh在服务端的操作

在要登录的服务器端安装opkssh,由于安装后还要进行一些设置,我建议直接采用opkssh项目提供的安装脚本进行安装:

$ wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash
Detected OS is debian
Created group: opksshuser
Created user: opksshuser with group: opksshuser
Downloading version latest of opkssh from https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64...
opkssh                           100%[========================================================>]  16.01M  83.4MB/s    in 0.2s
Installed opkssh to /usr/local/bin/opkssh
Configuring opkssh:
  Creating sudoers file at /etc/sudoers.d/opkssh...
  Adding sudoers rule for opksshuser...
Installation successful! Run 'opkssh' to use it.

之后我们需要修改一下服务端的sshd server的配置。SSH服务器支持一个名为AuthorizedKeysCommand的配置参数,该参数允许我们使用自定义程序来确定SSH公钥是否被授权。因此,我们通过对/etc/ssh/sshd_config文件进行以下两行更改,将SSH服务器的配置文件更改为使用OpenPubkey验证程序而不是SSH默认的验证程序:

AuthorizedKeysCommand /usr/local/bin/opkssh verify %u %k %t
AuthorizedKeysCommandUser opksshuser

然后通过opkssh添加授权的用户,这些用户登录后将具备root用户权限:

$opkssh add root bigwhite.cn@hotmail.com microsoft
Successfully added new policy to /etc/opk/auth_id

最后重启一下sshd服务:

$systemctl daemon-reload
$systemctl status sshd

5.3 ssh登录验证

注:为了避免使用之前的ssh免密登录,可以在服务端将.ssh/authorized_keys中的公钥删除!

服务端的opkssh命令行被sshd服务调用进行客户端验证时,会在/var/log/opkssh.log中打印相关日志,这也是opkssh起到作用的一个间接证明。

我在客户端依然以原先的ssh登录命令尝试登录服务器:

$ssh root@<your_server_ip>

我们在服务端opkssh.log中可以看到下面一些输出:

2025/03/29 02:57:43 /usr/local/bin/opkssh verify root AAAAKGVjZHNhLXNoYTItbDUQAAABVwZXJtaXQtWDExLWZvcndhcmRpbmcAAAAAAAAAF3Blcm1pdC1hZ2VudC1mb3J3YXJkaW5nAAAAAAAAABZwZXJtaXQtcG9ydC1mb3J3YXJkaW5nAAAAAAAAAApwZXJtaXQtcHR5AAAAAAAAAA5wZXJtaXQtdXNlci1yYwAAAAAAAAAAAAAAaAAAABNlY2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQSXO9YZhMPnGkYfnwpFu/HeX29s7q0l4lK5qCgvaeaWh3zBSidDh49Nirsu5Iwh7YVRkKMa5q+hhnJEFAh7FL5LAAAAZAAAABNlY2RzYS1zaGEyLW5pc3RwMjU2AAAASQAAACEAqD5msj3BsQhlpszOJHBoIcmK3Ex/BwyNWKHgp6labScAAAAgULO5naYi9xOmzrShcGiVIprRbdSvdWltioSVKu63h6Y= ecdsa-sha2-nistp256-cert-v01@openssh.com
2025/03/29 02:57:43 Providers loaded:  https://accounts.google.com 206584157355-7cbe4s640tvm7naoludob4ut1emii7sf.apps.googleusercontent.com 24h
https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0 096ce0a3-5e72-4da8-9c86-12924b294a01 24h
https://gitlab.com 8d8b7024572c7fd501f64374dec6bba37096783dfcd792b3988104be08cb6923 24h

2025/03/29 02:57:44 warning: failed to load user policy: failed to read user policy file /root/.opk/auth_id: error reading root home policy using command /usr/bin/sudo -n /usr/local/bin/opkssh readhome root got output Failed to read user's home policy file: failed to open /root/.opk/auth_id, open /root/.opk/auth_id: no such file or directory
 and err exit status 1
2025/03/29 02:57:44 successfully verified

之后,我就成功登录到服务器上了!

6.小结

OPKSSH 的开源是 OpenPubkey 项目和 Go 安全生态的重要里程碑。它不仅提供了一个解决 SSH 密钥管理难题的实用方案,也展示了 Go 语言在构建安全、可靠的基础设施工具方面的强大能力。

我们鼓励对安全、身份认证和 Go 开发感兴趣的开发者们:

  • 试用 OPKSSH: 在你的开发或测试环境中体验 SSO 登录 SSH 的便捷。
  • 关注 OpenPubkey 项目: Star GitHub 仓库,了解最新动态。
  • 参与社区贡献: 通过 Pull Request、Issue 反馈、参与讨论等方式为项目贡献力量。可以在 OpenSSF Slack 的 #openpubkey 频道找到社区成员,或参加每月一次的社区会议。

随着 OPKSSH 的加入和持续发展,我们期待 OpenPubkey 能够在更多场景下发挥价值,例如代码签名 (Sigstore 集成)、端到端加密通信等,进一步丰富和巩固 Go 语言在云原生和安全领域的基础设施地位。

7. 参考资料


Gopher部落知识星球在2025年将继续致力于打造一个高品质的Go语言学习和交流平台。我们将继续提供优质的Go技术文章首发和阅读体验。并且,2025年将在星球首发“Gopher的AI原生应用开发第一课”、“Go陷阱与缺陷”和“Go原理课”专栏!此外,我们还会加强星友之间的交流和互动。欢迎大家踊跃提问,分享心得,讨论技术。我会在第一时间进行解答和交流。我衷心希望Gopher部落可以成为大家学习、进步、交流的港湾。让我相聚在Gopher部落,享受coding的快乐! 欢迎大家踊跃加入!

img{512x368}
img{512x368}

img{512x368}
img{512x368}

著名云主机服务厂商DigitalOcean发布最新的主机计划,入门级Droplet配置升级为:1 core CPU、1G内存、25G高速SSD,价格6$/月。有使用DigitalOcean需求的朋友,可以打开这个链接地址:https://m.do.co/c/bff6eed92687 开启你的DO主机之路。

Gopher Daily(Gopher每日新闻) – https://gopherdaily.tonybai.com

我的联系方式:

  • 微博(暂不可用):https://weibo.com/bigwhite20xx
  • 微博2:https://weibo.com/u/6484441286
  • 博客:tonybai.com
  • github: https://github.com/bigwhite
  • Gopher Daily归档 – https://github.com/bigwhite/gopherdaily
  • Gopher Daily Feed订阅 – https://gopherdaily.tonybai.com/feed

商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



Statcounter View My Stats