有时,我们最大的敌人不是我们的朋友,而是我们自己

有时,我们最大的敌人不是我们的朋友,而是我们自己

我的朋友一直使用终端删除我的文件。所以请帮我解释一下如何为rm命令设置密码。

答案1

没有简单的方法可以在rm命令本身上设置这样的密码,除非进行大量的代码破解,这可能会破坏apt-get安装软件包和删除文件等功能,并让你必须输入密码一千次,或者可能会破坏对命令的访问权限需要它(比如您,删除自己的文件)。您可以通过拥有多个用户帐户和多个访问权限集并限制对不同数据部分(例如您的主目录)的访问来实现这一点,这样他们就无法访问它。

(另一个选项是为每个用户设置单独的用户帐户,然后设置访问控制列表,详情请参阅其他答案发布者视频直播

这是核心问题——你让你的朋友使用你的系统。这很多的安全隐患 - “任何拥有该盒子物理访问权限的人都能够控制系统并执行任何任务”的概念是一个 IT 安全口头禅,这就是为什么您不会与除受信任的授权人员之外的人“共享”物理系统访问权限。


唯一的确实明智的做法是不让你的朋友访问你的计算机,并为他们提供一个他们可以使用的“专用“访客”系统”,而您实际上并不太关心其中的文件。这是保护文件安全的最“安全”的方法。


当然,如果那不是一个选择,那么唯一真正安全的选择是配置多个用户帐户,每个用户一个,使用不同的主文件夹,并且不允许他们访问您自己的主目录或访问任何其他用户的主目录。然后将您不想让他们接触的所有内容保留在您的主目录中,不要给他们sudo访问权限、root密码或与他们共享您的密码。

你可以这样做:

假设我的名字是“Foo”,我想让用户“Bar”(我的朋友)使用我的系统,但不能访问我的文件。第一步是拒绝除我之外的任何人访问我的主目录。这是为了让其他用户不是删除您的文件,但同时也防止其他用户窥探您的主目录并查看您的主目录中有什么类型的东西:

chmod 750 /home/Foo

第二步是为“Bar”创建一个用户帐户(请勿输入下面括号中的内容,这仅供参考)。这样,我们可以确保他拥有自己独立的访问权限:

sudo adduser --create-home --user-group --shell /bin/bash Bar
sudo passwd Bar
(set a temporary password - you will not see characters as you type though)

第三下一步是限制他们的主目录,这样就没有人可以窥探他们的文件了。这只是让事情变得平等。

sudo chmod 750 /home/Bar

洗净双手,彻底冲洗干净,然后对系统上的所有用户重复这些步骤。他们将无法访问您的文件,而且由于您不会授予他们管理员权限,因此他们无法在不尝试的情况下删除您的文件sudo- 由于您不允许这样做,因此他们无法触碰您的内容。而且他们也无法查看您的文件,除非成为超级用户,而这不会在这里发生。


永远记住这一点:通过授予某人物理访问机器的权限,或者一般访问权限,您将使文件和数据面临风险。这是 IT 安全领域广泛接受的事实,并且仍然如此。让您的朋友访问您的计算机将始终使您的数据面临风险,因此要么让他们使用自己的系统,要么不要让他们访问你的机器。


关于磁盘加密的说明

虽然磁盘加密可以有效地保护您的数据不被第三方窃取,但也存在局限性。

  1. 如果系统已开启,磁盘已被解密,因此您面临风险。
  2. 有些系统有破碎的磁盘加密方法。例如,某些 Acer 系统仅使用您的密码来授权加密/解密并使用硬编码密码,或者使用容易破解的弱加密。
  3. 总有办法破解“密钥”,或者在系统关闭后、RAM 数据“消失”或损坏之前尝试从内存中提取密钥。(我不会深入讨论这些,但这些风险存在)。
  4. 无论系统是否加密,对机器的物理访问都会使您的数据面临风险。不要将物理访问权限(或远程网络访问权限)授予那些您不想让其完全访问您系统的人。

虽然磁盘加密不能解决这些问题,但它给威胁者带来了额外的麻烦。如果文件被加密,坏人可能会放弃,或者他们可能会折磨你(排队是强制性的XKCD 安全漫画)。

因此,如果您的系统已加密,但您允许其他用户使用它,那么他们要么有密码来解密,要么您的笔记本电脑处于解密状态,以便他们可以通过 SSH 进入或进行物理访问。在这两种情况下,情况都很糟糕。

也就是说,如果您的系统未加密,那么本节与您无关。

答案2

这可能与命令无关rm,因为有一些简单的方法可以删除文件而不使用它。如果问题是你的朋友无意中误用了该rm命令,那么专门限制该命令的使用或使其以不同的方式工作的解决方案可能会有所帮助。相反,如果问题是你的朋友故意以你不想要的方式处理你的数据,那么你需要实施实际的安全措施,并且没有任何专注于rm命令本身(或任何离散命令集)的解决方案可以保证您的安全。

您是否需要控制访问,或者只是防止诚实的错误?

假设您的朋友知道您不想让他们删除您的文件,则有两种可能性:

  1. 他们可能是故意这么做的。在这种情况下,你的朋友故意删除你的文件,你甚至不能相信他们会尝试遵从你的意愿,让他们使用你的电脑时处理你的数据。解决这个问题的唯一办法是使用实际有效的安全措施,正如 Thomas Ward 详细解释的那样。通常最好的措施是阻止他们使用您的计算机。但让他们使用自己的用户帐户可以提供一些保护。

  2. 他们可能是错误地这么做了。在这种情况下,你的朋友极易发生意外,他们不断运行rm他们不希望运行的命令。他们想尊重你和你的数据,但实际上却做得很糟糕,因为他们不断运行错误的命令、删除错误的文件……或诸如此类的事情。虽然相信这就是正在发生的事情会很好,但我提醒你不要认为那些在你告诉他们停止后继续删除你的数据的人是没有恶意的。

    此外,即使他们的意图是好的,除了不允许他们使用您的计算机之外,为他们提供单独的用户帐户仍然是防止他们删除您的文件的最万无一失的方法。

如果情况真的是 #2 -- 你的朋友不是删除你的文件,但只是需要帮助,而不是偶然删除它们,他们意外删除它们的唯一方式是通过无意中误用少数rm他们特别难以正确使用的命令(如)——然后Videonauth 的技术答案可能会有用。但你必须明白它们不是安全措施,因为rm命令只是其中之一许多删除文件的简单方法。详情请参阅下文。

我建议您问自己:“我的情况是否与我而不是其他使用我电脑的人使用rm不当的情况基本相同?”

如果答案是,那么这是一个信息安全问题,你需要阻止你的朋友使用你的用户帐户。如果答案是是的,那么你可以使用与是滥用rm

  • 教育。你的朋友需要知道他们在做什么以及如何避免它。
  • 界面改变。在不剥夺删除文件的实际能力(这需要单独的用户帐户)的情况下,你可以让删除文件变得更加困难偶然删除文件,使其自行运行,无需采取任何进一步措施,不会立即删除rm filefileVideonauth 的回答给出了一种方法。在这个答案中,我提出了另一种方法。

但即使你的朋友没有试图做任何坏事,你应该仍然考虑让他们使用自己独立的用户帐户。这仍然可以解决问题——保护数据免遭蓄意破坏的安全措施同样可以保护数据免遭无意破坏。即使没有恶意,如果有人一直做你不希望他们做的事情,那么你也不能相信他们会克制自己不做这件事。

删除前做出rm提示可以帮助防止一些错误。

为了帮助人们避免偶然删除文件rm,你可以做rm一个shell 别名实际运行rm -i。将-i标志传递给会rm导致它在删除每个文件之前提示用户(请参阅man rm)。

您可以通过将文件添加alias rm='rm -i'到您的.bash_aliases.bashrc文件来执行此操作(针对您的用户帐户)。请参阅这个问题那个了解详情。这将对您新打开的 bash shell 生效。

这提供了没有实际的安全并且也不能万无一失地防止错误,因为:

  • 当出现提示时,他们可以选择继续删除。
  • 他们可以通过多种方式绕过别名,包括运行/bin/rm或取消别名(unalias rm)。
  • 有很多情况下不会发生别名扩展,并且在这些情况下rm将不会运行-i
  • 他们仍然可以使用任何不需要的技术来删除文件rm(就像Videonauth 的方法- 见下文)。
  • 他们仍然可以在不删除任何文件的情况下损坏数据,例如通过覆盖文件或以其他方式更改其内容(Videonauth 的方法也是如此)。

但如果你不需要实际的安全性(见上文),那么这可能是可行的方法。与阻止你的朋友使用系统提供的rm命令的方法相比:

  • 使用别名rmrm -i防止错误方面效果较差——直到他们转而使用其他技术删除文件。那时,阻止他们使用rm将完全无效,即使他们没有试图做任何错事,因为他们可能会使用unlink(或任何其他无数的删除文件的命令)同样毫无顾忌。

  • 另一方面,因为别名扩展仅发生在某些情况下 - 粗略地说,就是普通的 shell 交互使用 - 您的朋友可能会认为他们将被提示,但实际上并没有提示(因为该命令在脚本中,例如,或从不同的 shell 发出)。Videonauth 的方式不存在这个问题,这是该方法相对于的客观优势alias rm='rm -i'

  • 当脚本运行时,除非故意使用别名,否则别名不会在其中展开。这意味着别名化rm不太rm -i可能破坏任何东西。这是 的一个客观优势alias rm='rm -i'

rm不能做任何其他完全普通的程序无法做的事情。

其实没有什么特别之处rm。它是一种方便且自带文档的删除文件的方法,因此限制对它的访问可能会破坏许多依赖它的脚本。但它远非删除文件的唯一方法——它只是一个普通的程序。

一些命令执行一些有限的(非) 用户无法在不运行它们的情况下执行。例如,sudo在检查确保您被允许这样做之后,允许您以另一个用户的身份运行程序。passwd编辑存储用户密码的数据库,但只允许您更改自己的密码(除非您是 root 用户,在这种情况下您可以更改任何人的密码)。

/usr/bin/sudo并且/usr/bin/passwd能够做到这一点是因为他们有setuid 位s设置,如运行时最左边一列显示的所示ls -l

ek@Io:~$ type -a sudo passwd rm
sudo is /usr/bin/sudo
passwd is /usr/bin/passwd
rm is /bin/rm
ek@Io:~$ ls -l /usr/bin/sudo /usr/bin/passwd /bin/rm
-rwxr-xr-x 1 root root  60272 Feb 18  2016 /bin/rm
-rwsr-xr-x 1 root root  54256 Mar 29  2016 /usr/bin/passwd
-rwsr-xr-x 1 root root 136808 Aug 17 09:20 /usr/bin/sudo

请注意,/bin/rm没有s:其权限为-rwxr-xr-x,而/usr/bin/passwd/usr/bin/so则为-rwsr-xr-x。这样一来,无论谁运行passwdsudo,它实际上都是以 root 用户身份运行的,因为 root 是可执行文件的所有者。(还有一个 setgid 位,设置后,可执行文件以其组所有者的组身份运行,而不是调用者的组身份。)

除了尚未发现的安全漏洞(或已发现但尚未修补的安全漏洞)之外,sudo它们passwd是安全的,因为这些实用程序是经过非常仔细编写的,因此它们只能执行调用者应该被允许做的事情。

/bin/rm这样不行。它不是 setuid,因为不需要。目录权限(和偶尔文件权限)控制用户可以删除哪些文件,并且他们不需要成为 root 用户就可以执行此操作。为了完全清楚,请不要设置 setuid 位rm。安全隐患将是灾难性的,因为无论谁运行rm,都如同 root 运行一样!(实用程序sudopasswd会检查谁真正在运行它们,并在执行某事之前检查是否允许;但rm不会这样做。)

检查可执行文件上是否设置了 setuid(或 setgid)位将告诉您是否有机会限制谁可以运行它来提高安全性。非 setuid(或 setgid)的可执行文件没有任何特殊状态,任何人都可以简单地复制它们并运行副本,从另一台机器上带上自己的副本,编写执行相同操作的脚本或程序,或使用其他程序来执行此操作。

删除文件无需rm

在 Ubuntu 中,删除文件最明显的方法rm是导航到图形文件浏览器(如果您使用的是 Unity 或 GNOME Shell,则为 Nautilus)中文件的位置并删除该文件。还有许多命令可用于从终端删除文件,而无需使用rm

例如,要删除foo.txt当前目录中的一个名为的文件,可以使用以下命令(这些命令在 Ubuntu 上开箱即用,不需要访问)rm来实现此目的。(为了确保万无一失,我在16.04 最小系统删除后,仅安装标准系统实用程序/bin/rm。)

  • unlink foo.txt
  • busybox rm foo.txt
  • perl -e 'unlink("foo.txt")'
  • python3 -c 'import os; os.remove("foo.txt")'python而不是python3旧版本)

