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
文件,用于部署1Passwordconnect 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) 密钥 和 用于认证的 密钥。
- 访问
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_HOST
和 OP_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(secure remote password) 协议和TLS 保证1password app 和 1password 服务器之间的互相认证和安全通信,避免用户隐私信息的泄露。
参考
https://developer.1password.com/docs/cli
https://1passwordstatic.com/files/security/1password-white-paper.pdf
网友评论