#json-file #json #ftp #json-format #libunftp #unftp #ftp-server

unftp-auth-jsonfile

libunftp的一个后端认证库,用于验证JSON格式的凭据

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

Apache-2.0

420KB
8K SLoC

unftp-auth-jsonfile

Crate Version API Docs Crate License Follow on Telegram

libunftp的一个认证后端,用于验证JSON文件。

许可证

您可以在Apache License v2.0的条款下免费使用、修改和分发此软件。


lib.rs:

此crate实现了libunftpAuthenticator,用于验证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