9个版本
0.3.4 | 2024年5月18日 |
---|---|
0.3.3 | 2023年12月24日 |
0.3.2 | 2023年9月16日 |
0.3.1 | 2023年1月25日 |
0.1.0 | 2021年3月26日 |
#9 in #ftp-server
用于 unftp
420KB
8K SLoC
unftp-auth-jsonfile
libunftp的一个认证后端,用于验证JSON文件。
许可证
您可以在Apache License v2.0的条款下免费使用、修改和分发此软件。
lib.rs
:
此crate实现了libunftp的Authenticator
,用于验证JSON格式中的凭据。
它支持明文密码以及PBKDF2编码的密码。
明文示例
[
{
"username": "alice",
"password": "I am in Wonderland!"
}
]
PBKDF2编码示例
盐和密钥都需要进行base64编码。目前libunftp仅支持HMAC_SHA256(以后将支持更多)。
有多种工具可以用来生成密钥。
在这个示例中,我们展示了两种生成PBKDF2的方法。首先,我们展示如何直接使用通用工具nettle-pbkdf2。
生成安全盐
salt=$(dd if=/dev/random bs=1 count=8)
生成base64编码的PBKDF2密钥,将其复制到JSON结构的pbkdf2_key
字段。
当直接使用nettle
时,请确保不要超过摘要算法的输出长度(256位,我们这里是32字节)
echo -n "mypassword" | nettle-pbkdf2 -i 500000 -l 32 --hex-salt $(echo -n $salt | xxd -p -c 80) --raw |openssl base64 -A
将盐转换为base64,以复制到JSON结构的pbkdf2_salt
字段
echo -n $salt | openssl base64 -A
除了直接使用nettle
外,您还可以使用我们的便捷docker镜像:bolcom/unftp-key-generator
docker run -ti bolcom/unftp-key-generator -h
不使用选项运行它,将根据给定的密码生成一个PBKDF2密钥和随机盐。如果没有输入密码,将使用默认设置生成一个安全的密码,包括密码复杂性和迭代次数。
现在将这些写入以下JSON文件。如果您使用我们的unftp-key-generator,可以使用-u
选项来直接生成JSON输出。否则,请确保以下示例中的pbkdf2_iter
与使用nettle-pbkdf2
时使用的迭代次数(-i
)相匹配。
[
{
"username": "bob",
"pbkdf2_salt": "<<BASE_64_RANDOM_SALT>>",
"pbkdf2_key": "<<BASE_64_KEY>>",
"pbkdf2_iter": 500000
},
]
混合示例
可以将明文和pbkdf2编码类型的密码混合使用。
[
{
"username": "alice",
"pbkdf2_salt": "<<BASE_64_RANDOM_SALT>>",
"pbkdf2_key": "<<BASE_64_KEY>>",
"pbkdf2_iter": 500000
},
{
"username": "bob",
"password": "This password is a joke"
}
]
与libunftp一起使用
使用JsonFileAuthenticator::from_file直接从文件加载JSON结构。请参阅示例examples/jsonfile_auth.rs
。
或者使用其他来源的JSON凭据,并使用JsonFileAuthenticator::from_json代替。
使用允许列表防止未经授权的访问
[
{
"username": "bob",
"password": "it is me",
"allowed_ip_ranges": ["192.168.178.0/24", "127.0.0.0/8"]
},
]
按用户证书验证
JSON验证器还可以检查客户端证书的CN是否与特定的字符串或子串匹配。此外,当libunftp配置为使用TLS,并且特别配置为通过Server.ftps_client_auth方法请求或要求客户端证书时,可以按用户配置无密码;仅证书;认证。为此,还需要配置一个包含根证书的受信任存储库,通过Server.ftps_trust_store方法。
给定此示例配置
[
{
"username": "eve",
"pbkdf2_salt": "dGhpc2lzYWJhZHNhbHR0b28=",
"pbkdf2_key": "C2kkRTybDzhkBGUkTn5Ys1LKPl8XINI46x74H4c9w8s=",
"pbkdf2_iter": 500000,
"client_cert": {
"allowed_cn": "i.am.trusted"
}
},
{
"username": "freddie",
"client_cert": {}
},
{
"username": "santa",
"password": "clara",
"client_cert": {}
}
]
我们可以看到,Eve需要提供一个与“i.am.trusted”匹配的有效客户端证书,然后还需要提供正确的密码。Freddie只需要提供一个由受信任存储库中的证书签名的有效证书。在登录时,他不需要密码。Santa需要提供一个有效的证书和密码,但CN可以是任何内容。
依赖关系
~22–35MB
~621K SLoC