如何保护 $HOME/.ssh

2022-03-18 11:17:20 +08:00
 0o0O0o0O0o
/t/841188

以普通用户权限运行的程序也可以读取修改它们,有什么简单的操作可以避免这一点吗?
6378 次点击
所在节点    Linux
51 条回复
james122333
2022-03-18 21:43:56 +08:00
其中最特厌的还是纯设置 程序都不是自己规划自己写的还要去分析究竟有多少影响
getadoggie
2022-03-18 23:30:08 +08:00
firejail 了解一下,你会感谢我的
ZeroClover
2022-03-19 00:35:12 +08:00
https://developer.1password.com/docs/ssh

https://smallstep.com/blog/use-ssh-certificates/

虽然并不能解决其他程序读取 .ssh 目录的问题,但是可以极大地减少风险。
baobao1270
2022-03-19 04:45:23 +08:00
方法一:使用硬件密钥,如 YubiKey 存储 SSH 密钥
方法二:只使用信任的软件,不使用来源不明的软件,定期或不定期轮换密钥

不要寻求技术上的绝对安全,正确的做法是在安全和成本间取得平衡。与其花费很高的成本去搞一套安全方案,不如在发生问题时尽力止损。如果发生问题的损失小于增强安全的代价,那就让问题发生去吧。
cwyalpha
2022-03-19 08:32:49 +08:00
生产环境下 selinux 不大好开。。
tomychen
2022-03-19 14:54:47 +08:00
@FrankHB 其实我想表达的一个意思是,先有 UNIX 、Linux ,而后才有了强制控制访问一说。而整体的 Unix 或者类 Unix 系统的最初模型也是基于 DAC 模型。而后,为了适用于这个模型,才引用到操作系统中。
不瞒你说,我大概是 2010 年左右才听到这种说法,而还是因为当时公司参与了等级保护的项目。

当时我熟悉另一家公司的产品,除了 FreeBSD 以外,类 AIX ,HPUNIX 包括了 Windows 这类闭源系统,他们采用都是非常暴力的 Hacking 式介入,从而达到“强制访问控制”的需求。

但这些也正如你所说的,因为历史遗留问题。但是确实不能把文件系统做得不那么“烂”么,我觉得以维护 linux kernel 那帮老头的能力,并不是什么太大的问题吧,以 Windows 这么有经济实力的企业重新设计也不是多大难题吧。

但更多的时候,我觉得操作系统的迭代除了引入,加强新的功能和特性外,应该还要考虑的是“用户”,用户包括了使用者和开发者和硬件厂家。推倒一个文件系统去重新实现一个满足于并不算多数用户需要使用到的功能重要,还是只是兼容某个特性重要,这个问题似乎套在 linux 上,它似乎已经承受了太多它不应该承受的包袱,我并不是指它有多完美或者多优秀。

从为课堂而生的它到今天已经演变成了一个主流操作系统,它已经不是当年的那个研究的课件。

再回到 VFS ,从设计模式来看,我觉得 VFS 是一个非常棒的东西。当然可能是我格局小了,我看到的是这个内核层的接口,让后来的开发者在这个接口上重新设计一套 FS ,将变得更简单,而且不用过度参与到更底层的现实层去。总不能因为一个新的 FS fork 一个新的分支吧。

同样,参考你的 “about-operating-systems.md” ,整个文档看下来,你的思维更多想完成一个更合乎于“现代”的一个操作系统的模型,或者说更理想化的一个模型。

从我的理解和认知里,Linux 也好其他 Unix 也好,更多的时候,在对现代模型的支持在当年那个年代没有办法设计出来,而后通过这种补丁式,侵入式,或者模块化的方式集成的现有的模型里面。当然,可能像你说的“懒”,但是我的理解可能是会了兼容更多的用户,满足更多的用户。


SELinux 可能对很多用户来讲太复杂了,但更多人没注意到一个简单的

https://elixir.bootlin.com/linux/v3.10/source/security/tomoyo

而这是一个 LMK 的存在,当然,官方现在已经引入,也就是说已经可以在编译内核的时候选择编译到内核。

同样引用了 VFS 。

看了你的文档,才发现你对操作系统这么有研究,一个门外汉,跟你说了这么多,显得有点,不那么从容和淡定。
FrankHB
2022-03-19 19:11:13 +08:00
@james122333 尽管访问控制在描述计算机安全系统的文献中比较流行,访问控制既不是通用的安全(safety)也不是系统安全(或者说安保)(security)专属的特性,而是一种要求系统具有特定属性时的实现手段。

