分类: 安全相关

  • Debian12使用 Unbound 搭建本地 DNS 服务器

    搭建本地 DNS 服务器能够提升域名解析速度、增强网络安全和隐私保护。Unbound 作为一款高性能、轻量级且支持 DNSSEC 的递归解析器,非常适合用来搭建本地 DNS 服务。通过本地 DNS,用户不仅减少对外部服务器的依赖,还能实现更灵活的管理与控制,提升整体网络体验和安全性。

    1. 更新系统软件包

    确保你的系统软件包是最新的。执行以下命令更新软件包列表:

    apt update

    2. 安装必要的软件包

    我们需要安装 nano(一个轻量级文本编辑器),dnsutils(包含 dig 等DNS调试工具),以及 unbound DNS 服务器。

    apt install -y nano dnsutils
    apt install -y unbound

    3. 启动并启用 Unbound 服务

    安装完成后,启用 unbound 服务并立即启动:

    systemctl enable --now unbound

    4. 配置系统使用本地 DNS

    为了让系统使用刚刚搭建的本地 DNS 服务器,修改 /etc/resolv.conf 文件,将 DNS 服务器地址指向本机:

    echo "nameserver 127.0.0.1" > /etc/resolv.conf

    5. 验证 DNS 服务监听端口

    使用 ss 命令检查本地是否有进程监听 53 端口(DNS 默认端口):

    ss -lnptu | grep 53

    如果看到 unbound 在 53 端口监听,说明服务正常启动。

    6. 测试 DNS 解析功能

    使用 dig 命令向本地 DNS 服务器请求解析 debian.org 域名:

    dig @127.0.0.1 debian.org

    如果查询返回正确的 DNS 解析结果,则 DNS 服务器工作正常。

    7. 配置 Unbound

    编辑主配置文件 /etc/unbound/unbound.conf

    nano /etc/unbound/unbound.conf

    添加以下配置内容:

    server:
        interface: 0.0.0.0
        access-control: 192.168.1.0/24 allow
        cache-max-ttl: 86400
        cache-min-ttl: 3600
        num-threads: 4 # CPU
        msg-cache-size: 128m
        rrset-cache-size: 256m
        msg-cache-slabs: 4
        rrset-cache-slabs: 4
        infra-cache-slabs: 4
        key-cache-slabs: 4
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
        root-hints: "/var/lib/unbound/root.hints"
        val-clean-additional: yes
        harden-glue: yes
        harden-dnssec-stripped: yes
        hide-identity: yes
        hide-version: yes
        do-ip4: yes
        do-tcp: yes
        do-udp: yes
        tcp-upstream: yes
        prefetch: yes
        prefetch-key: yes
    • interface: 0.0.0.0
      监听的网络接口,0.0.0.0 表示监听所有可用的IPv4接口(即对所有IP开放)。
    • access-control: 192.168.1.0/24 allow
      允许来自这个网段(192.168.1.0 到 192.168.1.255)的客户端访问DNS服务。
    • cache-max-ttl: 86400
      DNS缓存的最大存活时间(TTL),单位是秒。86400秒 = 24小时。缓存中的记录不会超过这个时间。
    • cache-min-ttl: 3600
      DNS缓存的最小存活时间(TTL),单位是秒。即使记录的TTL小于这个值,也会缓存至少3600秒(1小时)。
    • num-threads: 4 # CPU
      用于DNS查询处理的线程数量,通常设置为CPU核心数,这里是4个线程。
    • msg-cache-size: 128m
      DNS消息缓存大小,128MB。缓存解析过的DNS响应消息,提升查询效率。
    • rrset-cache-size: 256m
      RRSet缓存大小,256MB。RRSet是资源记录集合,缓存DNS记录的具体数据。
    • msg-cache-slabs: 4
      将消息缓存分成4个分片,提高并发访问性能。
    • rrset-cache-slabs: 4
      RRSet缓存分成4个分片,同样为了提高并发处理性能。
    • infra-cache-slabs: 4
      基础设施缓存分片数,4个。缓存底层的基础数据,提高性能。
    • key-cache-slabs: 4
      DNSSEC密钥缓存分片数,4个。缓存验证DNSSEC所需的密钥数据。
    • auto-trust-anchor-file: “/var/lib/unbound/root.key”
      DNSSEC自动信任锚文件路径,Unbound用来验证DNSSEC签名的根信任锚。
    • root-hints: “/var/lib/unbound/root.hints”
      根服务器提示文件路径,Unbound用来查找根DNS服务器的地址。
    • val-clean-additional: yes
      启用清理额外信息的DNSSEC验证功能,增强安全性。
    • harden-glue: yes
      加固“胶记录”的安全,防止DNS缓存投毒攻击。
    • harden-dnssec-stripped: yes
      防止中间人去除DNSSEC签名,确保DNSSEC验证的完整性。
    • hide-identity: yes
      隐藏Unbound服务器的标识信息,不向外泄漏服务器名称。
    • hide-version: yes
      隐藏版本信息,避免泄露软件版本给潜在攻击者。
    • do-ip4: yes
      启用IPv4查询支持。
    • do-tcp: yes
      启用通过TCP协议进行DNS查询,UDP有时不能传输大型响应。
    • do-udp: yes
      启用通过UDP协议进行DNS查询。
    • tcp-upstream: yes
      向上游服务器发起TCP连接查询,增强可靠性。
    • prefetch: yes
      启用预取缓存功能,缓存快要过期的记录时提前刷新,减少查询延迟。
    • prefetch-key: yes
      针对DNSSEC密钥的预取缓存功能,提高验证效率。

    8. 检查配置文件正确性

    使用 unbound-checkconf 命令检查配置文件语法是否正确:

    unbound-checkconf

    如果没有错误提示,说明配置有效。

    9. 重启 Unbound 服务

    最后,重启服务使配置生效:

    systemctl restart unbound

  • IaC 安全必备利器Checkov 在 DevSecOps 流程中的实践

    随着云计算和自动化技术的快速发展,基础设施即代码(Infrastructure as Code,IaC) 已成为现代软件交付的重要组成部分。与此同时,DevSecOps 的兴起,推动安全理念前移,将安全嵌入开发和运维流程,实现安全与速度的平衡。

    在云原生和自动化时代,IaC 已是基础设施管理的基石,保障其安全性成为必然。借助 Checkov 等工具,结合 DevSecOps 的安全文化,能够有效降低配置风险,提升整体交付质量和安全韧性。推动 IaC 安全从“可选”走向“必需”,是每个现代软件团队迈向成熟的关键一步。

    1. 为什么 IaC 安全不可忽视?

    IaC 通过代码化方式管理基础设施,极大提升了自动化水平和交付效率。但这也带来了新的安全挑战:

    • 配置风险高发
      误配置如开放存储桶、过宽权限或暴露的网络端口,极易被攻击者利用。
    • 敏感信息泄露隐患
      直接在 IaC 代码中硬编码密钥、凭证,存在重大安全漏洞。
    • 合规压力持续增加
      必须满足内部政策与行业法规要求,确保基础设施符合安全规范。
    • 快速部署带来的风险扩散
      自动化频繁部署导致漏洞迅速扩散,若未及时发现,后果严重。

    因此,在 DevSecOps 体系中,必须对 IaC 实施自动化安全扫描,实现“安全左移”,及早识别并修复安全隐患。

    2. Checkov:IaC 静态安全扫描利器

    Checkov 是一款开源的 IaC 静态分析工具,广泛支持主流 IaC 格式和云平台,帮助开发者和安全团队在代码层面发现潜在风险。

    主要功能亮点:

    • 支持多种 IaC 格式:Terraform、CloudFormation、Kubernetes YAML、ARM 模板、Serverless、Helm charts、Dockerfile 等。
    • 针对 AWS、Azure、GCP 等主流云平台内置丰富的安全合规策略。
    • 拥有数百条预置检测规则,覆盖常见安全漏洞和最佳实践。
    • 易于集成,适配本地开发环境和 CI/CD 流水线,实现自动化扫描。

    通过 Checkov,团队能够快速定位配置风险,防止漏洞进入生产环境。

    3. 快速上手 Checkov

    安装

    pip install checkov

    验证

    checkov --version

    扫描示例

    • 扫描单个文件:
    checkov -f main.tf
    • 扫描整个项目目录:
    checkov -d .

    4. 将 Checkov 深度融合到 DevSecOps 流程

    • 早期预警
      鼓励开发者本地运行 Checkov,尽早发现和修复安全问题。
    • CI/CD 自动化
      将 Checkov 作为流水线必经环节,扫描未通过即阻断合并或部署,确保安全代码上线。
    • 持续优化
      定期分析扫描报告,提炼常见风险,持续完善 IaC 模板和安全策略。
    • 跨团队协作
      安全团队与开发团队紧密配合,提升安全意识,共同打造安全可靠的基础设施。
  • 使用 Docker 部署 Greenbone Community Edition(GCE):打造你的本地漏洞扫描平台

    一、GCE 简介

    Greenbone Community Edition(GCE) 是由 Greenbone Networks 维护的开源安全漏洞扫描解决方案,基于知名的 OpenVAS(Open Vulnerability Assessment System) 项目构建。它包括:

    • GSA(Greenbone Security Assistant):图形化 Web 管理界面;
    • GVMD:扫描调度与管理守护进程;
    • OpenVAS Scanner:扫描引擎;
    • Greenbone Community Feed:开源漏洞数据库(每日更新);
    • GVM-Tools:命令行工具,支持远程自动化控制。

    GCE 是企业级 Greenbone GSM 产品的免费替代方案,非常适合中小企业、个人研究人员、DevSecOps 团队部署。

    二、安装Docker

    $ curl -fsSL https://get.docker.com -o get-docker.sh
    $ sudo sh get-docker.sh

    三、部署Greenbone Community Edition(GCE)

    1. 保存 docker-compose.yml 文件
    2. 运行以下命令启动服务:
    docker compose up -d
    1. 容器启动后,访问 Web 管理界面:
    http://<服务器IP>:9392
    登录默认管理员账户/密码:admin

    首次启动可能需要等待几分钟,用于加载漏洞数据库、初始化服务。

    name: greenbone-community-edition
    
    services:
      vulnerability-tests:
        image: registry.community.greenbone.net/community/vulnerability-tests
        environment:
          FEED_RELEASE: "24.10"
        volumes:
          - vt_data_vol:/mnt
    
      notus-data:
        image: registry.community.greenbone.net/community/notus-data
        volumes:
          - notus_data_vol:/mnt
    
      scap-data:
        image: registry.community.greenbone.net/community/scap-data
        volumes:
          - scap_data_vol:/mnt
    
      cert-bund-data:
        image: registry.community.greenbone.net/community/cert-bund-data
        volumes:
          - cert_data_vol:/mnt
    
      dfn-cert-data:
        image: registry.community.greenbone.net/community/dfn-cert-data
        volumes:
          - cert_data_vol:/mnt
        depends_on:
          - cert-bund-data
    
      data-objects:
        image: registry.community.greenbone.net/community/data-objects
        environment:
          FEED_RELEASE: "24.10"
        volumes:
          - data_objects_vol:/mnt
    
      report-formats:
        image: registry.community.greenbone.net/community/report-formats
        environment:
          FEED_RELEASE: "24.10"
        volumes:
          - data_objects_vol:/mnt
        depends_on:
          - data-objects
    
      gpg-data:
        image: registry.community.greenbone.net/community/gpg-data
        volumes:
          - gpg_data_vol:/mnt
    
      redis-server:
        image: registry.community.greenbone.net/community/redis-server
        restart: on-failure
        volumes:
          - redis_socket_vol:/run/redis/
    
      pg-gvm:
        image: registry.community.greenbone.net/community/pg-gvm:stable
        restart: on-failure
        volumes:
          - psql_data_vol:/var/lib/postgresql
          - psql_socket_vol:/var/run/postgresql
    
      gvmd:
        image: registry.community.greenbone.net/community/gvmd:stable
        restart: on-failure
        volumes:
          - gvmd_data_vol:/var/lib/gvm
          - scap_data_vol:/var/lib/gvm/scap-data/
          - cert_data_vol:/var/lib/gvm/cert-data
          - data_objects_vol:/var/lib/gvm/data-objects/gvmd
          - vt_data_vol:/var/lib/openvas/plugins
          - psql_data_vol:/var/lib/postgresql
          - gvmd_socket_vol:/run/gvmd
          - ospd_openvas_socket_vol:/run/ospd
          - psql_socket_vol:/var/run/postgresql
        depends_on:
          pg-gvm:
            condition: service_started
          scap-data:
            condition: service_completed_successfully
          cert-bund-data:
            condition: service_completed_successfully
          dfn-cert-data:
            condition: service_completed_successfully
          data-objects:
            condition: service_completed_successfully
          report-formats:
            condition: service_completed_successfully
    
      gsa:
        image: registry.community.greenbone.net/community/gsa:stable
        restart: on-failure
        ports:
          - 9392:80
        volumes:
          - gvmd_socket_vol:/run/gvmd
        depends_on:
          - gvmd
      # Sets log level of openvas to the set LOG_LEVEL within the env
      # and changes log output to /var/log/openvas instead /var/log/gvm
      # to reduce likelyhood of unwanted log interferences
      configure-openvas:
        image: registry.community.greenbone.net/community/openvas-scanner:stable
        volumes:
          - openvas_data_vol:/mnt
          - openvas_log_data_vol:/var/log/openvas
        command:
          - /bin/sh
          - -c
          - |
            printf "table_driven_lsc = yes\nopenvasd_server = http://openvasd:80\n" > /mnt/openvas.conf
            sed "s/127/128/" /etc/openvas/openvas_log.conf | sed 's/gvm/openvas/' > /mnt/openvas_log.conf
            chmod 644 /mnt/openvas.conf
            chmod 644 /mnt/openvas_log.conf
            touch /var/log/openvas/openvas.log
            chmod 666 /var/log/openvas/openvas.log
    
      # shows logs of openvas
      openvas:
        image: registry.community.greenbone.net/community/openvas-scanner:stable
        restart: on-failure
        volumes:
          - openvas_data_vol:/etc/openvas
          - openvas_log_data_vol:/var/log/openvas
        command:
          - /bin/sh
          - -c
          - |
            cat /etc/openvas/openvas.conf
            tail -f /var/log/openvas/openvas.log
        depends_on:
          configure-openvas:
            condition: service_completed_successfully
    
      openvasd:
        image: registry.community.greenbone.net/community/openvas-scanner:stable
        restart: on-failure
        environment:
          # `service_notus` is set to disable everything but notus,
          # if you want to utilize openvasd directly, remove `OPENVASD_MODE`
          OPENVASD_MODE: service_notus
          GNUPGHOME: /etc/openvas/gnupg
          LISTENING: 0.0.0.0:80
        volumes:
          - openvas_data_vol:/etc/openvas
          - openvas_log_data_vol:/var/log/openvas
          - gpg_data_vol:/etc/openvas/gnupg
          - notus_data_vol:/var/lib/notus
        # enable port forwarding when you want to use the http api from your host machine
        # ports:
        #   - 127.0.0.1:3000:80
        depends_on:
          vulnerability-tests:
            condition: service_completed_successfully
          configure-openvas:
            condition: service_completed_successfully
          gpg-data:
            condition: service_completed_successfully
        networks:
          default:
            aliases:
              - openvasd
    
      ospd-openvas:
        image: registry.community.greenbone.net/community/ospd-openvas:stable
        restart: on-failure
        hostname: ospd-openvas.local
        cap_add:
          - NET_ADMIN # for capturing packages in promiscuous mode
          - NET_RAW # for raw sockets e.g. used for the boreas alive detection
        security_opt:
          - seccomp=unconfined
          - apparmor=unconfined
        command:
          [
            "ospd-openvas",
            "-f",
            "--config",
            "/etc/gvm/ospd-openvas.conf",
            "--notus-feed-dir",
            "/var/lib/notus/advisories",
            "-m",
            "666",
          ]
        volumes:
          - gpg_data_vol:/etc/openvas/gnupg
          - vt_data_vol:/var/lib/openvas/plugins
          - notus_data_vol:/var/lib/notus
          - ospd_openvas_socket_vol:/run/ospd
          - redis_socket_vol:/run/redis/
          - openvas_data_vol:/etc/openvas/
          - openvas_log_data_vol:/var/log/openvas
        depends_on:
          redis-server:
            condition: service_started
          gpg-data:
            condition: service_completed_successfully
          vulnerability-tests:
            condition: service_completed_successfully
          configure-openvas:
            condition: service_completed_successfully
    
      gvm-tools:
        image: registry.community.greenbone.net/community/gvm-tools
        volumes:
          - gvmd_socket_vol:/run/gvmd
          - ospd_openvas_socket_vol:/run/ospd
        depends_on:
          - gvmd
          - ospd-openvas
    
    volumes:
      gpg_data_vol:
      scap_data_vol:
      cert_data_vol:
      data_objects_vol:
      gvmd_data_vol:
      psql_data_vol:
      vt_data_vol:
      notus_data_vol:
      psql_socket_vol:
      gvmd_socket_vol:
      ospd_openvas_socket_vol:
      redis_socket_vol:
      openvas_data_vol:
      openvas_log_data_vol:
  • 使用 Docker 部署和运行 Mobile Security Framework (MobSF)

    Mobile Security Framework (MobSF) 是一款开源、自动化的移动应用安全分析平台,全面支持 Android、iOS 和 Windows Mobile 应用的安全研究。它通过强大的静态和动态分析能力,助力移动应用安全、渗透测试、恶意软件和隐私分析等多种场景。MobSF 能够解析 APK、IPA、APPX 及源代码,并在动态分析中提供交互式测试、运行时数据和网络流量监控。其 REST API 和 CLI 工具的集成性,使其能无缝融入 DevSecOps 和 CI/CD 流程,有效增强安全工作流。

    • 多平台支持: 支持分析 Android (APK)、iOS (IPA) 和 Windows Mobile (APPX) 应用,并能解析其源代码。
    • 静态分析: 深入分析应用的代码、配置文件和资源文件,发现潜在的安全漏洞和敏感信息泄露。
    • 动态分析: 提供交互式测试环境,允许在运行时监控应用行为、捕获网络流量和分析运行时数据。
    • 集成性: 提供 REST API 和命令行界面 (CLI) 工具,方便集成到 DevSecOps 和持续集成/持续交付 (CI/CD) 流程中,提升安全工作流的效率。

    1. 拉取 MobSF Docker 镜像

    docker pull opensecurity/mobile-security-framework-mobsf:latest

    2. 运行 MobSF Docker 容器

    docker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest

    3. 访问 MobSF Web 界面

    启动完成后在你的 Web 浏览器中访问 MobSF 的 Web 界面。在地址栏中输入:

    http://localhost:8000

    默认的登录凭据是:

    • 用户名: mobsf
    • 密码: mobsf

    4. 使用 MobSF

    登录成功后,你就可以开始使用 MobSF 进行移动应用的安全分析了:

    1. 上传应用: 在 MobSF 的 Web 界面上,点击 “Upload & Analyze” 按钮。
    2. 选择文件: 选择你要分析的 Android (APK)、iOS (IPA) 或 Windows Mobile (APPX) 应用程序文件。
    3. 开始分析: 点击 “Submit” 或类似的按钮开始上传和分析。
  • SNI 漏洞如何影响你的加密通信

    SNI 阻断提醒我们:即使是 HTTPS 加密的通信,在握手时也会“说漏嘴”。
    在你构建下一代应用、工具或服务时,别忘了这点:安全不是默认的,隐私需要自己争取

    一、SNI 是什么?

    SNI,全称 Server Name Indication(服务器名称指示),是 TLS(传输层安全协议)的一个扩展。

    在传统 HTTP 中,请求目标的域名信息包含在明文请求头中。而在 HTTPS 中,请求的内容虽然会被加密,但在 TLS 握手开始时,客户端仍需要告诉服务器自己要访问哪个域名,以便服务器返回正确的证书。这部分信息就是通过 SNI 字段传输的。

    重点:SNI 字段是明文的,它暴露了你想访问的域名,即便其他通信内容都是加密的。

    举个例子:
    当你访问 https://example.com 时,浏览器会先发送一个 ClientHello 报文,其中就包含了 example.com 的 SNI 字段。只有在这之后,TLS 握手才会继续并建立加密通道。

    二、SNI 阻断的原理是什么?

    正因为 SNI 是明文传输的,它就成了防火墙和深度包检测(DPI)系统的“突破口”。

    封锁者只需在 TLS 握手过程中抓取流量,读取其中的 SNI 字段:

    1. 客户端发起 TLS 握手
    2. 在 ClientHello 中包含明文的 SNI 字段(即你要访问的域名)
    3. 防火墙或 DPI(深度包检测)设备分析该字段
    4. 如果域名匹配封锁规则,则立即阻断连接

    常见的阻断方式包括:

    • 发送 TCP RST 包:强制关闭连接;
    • 直接丢弃 TLS 握手包:让连接挂起、卡死;
    • 注入伪造响应、返回错误页、返回 reset 包

    这种方式对服务端和客户端透明、不依赖解密,加之效率极高,因此广泛用于精准封锁策略中。

    三、如何检测 SNI 是否被阻断?

    你可以使用如下方式排查:

    方法 1:使用 openssl 命令行测试

    openssl s_client -connect example.com:443 -servername example.com
    • 如果连接能建立,表示 SNI 暂未被封锁;
    • 如果连接发生 timeout、reset 或 TLS 握手失败,很可能 SNI 被拦截。

    方法 2:使用 Wireshark 抓包

    操作步骤:

    1. 打开 Wireshark,设置过滤器为 tcp.port == 443
    2. 访问你怀疑被封锁的网站;
    3. 查找 ClientHello 包,并检查是否出现:
      • 后续无响应;
      • 接收到 TCP RST;
      • 握手中断在 SNI 之后。
        Wireshark 可视化过程清晰,非常适合深入分析封锁点。

    四、对于开发者:如何构建更安全的服务

    安全设计的关键词:默认加密、最小权限、最少暴露

    不要等出了问题才想着“加个验证”或“换个协议”——安全不是补丁,而应该是架构的一部分

    在你开发每一个接口、设计每一个通信协议、部署每一台服务器时,都可以问问自己:

    这个组件,暴露了什么?
    是否默认安全?
    用户的数据有没有主动保护?

    真正可靠的服务,往往不是最强,而是最稳、最透明、最值得信赖。

    别忘了:安全不是奢侈品,它是你服务可信赖的基础。

  • 使用 opkssh 实现 OpenID 身份验证与 SSH 连接

    opkssh 是一个结合 OpenID 身份验证和 SSH 连接的工具,它能简化 SSH 密钥的管理,并提升 SSH 连接的安全性。与传统的 SSH 密钥验证方式不同,opkssh 通过 OpenID 身份验证来生成 SSH 密钥,使得用户的身份验证更加灵活与安全。

    1. 安装 opkssh

    opkssh 可以在 Windows、macOS 和 Linux 系统上使用。下面是详细的安装步骤:

    在 Windows 上安装 opkssh

    1. 打开 PowerShell 或命令提示符。
    2. 执行以下命令,下载并安装 opkssh
    curl https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-windows-amd64.exe -o opkssh.exe
    1. 下载完成后,你将获得 opkssh.exe 文件。你可以将它放在任何你想要的目录下,并通过命令行运行它。

    在 macOS 上安装 opkssh

    1. 打开终端。
    2. 执行以下命令,下载并安装 opkssh
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-osx-amd64 -o opkssh; chmod +x opkssh
    1. 这将下载 opkssh 文件并授予执行权限。你可以将其移动到 /usr/local/bin/ 目录,方便在终端中全局使用。

    在 Linux 上安装 opkssh

    Linux 系统支持多种架构。根据你的系统架构(x86_64 或 ARM64),选择相应的安装命令。

    • 对于 x86_64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-amd64 -o opkssh; chmod +x opkssh
    • 对于 ARM64 架构的 Linux 系统
    curl -L https://github.com/openpubkey/opkssh/releases/latest/download/opkssh-linux-arm64 -o opkssh; chmod +x opkssh

    安装完成后,你可以将 opkssh 文件移动到 /usr/local/bin/ 目录,或将其保留在当前目录。

    2. 使用 opkssh 进行身份验证与 SSH 登录

    安装完成后,你可以开始使用 opkssh 进行身份验证和 SSH 连接。

    登录并生成 SSH 密钥

    1. 在终端或命令行中运行以下命令:
    opkssh login
    1. 该命令将打开一个浏览器窗口,要求你选择一个 OpenID 提供商并完成身份验证。你可以选择 Google、GitHub 等常见的 OpenID 提供商来进行登录。
    2. 登录成功后,opkssh 会在你的本地系统中生成一个 SSH 公钥文件,默认位置是 ~/.ssh/id_ecdsa。这个密钥对应的是你的 OpenID Token,凭此可以通过 SSH 连接到服务器。

    默认 SSH 密钥过期时间

    生成的 SSH 密钥默认会在 24 小时后过期。到期后,你需要重新运行 opkssh login 来生成新的密钥。

    使用 SSH 登录

    一旦密钥生成成功,你可以像使用传统 SSH 密钥一样使用它来登录到远程服务器。执行以下命令:

    ssh [email protected]

    使用 SFTP 进行文件传输

    你还可以使用 opkssh 生成的 SSH 密钥进行 SFTP 文件传输:

    sftp [email protected]

    3. 自定义 SSH 密钥名称

    opkssh 允许你为生成的密钥指定自定义名称,方便管理。

    登录时指定自定义密钥名称

    如果你希望使用特定名称的密钥,可以在执行 opkssh login 时指定密钥名称:

    opkssh login -i opkssh_server_group1

    使用自定义密钥进行 SSH 连接

    在使用 SSH 时,你可以通过 -i 参数指定自定义的密钥文件。假设你使用了 opkssh_server_group1 作为密钥名称,可以执行以下命令:

    ssh -o "IdentitiesOnly=yes" -i ~/.ssh/opkssh_server_group1.pub -i ~/.ssh/opkssh_server_group1 [email protected]

    这里的 -o "IdentitiesOnly=yes" 参数会确保 SSH 仅使用指定的密钥进行身份验证,避免使用其他默认密钥进行干扰。

    4. 在服务器端安装和配置 opkssh

    为了让你的服务器支持使用 opkssh 进行身份验证,你需要在服务器上安装并配置它。

    安装 opkssh 在服务器上

    1. 登录到你的服务器。
    2. 使用以下命令安装 opkssh
    wget -qO- "https://raw.githubusercontent.com/openpubkey/opkssh/main/scripts/install-linux.sh" | sudo bash

    这条命令会自动下载并安装 opkssh,并将其放置在 /usr/local/bin/ 目录中,同时配置 SSH 服务以支持 opkssh 作为附加的身份验证机制。

    允许单个用户使用 opkssh 登录

    如果你想允许某个用户(例如 [email protected])通过 OpenID 进行身份验证并作为 root 登录到服务器,可以执行以下命令:

    sudo opkssh add root [email protected] google

    允许用户组使用 opkssh 登录

    如果你希望允许某个用户组(例如 ssh-users)中的所有成员通过 OpenID 进行身份验证并作为 root 登录,可以使用以下命令:

    sudo opkssh add root oidc:groups:ssh-users google