asw*_*win 29 permissions command-line password rm
我的朋友不断使用终端删除我的文件。所以请帮助我解释如何为rm命令设置密码。
Tho*_*ard 46
没有简单的方法可以在rm命令本身上设置这样的密码,如果没有大量的代码黑客攻击可能会破坏诸如apt-get安装包和删除文件之类的事情,并使您必须输入密码一千次,或者可能会破坏访问命令,以谁的人会需要它(喜欢你,删除自己的文件)。您可以通过拥有多个用户帐户和多个访问权限集并限制对不同数据部分(例如您的主目录)的访问来实现此目的,这样他们就无法访问它。
(另一个选项是每个用户的个人用户帐户,然后是访问控制列表,详见Videonauth发布的另一个答案)
这是核心问题——你让你的朋友使用你的系统。这有许多安全隐患——“任何对盒子有物理访问权限的人都将能够控制系统并执行任何任务”的概念是 IT 安全准则,这就是为什么您不“共享”物理系统访问权限受信任的授权人员除外。
做到这一点的唯一真正明智的方法是不让您的朋友访问您的计算机,并为他们提供一个他们可以使用的“专用“访客”系统,而您并不真正关心其中的文件。这是确保文件安全的最“安全”方式。
当然,如果这不是一种选择,那么您唯一真正安全的选择是配置多个用户帐户,每个用户一个,具有不同的主文件夹,并且不允许他们访问您自己的主目录或访问任何其他用户的主目录目录。然后将您不希望他们接触的所有内容都保留在您的主目录中,并且不要给他们sudo访问权限、root密码或与他们共享您的密码。
这是你如何做到这一点:
假设我的名字是“Foo”,我希望用户“Bar”,一个朋友,使用我的系统但不能访问我的文件。第一步是拒绝除我之外的任何人访问我的主目录。这是为了允许其他用户不删除您的文件,但也防止其他用户在您的主目录中窥探并查看您的主目录中的内容类型:
chmod 750 /home/Foo
Run Code Online (Sandbox Code Playgroud)
第二步是为“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)
Run Code Online (Sandbox Code Playgroud)
在第三步,然后限制他们的主目录也因此没有人可以窥探到他们的文件不管。这只是让事情变得平等。
sudo chmod 750 /home/Bar
Run Code Online (Sandbox Code Playgroud)
洗手,彻底冲洗干净,然后对系统上有多少用户重复这些步骤。他们将无法访问您的文件,并且由于您不打算授予他们管理员权限,因此他们无法在不尝试的情况下删除您的文件sudo- 由于您不允许这样做,他们不能摸你的东西。他们也将无法看到您的文件,除非成为超级用户,这在这里不会发生。
永远记住这一点:通过授予某人对机器的物理访问权限或一般访问权限,您将使您的文件和数据处于危险之中。这是 IT 安全领域广为接受的事实,并且仍然适用。让您的朋友访问您的计算机总是会使您的数据处于危险之中,因此要么让他们自己的系统来乱搞,要么就不要让他们访问您的机器。
只是关于磁盘加密的说明
虽然磁盘加密可以很好地保护您的数据免受第三方的侵害,但也存在局限性。
虽然磁盘加密不能解决这些问题,但它给威胁参与者带来了额外的麻烦。如果它被加密,坏人可能会放弃,或者他们可能会折磨你(排队强制性XKCD 安全漫画)。
因此,如果你的系统是加密的,但你让其他用户使用它,要么他们有密码来解密,要么你让你的笔记本电脑解密,这样他们就可以通过 SSH 进入或进行物理访问。在这两种情况下,情况都很糟糕。
也就是说,如果您的系统未加密,那么本节与您无关。
Eli*_*gan 19
这可能与rm命令无关,因为有一些简单的方法可以在不使用它的情况下删除文件。如果问题是您的朋友无意中误用了该rm命令,那么专门限制该命令的使用或使其以不同方式工作的解决方案可能会有所帮助。相比之下,如果问题是你的朋友故意以你不想要的方式处理你的数据,那么你需要实施实际的安全措施,而不是专注于rm命令本身(或任何离散的命令集)的解决方案会让你安全。
假设您的朋友知道您不希望他们删除您的文件,则有两种可能性:
他们可能是故意的。在这种情况下,您的朋友会故意删除您的文件,您甚至不能相信他们会在使用您的计算机时尝试遵守您的意愿,即他们如何处理您的数据。正如 Thomas Ward 详细解释的那样,解决此问题的唯一方法是使用实际有效的安全措施。通常最好的措施是阻止他们使用您的计算机。但是让他们使用自己的用户帐户可以提供一些保护。
他们可能做错了。在这种情况下,您的朋友非常容易发生事故,他们一直在运行rm他们希望没有的命令。他们想尊重你和你的数据,但在实践中真的很糟糕,因为他们一直在运行错误的命令,删除错误的文件......或类似的事情。虽然相信这就是正在发生的事情会很好,但我提醒您不要假设那些在您告诉他们停止删除您的数据后继续删除您的数据的人是没有恶意的。
此外,即使他们的意图是好的,给他们单独的用户帐户仍然是防止他们删除您的文件的最简单的方法,除了不允许他们使用您的计算机。
如果情况真的是#2 -你的朋友并不想删除你的文件,但只需要帮助不小心删除他们,他们不小心删除了他们的唯一方法是通过少量命令的无意的误用(如rm)他们在正确使用方面遇到了特殊的麻烦——那么Videonauth 的回答中的技术可能会有用。但您必须明白,它们不是安全措施,因为该rm命令只是删除文件的众多简单方法之一。详情请见下文。
我建议你问问自己,“我的情况是否与我,而不是其他使用我电脑的人使用rm错误的情况基本相同?”
如果答案是否定的,那么这是一个信息安全问题,您需要阻止您的朋友使用您的用户帐户。如果答案是肯定的,那么你可以使用同样的方法,如果你想使用你是我的唯一滥用rm:
rm filefile但是,即使您的朋友没有试图做错任何事,您仍然应该考虑让他们使用他们自己的独立用户帐户。这仍将解决问题——保护数据免遭蓄意破坏的相同安全措施也将保护数据免遭无意破坏。即使没有恶意,如果有人继续做你不希望他们做的事情,那么你不能相信他们会避免做那件事。
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 的方法一样——见下文)。但是如果您不需要实际的安全性(见上文),那么这可能是要走的路。与阻止您的朋友使用系统提供的rm命令的方法相比:
混叠rm到rm -i是防止失误不太有效-直到他们移动到使用其他一些技术来删除文件。到那时,阻止他们使用rm将完全无效,即使他们没有试图做错任何事,因为据推测他们会unlink以同样的粗心大意使用(或无数其他删除文件的命令中的任何一个)。
另一方面,因为别名扩展只发生在某些情况下——粗略地说,shell 的普通交互使用——你的朋友可能认为他们会在没有真正提示时得到提示(因为命令在一个脚本,例如,或从不同的 shell 发出)。Videonauth 的方式没有这个问题,这是该方式相对于alias rm='rm -i'.
当脚本运行时,除非故意编写它以使用别名,否则您的别名不会在其中展开。这意味着别名rm到rm -i不太可能破坏任何东西。这是 的客观优势alias rm='rm -i'。
rm 不能做任何其他完全普通的程序做不到的事情。真的没有什么特别的rm。这是删除文件的一种方便且自我记录的方式,因此限制对它的访问可能会破坏依赖它的众多脚本。但它远不是删除文件的唯一方法——它只是一个普通的程序。
一些命令执行某些受限(非root)用户在不运行它们的情况下无法执行的任务。例如,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
Run Code Online (Sandbox Code Playgroud)
注意/bin/rmhas no s:它的权限是-rwxr-xr-x, while/usr/bin/passwd和/usr/bin/sohave -rwsr-xr-x。这使得无论谁运行passwd或运行sudo,它实际上都以 root 用户身份运行,因为 root 是可执行文件的所有者。(还有一个 setgid 位,设置后会导致可执行文件以其组所有者的组标识而不是调用者的组标识运行。)
除了尚未发现(或已发现但尚未修补)的任何安全漏洞,sudo并且passwd是安全的,因为这些实用程序编写得非常仔细,因此它们只能做调用者应该被允许的事情去做。
/bin/rm不能这样工作。它不是 setuid 因为它不需要。目录权限(偶尔还有文件权限)控制用户可以删除哪些文件,他们不需要成为 root 用户即可执行此操作。为了完全清楚,请不要在 上设置 setuid 位rm。安全隐患将是灾难性的,从那时起,无论谁运行rm,就好像 root 运行它一样!(实用程序喜欢sudo并passwd检查谁真正在运行它们,并在执行之前检查某些事情是否被允许;rm没有这样的事情。)
检查是否在可执行文件上设置了 setuid(或 setgid)位将告诉您限制谁可以运行它是否有机会提高安全性。不是 setuid(或 setgid)的可执行文件没有任何特殊状态,任何人都可以简单地复制它们并运行副本,从另一台机器带来自己的副本,编写执行相同操作的脚本或程序,或使用另一个程序来做到这一点。
rm在没有rmUbuntu 的情况下删除文件的明显方法是在图形文件浏览器(Nautilus,如果您使用 Unity 或 GNOME Shell)中导航到它的位置并删除该文件。还有许多命令可用于从终端删除文件,而无需使用rm.
例如,要删除foo.txt当前目录中调用的文件,以下命令在 Ubuntu 上开箱即用,不需要访问rm,将实现这一点。(可以肯定的是,在删除/bin/rm.后,我在仅安装了标准系统实用程序的 16.04 最小系统上测试了它们。)
unlink foo.txtbusybox rm foo.txtperl -e 'unlink("foo.txt")'python3 -c 'import os; os.remove("foo.txt")'(python而不是python3在旧版本中)当然,这份清单还远未完成。不可能有此类命令的完整列表。防止文件删除是单独存在的用户帐户和文件和目录权限要实现的事情之一。他们可以很好地防止它。相比之下,更改rm命令(使其需要密码或以任何其他方式)或限制访问rm根本不会阻止它。
Vid*_*uth 16
您可以/bin/rm通过以下行更改命令的权限,这将防止它在没有 sudo 访问权限的情况下被执行:
sudo chmod 750 /bin/rm
Run Code Online (Sandbox Code Playgroud)
这特别防止他们使用rm系统提供的命令。您应该知道它不会阻止他们以其他方式删除文件。
为了防止他们使用rmdir命令,这是删除目录的常用方法,您可以在其可执行路径上以相同的方式设置权限:
sudo chmod 750 /bin/rmdir
Run Code Online (Sandbox Code Playgroud)
请注意,您也只能以 sudo 权限使用此命令。
如果您不喜欢它或发生其他问题,请将其改回755用于chmod
正如@muru 指出的那样,上面是一个非常粗略的解决方案,甚至可能会破坏不在root帐户上运行的系统服务。因此,我在这里添加了另一个选项,使用 ACL(访问控制列表)来做同样的事情,而且可能更安全(也很好读,你可以跳过启用部分,因为 ACL 现在通常安装在 Ubuntu 系统上):
因此,仅对要阻止的用户执行与上述相同的操作将是
sudo setfacl -m u:<user-name>:- /bin/rm /bin/rmdir
Run Code Online (Sandbox Code Playgroud)
只需替换<user-name>为您想要阻止使用这些文件的实际用户名。
与 一样chmod,setfacl -m用于阻止特定用户运行rm并rmdir仅适用于那些系统提供的命令。它不会阻止他们删除 Nautilus 中的文件和文件夹或使用其他终端命令。
解释:
-m标志表示修改文件 ACL。u代表用户。u对于用户、g组和o所有其他人,它可以具有以下值<user-name>可以根据您要更改的内容保留实际的用户名或组名。要设置整体更改,请将其留空。-,它也可以包含以下r用于读取权限、w写入权限和x执行的字母。这是一个非常简单的答案,可以阻止某人随意使用 rm 命令而无需提供密码。这不是一个安全的解决方案,您应该在其他答案中暗示一些替代建议。
但是,您可以使用别名来更改 rm 命令的行为方式。尝试:
alias rm="sudo -l >/dev/null && rm"
它的作用是当有人输入 rm 命令时,它会运行 sudo -l 命令。此命令强制用户输入他们的密码。如果他们做对了,它会列出他们的特权(我们丢弃这个输出)并以状态 0 退出,如果他们做错了,它会以错误的方式存在。
然后我们在 sudo 命令后面加上一个“&&”,它会退出下面的命令——在这种情况下,“rm”只有在前一个命令以状态 0 退出时——即他们得到了正确的密码。
要使其永久化,请在~/.bashrc.
请注意,这很容易被击败(例如,他们可以简单地输入/bin/rm.
我编写了一个脚本来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
Run Code Online (Sandbox Code Playgroud)
将密码“WE2U”更改为您喜欢的任何内容并保存文件。
rm脚本标记为可执行rm使用以下命令将新脚本标记为可执行:
sudo chmod +x /usr/local/bin/rm
Run Code Online (Sandbox Code Playgroud)
除非密码是WE2U,否则第一次运行脚本时您将获得“无效密码”并显示您输入的密码的加密密钥。将此加密密钥从终端复制并粘贴到脚本中。然后用在终端上显示加密密钥的 echo 注释掉该行。
因为/usr/local/bin列表中的路径比/bin我们rm调用的命令要高。获得有效密码后,它会调用/bin/rm进行真正的删除。
正如 Thomas Ward 在另一个答案中指出的那样,如果您要执行一个操作,sudo apt-get install ...您可能会被要求输入密码一千次。该脚本检查是否sudo使用并且不要求输入密码。此外,如果rm从 GUI 应用程序中调用,则不需要密码。
logger每次rm使用终端手动调用脚本调用记录。命令使用记录到/var/log/syslog.