关注了就能看到更多这么棒的文章哦~

Adding a "duress" password with PAM Duress

By Jake Edge
August 24, 2021
DeepL assisted translation
https://lwn.net/Articles/867158/

用户经常需要在他们的电脑上存储许多敏感信息,比如说加密证书密钥,或者被禁小说或者家庭照片。他们总是期望这些数据能通过账户的登录密码保护起来。但某些情况下用户可能会被要求登录进他们自己的系统,这样一来第三方(如联邦特工)就可以检查并复制上述数据了。PAM Duress 这个新项目就提供了一种为自己的账户添加其他密码的方式,每个密码都有自己的特有行为,这可能会是一种避免针对此系统授予所有权限的方法,不过合法性存疑。

正如其名称所指出的,PAM Duress 是一个可插拔的认证模块(PAM,pluggable authentication module),这是 Linux 以及其他 Unix 操作系统上都在使用的一种机制,可以很方便地支持增加各种类型的认证方法(authentication methods)。然而,PAM 并没有完全标准化,所以仍有多种实现方式,比如 Linux 发行版使用的就是 Linux PAM。Duress module 可以让管理员配置系统行为,在用户账户相关的密码跟提供的密码不一致的时候,再去核对一个或多个额外密码。

该项目网站页面上给出了一些例子,说明备用密码可能起到什么效果:

这个功能可以用来让被要求提供密码的人在[胁迫]下可以输入一个能进入系统的密码,但后台开始运行脚本来清理掉敏感数据,关闭与其他网络的连接,发送一个[通知]或警报(可能包含详细信息,如位置、可见的 wifi 热点、摄像头此时拍到的照片、麦克风采集到的音频流链接等等)。你甚至可以生成一个进程来删除 pam_duress 模块,这样在施行威胁行为者就无法看到系统中是否有 duress module。

这个过程中要使用到的脚本或二进制文件(即 duress 程序)可以放在/etc/duress.d 中,用于对整个系统受到胁迫时的处理,也可以放在~/.duress 中专用于服务特定的用户。在这两种情况中,duress_sign 脚本都被用来将文件处理成 PAM Duress 可以控制的形式。这个脚本会提示输入密码,并使用文件内容的 SHA-256 哈希值作为 salt,用 SHA-256 哈希进行哈希处理。最终结果这个哈希值会被写入 duress-script-name.sha256。存储下来的哈希值可以防止脚本被修改,并将密码安全地 "存储" 在仅仅一个哈希值之内。

要想使用 PAM Duress,系统的 PAM 认证文件(例如/etc/pam.d/common-auth)需要设置成首先尝试用户的密码(即使用通常的 pam_unix.so module);如果失败了,那么就要去调用 pam_duress.so 来检查是否能匹配上 duress 密码。按文档中这个说法的话,可能就是下面这个样子:

# Example /etc/pam.d/common-auth
auth [success=2 default=ignore] pam_unix.so
auth [success=1 default=ignore] pam_duress.soauth requisite pam_deny.so

被调用时,PAM Duress 会查看上述的两个 duress 程序目录中的每个文件,使用文件内容的哈希值作为 salt 来对所提供的密码进行 hash 计算,然后将其与相应的.sha256 文件中的值进行比较。如果有匹配上的,那么 duress 程序就会被调用。只要有任何文件匹配上了,就会给 PAM 返回成功,这样一来就相当于同意了授予系统访问权限,并在 duress 程序开始运行之后再调用用户的 login shell。

repository 仓库中提供了一个简单的例子来演示这个 module。其中 pushover.sh 脚本就使用 Pushover service 的 API 来发送一条信息,报告说发现 duress 密码被使用了。该消息中包含了登录者的用户名以及系统的 local 和 external IP 地址。