当然,这个列表远不完整。不可能有完整的此类命令列表。防止文件删除是存在单独的用户帐户和文件和目录权限要实现的目标之一。它们可以很好地防止这种情况发生。相反,更改命令rm(使其需要密码或以任何其他方式)或限制访问根本rm无法防止这种情况发生。

答案3

/bin/rm您可以通过以下行更改命令的权限,以防止在没有 sudo 访问权限的情况下执行该命令:

sudo chmod 750 /bin/rm

这专门阻止他们使用rm系统提供的命令。您应该知道,这不会阻止他们以其他方式删除文件。

为了防止他们使用该rmdir命令(这是删除目录的常用方法),您可以在其可执行路径上以相同的方式设置权限:

sudo chmod 750 /bin/rmdir

请记住,您也只能使用具有 sudo 权限的命令。

如果您不喜欢它或者出现其他问题,请755使用chmod


正如 @muru 指出的那样,上述解决方案非常粗糙,甚至可能会破坏未在系统上运行的系统服务帐户。因此,我在这里添加了另一个选项,使用 ACL(访问控制列表)来执行相同操作,并且可能更安全(也值得一读你可以跳过启用部分,因为 ACL 现在通常安装在 Ubuntu 系统上):

因此,针对您想要阻止的用户执行上述相同的操作

