有时,Ubuntu显示以下窗口:



此窗口可能是由某些正在运行的后台进程引起的,例如自动更新或向Canonical报告错误的进程它以这种方式表现出来:



由于这些是后台进程,因此在我处于这种状态的情况下,不会显示第一个窗口来响应我自己执行的操作希望系统要求我输入密码。这意味着:


从用户的角度来看,不能保证提示来自操作系统;它可能是任何只有有限权限才能显示窗口的恶意程序,并且通过提示我的密码,该程序可以无限制地访问整台计算机。
通过定期提示用户输入密码,系统告诉用户在某些应用程序要求时提供系统密码是一件很自然的事情。

我的问题是:


是否安全?通常在Linux或Ubuntu中的一种机制,可以防止任何应用程序显示与系统对话框相同的对话框,要求我输入密码?
如何设计此类窗口以提高用户安全性?为什么不在登录时实现类似于Windows的Ctrl + Alt + Del的系统?


评论

评论不作进一步讨论;此对话已移至聊天。

#1 楼

您的观点都是正确的,但您是正确的,但是在对此感到愤怒之前,我们需要提醒自己linux安全模型是如何工作的以及它旨在保护什么。

记住Linux安全模型设计时考虑了多用户纯终端或SSH服务器。 Windows在设计时就考虑到了最终用户工作站(但是我听说最近的Windows对终端更友好)。特别是,Linux约定在将应用程序沙箱化到用户方面做得更好,而在Windows中,任何重要的东西都作为系统运行,而Linux GUI(X Server)吸纳了安全性,Windows GUI具有内置的UAC之类的功能。基本上,Linux首先是(并且一直以来都是)服务器,其次是工作站,而Windows则相反。


安全模型

到目前为止就“操作系统”(即内核)而言,您有7个tty控制台和任意数量的SSH连接(也称为“登录会话”)-碰巧ubuntu附带了脚本来自动启动tty7上的GUI会话,但对于内核来说,它只是另一个应用程序。

登录会话和用户帐户彼此之间的沙盒关系非常好,但是Linux采取了一种安全的心态,您不需要保护用户不受它们侵害-自。在这种安全模型中,如果您的帐户遭到恶意软件的入侵,这是一个丢失的原因,但是我们仍然希望将其与其他帐户隔离开来,以保护整个系统。

例如,Linux应用程序倾向于创建一个像apacheftp这样的低特权用户,这些用户在不需要做有恶意的事情时就可以运行。如果攻击者设法控制了正在运行的apache进程,则它可以破坏其他apache进程,但跳转到ftp进程时会遇到麻烦。

请注意,Windows在这里采用了根本不同的方法,主要是通过约定所有重要事物始终作为系统运行。与以System身份运行的恶意进程相比,Linux中的恶意服务具有更小的范围来做坏事,因此Windows需要付出更多的努力来保护具有管理员权限的人员免受“他们自己”的攻击。<​​br />
GUI环境和非用于安全性的X Server对该安全模型产生了影响。


Gnome gksudo与Windows UAC和键盘记录程序

在Windows中,当用户进程请求特权升级时,内核会抛出一个特殊的受保护提示,其内存和键盘/鼠标总线与其余桌面环境隔离。可以这样做是因为GUI内置在OS中。在Linux中,GUI(X服务器)只是另一个应用程序,因此密码提示属于调用它们的进程,该进程以您的身份运行,与其他所有窗口和进程一样以您的身份运行共享内存权限和输入总线。

root提示符无法完成Iike锁定键盘的幻想操作,因为这些要么已经是root,要么需要完全重新设计X服务器(请参阅下面的Wayland)。 catch 22在这种情况下是将GUI与内核分开的缺点。但是,至少它与Linux安全模型保持一致。

如果我们要修改安全模型以通过在密码提示和在同一GUI中以用户身份运行的其他进程之间添加沙盒来对此加以限制会话中,我们可能不得不重新编写很多东西。至少,内核需要具备GUI意识,以便能够创建提示(今天还不是这样)。另一个首选示例是GUI会话中的所有进程共享一个键盘总线。

看着我写一个键盘记录器,然后在另一个窗口中按一些键:

➜  ~ xinput list  
⎡ Virtual core pointer                      id=2    [master pointer (3)]
⎜   ↳ Virtual core XTEST pointer            id=4    [slave  pointer  (2)]
⎜   ↳ Logitech K400 Plus                    id=9    [slave  pointer  (2)]
⎜   ↳ ETPS/2 Elantech Touchpad              id=13   [slave  pointer  (2)]
➜  ~ xinput test 9
key release 36 
key press   44 
hkey release 44 
key press   40 
ekey release 40 
key press   33 
lkey release 33 
key press   33 
lkey press   39 
okey release 33 
key release 39 
key press   66 
key press   31


您可以在另一个进程的提示符或终端中嗅探密码,然后在其自身上调用sudo的任何正在运行的进程(这直接源于“无需保护您”的思维定式),因此,除非没有增加密码提示的安全性,否则除非我们从根本上改变了安全模型,并对各种事情进行了大规模重写。

(值得注意的是,Gnome似乎至少在沙盘上锁定了键盘总线,并通过“切换用户”(在此处键入的内容不会显示在我的会话的键盘总线中)。


Wayland

Wayland是旨在替换X11的新协议。它将锁定客户端应用程序,以使它们无法窃取信息或影响其窗口外的任何内容。客户端可以在外部IPC外部彼此通信的唯一方法是通过控制所有客户端的合成器。但是,这不能解决根本问题,而只是将对信任的需求转移到了合成器。


虚拟化和容器

如果您使用云技术,您可能会上下跳跃地说“ Docker是答案!”。确实,布朗尼为您提供了帮助。尽管Docker本身并不是真的要增强安全性(感谢@SvenSlootweg),但它的确指向使用容器化和/或虚拟化作为与当前Linux体系结构兼容的转发。

两个值得注意的linux发行版构建时考虑到了进程间隔离:

Qubes OS在多个VM中运行用户级应用程序,这些VM分为“安全域”,例如工作,银行业务,Web浏览。

Android以独立的低特权用户身份安装和运行每个应用程序,从而在应用程序之间获得进程级隔离和文件系统隔离(每个应用程序都限制在其自己的主目录中)。


底线:从最终用户的角度来看,期望Linux的行为与Windows相同并不无道理,但这是您需要了解底层系统如何工作以及为什么会这样的情况之一。以这种方式设计。只要更改密码提示的实现由您拥有的进程拥有,就不会完成任何事情。为了使Linux在单用户GUI工作站的环境中获得与Windows相同的安全行为,将需要对OS进行重大的重新设计,因此不太可能发生,但是像Docker这样的事情可能会在更多Linux-上提供前进的方向。本机方式。

,在这种情况下,重要的区别是Linux在较低级别上被设计为多用户服务器,并且他们决定不保护用户自身免受用户攻击,而Windows被设计为单用户工作站,因此您确实需要在登录会话中具有进程间保护。同样重要的是,在Windows中,GUI是操作系统的一部分,而在Linux中,GUI只是另一个用户级应用程序。

评论


我不知道如何使它适合身体,但是必须使用xkcd

– Mike Ounsworth
17年8月13日在21:25



我认为这两种操作系统都是“低级”的,功能完善的,完全可比的多用户服务器。重要的是“ GUI是Windows(!)的一部分”与“ X会话只是另一个用户程序”部分。

–彼得-恢复莫妮卡
17年8月14日在4:49

尽管所有这些事实实际上都是正确的,但我认为这个问题几乎没有关系...

– AnoE
17年8月14日在8:01

@JopV。主要是根据我自己的经验; X服务器的安全性很差,虽然我不是Windows专家,但似乎让多个用户同时登录GUI以及使任何重要的东西都作为系统运行而不是应用最小特权原则的约定看起来很糟糕。我很高兴能改变看法。

– Mike Ounsworth
17年8月16日在13:04

“如果我们开始看到Linux发行版在未来几年内将Web浏览器和其他高风险应用程序容器化,我不会感到震惊。” Qubes这样做。

– Corey Ogburn
17年8月16日在15:22



#2 楼


Linux或Ubuntu上是否有任何一般的安全机制,特别是防止任何应用程序显示对话框的安全机制
,该对话框看上去与系统的对话框相同,要求我输入密码?


快速解答:否。



从用户的角度来看,不能保证
提示来自操作系统;可能是任何只有有限权限才能显示窗口的恶意程序,并且通过
提示输入密码,将可以无限制地访问整个计算机。


如果计算机上有恶意程序,则显示对话框的程序甚至都没有关系。
如果是恶意程序,如下面的句子所述,它甚至不需要显示对话框。如果它是合法程序,则恶意程序可以在X服务器环境(终端更好)中“监视”窗口以及您在其中键入的内容。

解决方案?

如果您有理由认为某些程序不值得信赖,可以使用沙箱(VM或更少的东西)。

否则,不要求输入密码。该对话框为非技术用户提供了便利。如果您担心安全性,或者是组织管理员或类似人员,那么绝对不需要显示GUI密码查询。正确配置非root用户帐户的权限(是或否,但不询问),并且不要将桌面用作root用户(因为这样做是因为,它经常导致不必要地使用root用户)。


通过定期提示用户输入密码,系统会告知
用户,每当某个应用程序要求输入系统密码时,它都是很自然的事情。


如上所述,只是不要问他们。作为管理员,“您的”用户应具有明确定义的权限。

而且,关于以组织管理员的身份进行自动更新:您疯了吗:)严重的是,不要让许多Ubuntu客户端随机地更新randon东西。您维护并测试然后发布的中央映像如何?还是反过来,例如Ansible?
完全独立于安全性,更新可能会破坏事情。这就是为什么。

