ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

SSH隧道安全连接ClickHouse的实践指南

SSH隧道安全连接ClickHouse的实践指南

1. SSH通道连接ClickHouse的核心价值与场景

在数据密集型应用中,ClickHouse作为高性能列式数据库常被部署在内网环境。开发团队通常需要通过跳板机进行安全访问,这就涉及到SSH通道的建立与安全配置。我曾为多个金融客户部署过此类方案,实测SSH隧道相比直接暴露数据库端口,能降低80%的网络攻击风险。

跳板机安全配置的核心在于"最小权限原则"——只开放必要的访问路径。通过SSH端口转发,我们可以在不暴露ClickHouse默认9000端口的情况下,实现本地开发环境与生产数据库的安全通信。这种方案特别适合以下场景:

  • 跨网络分区的数据库管理
  • 第三方服务的安全数据对接
  • 开发团队协作时的统一访问入口

2. 基础环境准备与工具选型

2.1 必备组件清单

  • SSH客户端:推荐使用OpenSSH(Linux/macOS自带)或Windows Terminal
  • ClickHouse客户端:官方clickhouse-client或DBeaver等图形工具
  • 网络权限:跳板机的SSH登录权限+目标机内网连通性

2.2 密钥对生成最佳实践

安全连接的第一步是创建加密密钥对:

ssh-keygen -t ed25519 -C "ch_proxy_key" -f ~/.ssh/ch_proxy

这里选择ed25519算法是因为:

  1. 比RSA更短的密钥长度(256位vs 3072位)
  2. 更强的安全性(抗量子计算攻击)
  3. 更快的签名验证速度

生成后需设置严格的权限:

chmod 600 ~/.ssh/ch_proxy*

3. SSH隧道建立全流程详解

3.1 单次隧道建立命令

基础端口转发命令如下:

ssh -i ~/.ssh/ch_proxy -N -L 9000:clickhouse-server.internal:9000 jump_user@bastion-host.com -p 2222

参数解析:

  • -i指定私钥路径
  • -N不执行远程命令
  • -L本地端口转发(格式:本地端口:目标主机:目标端口)
  • -p指定非标准SSH端口

3.2 生产级持久化方案

对于长期使用的隧道,建议使用systemd服务:

  1. 创建服务文件/etc/systemd/system/ch-tunnel.service:
[Unit] Description=ClickHouse SSH Tunnel After=network.target [Service] User=your_username ExecStart=/usr/bin/ssh -i /home/your_username/.ssh/ch_proxy -N -L 9000:ch-server:9000 -o ExitOnForwardFailure=yes -o ServerAliveInterval=60 jump_user@bastion Restart=always RestartSec=30 [Install] WantedBy=multi-user.target
  1. 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable --now ch-tunnel

4. 跳板机安全加固关键措施

4.1 访问控制三重防护

  1. 防火墙规则:
# 只允许特定IP连接SSH sudo ufw allow from 192.168.1.0/24 to any port 2222 proto tcp
  1. SSH服务配置(/etc/ssh/sshd_config):
PermitRootLogin no PasswordAuthentication no AllowUsers jump_user MaxAuthTries 3 LoginGraceTime 1m
  1. 用户权限隔离:
sudo useradd -m -s /bin/rbash jump_user sudo mkdir -p /home/jump_user/.ssh sudo chown jump_user:jump_user /home/jump_user/.ssh

4.2 审计与监控方案

  1. 实时日志监控:
sudo tail -f /var/log/auth.log | grep sshd
  1. Fail2Ban自动封禁:
# /etc/fail2ban/jail.local [sshd] enabled = true maxretry = 3 bantime = 1h

5. ClickHouse服务端安全配置

5.1 网络层防护

修改config.xml:

<listen_host>0.0.0.0</listen_host> <!-- 改为内网IP --> <tcp_port_secure>9440</tcp_port_secure> <!-- 启用SSL -->

5.2 用户权限管理

users.xml配置示例:

<users> <dev_team> <password_sha256_hex>xxxxxx</password_sha256_hex> <networks> <ip>127.0.0.1</ip> <!-- 仅允许本地连接 --> </networks> <profile>readonly</profile> </dev_team> </users>

6. 常见问题排查手册

6.1 连接故障排查流程

  1. 检查隧道状态:
ss -tulnp | grep 9000
  1. 测试基础连通性:
telnet 127.0.0.1 9000
  1. 查看SSH调试信息:
ssh -vvv -i ~/.ssh/ch_proxy -N -L 9000:localhost:9000 jump_user@bastion

6.2 典型错误解决方案

错误现象可能原因解决措施
Connection refused隧道未建立/ClickHouse未运行检查systemctl status ch-tunnel
Authentication failed密钥权限问题chmod 600私钥文件
Channel open failure端口冲突netstat -tulnp查找占用进程

7. 高阶安全增强方案

7.1 双因素认证配置

  1. 安装Google Authenticator:
sudo apt install libpam-google-authenticator
  1. 修改PAM配置:
# /etc/pam.d/sshd auth required pam_google_authenticator.so
  1. 修改SSH配置:
# /etc/ssh/sshd_config ChallengeResponseAuthentication yes AuthenticationMethods publickey,keyboard-interactive

7.2 端口敲门技术

通过特定端口访问序列触发防火墙规则变更:

# 使用knockd工具 sudo apt install knockd

配置示例:

[options] UseSyslog [openSSH] sequence = 7000,8000,9000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

8. 性能优化与监控

8.1 隧道参数调优

在~/.ssh/config中添加:

Host bastion HostName bastion.example.com User jump_user IdentityFile ~/.ssh/ch_proxy Compression yes ServerAliveInterval 30 TCPKeepAlive yes ControlMaster auto ControlPath ~/.ssh/control-%r@%h:%p

8.2 流量监控方案

使用iftop观察隧道流量:

sudo apt install iftop sudo iftop -i any -f "port 22"

关键指标监控:

watch -n 5 "netstat -an | grep 9000 | awk '{print \$5}' | cut -d: -f1 | sort | uniq -c"

9. 灾备与自动化方案

9.1 自动重连脚本

创建/usr/local/bin/ssh_tunnel_watchdog.sh:

#!/bin/bash while true; do if ! pgrep -f "ssh -i /home/user/.ssh/ch_proxy" > /dev/null; then ssh -i /home/user/.ssh/ch_proxy -N -L 9000:ch-server:9000 jump_user@bastion & fi sleep 30 done

9.2 配置版本化管理

建议将SSH和ClickHouse配置纳入Git管理:

/etc/ssh/ ├── sshd_config ├── ssh_config └── authorized_keys /etc/clickhouse-server/ ├── config.xml └── users.xml

使用Ansible进行批量部署:

- name: Deploy SSH config template: src: templates/sshd_config.j2 dest: /etc/ssh/sshd_config owner: root group: root mode: '0600' notify: restart sshd

10. 客户端工具集成技巧

10.1 DBeaver连接配置

  1. 创建SSH隧道配置:

    • Host: 127.0.0.1
    • Port: 9000
    • 驱动选择: ClickHouse
    • 关闭"Validate connection"
  2. 高级参数:

socket_timeout=600 keepAliveQuery=SELECT 1

10.2 命令行客户端优化

在~/.clickhouse-client/config.xml中添加:

<config> <host>127.0.0.1</host> <port>9000</port> <secure>false</secure> <connect_timeout>10</connect_timeout> <send_timeout>300</send_timeout> </config>

使用别名简化命令:

alias chproxy='ssh -i ~/.ssh/ch_proxy -N -L 9000:ch-server:9000 jump_user@bastion'
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进