在介绍这个例子的 web 页面上,脚本是被利用一个密码进行了签名的,而这个密码要在每个人的系统上安装配置 duress 时给他的。这个例子指出,如果知道密码的人离开了组织,那么就应该更改密码,当然也可以使用其他策略(例如使用个人的密码)。脚本上的完整性哈希值似乎主要是为了防止无意中被修改,因为一个能够访问文件系统的攻击者有很多其他方法可以用来破坏系统。演示脚本中使用了一个配置文件来保存 API 密钥,并没有使用 hash 保护,所以这个文件如果被修改的话不会被发现,不过对大局来说没有什么影响。

从法律角度看,在 duress 密码被使用时发送消息似乎相对来说没有多大坏处,但如果进行了其他一些操作的话可能就不一样了。在 Hacker News 上关于 PAM Duress 的一个很长的讨论话题中,多名回复者指出,如果边境口岸入境时被要求登录进系统时,在后台偷偷删除文件很可能会被判定是一种违法行为,只要是被发现了的话。与所有关于 security 的问题一样,这个问题的核心还是在于所保护的是哪种类型的威胁。正如 "jeroenhd" 所说:

如果你被枪指着,那么这个会擦除你整个硬盘的脚本只会让你的日子更难过。

据我所知,如果你真的在机场被拘留和审问,那么在尝试任何密码之前,你的硬盘就已经导出一个镜像文件了。在移动设备上你也许可以摆脱这种情况,因为在移动设备上一般不会有这种功能(毕竟没什么人在智能手机上使用纯 Linux)。

我总是在想,有哪些场景会是这样的情况。如果当时你无法说 "No" 的话,那么通过提供虚假信息来激怒控制你的人那可能也不是一种好选择。

我不知道执法部门会在我的工作硬盘上寻找什么数据,但如果不可以说 "no" 的话,我肯定不希望因为我的加密密码而导致我被射杀。

"Spooky23" 说,用 PAM Duress 这样的技术手段处理这种情况的想法是 "傻傻的书呆子做法"。如果一个人拥有当局想要获取的数据,那么就不应该用他们自己的机器来携带这些数据穿越边境。"胜利的唯一方式就是不要参与进去"。但其他人指出,使用 duress 密码的目的正像 "dredmorbius" 所说的 "给人以合法合规的感觉",这可能足够让调查员满意了,也就不会再有进一步的调查了。