评论


尽管无节制更新的混乱状态确实很危险,但是控制更新的最简单(可能是最常见)的方法是不进行更新,这也是危险的。

–James_pic
17年8月13日在22:36

这对企业来说很好,但是家庭用户和小型企业呢?他们可能只是直接使用它。的确,这是Ubuntu的卖点(没有详尽的配置)。如果默认设置不安全,他们是否应该将其营销给个人用户?

–凯文
17年8月14日在5:11

而且,无论如何,只要我们不知道要防护什么以及风险有多高,就不可能使用“安全”的操作系统。 Ubuntu不能为“所有”用户做出选择,而只是为其中的一部分做出选择。 (那部分不知道终端是什么)。

– deviantfan
17年8月14日在6:06



@deviantfan这部分也更容易受到sudo欺骗的影响。 Windows仅因其市场份额而拥有当今数量的恶意软件。随着Ubuntu的不断扩大,它成为恶意软件的更受关注的目标,并且当前操作系统的化身无法保护最终用户免受智能攻击者的侵害。这是一个非常主要的设计失败。

– T. Sar
17年8月16日在10:51

@ T.Sar好吧,但是适合所有目标群体的解决方案是什么?对于没有技术管理员(=多数用户)的非技术用户,要求终端是不行的。只要存在X,实际上就不可能确保该对话框的安全(并且Wayland尚未完成)

– deviantfan
17年8月16日在10:57



#3 楼

是。这是不安全的!

我个人总是取消该对话框。不是因为它可能是假的,而是因为它可能是真实的。

我应该仅仅因为它要求而向“应用程序”赋予升级的特权?不,我不这么认为。

系统更新很好,我可以手动进行,但是让我感到烦恼的是,错误报告系统需要这样做。设计不好。

评论


好吧,对话框并不是特别不安全。程序可以自行要求提高风险是一种风险(命令行上的风险是相同的)。通常,这是一个方便的问题。如果您不想立即运行需要以root privs作为root的程序(连接到WLAN,升级安装等),则必须打开root shell或为此运行sudo(您显然可以这样做)升级)。这不是一个坏主意,但是对于面向GUI的OS来说,它太麻烦了。

–彼得-恢复莫妮卡
17年8月14日14:39



问题在于需要root特权的程序尚未存在suid。这就是suid存在的原因。 (注意:请勿对整个大型图形程序进行suid。制作一个小型suid程序,该程序可以执行所需的操作,仅此而已)

– Stig Hemmer
17年8月15日在7:18



您显然不是Ubuntu或GUI的粉丝,对吗?

–oldmud0
17年8月17日在15:09

