跳转到主要内容

使用SSH代理加密/解密任意数据

项目描述

sagecipher

PyPI Codecov Build Status

sagecipher (ssh agent cipher) 提供了一个AES加密器,其密钥通过通过SSH代理对nonce数据进行签名获得。以下是一个示例。

Cipher illustration

这可以通过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

  1. 设置环境变量

    环境变量 描述
    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
    
  2. 为 ansible-vault 生成随机密钥并将其存储在密钥环中

    keyring set ansible-vault key < <(dd if=/dev/urandom bs=32 count=1 | base64)
    
  3. 创建保险库密码脚本以检索保险库密钥

    $ cat <<EOF > ~/vault-pass.sh
    #!/bin/sh
    keyring get ansible-vault key
    EOF
    
    $ chmod +x vault-pass.sh
    
  4. 使用 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 (12.2 kB 查看哈希值)

上传时间

支持者: