使用SSH代理加密/解密任意数据
项目描述
sagecipher
sagecipher (ssh agent cipher) 提供了一个AES加密器,其密钥通过通过SSH代理对nonce数据进行签名获得。以下是一个示例。
这可以通过keyring库和ansible-vault来使用,通过用户的本地或转发ssh-agent会话来加密/解密文件或秘密。
内容
安装
pip install sagecipher
使用
在使用之前,必须运行至少有一个ssh-key可用于生成加密密钥材料的ssh-agent
$ source <(ssh-agent)
Agent pid 3710
$ ssh-add
Enter passphrase for /home/somebody/.ssh/id_rsa:
Identity added: /home/somebody/.ssh/id_rsa (/home/somebody/.ssh/id_rsa)
使用keyring后端
在这里我们将设置以下环境变量
环境变量 | 值 | 描述 |
---|---|---|
PYTHON_KEYRING_BACKEND |
sagecipher.keyring.Keyring |
明确告诉keyring使用sagecipher后端 |
KEYRING_PROPERTY_SSH_KEY_FINGERPRINT |
<ssh密钥的十六进制指纹> | 预先选择SSH密钥以供sagecipher后端使用 |
如果没有其他密钥环后端可用,sagecipher 将作为默认后端,其 优先级
为 1。可以通过设置环境变量 PYTHON_KEYRING_BACKEND
来显式设置后端。有关使用 keyring 库的更多信息,请参阅 keyring 文档。
$ sagecipher list-keys # paramiko does not yet expose key comments, unfortunately..
[ssh-rsa] e8:19:fe:c5:0a:b4:57:5d:96:27:b3:e3:ec:ba:24:3c
[ssh-rsa] 38:c5:94:45:ca:01:65:d1:d0:c5:ee:5e:cd:b3:94:39
$ export PYTHON_KEYRING_BACKEND=sagecipher.keyring.Keyring
$ keyring set svc user1
Password for 'user' in 'svc':
Please select from the following keys...
[1] ssh-rsa e8:19:fe:c5:0a:b4:57:5d:96:27:b3:e3:ec:ba:24:3c
[2] ssh-rsa 38:c5:94:45:ca:01:65:d1:d0:c5:ee:5e:cd:b3:94:39
Selection (1..2): 1
$ keyring get svc user1
password1
$ export KEYRING_PROPERTY_SSH_KEY_FINGERPRINT=e8:19:fe:c5:0a:b4:57:5d:96:27:b3:e3:ec:ba:24:3c
$ keyring get svc user2
password2
$ python
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyring
>>> keyring.get_password('svc', 'user1')
'password1'
>>> keyring.get_password('svc', 'user2')
'password2'
与 ansible-vault 一起使用
在这个示例中,我们在密钥环中创建一个用于 ansible-vault
的密钥。此过程可以与任何密钥环后端一起工作,但假设我们根据上一节的内容已经安装并运行了 sagecipher
密钥环后端。
更多信息,请参阅: https://docs.ansible.org.cn/ansible/latest/user_guide/vault.html
-
设置环境变量
环境变量 值 描述 PYTHON_KEYRING_BACKEND
sagecipher.keyring.Keyring
告诉 keyring
使用sagecipher
后端KEYRING_PROPERTY_SSH_KEY_FINGERPRINT
<ssh密钥的十六进制指纹> 预先选择SSH密钥以供sagecipher后端使用 ANSIBLE_VAULT_PASSWORD_FILE
<密码脚本路径> ansible-vault
将使用此脚本查找保险库加密密钥将下面的密钥指纹替换为您自己的。
export PYTHON_KEYRING_BACKEND=sagecipher.keyring.Keyring export KEYRING_PROPERTY_SSH_KEY_FINGERPRINT=e8:19:fe:c5:0a:b4:57:5d:96:27:b3:e3:ec:ba:24:3c export ANSIBLE_VAULT_PASSWORD_FILE=~/vault-pass.sh
-
为 ansible-vault 生成随机密钥并将其存储在密钥环中
keyring set ansible-vault key < <(dd if=/dev/urandom bs=32 count=1 | base64)
-
创建保险库密码脚本以检索保险库密钥
$ cat <<EOF > ~/vault-pass.sh #!/bin/sh keyring get ansible-vault key EOF $ chmod +x vault-pass.sh
-
使用
ansible-vault
进行测试$ ansible-vault encrypt_string "secret_password" --name "secret_attribute" > secrets.yml $ ansible localhost -m debug -a var="secret_attribute" -e "@secrets.yml" [WARNING]: No inventory was parsed, only implicit localhost is available localhost | SUCCESS => { "secret_attribute": "secret_password" }
直接在 Python 中使用 sagecipher
>>> from sagecipher import Cipher
>>>
>>> # Encrypts using the first SSH key available from SSH agent...
>>> enc_text = Cipher.encrypt_string("hello, world")
>>> text = Cipher.decrypt_string(enc_text)
>>> text
"hello, world"
使用 sagecipher 命令行工具
通过运行 sagecipher --help
检查使用说明。默认情况下,'解密'操作将创建一个 FIFO 文件,然后每当打开 FIFO 时,都会启动循环以将解密数据输出到 FIFO。
FIFO 文件默认以模式 600 创建,如果权限被更改或父 shell 被终止,则 sagecipher 背景会话将结束。
$ sagecipher encrypt - encfile
Please select from the following keys...
[1] ssh-rsa e8:19:fe:c5:0a:b4:57:5d:96:27:b3:e3:ec:ba:24:3c
[2] ssh-rsa 38:c5:94:45:ca:01:65:d1:d0:c5:ee:5e:cd:b3:94:39
Selection (1..2): 1
Reading from STDIN...
secret sauce
(CTRL-D)
$ sagecipher decrypt encfile
secret sauce
$ mkfifo decfile
$ sagecipher decrypt encfile decfile &
[1] 16753
$ cat decfile # decfile is just a FIFO
secret sauce
$
项目详细信息
sagecipher-0.7.5.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | b7330f2b2f5b3d0207f94c25973d24282a1fe9ca04f39dfb1dd09939c47abad4 |
|
MD5 | 6f794155c872b96e6e4e7fa46412bf6b |
|
BLAKE2b-256 | 79bb5cf41087b5eb5b8482023b5d0b885c54311900c96e434d78749c69941deb |