我通常是Ubuntu的粉丝,但认为他们对此持反对态度。

– Stig Hemmer
17年8月21日在10:41

@ oldmud0您还不记得Vista何时发布,实际上有成千上万的人抱怨需要不断在UAC对话框中单击“确定”吗?当您实际上每次需要输入密码时,抱怨在Ubuntu中甚至变得更糟。当他们要求升级权限时,有些事情使我感到困惑……例如从“软件中心”安装仅当前用户会使用的软件(也许这已经改变了)。我认为Stig很有意思。太多的事情要求特权升级。

– Lan
17年8月22日在0:34



#4 楼

与您的感觉相反,(现代)Windows和Ubuntu处理特权级别和特权提升的方式非常相似。原因肯定是操作系统都是具有相似用例且面临类似问题的多用户系统。

这两个操作系统都限制了普通用户的操作(当然是通过运行程序)。用户可以销毁自己的数据,但在理想情况下不能销毁其他人的数据(除非他们共享了数据),并且在理想情况下不能破坏或破坏系统。为了读取和写入系统数据,程序在两个操作系统上都需要具有管理员(root)特权,通常只有admin / root启动的程序才具有该特权。

为了简化操作,这两个操作系统都为默认用户提供了分别通过sudo和UAC运行具有“特权提升”的单个程序的功能。两种操作系统的GUI均会触发一个对话框,以使用户有机会阻止程序以管理员/超级用户身份运行。两种系统都具有根本不允许运行特权程序的用户的概念。

Ubuntu对话框要求输入密码; Windows UAC对话框没有。 (您似乎认为程序需要特殊权限才能显示该对话框;实际情况并非如此。该程序正在用对话框询问他们。如果有人伪造该对话框,则会得到您的(用户)密码,这对于程序已经以该用户身份运行。)

最重要的一点是,恶意程序可以假装它需要提升权限才能使用某些有用的内容并启动对话框,但是一旦获得该权限,格式化硬盘驱动器。1对于两个操作系统都是如此。因为在Windows下通常安装更多的第三方软件,所以命中此类程序的机会可能比Ubuntu更高。

您提到过,在Windows中,UAC对话框通常是用户操作(例如,安装程序)的结果,而Ubuntu却在没有明显原因的情况下启动了对话框。我能想到的一个原因是Windows软件更新是由操作系统启动的,因此它们已经具有提升的特权。也许Ubuntu在安装前会询问。

除了提供“我需要您护照,靴子和外套”以外的信息,确实很高兴。我这里没有Ubuntu系统,但是在对话框的左侧看到了“ Details”标题。你看了说什么吗? (当然,恶意程序可以在其中伪造任何文本,但是您可以检查所指控的程序是否确实在运行。)



1那不是那么糟糕,与实际覆盖数据相比。

评论


好吧,Windows UAC东西提供了一些额外的保护,使欺骗变得更加困难,请参阅blogs.msdn.microsoft.com/uac/2006/05/03/…因此,在Ubuntu上,流氓程序伪造该对话框要容易得多。

–schlenk
17年8月14日在12:59

@schlenk你是对的;操作系统中GUI的集成为MS Windows提供了在特权提升之前要求强制性UAC对话框的权限。我不知道其控制台可能未被占用的Windows服务器如何处理该问题。可能在某个时候需要提升的所有程序都将立即以管理员身份运行。但是基本的问题似乎是Linux提示“突如其来”,而Windows的UAC提示(几乎是?)始终是用户交互(启动程序等)的结果。 UAC提示的主要安全优势是它不能显示错误的信息。

–彼得-恢复莫妮卡
17年8月14日14:50



@ PeterA.Schneider通过RDP连接时,您会得到Windows UAC提示符,就像在控制台一样。我不知道引擎盖下是否有明显不同,但我怀疑不是很大。

–用户
17年8月14日在15:11

如果您未以管理员身份登录或将UAC设置为始终要求输入密码,则需要告知UAC密码

– T. Sar
17年8月15日在16:31

我唯一不知道Windows的UAC提示出现在哪里的唯一时间是在启动时启动的程序需要管理员权限。通常,它们仅在启动的前10分钟(在HDD上)或2-5分钟(在SSD上)内显示。

