1Password介绍

作者: 雪落无留痕 | 来源:发表于2023-09-21 15:14 被阅读0次

1Password 是一款密码管理器,能够记住用户所有的密码。

1Pasword 支持macOS, iOS, windows, Android, Liunx, Chrome OS, Command Line 多种版本。

1Password 将通秘密引入的方式将用户的秘密加载到环境变量和配置文件中,用户不需要在代码中放置明文秘密。

基本概念

账户

用户在新注册一上具账户时,需要提供密码,然后由1Password 会生成 128位密钥,由用户保管。 若用户丢失密码和密钥,则无法恢复。

**Vault **

用户可以创建多个保险箱,每个保险箱可以添加多个Item, 每个Item是为用户的一条秘密信息。

Item

用户可以将各密码,包含各种网站登陆的用户名和密码,信用卡,加密钱包的密钥等添加到1Pass中,统一进行管理。

用户在添加item时可以添加自定义的字段。

秘密加载

将秘密载入环境变量

通过op item get 方式,自动为Item 中的每个字段生成一个秘密引用。

$ op item get GitHub --formate json  // op为 1Password CLI工具,Github为Item 名称 

会得到如下结果:

"fields": [
  {
    "id": "username",
    "type": "STRING",
    "purpose": "USERNAME",
    "label": "username",
    "value": "wendy_appleseed@agilebits.com",
    "reference": "op://development/GitHub/username"
  },
  {
    "id": "password",
    "type": "CONCEALED",
    "purpose": "PASSWORD",
    "label": "password",
    "value": "GADbhK6MjNZrRftGMqto",
    "entropy": 115.5291519165039,
    "reference": "op://development/GitHub/password",
    "password_details": {
      "entropy": 115,
      "generated": true,
      "strength": "FANTASTIC"
    }
  },
  {
    "id": "notesPlain",
    "type": "STRING",
    "purpose": "NOTES",
    "label": "notesPlain",
    "reference": "op://development/GitHub/notesPlain"
  },
  {
    "id": "5ni6bw735myujqe4elwbzuf2ee",
    "section": {
      "id": "hv46kvrohfj75q6g45km2uultq",
      "label": "credentials"
    },
    "type": "CONCEALED",
    "label": "personal_token",
    "value": "ghp_WzgPAEutsFRZH9uxWYtw",
    "reference": "op://development/GitHub/credentials/personal_token"
  }
]

然后可以通过环境变量引用秘密信息:

$ export GITHUB_TOKEN=op://development/GitHub/credentials/personal_token

然后通过op run 可以解析引用的秘密:

$ op run --no-masking -- printenv GITHUB_TOKEN
$ ghp_WzgPAEutsFRZH9uxWYtw

将秘密载入配置文件

首先定义配置文件模板:

### config.yml.tpl

database:
    host: http://localhost
    port: 5432
    username: op://prod/mysql/username
    password: op://prod/mysql/password

然后通过op inject 将秘密注入到配置文件中:

$ op inject -i config.yml.tpl -o config.yml

注意:对于解析秘密的配置文件,需要及时删除。

connect Server

采用secrets Automation Workflow 管理公司基础设施的秘密。

通过使用由 connect server 提供的私有的REST API, 使公司的应用能访问在账户保险箱中的秘密。

设置Secrets Automation workflow