对上层系统的需求描述来讲,可预期应当是自然的,但实现上不可能无限担保,总有一些前提。逻辑上任何一个不满足假设前提的非预期行为的脆弱性都可以导致一整套机制实效。
例如,基本上重大的软件安全漏洞都源自于安全软件的实现违反可预期的语义保证的程序行为。符合语言规范要求的正确编码就是这里的一种前提。

如果真要用于安全目的,笼统的访问控制的效果除了“可预期”(但是因为许可证经常不担保承担责任,出 bug 嘛……),几乎等于没有。
即便说的是 MAC ,也要求区分正确不同的敏感性才可能提供有意义的保证。当然,不是说不满足 MAC 就无所谓安全,但说实话就算具有 MAC 的系统,也可能只提供很入门级的系统安全性。
对控制整个计算机的操作系统,没有 MAC 意味着系统管理员基本没什么手段最终可以区分针对系统资源利用的无意和恶意的历史行为,在此之上的保护仅仅是防止手贱的程度了。
所以光是考虑对非专业用户的认知友好(避免误导)上,这类访问控制还不如彻底排除出安全目的,就像设计用于摘要的散列函数不应当被视为“加密”一样。

处理文件权限的要求是软件接口的要求,包括 API 和 UI 。没什么实际应用故意去利用文件权限来编码无关的业务信息,所以如果放弃基于文件权限的访问控制,这就是多余的。考虑到上下文(比如沙箱)可以代替文件作为更强力的安全措施,这原则上不会损害安全性。
另一方面,摈弃权限的思路,特定的属性反而可以编码原先没有不能充分被利用的更上层信息。例如,限制写访问不作为访问控制,而是明确作为文件的只读属性的实现,可以类似 PL 中的对象引用的只读访问限制;如果能假定上下文而确保只读访问不和其它数据访问(比如并发写内容或者修改属性)冲突,传统 PL 上的优化也可以适用于 VFS 及其它持久对象系统。对只读属性,典型的优化是常量传播。结合这些优化,可以轻易地实现文件系统去重这样的高级功能,而不用单独重新实现(除非是为了性能调优进行特化)和验证。
遗憾的是,传统的操作系统设计并不适合这种实践——非但缺乏普遍可编程的上下文,还普遍不能排除 TOCTTOU 这种并发访问冲突。
(作为实现细节,虚存分页机制上的权限可以继续维持 RWX 的基础设计以避免开销;这不和上层的高级语言语义或者持久存储要求的属性矛盾。)

考虑这种遗憾的相当大一部分,来自系统和应用开发者的墨守成规(不愿意承认上下文的必要性),现在来看,UNIX 权限这种设计,还不如一开始就没存在过。
多用户自然还是得有的,但不应该和 UNIX 权限那么强绑定:而是更接近 NT 的 SID 这样的间接抽象;虽然 SID 用起来的体验嘛……

@tomychen 这里的阻碍很大程度上来自 UNIX 等上古系统设计的思维惯性,使系统设计和维护人员乃至大多数应用开发人员都难以适应范式转移,而不是具体维护工作的开销(虽然这对绝大多数组织已经够要命了)。
更根本地,这可以追溯为主流的设计人员没有理解清真正的需求,而直接偷懒复用了旧的设计,恰好旧的设计因为时代局限性等历史原因也没有解决一系列关键问题。这同时是懒惰和教条主义的体现。
这种消极的懒惰不是强到一定的地步,TOCTTOU 这种低级的问题不可能不被处理掉,而不是 POSIX.1-2008 这样一堆 at 补丁就能凑数了。

所谓设计模式是另外一种业界体系性缺陷的集中体现:www.v2ex.com/t/835769#r_11427195 ,所以看起来像设计模式味儿的设计,本身就暗示存在一些没解决的糊涂问题。
老实说,UNIX 这种一切皆文件的设计和 OOP 语言所谓一切都是对象的设计是类似的问题,比所有所谓的设计模式都高层一些,更应当是架构上的。
即便如此,这里也是高下立判。OOP 类似主张的主要问题是根本没拎清楚“对象”本来就应该有的含义,重要原则(设计上鼓吹 LSP )其实也是老调重弹(这其实就是许多更传统多态类型系统上的公理),而在更具体设计(类型系统上基于继承这种序结构实现的包含多态)多少还有点进步意义;反观文件,则更像是需求假设破碎却又应对不了新的需求(要求常规文件和目录以外新的类型的持久对象)之后的近乎不作为放任自流的结果罢了,在古典设计之后基本就不存在实质的创新。

SELinux 的出发点(看到现有系统设计不足,应对真实安全保证的需求很无能)没太大问题,复杂主要也是来自安全保证需求自身。
但另一方面还有它是在传统 UNIX 的 VFS 上的强行修补的原因。如果 UNIX 权限不存在,那么结果大约会好那么一些。
(嘛,只是好一些,因为缺乏像样的 UI ,也确实太复杂了,并且这玩意儿文档也不大好找,具体配置非常依赖用户自己发挥; Linux 桌面系统要是开箱可用不折腾也就算了,Android 手机我是折腾吐了弃疗了。另外 Android 的魔改权限正是我黑 UNIX 的动力之一,即便折腾起来比 SELinux 仍然容易多了……)

没有后退的余地会让开发者使 UI 更加友好易用。这才是最终能使这种机制普遍实用化的动力,而现在做得还是很不够。排除掉上面的来自开发者懒惰和墨守教条的原因,还有个重要因素是最终用户推动不够。大多数用户甚至都未必知道这个难用到什么程度,知道“难关闭”(但这姑且算是个预期中的 feature……)就不错了。
这方面我强调:不好用,也尽量不要回避,否则只会恶性循环而无法改善现状。

TOMOYO 这样的尝试对引入安全保证的能力是好事,但是长期来讲,仍然不算受到足够的重视(这个应该 2.6 时代就有了,长期也没啥存在感)。
Linux 社区,特别是 Linux Torvalds 本人,传统上并不怎么在乎安全需求(传说中的 masturbating monkeys……)。
独立于内核之外的 Grsecurity/PaX 是早年一个比较著名的例子。
当然,其实我也没那么在乎……至少没在乎到像 old school hacker 一样亲自糊个类似 LSM 的东西;毕竟成本过于离谱。
我更在乎的是不合时宜的旧设计无法被移除,并且越来越没戏。
毕竟,软件安全的一个持久的重要未决问题是:现有代码写得太长了,导致看不完而没法完成审计。
FrankHB
2022-03-19 19:30:34 +08:00
补充以上的个别零碎观点:
1.MAC 的概念应该在 1980 年代中期就算成熟了,比 Linux 早。
2.上面绝大多数安全值的都是 security 而不是 safety 。需要 protect 的也主要是这种安全。
另一方面,对 PL 用户来讲,所谓 safety ( memory safety/type safety/...)也的确主要只是为了防手贱的,并不能指望多 secure ;虽然:
(1)手贱了的确可能导致写出来的代码更容易有缺陷可被利用;
(2)违反 safety 在某些 PL 中直接引起未定义行为而破坏了 security 假设的常见前提。
这体现防手贱也有单独的必要性,某些情况下算是实现 security 的一种前提。
james122333
2022-03-21 10:09:38 +08:00
@FrankHB

只有应用本身安全性不够才需要以非应用本身机制来限制 更上层的信息 只要你需要提供应用使用 你就非得暴露它 不管以何种形式 看应用要不要使用而已
但现今应用多数是如此 包含 MAC 本身 所以个人都不会使用这些工作上使用的 DAC 的变化已经符合需求 hash 本来就是验证用 你再加密一层都可以 虽然现在都是 https
FrankHB
2022-03-21 18:54:10 +08:00
@james122333 安全性这个话题的口水来源之一就是需求没有上界。你可能认为某个应用够安全了,但换个环境别的用户就未必。这没法定义清楚。
所以跟你说的类似,现在系统设计者基本也不会替用户决定应该安全到什么程度,大多只是提供材料(安全机制),让用户决定怎么用。但系统的用户包括应用(开发者)和最终用户(系统管理员),究竟何者来决定,就比较微妙了。
这个问题还涉及公共安全决策,比如浏览器厂商决定不提供 http (强制 https ),各方利益有冲突而更加混乱。考虑到 http 确有合理用途(可控的上下文中避免安全实现的开销),这更应当让用户自决而非供应商独断,即便用户决策错误,也不会自然坑到决策正确的其他用户。UNIX 权限的问题则略有不同:它是半吊子,明确想要安全或者明确不想被安全性成本拖累的两边都不讨好,维持现状也无助于改善混乱局面,除了用脚投票的用户也就是系统厂商的责任了,应用厂商反而没什么存在感。
无论如何,至少有一点还是确定的:最终用户多了解现状,多明确表达自身的需求,多参与安全事务的决策,对整体减少非预期安全风险和安全实现的开销以及解决历史遗留问题都有好处。
james122333
2022-03-24 19:27:59 +08:00
@FrankHB

所以要慎选应用 然而现在的状况是哪个热门用哪个 unix 的话 DAC 就挺够了 有时候读写不应该是靠 MAC 决定的 而且那堆 MAC 的 role 事实上也与 DAC 差不多...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX