简单的1password cli通过查询本地sqlite数据库列出和解密机密
onepassword-local-search的Python项目详细描述
1密码本地搜索
This is an unofficial tool focused on listing and decryption of secrets with increased performance comparing to native op CLI
如何使用?
此工具不替换1password的官方cliop
。您仍然需要它来执行登录和获取会话密钥。
因此,请确保您已在您的环境中注册了操作会话团队。
####数据库路径
脚本将根据您的平台尝试在标准路径搜索数据库。如果失败了或者你想 要使用另一个数据库,可以将env变量onepassword_local_database_path设置为 您要使用的b5.sqlite数据库。
获取解密值
op-local get uuid [field] [--use-custom-uuid] [--use-lastpass-uuid]
总计
如果创建了一个字段类型为“一次性密码”的无标题“一次性密码”,则可以检索
使用特殊字段totp
的totp值。例如:op-local get uuid totp
。
列表项
op-local list [--format='{uuid} {title}'] [--filter=''] [--output-encoding=json]
格式字符串允许您自定义列表项的输出格式。你可以使用任何字段, 将使用任何节中的第一个匹配项。
op-local list --format='{uuid}|{title}|{username}|{password}'
筛选器将只返回其标题包含筛选器字符串的条目。
通过附加,--output-encoding=json
,您可以生成正确的json编码列表。例如:
op-local list --format='{{"uuid": "{uuid}", "title": "{title}"}},' --output-encoding=json
通过认证
op-local is-authenticated
检查1密码会话是否已打开。
uuid映射
将项目从一个保管库移动到另一个保管库时,1password中的uuid会发生更改。为了防止这个问题,自定义uuid 已实现映射功能。
您需要在每个项上添加一个名为UUID
的字段。
然后运行op-local mapping update
生成映射talbe关系。
现在可以使用自己的UUID
获得一个项,方法是将--use-custom-uuid
标志附加到get
命令。
--use-lastpass-uuid
标记也做了同样的事情,但是使用了一个LASTPASS_ID
字段。
您可以通过运行op-local mapping list
来显示uuid映射。
由于0.16和as、uuid v4、lastpass id和1password uuid完全不同,因此将执行搜索 对于给定的uuid类型,不必使用任何特殊标志。
多个账户
此项目支持多帐户解密。但是,请记住您需要:
- 使用1密码桌面客户端的主帐户进行身份验证
- 要与您要使用的其他帐户进行身份验证
已知限制
- 目前,E类保险库(家庭共享?)不支持。我现在不需要这种保险库。我不确定我会在这方面下功夫。
- 未与您共享的保管库不会被排除,并且将使列表过程失败。我想这是一个简单的修复,将在下一个版本。
- 未实现组权限。用户必须手动附加到每个保险库。
为什么要做这个项目?
我们使用ansible来管理基础设施,并使用一个查找插件来获取数百个机密。
我们以前使用lastpass,但由于不可靠的api调用和不支持的cli,我们决定离开。
本机op
工具的第一个基准测试在大约3到4个小时内显示出了非常差的性能
找回一个秘密。当cli工具请求1password服务器检索机密时,性能
直接受您与服务器的距离的影响。
基准
获取命令
官方操作命令1M23S
Performance may depends on how far you are of a 1Password data-center. I live in South of France, nearest is Frankfurt.
ime (for i in {1..20}; do IDS=('zzfmhu2j7ajq55mmpm3ihs3oqy' 'n3iopimevz3pddels3dgfwyp2a' ); eval "time op get item ${IDS[$((RANDOM % ${#IDS[@]}+1))]} --session="XXX" > /dev/null"; done)
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,50s user 2,09s system 85% cpu 4,180 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,49s user 2,12s system 84% cpu 4,280 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,50s user 2,12s system 85% cpu 4,230 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,49s user 2,06s system 84% cpu 4,210 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,49s user 2,08s system 88% cpu 4,029 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,50s user 2,11s system 85% cpu 4,222 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,50s user 2,10s system 85% cpu 4,189 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,50s user 2,14s system 93% cpu 3,888 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,49s user 2,12s system 78% cpu 4,601 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,51s user 2,14s system 87% cpu 4,182 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,51s user 2,12s system 92% cpu 3,913 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,49s user 2,11s system 80% cpu 4,494 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,50s user 2,12s system 91% cpu 3,972 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,50s user 2,15s system 93% cpu 3,893 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,50s user 2,12s system 80% cpu 4,487 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,49s user 2,10s system 81% cpu 4,378 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,47s user 2,05s system 90% cpu 3,909 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,50s user 2,07s system 92% cpu 3,859 total
op get item zzfmhu2j7ajq55mmpm3ihs3oqy > /dev/null 1,50s user 2,12s system 93% cpu 3,861 total
op get item n3iopimevz3pddels3dgfwyp2a > /dev/null 1,50s user 2,09s system 84% cpu 4,240 total
( for i in {1..20}; do; IDS=('zzfmhu2j7ajq55mmpm3ihs3oqy' ) ; eval ; done; ) 29,92s user 42,15s system 86% cpu 1:23,02 total
本地操作3,5秒(比原来快23倍)
time (for i in {1..20}; do IDS=('gzikfbpysjwsqdagcgxcwqmmxe' 'jfcpk2cpgxarvrhlatca7tsyui' 'osk6bqktonuxjm4qgqxs2tpz6a' 'dytzaelqvqrmhfstscb67geuly' ) FIELDS=('password' 'title'); eval "time op-local get ${IDS[$((RANDOM % ${#IDS[@]}+1))]} ${FIELDS[$((RANDOM % ${#FIELDS[@]}+1))]} > /dev/null"; done)
op-local get dytzaelqvqrmhfstscb67geuly title > /dev/null 0,13s user 0,03s system 97% cpu 0,165 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe password > /dev/null 0,14s user 0,04s system 98% cpu 0,175 total
op-local get dytzaelqvqrmhfstscb67geuly title > /dev/null 0,14s user 0,03s system 98% cpu 0,176 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a password > /dev/null 0,13s user 0,03s system 98% cpu 0,170 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null 0,14s user 0,04s system 98% cpu 0,175 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a password > /dev/null 0,14s user 0,04s system 98% cpu 0,178 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null 0,13s user 0,03s system 98% cpu 0,168 total
op-local get jfcpk2cpgxarvrhlatca7tsyui title > /dev/null 0,13s user 0,03s system 98% cpu 0,169 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null 0,13s user 0,03s system 97% cpu 0,171 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a password > /dev/null 0,13s user 0,04s system 98% cpu 0,173 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null 0,14s user 0,04s system 98% cpu 0,173 total
op-local get jfcpk2cpgxarvrhlatca7tsyui title > /dev/null 0,14s user 0,03s system 97% cpu 0,176 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe password > /dev/null 0,13s user 0,03s system 97% cpu 0,171 total
op-local get dytzaelqvqrmhfstscb67geuly password > /dev/null 0,14s user 0,03s system 97% cpu 0,174 total
op-local get jfcpk2cpgxarvrhlatca7tsyui password > /dev/null 0,14s user 0,04s system 98% cpu 0,179 total
op-local get dytzaelqvqrmhfstscb67geuly title > /dev/null 0,14s user 0,04s system 97% cpu 0,181 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null 0,14s user 0,04s system 97% cpu 0,179 total
op-local get gzikfbpysjwsqdagcgxcwqmmxe title > /dev/null 0,14s user 0,04s system 98% cpu 0,178 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null 0,14s user 0,04s system 98% cpu 0,182 total
op-local get osk6bqktonuxjm4qgqxs2tpz6a title > /dev/null 0,15s user 0,04s system 97% cpu 0,188 total
( for i in {1..20}; do; IDS=('gzikfbpysjwsqdagcgxcwqmmxe' ) FIELDS=( 'title) 2,74s user 0,71s system 98% cpu 3,509 total
列表命令
0,7s列出并解密1877个条目
time op-local list | wc -l
1877
op-local list 0,68s user 0,05s system 99% cpu 0,741 total
wc -l 0,00s user 0,00s system 0% cpu 0,740 total
开发
开发需求列在requirements/dev.txt中
mkvirtualenv3 op-local-search
workon op-local-search
pip3 install -r requirements/dev.txt
测试
测试通过pytest
完成。
致谢
如果没有david schuetz的工作,awesome这个工具是不可能实现的。(@dschuetz)https://github.com/dschuetz/1password
我还要感谢1password的支持团队,特别是@cohix,它帮助了我 低调找到1密码的其余内部。
非常感谢jo_l franusic和他在jwkhttps://github.com/jpf/okta-jwks-to-pem上的工作。那帮助我 大大提高了应用程序的性能。
非常感谢大家!
许可证
gplv3