这个过程主要生成:

  • 1password-credentials.json 文件,用于部署1Password connect server:
{"verifier":{"salt":"r2pcKqNSMJ7dXRoACDTEzg","localHash":"qBlW_peexLuwMcGRpJKMsY9bbpLWNYA3n7WrNfhgxnc"},"encCredentials":{"kid":"localauthv2keykid","enc":"A256GCM","cty":"b5+jwk+json","iv":"1uzxGyei2ev1BtL5","data":"Ga0k8fy3HFHXWjMnjvjSqnOxtzclQxwLHpmwxmuzwXkgf_Q4qhYOhmj9b4fd9eNw6kfXOqNTIYHH7yWbJdQqXwl2vDxpVFGbxi47J5gLUfMp7JWmPaFpCZNyN2WMsGkKJJSxNR-gdlQ4mbkPayhPru1ksvk3ytUt6kEXqvMs7bvUs1F5kv0E4jpPp2kWkT6mq22QEDQJU_8fp1dWKU92uqV4oBeSMA-CFNozz7PHaX_QL-pmvCM807-rejzxNGnV1tPnyK6JRhOPWVVGlqq_0312GjIbF325UCSqcXIs9DdzkBTd58z5eSoqS4GBnkHnTz4iwmB2NbW5AjoUbzoD9kf4TO_TD2SRVpi6rEwjqnuZjp_KKNdP1KknwIdyfQUCkGOfFeDG18A9lQCiipfgzXw9ku5NCuHXeKkOa_FvukeCPokF_njQPm08T_l3_hMBP9gxDPq3bawtl_r9AkJM0HSjFT97gHFlU2dVDAafwYTugys0zyPUL4RMoJhP8EpgOfba2Oo1g1A5BqAQv5U55AfNVdw6oi7sI75VvsGYckfcC-z0AecDGZCbzA5m9m0r_Csi9e34ZmqcDH7tKOnF-i5AZgr_GuREGEnCEpHwbfxP4xoaBvgmAw"},"version":"2","deviceUuid":"bdcfucia5waw5wt3mcmcw4r5a4","uniqueKey":{"alg":"A256GCM","ext":true,"k":"9EXfNEs8fPrzeoXgcm6NUAezSErg50Dc7TGjPyi4AVY","key_ops":["encrypt","decrypt"],"kty":"oct","kid":"epsselzoe7rz3yhne3zil3dpbe"}}

里面主要包含了加密了凭证信息,即用于加密的 AUK(Account Unlock key) 密钥 和 用于认证的 SRP-x 密钥。

  • 访问token, 用于应用和REST API进行认证:
eyJhbGciOiJFUzI1NiIsImtpZCI6InprYjJ6YXE2djR3bzQyc2t1eXhqbWw2ZzdxIiwidHlwIjoiSldUIn0.eyIxcGFzc3dvcmQuY29tL2F1dWlkIjoiVkRDQUFRSkNJRkFXUE5VWVpXMkRZSVVTWkUiLCIxcGFzc3dvcmQuY29tL3Rva2VuIjoiR2NqdUtKOFJTTXVnSC1YOF9wTUtXTG52N0ZBbUJDR3oiLCIxcGFzc3dvcmQuY29tL2Z0cyI6WyJ2YXVsdGFyJdLCIxcGFzc3dvcmQuY29tL3Z0cyI6W3sidSI6ImtqN2h2NjZpY2xvZ3dyeXppdG50b2loN2p1IiwiYSI6NDh9XSwiYXVkIjpbImNvbS4xcGFzc3dvcmQuY29ubmVjdCJdLCJzdWIiOiJRTzRNUzJIWkVCQkFKS1VEQjYyNk9MUFJTRSIsImV4cCI6MTY3MTMyMTU5OSwiaWF0IjoxNjY4Njc4MDA3LCJpc3MiOiJjb20uMXBhc3N3b3JkLmI1IiwianRpIjoidW53Y3RqcGI2ZnBtM2RvZm4ydmphdHgya3kifQ.Cl7Yn_CNxDFy1YPYN1aYtXaC31esAYMry4c6-Gjzl-MzQylKw2v9i3cCQsNnLhCCDAzfPo4WMucCXI_tG-j71Q

token 是一个JWT(JSON Web Token), 用于HTTP认证,也包含了用于解密身份凭证的密钥。

token 可以设置有效期,为30天,90天等,或者永远有效。

部署1Password connect server

通过docker 部署1password 连接服务器,需要配置1password-credentials.json,如下所示:

services:
  op-connect-api:
    image: 1password/connect-api:latest
    ports:
      - "8080:8080"
    volumes:
      - "./1password-credentials.json:/home/opuser/.op/1password-credentials.json"
      - "data:/home/opuser/.op/data"
  op-connect-sync:
    image: 1password/connect-sync:latest
    ports:
      - "8081:8080"
    volumes:
      - "./1password-credentials.json:/home/opuser/.op/1password-credentials.json"
      - "data:/home/opuser/.op/data"

应用和服务可以通过REST API 请求连接到 connect server, 获取账户中保险箱的秘密。

curl \
-H "Accept: application/json" \
-H "Authorization: Bearer $OP_API_TOKEN" \
http://localhost:8080/v1/vaults

1Password官方提供了go, Node.js, Python版本的SDK, 可以对账户保险箱的秘密执行各种操作。

注:默认情况下,1Password connect server 和 用户应用在一个可信的网络中;但必要情况下,可以启用TLS协议,保证用户应用与connect server 连接之间的安全性,此时需要配置connect server的证书。

REST API

主要有以下接口, 可以执行CRUD操作:

  • GET /v1/vaults
  • GET /v1/vaults/{vaultUUID}
  • GET /v1/vaults/{vaultUUID}/items
  • POST /v1/vaults/{vaultUUID}/items
  • GET /v1/vaults/{vaultUUID}/items/{itemUUID}
  • PUT /v1/vaults/{vaultUUID}/items/{itemUUID}
  • DELETE /v1/vaults/{vaultUUID}/items/{itemUUID}
  • PATCH /v1/vaults/{vaultUUID}/items/{itemUUID}
  • GET /v1/vaults/{vaultUUID}/items/{itemUUID}/files
  • GET /v1/vaults/{vaultUUID}/items/{itemUUID}/files/{fileUUID}
  • GET /v1/vaults/{vaultUUID}/items/{itemUUID}/files/{fileUUID}/content
  • GET /heartbeat
  • GET /health
  • GET /metrics

token 权限管理

采用token主要有以下优势:

  • 可以管理组成员和应用分别对某些token有访问权限;
  • 可以监控和审查token和item 的使用情况;
  • 可以选择token的有效期,并且可以随时撤销token。

connect server 安全性

在设置connect server 的时候,可以配置其可以访问的保险箱,token 也只能访问指定的保险箱秘密。

只能授权的客户端,可以通过token 访问1Password connect server, 采用了ES256签名方案。

连接CLI

1Password 可以连接 connect server, 需要配置OP_CONNECT_HOSTOP_CONNECT_TOKEN 环境变量。然后可以执行以下操作:

  • op run
  • op inject
  • op read
  • op item get --format json

事件报告API

采用1Password, 可以将账户活动发送到 SIEM (Security information and event management system) 中,例如使用item的使用情况。

安全性

1Password 数据经端到端加密,在本地和传输过程中均得到安全保护,使用 AES-256 算法加密,并通过多种方式确保只有用户本人才能解密访问自己的信息。

账户密码(password):用于保护用户设备上的数据 ,只有用户本人知道账户密码,永完不会通过网络发送或存储。

用户密钥(secret key):128位,只用用户自己知道,主要保证用户数据在设备之外的安全性,用户需要妥善保管,存储在apps或浏览器上。

真正的加密密钥和认证密钥由密码和密钥派生,也称为2SKD(Two Secret Key Derivation), 派生用于加密的 AUK(Account Unlock key) 密钥 和 用于认证的 SRP-x 密钥。

通过SRP(secure remote password) 协议和TLS 保证1password app 和 1password 服务器之间的互相认证和安全通信,避免用户隐私信息的泄露。

参考

https://1password.com/zh-cn/

https://developer.1password.com/docs/cli

https://github.com/1Password

https://1passwordstatic.com/files/security/1password-white-paper.pdf

https://tooltt.com/jwt-decode/

相关文章

网友评论

    本文标题:1Password介绍

    本文链接:https://www.haomeiwen.com/subject/mgdzvdtx.html