– Clonkex
17年8月16日在3:59



#5 楼

确保您的密码未被监听的最安全方法是使用SAK序列:alt-sysrq-k。这将杀死当前VT(包括X11)上的所有程序,并且init将为您提供全新的登录提示。我知道的仅有的攻击涉及更改内核键映射或破坏init本身,这两种攻击都已经需要root或更好的访问。

有各种各样的不太完整的方法(XTerm可以访问X11的“独占输入”选项),具体取决于您信任的系统数量,但是...为什么不能够信任您的系统?

Linux和Windows安全模型是在Linux下,您不仅可以从Internet下载随机可执行文件并运行它们。 (已经做了一些努力,将不受信任的Linux应用程序打包在类似Android的软件包沙箱中,但是没有人使用它们。)

评论


我不会称其为在“ Linux”中实现的“安全机制”……这更多是一种解决方法。

–苗哈托拉
17年8月14日在5:43

不能保证Magic SysRq支持可用。就像Linux内核中的许多其他内容一样,它是一个可选选项。

–用户
17年8月14日在15:13

@MichaelKjörling和Linux内核中的其他内核一样,除非您知道自己在做什么,否则您可能没有禁用它。

–o11c
17年8月14日在16:18

@ o11c:许多发行版都禁用了大多数SysRQ功能。例如,Ubuntu的/etc/sysctl.d/10-magic-sysrq.conf设置kernel.sysrq = 176 = 128 + 32 + 16 = reBoot / powerOff,remount Ro和Sync是唯一启用的命令。另请参见askubuntu.com/questions/11002/…。 IDK为什么他们禁用SAK以及将内存内容转储到控制台(出于安全原因而禁用)。但是显然OpenSUSE也使用176。另请参见bugs.launchpad.net/ubuntu/+source/procps/+bug/1025467:启用176,之前已完全禁用。

– Peter Cordes
17年8月14日在16:33



这如何回答问题?

– GnP
17年8月15日在21:41

#6 楼

可怕,缺乏安全保障。当我看到图形化sudo的设计时,我忍了一下,做了sudo passwd rootapt-get remove sudo,然后我提倡卸载sudo确实使ubuntu IRC人士感到恼火。

但仍然可以理解,这是完全不安全的。在终端上还可以(更好的是,当弹壳较弱时,它相对未知,并且尚未真正发动针对它的攻击),但现在是一个明显的弱点。

我宁愿再开始第二次X现在,作为实例以root身份运行一年不到一次,因此我必须为图形程序提供root。 (我通过直接启动X:1而不是通过运行startx来执行此操作,因此目标应用程序仅在root的X实例中运行)。如果您更需要root用户,请建议apt-get install sshssh -X root@localhost

评论


如果您需要拒绝投票的理由... a)卸载sudo将无济于事,因为此对话框不是sudo。 b)这个问题不是关于sudo是不安全的,因为事实并非如此。 c)第二个X实例无济于事。 d)X为根?根本不推荐。 e)SSH本身的本地计算机并不比sudo安全,相反(相反,更多的代码错误或错误的配置可能性)

– deviantfan
17年8月15日在15:59

@deviantfan:屏幕快照显然是一个sudo提示。 X作为根不是不安全的;不在乎是现代X环境。

–约书亚
17年8月15日在16:29

您所谓的“ sudo提示”不是由程序sudo运行的,因此无法通过卸载sudo删除。尝试一下,例如。通过在窗口打开时查看过程列表。 ...我不知道X环境的现代性与任何事情有关。 X(新旧)基于防止安全密码窗口的原理。不打破X就不可能改变它。

– deviantfan
17年8月15日在16:36

@deviantfan:Ctrl-Alt-Fx序列切换X环境和终端效果很好。 “作为根的X是不安全的”的神话来自无数的现代窗口管理器,几乎没有一个是经过远程强化的,因此永远都不应扎根。过去有一些安全的地方。我一直坚持不懈地使用杀鼠药,直到我的眼睛问题变得严重到无法获得辅助功能为止。

–约书亚
17年8月15日在16:40

有问题的提示来自Polkit。完全不同的系统。

–muru
17年8月16日在5:28