1个不稳定版本
0.1.0 | 2020年10月10日 |
---|
#1023 在 HTTP服务器
64KB
1.5K SLoC
svanill-vault-server
一个HTTP服务器,用于存储/检索由svanill(命令行 或 Web)生成的文件。
经过身份验证的用户可以向一个专门的S3桶推送、列出或删除文件。
第三方服务
需要
- S3兼容的服务(AWS S3、minio等)
可选
- Sentry(用于记录错误)
目前用户数据从SQLite数据库读取,因此不需要外部数据库。
构建
您需要 Cargo,Rust软件包管理器。
cargo build
运行
构建工件位于项目根目录的目标文件夹中(如多crate Rust仓库的常规做法)。
默认情况下,AWS凭证通过环境变量 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
读取,但还有其他回退选项,请参阅 rusoto文档。您也可以将它们作为参数传递(请参阅 --help
)。
cargo run # or execute the binary from `../target/debug` or `../target/release`
# most params can be provided as env variables, here we just use arguments
RUST_LOG=trace,actix_server=trace,actix_web=trace cargo run -- \
--s3-access-key-id=test_s3_access_key \
--s3-secret-access-key=test_s3_secret_key \
--s3-bucket testbucket \
--s3-region=us-east-1 \
--s3-endpoint=http://localhost:9000 \
-H 127.0.0.1 \
-P 5000 \
-d test.db \
-v
数据库
svanill-vault-server 访问只读SQLite数据库文件。如果数据库文件不存在,它将自动创建并运行迁移。您可以通过运行查询等方式添加用户
sqlite3 test.db
sqlite> .schema
CREATE TABLE __diesel_schema_migrations (version VARCHAR(50) PRIMARY KEY NOT NULL,run_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP);
CREATE TABLE user (
username VARCHAR(50) NOT NULL PRIMARY KEY,
challenge VARCHAR(255) NOT NULL,
answer VARCHAR(32) NOT NULL
);
sqlite> INSERT INTO user VALUES ('your username', 'the challenge', 'the answer');
身份验证
用户通过请求一个挑战并然后提供对该挑战的答案来进行身份验证。
answer
应该是一个随机字符串,例如使用 hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
challenge
是使用对称算法(据说使用Svanill(Web 或 命令行))加密的答案。
它是这样工作的,这样Svanill用户可以使用单个密码来加密/解密文件并安全登录(Svanill使用AES-GCM加密,不会受到已知明文攻击的影响)。
依赖项
~76MB
~1.5M SLoC