第一章:Go出海DevSecOps流水线的全球化挑战与FIPS合规必要性
当Go语言构建的微服务架构走向全球,DevSecOps流水线不再仅需应对CI/CD效率问题,更面临多国监管叠加、加密算法合法性、密钥生命周期管控等深层合规压力。FIPS 140-2/3(Federal Information Processing Standards)作为美国联邦政府强制要求的密码模块安全标准,已成为金融、医疗、政务等出海场景的准入门槛——即使业务未直连美国系统,云服务商(如AWS GovCloud、Azure Government)底层加密组件亦默认启用FIPS验证模式,非合规实现将导致TLS握手失败、JWT签名拒绝或密钥导出异常。
全球化部署中的典型合规断点
- 加密算法硬编码:
crypto/md5或crypto/sha1在FIPS模式下被禁用,运行时panic; - 随机数生成器不安全:
math/rand不满足FIPS熵源要求,必须替换为crypto/rand; - TLS配置缺失:未显式指定
tls.TLS_AES_128_GCM_SHA256等FIPS-approved cipher suite; - 第三方库隐式依赖:如
golang.org/x/crypto/bcrypt内部调用非FIPS算法,需审计其go.mod依赖树。
Go项目启用FIPS合规的关键步骤
首先,在构建环境启用FIPS内核模式(Linux):
# 检查当前状态
sysctl crypto.fips_enabled
# 启用(需root权限)
sudo sysctl -w crypto.fips_enabled=1
其次,在Go代码中强制使用合规密码套件:
// 初始化TLS配置,仅允许FIPS认证算法
config := &tls.Config{
MinVersion: tls.VersionTLS12,
CipherSuites: []uint16{
tls.TLS_AES_128_GCM_SHA256, // FIPS 140-2 approved
tls.TLS_AES_256_GCM_SHA384,
},
Rand: crypto/rand.Reader, // 替换默认伪随机源
}
最后,通过静态扫描验证合规性:
# 使用gosec检测硬编码弱算法
gosec -exclude=G401,G402 ./...
# G401: MD5 usage → 违规;G402: Insecure TLS config → 违规
| 合规检查项 | 合规实现方式 | 常见误用示例 |
|---|---|---|
| 哈希算法 | crypto/sha256, crypto/sha512 |
crypto/md5, crypto/sha1 |
| 对称加密 | crypto/aes, crypto/cipher |
自实现ECB模式 |
| 随机数生成 | crypto/rand.Read() |
math/rand.Intn() |
FIPS合规不是一次性开关,而是贯穿开发、测试、部署全链路的约束条件——从go build环境变量(CGO_ENABLED=1以链接FIPS验证的OpenSSL)到Kubernetes Pod Security Policy中seccompProfile的严格定义,每一环都需可验证、可审计。
第二章:GitHub Actions流水线架构设计与多环境适配
2.1 基于Go模块化构建的跨平台CI策略(Linux/macOS/Windows ARM64)
Go 的 GOOS/GOARCH 环境变量与模块化依赖管理天然契合跨平台构建。现代 CI 需统一协调多目标平台编译与验证。
构建矩阵配置示例
# .github/workflows/ci.yml 片段
strategy:
matrix:
os: [ubuntu-22.04, macos-14, windows-2022]
arch: [amd64, arm64]
go-version: ['1.22']
该配置驱动 GitHub Actions 并行执行 3×2=6 个构建作业;GOOS 自动映射为 linux/darwin/windows,GOARCH=arm64 在 Apple Silicon、Linux ARM64 服务器及 Windows on ARM 设备上均生效。
关键构建命令
# 统一构建脚本(支持所有平台)
CGO_ENABLED=0 GOOS=$OS GOARCH=$ARCH go build -mod=readonly -o ./dist/app-$OS-$ARCH .
CGO_ENABLED=0 确保纯静态链接,规避 C 运行时差异;-mod=readonly 强制使用 go.mod 锁定版本,保障可重现性。
| 平台 | GOOS | GOARCH | 典型运行环境 |
|---|---|---|---|
| Linux x86_64 | linux | amd64 | CI runner / Docker |
| macOS ARM64 | darwin | arm64 | M1/M2 Mac |
| Windows ARM64 | windows | arm64 | Surface Pro X |
graph TD
A[源码 + go.mod] --> B{CI 触发}
B --> C[并行构建作业]
C --> D[GOOS=linux GOARCH=arm64]
C --> E[GOOS=darwin GOARCH=arm64]
C --> F[GOOS=windows GOARCH=arm64]
D & E & F --> G[签名 + 上传制品]
2.2 GitHub Environment Secrets与OIDC Token安全注入实践
为什么需要环境级密钥隔离
GitHub Environment Secrets 专为生产/预发等关键环境设计,与仓库级密钥物理隔离,且仅在指定 environment(如 production)的 workflow job 中可访问,天然规避误用风险。
OIDC Token替代静态密钥的核心优势
GitHub Actions 运行时动态颁发短时效 OIDC Token(默认 60s),携带 iss, sub, aud 等声明,配合云厂商(如 AWS、GCP)的 Identity Federation,实现零密钥轮转、最小权限绑定。
安全注入实战示例
# .github/workflows/deploy.yml
jobs:
deploy:
environment: production # 触发环境级 secrets 注入
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/github-oidc-role
aws-region: us-east-1
✅ 逻辑分析:environment: production 激活环境上下文,使 secrets.AWS_ACCESS_KEY_ID 等静态密钥不可见;configure-aws-credentials 内部自动获取 OIDC Token 并向 AWS STS 请求临时凭证,全程不暴露长期密钥。
权限最小化对照表
| 配置方式 | 密钥生命周期 | 权限粒度 | 审计追踪能力 |
|---|---|---|---|
| 静态 Secret | 手动轮转 | 全仓库级 | 弱(仅日志) |
| OIDC + IAM Role | 自动刷新 | 绑定角色策略 | 强(CloudTrail) |
graph TD
A[GitHub Action Job] --> B[请求 OIDC Token]
B --> C{GitHub IDP 签发}
C --> D[Token 含 environment 名称 & job 信息]
D --> E[云平台验证 audience/subject]
E --> F[颁发临时凭证]
2.3 多租户隔离流水线:组织级Policy-as-Code与Team-scoped Permissions
多租户CI/CD流水线需在统一平台中实现策略治理与权限收敛的双重保障。
组织级策略即代码(Org Policy-as-Code)
通过Open Policy Agent(OPA)集成Conftest,在流水线准入阶段校验YAML合规性:
# policy/team-quota.rego
package ci
default allow := false
allow {
input.kind == "Pipeline"
input.spec.resources.limits.cpu | "500m" <= "2000m"
input.metadata.labels["team"] != ""
}
该策略强制所有Pipeline声明team标签且CPU上限不超2000m,input为解析后的Kubernetes资源对象,|提供默认值容错。
团队级权限沙箱
| 资源类型 | Team-A 权限 | Team-B 权限 |
|---|---|---|
| Secrets | 只读自身命名空间 | 禁用访问 |
| Helm Charts | 推送至team-b仓库 |
仅拉取team-a仓库 |
流水线执行隔离模型
graph TD
A[Git Push] --> B{OPA Gatekeeper}
B -->|Allow| C[RBAC Context Switch]
B -->|Deny| D[Reject w/ Policy Violation]
C --> E[Run in team-a:dev ns]
团队上下文由Git分支前缀自动注入(如team-a/feature-x → team-a命名空间),实现零配置租户隔离。
2.4 FIPS 140-2兼容的TLS 1.2+与加密算法白名单配置(OpenSSL 3.0+ / BoringCrypto)
OpenSSL 3.0 引入了模块化FIPS Provider,需显式加载并启用FIPS模式:
// 启用FIPS Provider(必须在任何密码操作前调用)
OSSL_PROVIDER_load(NULL, "fips");
OSSL_PROVIDER_load(NULL, "base");
EVP_default_properties_enable_fips(NULL, 1);
此代码强制所有后续EVP调用仅使用FIPS验证过的算法。
EVP_default_properties_enable_fips()是全局开关,不可逆;若未加载fips provider则失败。
支持的FIPS白名单算法(TLS 1.2+核心)
| 协议层 | 允许算法(OpenSSL 3.0 FIPS Provider) |
|---|---|
| 密钥交换 | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(P-256/P-384) |
| 对称加密 | AES-128-GCM、AES-256-GCM(仅GCM模式) |
| 摘要函数 | SHA2-256、SHA2-384 |
BoringCrypto差异要点
- 自动禁用非FIPS算法(无需手动白名单过滤)
- TLS handshake中自动拒绝
TLS_RSA_WITH_AES_128_CBC_SHA等CBC套件
graph TD
A[Client Hello] --> B{Cipher Suite Negotiation}
B -->|匹配FIPS白名单| C[TLS Handshake Success]
B -->|含非FIPS套件| D[Abort with SSL_ERROR_SSL]
2.5 Go 1.21+ Build Constraints与CGO_ENABLED=0在FIPS模式下的静态链接验证
FIPS 140-2/3 合规要求二进制不含非批准密码算法及动态链接依赖。Go 1.21 引入更严格的 //go:build 约束解析,支持 fips 标签显式启用 FIPS 模式构建:
//go:build fips && !cgo
// +build fips,!cgo
package main
import "crypto/aes"
func main() { _ = aes.NewCipher(nil) }
此构建约束强制禁用 CGO 并仅启用 FIPS 认证的 crypto 实现(如
crypto/aes使用 OpenSSL FIPS 静态模块或 Go 内置 FIPS AES)。CGO_ENABLED=0确保零 C 依赖,生成纯静态 ELF。
关键构建参数对照
| 参数 | 值 | 作用 |
|---|---|---|
GOOS |
linux |
锁定目标平台 |
CGO_ENABLED |
|
禁用 C 链接器,规避 OpenSSL 动态符号 |
GOFIPS |
1 |
启用 Go 运行时 FIPS 密码策略 |
验证流程
graph TD
A[源码含 //go:build fips,!cgo] --> B[GOOS=linux CGO_ENABLED=0 GOFIPS=1 go build]
B --> C[ldd binary → no shared libs]
C --> D[openssl dgst -sha256 → matches FIPS-approved digest]
- 构建后执行
file binary应显示statically linked go tool nm binary | grep -q 'C\.malloc'必须无输出
第三章:Trivy深度扫描与SBOM驱动的风险治理
3.1 Trivy OSS vs Trivy Enterprise:Go module proxy扫描与vendor目录递归检测
Trivy OSS 默认跳过 vendor/ 目录,且不解析 Go module proxy(如 proxy.golang.org)中动态拉取的依赖元数据;Enterprise 版则启用深度 vendor 递归扫描,并支持通过 --go-proxy-url 显式配置代理源。
vendor 目录处理差异
- OSS:硬编码忽略
vendor/(源码路径) - Enterprise:启用
--scan-vendor标志后,递归解析vendor/modules.txt并校验 checksums
Go proxy 扫描能力对比
| 能力 | Trivy OSS | Trivy Enterprise |
|---|---|---|
解析 go.sum 依赖树 |
✅ | ✅ |
| 下载 proxy 源模块元数据 | ❌ | ✅(需配置) |
| vendor 目录递归扫描 | ❌ | ✅ |
# Enterprise 启用 proxy 扫描示例
trivy fs --go-proxy-url https://proxy.golang.org --scan-vendor ./src
此命令强制 Trivy 从官方 proxy 获取模块版本信息,并遍历
vendor/中每个子模块的go.mod。--go-proxy-url触发 HTTP HEAD 请求校验模块存在性,避免本地缓存污染导致的 CVE 漏洞漏报。
依赖解析流程(Enterprise)
graph TD
A[扫描根目录] --> B{存在 vendor/?}
B -->|是| C[读取 vendor/modules.txt]
B -->|否| D[解析 go.mod/go.sum]
C --> E[递归解析各 vendor/submod/go.mod]
E --> F[合并所有 module checksums]
F --> G[查询漏洞数据库]
3.2 基于Syft生成的SPDX 2.3 SBOM与Trivy CVE映射规则定制
数据同步机制
Syft 输出 SPDX 2.3 格式 SBOM 后,需将 Package 的 purl(如 pkg:maven/org.apache.commons/commons-lang3@3.12.0)与 Trivy 扫描结果中的 VulnerabilityID 关联。核心依赖 purl 字段的标准化解析。
映射逻辑实现
# custom-mapping.yaml:定义CVE匹配策略
matchers:
- type: purl
pattern: "^pkg:maven/(?<vendor>[^/]+)/(?<name>[^@]+)@"
cveField: "Trivy.Vulnerabilities[].VulnerabilityID"
该配置提取 Maven 组件的供应商与名称,用于跨工具语义对齐;purl 解析确保版本无关的组件指纹一致性,避免因 version 字段缺失导致漏匹配。
规则验证流程
| 输入源 | 字段关键性 | 映射可靠性 |
|---|---|---|
| Syft SBOM | purl, checksums |
★★★★☆ |
| Trivy JSON | VulnerabilityID, PkgName |
★★★★☆ |
graph TD
A[Syft生成SPDX SBOM] --> B[提取purl并归一化]
C[Trivy扫描输出CVE] --> D[按PkgName/purl双路匹配]
B --> E[生成映射关系表]
D --> E
3.3 FIPS合规漏洞阈值策略:NIST NVD CVSS v3.1向量校准与Red Hat Errata优先级融合
FIPS 140-2/3合规场景下,漏洞处置不能仅依赖CVSS基础分,需将NVD的CVSS v3.1向量(如AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)与Red Hat Errata的severity(Critical/Important/Moderate)进行语义对齐。
向量驱动的阈值映射规则
- Critical errata → CVSS ≥ 7.0 且
C/I/A任一为H,同时AV:N必须满足 - FIPS-relevant flaws → 必须包含
S:C(Scope Changed)或加密模块路径(crypto/,openssl,fips)
校准代码示例(Python)
def fips_cvss_threshold(cvss_vector: str, errata_sev: str) -> bool:
# 解析NVD向量(简化版)
av = cvss_vector.split('/')[0].split(':')[1] # AV:N → network
ci_a = [v for v in cvss_vector.split('/') if v.startswith('C:') or v.startswith('I:') or v.startswith('A:')]
return (errata_sev == "Critical"
and av == "N"
and any("H" in x for x in ci_a))
该函数强制执行FIPS核心约束:远程可利用(AV:N)+ 高机密性/完整性/可用性影响(C:H等),规避CVSS分数被低权本地向量稀释的风险。
Red Hat Errata与CVSS v3.1融合优先级表
| Errata Severity | Min CVSS Score | Required Vector Flags | FIPS Impact |
|---|---|---|---|
| Critical | 7.0 | AV:N + C:I:A:H or S:C |
✅ Mandatory |
| Important | 5.0 | AV:N + C:H or crypto path |
⚠️ Conditional |
graph TD
A[NVD CVSS v3.1 Vector] --> B{AV:N?}
B -->|Yes| C{C/I/A:H or S:C?}
B -->|No| D[Reject for FIPS]
C -->|Yes| E[Apply FIPS Threshold]
C -->|No| F[Downgrade per Errata Context]
第四章:Cosign签名体系与零信任软件供应链落地
4.1 Cosign FIPS 140-2 Level 2认证HSM集成(YubiKey PIV / AWS KMS / HashiCorp Vault PKI)
Cosign 支持通过符合 FIPS 140-2 Level 2 标准的硬件安全模块(HSM)执行密钥托管与签名操作,确保私钥永不离开安全边界。
支持的HSM后端对比
| 后端类型 | 密钥生命周期管理 | PIV标准兼容 | 签名协议支持 |
|---|---|---|---|
| YubiKey PIV | ✅(本地PIN保护) | ✅ | ECDSA P-256/SHA-256 |
| AWS KMS | ✅(自动轮转) | ❌ | RSA/ECDSA via KMS API |
| Vault PKI | ✅(TTL+策略) | ❌ | PKCS#11 over Vault Agent |
YubiKey PIV签名示例
# 使用YubiKey PIV槽位9a(默认签名密钥)签署镜像
cosign sign --key 'pkcs11://?pin-value=123456&slot-id=1&token-label=Yubico%20PIV%20Token&object-label=Signature%20Key' \
ghcr.io/user/app:v1.0.0
此命令通过PKCS#11 URI指定YubiKey设备、PIN、槽位及密钥标签;
slot-id=1对应PIV应用槽位,object-label匹配证书对应的私钥对象。FIPS模式下所有加密运算在YubiKey芯片内完成,主机仅传递摘要。
签名流程(Mermaid)
graph TD
A[镜像摘要] --> B{Cosign调用PKCS#11}
B --> C[YubiKey/Cloud HSM]
C --> D[芯片内FIPS验证+签名]
D --> E[返回DER格式签名]
4.2 Go binary、OCI镜像、SBOM三重签名链:cosign sign –key / cosign attach sbom
现代软件供应链要求可验证的完整性与溯源性,cosign 支持对 Go 二进制、OCI 镜像和 SBOM(Software Bill of Materials)进行独立签名并构建可信链。
三重签名协同流程
# 1. 签名 Go 二进制(如 ./app)
cosign sign --key cosign.key ./app
# 2. 构建并签名 OCI 镜像
docker build -t ghcr.io/user/app:v1 .
cosign sign --key cosign.key ghcr.io/user/app:v1
# 3. 生成并附加 SBOM(SPDX 格式),再签名
syft ./app -o spdx-json > app.spdx.json
cosign attach sbom --sbom app.spdx.json ghcr.io/user/app:v1
--key指定私钥路径,用于 ECDSA 或 Ed25519 签名;attach sbom将 SBOM 作为 OCI artifact 关联到镜像,支持后续cosign verify联合校验。
验证时的信任链关系
| 签名对象 | 存储位置 | 验证命令示例 |
|---|---|---|
| Go binary | .app.cosign.sig |
cosign verify --key cosign.pub ./app |
| OCI 镜像 | registry 的 signature tag | cosign verify --key cosign.pub ghcr.io/user/app:v1 |
| SBOM | OCI artifact (.sbom) |
cosign verify --key cosign.pub ghcr.io/user/app:v1@sha256:... |
graph TD
A[Go binary] -->|cosign sign| B[Binary Signature]
C[OCI Image] -->|cosign sign| D[Image Signature]
E[SBOM JSON] -->|cosign attach sbom| F[SBOM Artifact]
D -->|references| F
B -->|provenance| A
4.3 Sigstore Fulcio + Rekor审计日志与FIPS时间戳服务(RFC 3161 TSA with SHA-256)
Sigstore 生态中,Fulcio 签发短期证书,Rekor 存储不可篡改的签名事件日志,二者协同构建可验证软件供应链信任链。
时间戳强约束机制
Rekor 集成符合 FIPS 140-2 验证的 RFC 3161 时间戳权威(TSA),使用 SHA-256 哈希与 PKI 签名保障时序不可抵赖:
# 向合规TSA请求RFC 3161时间戳(SHA-256摘要)
openssl ts -query -sha256 -cert -out timestamp.tsq -digest \
$(sha256sum artifact.bin | cut -d' ' -f1)
此命令生成标准
.tsq请求:-sha256指定摘要算法;-cert要求TSA返回其证书链;-digest传入二进制文件的 SHA-256 值,确保时间绑定对象完整性。
审计日志结构化同步
Rekor 的 tlog(transparency log)条目自动关联 Fulcio 证书、签名及 TSA 时间戳响应,形成三元可信锚点:
| 字段 | 来源 | 合规要求 |
|---|---|---|
integratedTime |
Rekor | Unix epoch (UTC) |
timestampNanos |
FIPS TSA | NIST traceable |
certificatePEM |
Fulcio | X.509 v3, short-lived |
graph TD
A[Artifact] --> B[Fulcio: Sign & Issue Cert]
A --> C[Rekor: Log Entry + SHA-256]
C --> D[RFC 3161 TSA: Timestamp Token]
D --> E[Verifiable Audit Trail]
4.4 自动化验证门禁:cosign verify –certificate-oidc-issuer –certificate-identity-match
cosign verify 的 OIDC 证书身份校验能力,是实现零信任软件供应链的关键门禁。
核心验证逻辑
cosign verify \
--certificate-oidc-issuer https://oauth2.example.com \
--certificate-identity-match "user@corp.example.com" \
ghcr.io/org/app:v1.2.0
--certificate-oidc-issuer断言签名证书由指定 OIDC 提供方签发(如 Dex 或 GitHub OIDC)--certificate-identity-match要求证书中sub或email声明精确匹配给定标识符- 验证失败时立即退出(非零状态码),天然适配 CI/CD 门禁流程
支持的匹配模式
| 匹配类型 | 示例值 | 说明 |
|---|---|---|
| 精确字符串 | dev@team-a.example.com |
默认行为,区分大小写 |
| 正则表达式 | ^prod-.*@example\.com$ |
需显式加 regex: 前缀 |
门禁执行流程
graph TD
A[拉取镜像签名] --> B[解析 OIDC 证书]
B --> C{Issuer 匹配?}
C -->|否| D[拒绝]
C -->|是| E{Identity 匹配?}
E -->|否| D
E -->|是| F[放行]
第五章:从合规到竞争力——Go出海DevSecOps的演进范式
合规驱动的初始落地:新加坡金融客户POC实践
某国内金融科技公司面向新加坡MAS(金融管理局)开展Go语言微服务出海项目,初期以满足《MAS TRM Guidelines》第12.4条“自动化安全测试覆盖率≥85%”为硬性门槛。团队在CI流水线中嵌入gosec v2.14.0静态扫描、gosec-reporter生成OWASP Top 10映射报告,并将结果强制阻断PR合并。首月拦截高危问题37处,包括硬编码API密钥(go:embed误用)、未校验TLS证书(&http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}})等典型Go反模式。
构建可信供应链:SBOM与签名验证闭环
针对欧盟DSA法案要求,团队采用Syft + Grype构建全链路软件物料清单(SBOM),并集成Cosign实现Go二进制签名:
cosign sign --key cosign.key ./payment-service-v1.2.0-linux-amd64
cosign verify --key cosign.pub ./payment-service-v1.2.0-linux-amd64
所有镜像推送至Harbor时自动触发签名验证,未签名镜像禁止部署至生产集群。该机制在2024年Q2德国客户审计中一次性通过ISO/IEC 27001附录A.8.2.3条款审查。
安全左移的工程化改造:Go模块级策略引擎
基于Open Policy Agent(OPA)开发go-policy-engine,将安全规则下沉至go.mod解析层:
| 规则类型 | Go代码示例 | 阻断时机 |
|---|---|---|
| 禁止使用已知漏洞版本 | require github.com/gorilla/mux v1.8.0(CVE-2023-37912) |
go mod tidy执行后 |
| 强制依赖最小权限 | require cloud.google.com/go/storage v1.34.0 // +insecure注释存在 |
go build -v阶段 |
竞争力跃迁:安全能力产品化输出
将上述能力封装为GoSecOps-as-a-Service平台,支持客户自助配置策略模板。越南VNPAY银行接入后,其跨境支付网关上线周期从42天压缩至9天,安全缺陷修复平均耗时由72小时降至4.3小时。平台内置的go-fuzz模糊测试调度器,可自动为encoding/json.Unmarshal等高危函数生成百万级变异输入,2024年累计发现3类Go标准库边界条件缺陷(已提交上游PR#62188、#62401)。
多云环境下的策略一致性保障
面对AWS GovCloud与阿里云国际站混合部署场景,采用Terraform Provider for OPA统一管理策略分发。关键策略同步状态通过Mermaid流程图实时可视化:
graph LR
A[OPA Bundle Server] -->|HTTPS轮询| B(AWS EKS Cluster)
A -->|S3 EventBridge| C(Alibaba Cloud ACK)
B --> D[go-policy-engine注入Pod]
C --> D
D --> E[拒绝含unsafe.Pointer的反射调用]
文化融合:Go安全工程师双认证体系
联合新加坡SAFETY联盟建立Go安全能力认证路径,要求工程师同时持有GCP Professional DevOps Engineer与OWASP GoSecure Practitioner双资质。首批23名认证工程师主导重构了印尼Bank Central Asia的跨境清算系统,将crypto/rand.Read误用导致熵源不足的风险事件归零。
实时威胁响应:eBPF驱动的运行时防护
在Kubernetes DaemonSet中部署eBPF程序监控Go runtime系统调用,当检测到net/http.(*conn).serve异常高频panic(>5次/秒)时,自动触发pprof内存快照并隔离Pod。该机制在2024年3月成功捕获某勒索软件利用gob反序列化漏洞的攻击链,平均响应时间1.8秒。
