Python实战,动手开发一款密码管理器

hello, 大家好,我是Jackpop!

这段时间热度和话题度较高的事情肯定少不了俄乌战争。

前不久看到一个有趣的消息,乌克兰武装部队的自动控制系统(ACS)“Dnipro” 曾经使用 “admin” 和 “123456” 作为服务器的账号密码。

堂堂武装部自动控制系统竟然用这么简单的密码?

据知名网站调研,”123456“这个密码的使用人数已经高居榜首。

这背后自然有安全意识淡薄的问题,但是,反观现如今的互联网世界,任何网站都需要注册一个新的账密,如果设定一些复杂的账号密码,自然会给记忆带来很多负担。

那么,该如何存储秘钥数据呢?

在我们开始实际的存储之前,让我们简单地讨论一下什么是秘钥,以及为什么我们可能需要管理它们。

由于各种原因,今天的大多数应用程序都托管在一个基于云的架构上。无论是在企业内部还是在云端,你都可能需要将你的秘钥存储在一个安全的环境中。

什么是秘钥?

秘钥是一种数字数据,包括但不限于以下内容:

  • 用户密码

  • 系统密码

  • 数据库密码

  • API密钥

  • ssh密钥

  • OTPs

  • 加密密钥等等...

管理这些秘钥是由组织中的信息安全/DevOps负责的。他们确保没有对数据的未经授权的访问。

安装Vault

什么是Vault?

Vault是一个基于身份的秘密和加密管理系统,它提供的加密服务是由认证和授权方法控制的。

使用Vault的用户界面、CLI或HTTP API,秘密和其他敏感数据的访问可以被安全地存储和管理,严格控制(限制),并且可以审计。

首先,让我们在本地系统上安装Vault:

macOS

在macOS上,我们可以使用brew进行安装。

首先,安装HashiCorp tap:

$brew tap hashicorp/tap

安装Vault:

$brew upgrade hashicorp/tap/vault

Windows

在Windows上,我们可以使用Chocolatey进行安装:

$choco install vault

Ubuntu

$curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

添加官方的HashiCorp Linux资源库:

$ sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"

更新并安装:

$ sudo apt-get update && sudo apt-get install vault

启动Vault服务:

一旦安装完成,使用下面的命令验证安装:

$ vault status

输出:

dineshkumarkb@dineshkumarkb% vault status
Key             Value
---             -----
Seal Type       shamir
Initialized     true
Sealed          false
Total Shares    1
Threshold       1
Version         1.9.0
Storage Type    inmem
Cluster Name    vault-cluster-5bfc48b1
Cluster ID      4f365a2d-2b5c-37ae-4ba3-c8b76a3e56a5
HA Enabled      false

启动服务:

vault server -dev

输出:

==> Vault server configuration:

             Api Address: http://127.0.0.1:8200
                     Cgo: disabled
         Cluster Address: https://127.0.0.1:8201
              Go Version: go1.17.2
              Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
               Log Level: info
                   Mlock: supported: false, enabled: false
           Recovery Mode: false
                 Storage: inmem
                 Version: Vault v1.9.0

==> Vault server started! Log data will stream in below:


WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
and starts unsealed with a single unseal key. The root token is already
authenticated to the CLI, so you can immediately begin using Vault.

You may need to set the following environment variable:

    $ export VAULT_ADDR='http://127.0.0.1:8200'

The unseal key and root token are displayed below in case you want to
seal/unseal the Vault or re-authenticate.

Unseal Key: WO3EV3INnT7cAPozmQB2S0DotmLg8eMa7q+CBRbrtUE=
Root Token: s.PrJcwT6kkUfG3kJdfhenoN9a

Development mode should NOT be used in production installations!

Dev服务器是一个内置的、预配置的服务器,它不是很安全,但对于在本地玩Vault很有用。

该服务器显示解封密钥和根令牌,根令牌在你每次启动服务器时都会改变。所以要确保每次重启服务器时都将该令牌添加到环境变量中。

