Fwknop version:2.6.8
使用Rijndael和HMAC加密方式的认证流程。
Fwknop Client
一、生成密钥
HMAC KEY:
1、获取用户指定的HMAC摘要类型(default:SHA256)。
2、获取对应摘要长度为hmac_klen.
3、生成hmac_klen长度的随机字符串作为key。
4、将key通过base64编码。
Rijndael KEY:
1、 获取用户指定的klen。
2、 生成klen长度的随机字符床作为key。
3、 将key用base64编码。
二、生成SPA认证包
1、 生成access_buf,格式化为:
allow_ip+”:”+access_str(allow_ip:请求认证的IP,access_str:请求开放的服务/端口)。
2、 构造认证消息(message),格式化为:
随机字符串+”:”+base64编码的用户名+”:”+时间戳+”:”+版本信息+”:”+SPA类型值+”:”+base64编码的access_buf+”:”+base64编码的NAT信息(可选)+”:”+base64编码的server_auth字段(可选)+”:”+认证超时时间(可选)。
3、 通过用户指定的digest_type(default:SHA256)计算message的摘要数据。
4、 将salt、message和digest组合,格式化为:
“Salted__”+message+”:”+digest
5、 根据之前生成的密钥对4进行Rijndael算法加密。
6、 对密文进行base64编码,并截断编码中的等号。
7、 计算Rijndael密文的HMAC摘要。
8、 将HMAC摘要编码为base64格式并截断等号。
9、 将HMAC摘要追加到Rijndael密文后,并添加等号。
三、发送UDP SPA认证包
1、 确定发送数据spa_data,若是Rijndael加密形式则忽略前10个字节,若是GPG加密,则忽略前2个字节(去掉salt)。
2、 随机生成源端口,随机生成目的端口(可选)。
3、 发送spa_data。
Fwknop Server
一、监听指定协议和端口
二、解析SPA报文
1、 获取报文的来源和目的地址。
2、 匹配数据段前10(或2)字节是否和预留salt一样,相同则丢弃此数据包。
3、 检测数据段是否为base64编码格式,否则丢弃。
4、 从第一个stanza开始检查,若来源IP在允许访问的IP范围内,则进行后续操作。
5、 还原加盐密文,头部添加salt。
6、 取出数据段中的HMAC摘要,重新计算message密文的HMAC摘要,验证是否一致。用这种方式来匹配客户端对应的stanza。
7、 检测message加密类型,并解密。
8、 检测是否收到重放攻击报文。
9、 查看SPA中是否存在timeout字段,没有则用access.conf中设置的认证超时字段。
10、 查看SPA中的时间戳,与本机比对,差值不得超过设定值(default:120s)。
11、 若在access.conf中的REQUIRE_USERNAME字段被设置,需确保username在SPA中可被匹配。
12、 生成并配置iptables规则。
SPA数据包结构图: