标签: 解决方案; 安全架构
注: 请务必确保文章著作权或已获得转载授权; 著作权均归原作者所有.
首先, 先要严格阐明一下:"证书" 和 "密钥".
我们通常SSH登陆主机主要通过:
公钥认证, 是针对服务端而言, 对于客户端其实是私钥认证
SecureCRT/Putty/Xshell 的PublicKey也是上面的密钥登陆
麻烦请记住, 上面这种方式严格意义上叫 密钥/公钥登陆 !!!
那么什么是证书登陆验证呢? SSH证书也是基于密钥认证的, ssh证书是经过CA(证书颁发架构)签名后的公钥, 可以先看一下ssh公钥和ssh证书.
证书 = 公钥 + 元数据(公钥指纹/签发CA/序列号/有效日期/Principals等)
Ok, 现在你只需要知道证书登陆 != 密钥登陆.
SSH证书签发CA, 与我们所熟知的HTTPS的签发不同, 它不支持 证书链 和 可信商业CA. 可以理解为SSH签发CA只可以支持自签CA, 下面我们通过实例来说一下SSH证书验证.
这里我们创建两个CA:
# 创建Host-CA CA> ssh-keygen -t rsa -b 4096 -f Host-CA -C "host ca" # 创建User-CA CA> ssh-keygen -t rsa -b 4096 -f User-CA -C "user ca"
# 在需要签名的主机上生成主机密钥对 exs-c7-2> ssh-keygen -f ssh_host_exs-c7-2 -t rsa -b 4096 -N '' # 传输ssh_host_exs-c7-2.pub至CA服务器(exs-c7-1) # 使用Host-CA签发主机公钥 cA> ssh-keygen -s Host-CA -I host-exs-c7-2 -h -n 192.168.11.212,exs-c7-2 -V +52w ssh_host_exs-c7-2.pub #签发后我们得到cert文件 # ssh_host_exs-c7-2.pub # ssh_host_exs-c7-2-cert.pub
参数说明: -s: 指定签名的私钥文件名 -I: 证书标识 -h: 表示需要生成的是主机证书, 而不是用户证书 -n: 使用逗号分隔, 证书主要校验字段[user|host], 可以验证此证书仅能验证那些主机IP或者主机域名 -V +52w: 表示证书有效期, 52周(一年)
-应用证书到服务器
私钥(ssh_host_exs-c7-2)拷贝至/etc/ssh
公钥证书(ssh_host_exs-c7-2-cert.pub)拷贝至/etc/ssh
/etc/ssh/sshd_config 添加如下配置, 并重启sshd
HostKey /etc/ssh/ssh_host_exs-c7-2
HostCertificate /etc/ssh/ssh_host_exs-c7-2-cert.pub
-客户端导入Host-CA
client> cat ~/.ssh/known_hosts
@cert-authority 192.168.11.212 #替换为Host-CA.pub的内容"
我们登陆主机, 可以看到服务器的证书校验通过, 如下:
这里我们是通过重新生成主机密钥, 然后通过Host-CA进行签发, 其实可以将/etc/ssh下现有的公钥签发即可. 我们还可以将Host-CA添加至/etc/ssh/ssh_known_hosts
这一步其实是解决,使用公钥认证中"Trust on first use(TOFU)"的问题, 即
# 用户密钥生成 client-root> ssh-keygen -f ssh_user_root -t rsa -b 4096 -C "ssh-user:root" # 用户将公钥传给CA服务器, 使用User-Ca签发 CA> ssh-keygen -s User-CA -I ssh-user-root -n root,t1,b2 -V +3d ssh_user_root.pub
-n: 使用逗号分隔, 证书主要校验字段[user|host], 通过此字段可以限制证书只可以用于登陆root/t1/b2用户.
-服务器信任User-CA
# 信任User-CA签发的证书
TrustedUserCAKeys /etc/ssh/User-CA.pub
-登陆验证
ssh -vv -i ssh_user_root [email protected] 登陆成功, 即表示ssh证书验证配置Ok.
ssh证书验证其实是密钥认证的扩展, 嵌套了一层证书校验的逻辑, 核心还是密钥认证
SSH证书的其实就是PKI体系, 简单说一下, 不敢深入.
"CA可以验证某个证书是否由其签发
采用证书验证自然会继承PKI体系的优点:
基于证书身份验证
主机身份校验
生命周期管理
SSH零信任方案
客户端身份校验/权限管控
如: 限制某个证书只可以登陆某个用户, 同时此证书禁止ssh端口/X11/agent转发等.
Uber: uber的SSH治理正是基于SSH证书认证 + PAM的模式, 详细可以参考: Introducing the Uber SSH Certificate Authority
Netflix: https://github.com/Netflix/bless
SSH证书认证不是什么新技术, 自OpenSSH5.4都已经支持(2010/03/08), 但是有多少人知道又有多少企业在用呢?
个人在以下场景中, SSH证书体系绝对是最佳的安全选择.