在讨论这类问题时,每次都有人会提到 xkcd pipe wrench scenario (https://xkcd.com/538/) 这幅漫画。用技术手段来避免随意随机的入境搜查,这对那些热爱技术的人来说当然有吸引力。但是,利用隐藏加密磁盘分区或者看起来像乱数据的文件系统等类似方案就想要作为一个推诿手段的话,都可能会成为上面说的 wrench scenario 的牺牲品。如果当局(或者是罪犯,尽管现在有时挺难区分这两者)非常想访问你的数据,他们就会找到一个手段(很可能是非技术性的)来达到他们的目的。

可以预料到,还有人建议采取其他的技术措施,比如说建立一种机制能在输入 duress 密码的情况下对加密磁盘进行 "核爆" 操作。还有人指出了一个更早以前的项目,pam_duress,它的目标完全可以从这个几乎相同的名字就看出来。此外,还有人建议将敏感数据存储在其他地方(例如在云服务中加密存储起来),这样就可以在到达目的地后再恢复出来。

归根结底,在跨越边境或处于有可能被胁迫(duress)的情况下,最安全的解决方案是不要携有敏感数据。当然,将上述数据存储在 "其他地方" 也有风险,因为云服务也几乎不可能不受到国家权力机构的影响。什么样的数据是不应该拥有的数据,这在世界不同地区往往有不同的定义,这些数据往往总是很难处理好。技术手段当然可以提供帮助,但绝对不是万能的。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

LWN:利用PAM Duress来增加一个被胁迫时的专用密码!相关推荐

  1. 如何利用python 编写脚本增加微信读书的时长。

    第一步: 安装mumu模拟器,[可在软件管家中下载] 等待安装- 第二步:搜索框所谓微信读书,并下载. 第三步:安装Python3, 下载方法1: https://www.python.org/dow ...

  2. linux内核打开prntk,操作系统实验一向Linux内核增加一个系统调用.docx

    操作系统实验一: 向Linux内核增加一个系统调用 xx 711103xx 2012年3月18日 一.实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法:掌握用 户程 ...

  3. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

    计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决. 这句话几乎概括了计算机软件体系结构的设计要点.整个体系从上到下都是按照严格的层级结构设计的. 而这个中间层通过映射来连接上下文. 不仅是 ...

  4. 一个Netfilter nf_conntrack流表查找的优化-为conntrack增加一个per cpu cache

    独悲需要忍受,快乐需要分享 对Linux协议栈多次perf的结果,我无法忍受conntrack的性能,然而它的功能是如此强大,以至于我无法对其割舍,我想自己实现一个快速流表,但是我不得不抛弃依赖于co ...

  5. [JS]请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

    请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组. 刚开始复习js题还不太习惯 CSDN上看了一个帖子,说是牛客上的标答, ...

  6. Directx11教程(11) 增加一个debug宏

    现在我们在common.h中增加一个debug的宏,在每个d3d11函数后调用,如果d3d函数出错,它能够给出程序中错误的代码行数. common.h代码如下: #pragma once #inclu ...

  7. 如何为ccflow工作流引擎增加一个优先级PRI?

    为什么80%的码农都做不了架构师?>>>    如何为ccflow工作流引擎增加一个优先级PRI? 对于一条流程的优先级可分为 低,中,高三个级别,用这个状态来标示这条流程的紧急程度 ...

  8. [内部项目]i前端如何增加一个页面

    i 的前端如何增加一个新页面呢? 要改很多地方: (1)pathMap.js 路径:js/pathMap.js 说明:key表示url访问路径,value表示接口路径和js文件名称 (2)Header ...

  9. java聊天室小程序论文_在Java项目中利用continue与break制作一个聊天室小程序

    在Java项目中利用continue与break制作一个聊天室小程序 发布时间:2020-12-08 16:03:27 来源:亿速云 阅读:98 作者:Leah 在Java项目中利用continue与 ...

最新文章

  1. 怎样将jpg转换成pdf软件
  2. JSON字符串通过response下载保存
  3. 导入excel文件处理流程节点的解决方案
  4. systemverilog 起步
  5. 震惊kafka_5个令人震惊的统计数据证明日志不足
  6. leetcode 【 Sort List 】 python 实现
  7. html object标签与java,html之object标签的classid收集
  8. 阿里重磅开源中后台UI解决方案Fusion
  9. VC中借助DirectDraw实现水波的模拟
  10. 【Selenium】1.介绍 Selenium
  11. 射频电子电路设计图集---研读
  12. java学生信息管理系统
  13. 蓝屏维修记录: IRQL_NOT_LESS_OR_EQUAL、WiseTDIFw64与iaStorAVC问题
  14. “程序员猝死”引发的思考
  15. 银河麒麟(kylin)V10桌面版
  16. java打地鼠小游戏
  17. SAAS平台的基础,构建多租户系统的思考
  18. backtrader 自定义indicator_BackTrader回测工具(一)
  19. BP神经网络实例及代码分析(python+tensorflow实现)
  20. 安装hadoop集群模拟大数据集群踩到的坑(一)

热门文章

  1. Android 通讯录导航栏
  2. [乐意黎原创] 关于eMule下载伤硬盘的话题
  3. Jhipster介绍和使用
  4. 慧荣SM2259XT主控贴镁光B27A测试分享
  5. 趋势操盘法则:资深操盘手6年60倍实战选股技法
  6. Python—numpy模块下函数介绍(一)numpy.ones、empty等
  7. C语言程序设计-引言
  8. STM32:OLED显示屏代码
  9. 递归实现前n项和(两种方法)
  10. IE8 松散耦合进程框架(Loosely-Coupled IE (LCIE)--特性介绍