Lazy loaded image
高可用 step-ca 服务器
Words 2558Read Time 7 min
2025-9-30
2025-11-10
date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Nov 10, 2025 10:02 PM
是否已更新
orginal_page
是否推荐

Ubuntu 安装并运行 step-ca

创建 postgresql step-ca 数据库
假设在 192.168.1.100 上创建 stepdb 数据库
  • 管理客户端认证,允许对应局域网地址通过 step 用户访问 stepdb
    • PSQL_PATH=$(psql -d postgres -c "SHOW config_file;" | awk 'NR==3{print $1}' | xargs dirname)
      • 查找目录位置
    • vim $PSQL_PATH/pg_hba.conf
    • pg_ctl reload -D $PSQL_PATH
      • 重新加载配置
  • postgres 身份进入 shell,创建用户和数据库
    • psql postgres
    • step-ca 服务器只需安装 postgresql 客户端
      • apt install postgresql-client
    step-ca 服务器设置 postgresql 环境变量
    • 如果需要自动加载,编辑 /etc/environment
    • 手动加载 /etc/environment
      • for env in $( cat /etc/environment ); do export $(echo $env | sed -e 's/"//g'); done
    下载并安装 step-cli(以 amd64 为例)
    • wget https://dl.smallstep.com/cli/docs-ca-install/latest/step-cli_amd64.deb
    • dpkg -i step-cli_amd64.deb
    下载并安装 step-ca
    • wget https://dl.smallstep.com/certificates/docs-ca-install/latest/step-ca_amd64.deb
    • dpkg -i step-ca_amd64.deb
    CA 初始化(类似于 Docker 创建 step-ca)
    • 默认的超级管理员账户为 step,首个 provisioner 在创建过程中自行命名
      • CA 私钥密码后续需要使用,请牢记
    • 创建 CA 配置文件
      • step ca init --acme --remote-management
        • 如果需要 ACME 传递选项 -acme
        • 如果需要使用 SSH 证书传递选项 -ssh
        • 如果需要启用远程配置传递选项 -remote-management
    (可选)通过 expect 脚本创建 CA 配置文件
    • vim step-cli-init.exp
      • 自行更改响应内容
    • expect step-cli-init.exp
    • 修改配置文件使用 step-ca 数据库作为存储
      • vim $(step path)/config/ca.json
        • 如果前面没有设置 postgresql 环境变量可以在这里显示提供 dataSourcedatabase 键值对
        • 如果已设置可以删除
    • CA 加载配置并启动
      • step-ca $(step path)/config/ca.json
        • 需要提供之前的密码
    配置 step-ca 为 deamon 服务
    • 添加用户 step
      • useradd --user-group --system --home /etc/step-ca --shell /bin/false step
      • 如果要设置为 443 之类的低位端口,需要添加对应能力
        • setcap CAP_NET_BIND_SERVICE=+eip $(which step-ca)
    移动 step-ca 配置文件到 /etc/step-ca
    • mkdir -p /etc/step-ca
    • mv $(step path)/* /etc/step-ca
    • chown -R step:step /etc/step-ca
      • 修改权限
    添加 unit 服务文件
    • vim /etc/systemd/system/step-ca.service
    • 部分配置项解释
      • AmbientCapabilitiesCapabilityBoundingSetSecureBitsNoNewPrivileges: 这些选项控制进程的能力和权限
        • AmbientCapabilities 允许进程接收环境能力
        • CAP_NET_BIND_SERVICE 能力允许进程绑定到小于 1024 的端口
        • CapabilityBoundingSet 限制了进程可以拥有的能力集
        • SecureBits 允许服务在切换到 step 用户后仍保持其能力
        • NoNewPrivileges 确保进程不会在未来进行权限提升
      • ProtectSystemProtectHomeRestrictNamespacesRestrictAddressFamiliesPrivateTmpPrivateDevicesProtectClockProtectControlGroupsProtectKernelTunablesProtectKernelLogsProtectKernelModulesLockPersonalityRestrictSUIDSGIDRemoveIPC: 安全相关的选项,旨在限制服务对系统的访问,增强安全性
        • ProtectSystem 和 ProtectHome 通过为进程分配一个只读文件系统命名空间来配置沙盒环境
        • ProtectNamespaces 防止进程创建内核命名空间
        • RestrictAddressFamilies 阻止服务分配如 AF_PACKET 这样的特殊套接字
        • PrivateTmp 给服务提供了一个独立的 /tmp 目录
        • PrivateDevices 向服务展示了一个非常有限的 /dev 设备列表
        • Protect* (一系列保护选项)限制对系统资源的访问
        • LockPersonality 锁定了进程的执行域
        • RestrictSUIDSGID 限制了 setuid/setgid 文件的创建
        • RemoveIPC 在服务停止时移除该服务创建的所有 IPC 对象
        • RestrictRealtime 限制实时调度访问
      • SystemCallFilter: 允许的服务可以使用的系统调用白名单,这里使用了 @system-service 标签,表示允许常规系统服务所需的系统调用
      • SystemCallArchitectures: 限制服务只能调用原生架构的系统调用
      • MemoryDenyWriteExecute: 防止创建可写和可执行的内存区域,增加安全性
      • ReadWriteDirectories: 指定哪些目录是可以读写的,这里是 /etc/step-ca/db
    • 添加 password 文件 -password-file password.txt 传递私钥密码
      • echo "mypassword" > /etc/step-ca/password.txt
    启动 step-ca 服务
    • 先修改 ca.json 路径
      • sed -i 's|/root/.step|/etc/step-ca|g' /etc/step-ca/ca.json
        • root
      • sed -i 's|/home/$(whoami)/.step|/etc/step-ca|g' /etc/step-ca/ca.json
        • non-root
    • systemctl daemon-reload
    • systemctl status step-ca
    • systemctl enable --now step-ca
      • 启动 step-ca
    • journalctl --follow --unit=step-ca
     

    配置高可用 step-ca

    • 按照上面方法配置完首台 step-ca 服务器后,在后续机器上共享该 ca.json 配置文件
    安装并配置 ansible 通过 ssh 同步
    • 假设已经配置好了与另外几台服务器的 ssh 连接
      • 假设其他两台主机为 192.168.1.2 和 192.168.1.3
    • apt update && apt install ansible
    配置 ansible
    • mkdir -p /etc/ansible
    • vim /etc/ansible/hosts
      • vim /etc/ansible/ansible.cfg
        • 测试是否可以联通
          • ansible all --list-hosts
          • ansible all -m ping
        使用 ansible 同步 step-ca 配置
        • 以配置 step-ca 为 deamon 服务为基准进行
        • 创建 playbook
          • vim step-ca-init.yaml
        • 执行 playbook
          • ansible-playbook step-ca-init.yaml
        部署两台 alpine 服务器使用 haproxy 和 keepalived 实现高可用 step-ca
        • 网络环境
          • 假设两台 alpine 内网 lan 口地址分别为 192.168.1.101192.168.1.102,在虚拟地址 192.168.1.103 上提供负载均衡
          • 假设三台 step-ca 内网 lan 口地址分别为 192.168.1.51, 192.168.1.52, 192.168.1.53
        • apk add haproxy keepalived
        配置 keepalived
        • mkdir -p /etc/keepalived
        • touch /etc/keepalived/keepalived.conf
        • 全局定义 global_defs
          • vim /etc/keepalived/keepalived.conf
            • router_id 当前 keepalived 实例路由标识,可以改成主机名
            • VRRP 协议优化
              • vrrp_skip_check_adv_addr 跳过对 VRRP 通告报文源地址的检查
              • vrrp_strict 启用严格模式,强制遵循 VRRP 协议规范
              • vrrp_garp_interval 0 设置免费 ARP(Gratuitous ARP)报文发送间隔
                • 默认值为 0,表示仅在切换为主节点时发送一次 GARP 消息
              • vrrp_gna_interval 0 设置 IPv6 邻居通告(Gratuitous NA)间隔
                • 默认值为 0,表示仅在切换为主节点时发送一次 GNA 消息
            • 剩余主要涉及邮件通知和 SMTP 服务设置,可以忽略
        • 旁路由配置样例
          • vim /etc/keepalived/keepalived.conf
            • 网络组 haproxy-vip 绑定 eth0 接口
              • virtual_router_id 51 局域网内唯一虚拟路由ID,不同接口可以重复
              • state <STATE> 区分主备
                • # MASTER on lb-1, BACKUP on lb-2
              • priority <PRIORITY> 定义优先级
                • # 200 on lb-1, 100 on lb-2
              • virtual_ipaddress 对局域网设备展示的虚拟 IP 地址
              • track_script 使用检测脚本 chk_haproxy
            • 检测脚本 chk_haproxy,用以实现某个检测功能
              • interval 2, timeout 1 每间隔 2 秒检测 haproxy 进程,超时 1 s 算失败
              • rise 1 连续成功 1 次视为健康
              • fall 2 连续成功 2 次视为不健康
                • 失败时根据 weight -20 调整优先级数值使其掉至备份
          haproxy 添加对应前后端
          • 参数解释
            • mode tcp 支持传输层(第4层)流量透传
              • SSL 由对应服务器自行处理
            • balance first 按服务器在配置文件中定义的顺序选择第一个可用的服务器
              • 其他常用负载均衡算法
                • roundrobin:轮询分发,适合无状态服务
                • leastconn:选择连接数最少的服务器,适合长连接场景
                • source:基于客户端 IP 哈希,适合需要会话保持的场景
            • inter 10s:每 10 秒执行一次健康检查
            • downinter 5s:当服务器标记为 DOWN 后,每 5 秒重试检查
            • option tcp-check, server ca-1 192.168.1.51:443 check
              • ca-1 服务器执行健康检查,方式为 tcp-check
          • vim /etc/haproxy/haproxy.cfg
          • 设置开机自动启动
            • rc-update add haproxy default
            • rc-update add keepalived default
          • 启动后在虚拟地址 192.168.1.103 可以为三台 step-ca 提供健康检测和负载均衡
            • service haproxy start
            • service keepalived start
           
          上一篇
          mac 服务管理工具 launchd
          下一篇
          Win 包管理 Scoop

          Comments
          Loading...