Dev服务器将其所有数据存储在内存中,在没有TLS的情况下监听localhost,并自动解封并向你显示解封密钥和根访问密钥。

添加服务器细节到PATH

$ export VAULT_ADDR='http://127.0.0.1:8200'
$ export VAULT_TOKEN="s.PrJcwT6kkUfG3kJdfhenoN9a"

当在开发模式下运行Vault时,Key/Value v2秘密引擎在secret/path处被启用。

Key/Value秘密引擎是一个通用的键值存储,用于在为Vault配置的物理存储中存储任意的秘密。

写入Vault的秘密会被加密,然后写入后端存储。

因此,后端存储机制永远不会看到未加密的值,也没有必要在没有Vault的情况下对其进行解密。

访问Vault

Vault提供了多种机制,如UI、Cli和API来存储/获取秘密,可以使用各种秘密引擎来存储/检索它们。

然而,Vault服务器在开发模式下总是使用Key/Value引擎。

Key/Value秘密引擎是一个通用的键值存储,用于在为Vault配置的物理存储中存储任意的秘密。写入Vault的秘密会被加密,然后写入后端存储。

要访问用户界面,请在浏览器中打开https://127.0.0.1:8200

开发模式下的服务器将秘密存储在secret/

用Python编写KV秘钥

现在我们的Vault开发服务器已经启动并运行,让我们尝试使用Python存储秘钥。

请注意,开发服务器将所有的秘钥存储在内存中,当服务器会话结束时,所有的秘钥都被删除。

HVAC是我们将用来与Vault服务器交互的vault API客户端,所以,需要安装一下。

安装HVAC

$ pip install hvac

链接HVAC客户的

import hvac

def init_server():

    client = hvac.Client(url='http://localhost:8200')
    print(f" Is client authenticated: {client.is_authenticated()}")

init_server()

Output:
Is client authenticated: True
def write_secret():

    create_response = client.secrets.kv.v2.create_or_update_secret(path='hello', secret=dict(foo="bar"))

    print(create_response)

write_secret()

输出:

{
   "request_id":"f2e29013-09f9-efd7-f51e-825c4a6d8f75",
   "lease_id":"",
   "renewable":false,
   "lease_duration":0,
   "data":{
      "created_time":"2021-12-02T07:34:58.187639Z",
      "custom_metadata":"None",
      "deletion_time":"",
      "destroyed":false,
      "version":1
   },
   "wrap_info":"None",
   "warnings":"None",
   "auth":"None"
}

你可以从用户界面/CLI中验证这些秘钥。我们刚刚写的秘钥被保存在secrets/hello中。

读取秘钥

def read_secret():

    read_response = client.secrets.kv.v2.read_secret_version(path='hello')
    print(read_response)

read_secret()

输出:

{
   "request_id":"9c2fb05c-f78a-837a-a6d0-6b7a59b4d45d",
   "lease_id":"",
   "renewable":false,
   "lease_duration":0,
   "data":{
      "data":{
         "foo":"bar"
      },
      "metadata":{
         "created_time":"2021-12-02T07:34:58.187639Z",
         "custom_metadata":"None",
         "deletion_time":"",
         "destroyed":false,
         "version":1
      }
   },
   "wrap_info":"None",
   "warnings":"None",
   "auth":"None"
}

读取的响应包含数据对象中存储在hello中的所有秘钥,以及秘钥的元数据。

Vault的功能不仅限于KV引擎,他们还支持多云平台,如GCP、Azure和AWS的专用引擎和API。

如果感兴趣,可以深入了解一下!

最后,给大家推荐一个非常不错,可以用于练习算法和编程技巧的平台,涵盖Java、算法、Python、SQL等不同领域和方向,题库丰富,完全免费:

算法提升平台icon-default.png?t=M276https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=295&fromPut=pc_zh_liudong0110_suanfa

猜你喜欢

转载自blog.csdn.net/jakpopc/article/details/123929564