sudo setfacl -m u:<user-name>:- /bin/rm /bin/rmdir

只需将其替换<user-name>为您要阻止使用该文件的实际用户名即可。

与 一样chmod,使用setfacl -m阻止特定用户运行仅rm适用rmdir于系统提供的命令。它不会阻止他们在 Nautilus 中或使用其他终端命令删除您的文件和文件夹。

解释:

  • -m标志表示修改文件的ACL。
  • 更改的第一部分,代表用户。对于用户、组和所有其他用户,u它可以具有以下值ugo
  • 中间部分<user-name>可以根据您要更改的内容保存实际的用户名或组名。要设置整体更改,请将其留空。
  • 第三部分包含您要设置的权限类型。在此示例中,我们不想设置任何权限,因此我们输入-,它也可以包含以下字母,r分别表示读取权限、w写入权限和x执行权限。

答案4

有时,我们最大的敌人不是我们的朋友,而是我们自己

我已经编写了一个脚本来rm按照 OP 的要求进行密码保护,但也进行了编辑以防止您意外删除:

  • /
  • /家
  • /垃圾桶

编辑:2017 年 3 月 5 日 - 更改检查是否在终端运行的方法。


创建脚本

使用gksu gedit /usr/local/bin/rm并复制以下行:

#!/bin/bash

tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi

if [ $Terminal == "Y" ] ; then
    # Running from terminal don't allow delete of / or /toplevel directory even if sudo
    for i in ${@:1}
    do
        # Skip options -i -r -v -d 
        if [[ ${i:0:1} != "-" ]] ; then
            # if parameter doesn't begin with '-' it's file or directory, so get real path.
            fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
            # We must have at least two `/` in the full path
            levels=$(echo "$fullname" | tr -cd '/' | wc -c)
            if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
                echo "Attempting to remove top level directory '$fullname'"
                echo "Use 'sudo /bin/rm $@' instead."
                exit 1 # error
            fi
        fi
    done
fi


if [[ $(id -u) != 0 ]]; then # Only non-root processes enter password (ie "sudo rm ..." is ok)
  if [ $Terminal == "Y" ] ; then
  # Only running from a terminal needs password (ie not cron)

    # log rm usage to /var/log/syslog
    PARENT_COMMAND="$(ps -o comm= $PPID)"   
    logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"

    # Get password
    Password=$(zenity --password --title="Password for rm")
    encryptPassword=$(echo -n "$Password" | md5sum)

echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.

    if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe  -" ]]; then
        echo "Invalid password!"
        exit 1
    fi
  fi # non-terminals can't enter password.
fi # root doesn't need to enter password.

# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"

exit 0

将密码“WE2U”更改为您喜欢的任何密码并保存文件。

将新rm脚本标记为可执行

使用以下方法将新rm脚本标记为可执行:

sudo chmod +x /usr/local/bin/rm

怎么运行的

房间密码

除非密码是WE2U,第一次运行脚本时,您将收到“无效密码”提示,并显示您输入的密码的加密密钥。将此加密密钥从终端复制并粘贴到脚本中。然后注释掉在终端上显示加密密钥的 echo 行。

因为路径/usr/local/bin在列表中的位置高于我们调用的/bin命令。获取有效密码后,它会调用该命令进行真正的删除。rm/bin/rm

正如 Thomas Ward 在另一个答案中指出的那样,如果您执行此操作,sudo apt-get install ...则可能会被要求输入密码一千次。脚本会检查是否sudo使用并且不会要求输入密码。此外,如果rm从 GUI 应用程序内部调用,则不需要密码。

logger每次rm使用终端手动调用时,脚本都会调用记录。命令使用情况会记录到/var/log/syslog

相关内容