Answers:
没有一种简单的方法可以在rm
命令本身上设置这样的密码,除非没有大量的代码破解,否则这些密码破解可能会破坏诸如apt-get
安装软件包和删除文件的工作,使您必须输入密码一千次,否则可能会破坏密码。访问命令,以谁的人会需要它(喜欢你,删除自己的文件)。您可以通过具有多个用户帐户和多个访问权限集,并限制对数据的不同部分(例如您的主目录)的访问来做到这一点,以使他们无法访问它。
(另一个选项是每个用户的个人用户帐户,然后是访问控制列表,如Videonauth发布的另一个答案中所述)
这是核心问题-您要让您的朋友使用您的系统。这具有许多安全隐患-“任何具有对箱体的物理访问权的人都将能够控制系统并执行任何任务”的概念是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安全领域广为接受的事实,并且这一事实继续存在。让您的朋友访问您的计算机将始终使您的数据处于危险之中,因此,要么给他们自己的系统带来麻烦,要么就是不让他们访问您的计算机。
只是有关磁盘加密的说明
虽然磁盘加密可以很好地保护您的数据免遭第三方的攻击,但存在局限性。
尽管“磁盘加密”不能解决这些问题,但它给威胁参与者带来了额外的麻烦。如果是加密的,则是坏人可能会放弃,或者可能折磨您(必须执行XKCD Security漫画)。
因此,如果您的系统是加密的,但又让其他用户使用它,则他们要么拥有要解密的密码,要么让笔记本电脑解密,以便他们可以SSH进入或具有物理访问权限。在这两种情况下,这都是不好的。
就是说,如果您的系统未加密,则本节与您无关。
apt-get
运行dpkg
,它运行经常使用的脚本rm
。在我的Xenial框上,cd /var/lib/dpkg/info; grep -P '\brm\b' *inst
输出344行,其中333行看起来像是rm
命令的真实用法-仅在安装脚本中。grep -P '\brm\b' *rm
在删除脚本中显示的更多(删除配置文件,而不是软件包文件)。
这可能与rm
命令无关,因为有简单的方法可以删除文件而不使用它。如果问题是您的朋友无意间滥用了该rm
命令,那么专门限制该命令的使用或导致该命令以不同方式工作的解决方案可能会有所帮助。相反,如果问题是您的朋友故意以您不想要的方式处理数据,则您需要实施实际的安全措施,并且没有解决方案着眼于rm
命令本身(或任何离散的命令集)将使您安全。
假设您的朋友知道您不希望他们删除文件,则有两种可能性:
他们可能是故意这样做的。在这种情况下,您的朋友有意删除您的文件,您甚至不能信任他们尝试遵守您对使用计算机时如何处理数据的要求。正如托马斯·沃德(Thomas Ward)详细解释的那样,解决此问题的唯一方法是使用实际有效的安全措施。通常,最好的措施是阻止他们使用您的计算机。但是让他们使用自己的用户帐户可以提供一定的保护。
他们可能会错误地这样做。在这种情况下,您的朋友极容易发生意外,并且他们继续运行rm
他们本来希望没有的命令。他们想尊重您和您的数据,但实际上在实践中却很糟糕,因为他们会继续运行错误的命令,删除错误的文件……之类的东西。尽管最好相信这是正在发生的事情,但我告诫您不要假设那些在您告诉他们停止数据后继续删除您的数据的人没有恶意地在工作。
此外,即使他们的意图很好,给他们一个单独的用户帐户仍然是防止他们删除文件的最简单的方法,除了不允许他们使用您的计算机。
如果情况确实是#2-您的朋友不是在尝试删除您的文件,而是需要帮助,不要意外删除它们,而他们意外删除它们的唯一方法是无意间滥用了少量命令(例如rm
)他们在正确使用上有特别的麻烦-那么Videonauth答案中的技术可能有用。但是您必须了解它们不是安全措施,因为该rm
命令只是删除文件的许多简便方法之一。有关详情,请参见下文。
我建议您问自己:“我的情况与我(而不是其他使用我的计算机的人)使用rm
错误的情况基本相同吗?”
如果答案为否,则这是信息安全问题,您需要阻止朋友使用您的用户帐户。如果答案是肯定的,那么你可以使用同样的方法,如果你想使用你是我的唯一滥用rm
:
rm file
file
但是,即使您的朋友没有尝试做任何错误的事情,您仍然应该考虑让他们使用自己的单独用户帐户。这仍将解决问题-保护数据免遭故意破坏的相同安全措施也将保护其免受意外破坏。即使没有恶意的意图,如果某人继续做您不希望他们做的事情,那么您也不能相信他们会拒绝这样做。
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的常规交互式使用-您的朋友可能会认为,在未真正提示时会提示他们(因为该命令位于例如脚本,或从其他外壳发布)。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
请注意,/bin/rm
有没有s
:它的权限-rwxr-xr-x
,而/usr/bin/passwd
和/usr/bin/so
有-rwsr-xr-x
代替。这样,无论谁运行passwd
或sudo
,它实际上都以root用户身份运行,因为root是可执行文件的所有者。(还有一个setgid位,设置该位后,将使可执行文件以其组所有者而不是调用者的组身份运行。)
除了那些没有被发现(或已经发现但尚未被修补)的任何安全漏洞,sudo
并且passwd
是安全的,因为工具都是非常精心编写的,使他们只能做的事情,调用者应该允许去做。
/bin/rm
这样行不通。它不是setuid的,因为它不需要。目录权限(有时是文件权限)控制用户可以删除哪些文件,而无需成为root用户即可删除。只是为了清楚起见,请永远不要将setuid位设置为onrm
。从那时起,安全隐患将是灾难性的,从那时起,无论由谁运行rm
,就好像是root在运行它!(实用程序喜欢sudo
并passwd
检查谁真正在运行它们,并在执行某项操作之前先检查是否已允许;rm
请勿执行此类操作。)
检查是否在可执行文件上设置了setuid(或setgid)位将告诉您是否限制谁可以运行它可以提高安全性。不是setuid(或setgid)的可执行文件没有任何特殊状态,任何人都可以简单地复制它们并运行该副本,从另一台计算机上带来他们自己的副本,编写执行相同操作的脚本或程序,或使用另一个程序来做。
rm
不rm
使用Ubuntu 删除文件的一种明显方法是导航到图形文件浏览器中的位置(如果使用的是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
根本不会阻止它。
rm
的-I
选项。它仅提示您删除4个或更多文件,或者提示您进行递归删除。因此,您不会养成始终使用的习惯-f
,\rm
以避免别名扩展或在y
不阅读的情况下进行输入。但这仍然可以避免您遇到错别字,使您错失良机,否则您可能无法匹配很多文件。
mv foo.txt /tmp/.gone
然后重新启动,丢弃正在备份的tmpfs /tmp
。或仅用于mv
将多个文件重命名为相同的名称,因此只剩下最后一个。或者只是通过使用晦涩的名称重命名文件来隐藏文件。正如该答案的第一部分所指出的那样,如果您要防御恶意而不是无能,则只需将人们拒之门外。
您可以/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
代表用户。u
对于用户,g
组和o
所有其他用户,它可以具有以下值<user-name>
可以根据您要更改的内容暂停实际的用户名或组名。要设置整体更改,请将其留空。-
,它还可以包含以下字母分别r
表示读取权限,w
写入权限和x
执行权限。sudo setfacl -m u:<username>:- /bin/rm /bin/rmdir
,IIRC。您可以通过getfacl /bin/rm /bin/rmdir
rm
。Videonauth在此提供的解决方案是一种帮助容易发生事故的用户停止删除内容的可能方法,但它没有提供任何实际的安全性(如果OP的朋友不是故意破坏OP的意愿,这可能是可以的) 。Videonauth:我建议编辑这篇文章,以便它清楚地说明它实际上并没有阻止人们删除文件,因为他们不需要rm
命令来删除它。(我不想自己编辑它,以防您不想这么说。)
rm
命令权限。
这是一个非常简单的答案,它将在不提供密码的情况下随便使用rm命令阻止某人。这不是一个安全的解决方案,您应该在其他答案中暗含一些其他建议。
但是,您可以使用别名来更改rm命令的行为方式。尝试:
alias rm="sudo -l >/dev/null && rm"
这是当有人输入rm命令时,它运行sudo -l命令。该命令强制用户输入密码。如果他们做对了,它将列出他们的特权(我们将放弃此输出),并以状态0退出,如果他们做错了,则存在错误。
然后,我们在sudo命令后加上“ &&”,这将退出以下命令-在本例中,仅当前一个命令以状态0退出时才退出“ rm”-即他们输入了正确的密码。
要使其永久存在,请在中包含alias命令~/.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
将密码“ WE2U”更改为所需的任意名称,然后保存文件。
rm
脚本标记为可执行rm
使用以下命令将新脚本标记为可执行文件:
sudo chmod +x /usr/local/bin/rm
除非密码是WE2U,第一次运行脚本时,您将获得“无效密码”,并显示输入密码的加密密钥。从终端复制此加密密钥并将其粘贴到脚本中。然后在回显行中注释掉在终端上显示加密密钥的行。
因为/usr/local/bin
列表上的路径比调用/bin
我们的命令的路径高rm
。获取有效密码后,它将调用/bin/rm
以进行真正的删除。
正如托马斯·沃德(Thomas Ward)在另一个答案中指出的那样,如果sudo apt-get install ...
要进行密码输入,则可能会要求您输入密码1000次。该脚本检查是否sudo
已使用,并且不要求输入密码。此外,如果rm
从GUI应用程序中调用,则不需要密码。
logger
每次rm
使用终端手动调用脚本来记录的时间。命令用法记录到中/var/log/syslog
。
另一种选择是在非root用户无权访问的目录中创建任何重要文件的备份副本。您可以使用rsync
或unison
自动同步它们,只需确保备份目标路径中的至少一个目录归root和mode 700所有。尽管如此,这将导致所有文件具有两个副本。仅创建一个访客用户供他们使用会更安全,除非您确实需要记住始终锁定或注销,然后再给他们计算机或使其无人看管。
不是您要寻找的问题的直接答案,而是:
如果您的朋友正在使用该rm
命令删除文件,那么您的朋友要么不称职,混蛋,要么是BOFH的想方,他们正试图教您不要让会话保持登录状态且无人看管。在所有情况下,解决方案都是相同的:不要让您的会话处于登录状态且无人值守。
这样做的好处是,每次升级或获取新系统时,都不必记住要对系统进行特殊更改,并且还可以防止依赖预期行为的脚本和其他所使用的东西以无法预测的方式失败。
它还具有阻止“朋友”继续进行下一步的优势。mv
如果当他们发现简单的删除操作无法满足您的要求时,如果他们决定将文件移至/ dev / null,您是否还希望对命令进行“密码保护” ?当您在这样的游戏中时,唯一的制胜法宝就是不要玩。
一个非常愚蠢的问题的非常愚蠢的解决方法。
如果您不想使用chmod
rm
,,rmdir
或mv
(用于mv filename /dev/null
)或使用ACL,则可以创建一个虚拟用户,其密码为nobody,但您知道并sudo [user]
为每个命令添加别名,然后为您的朋友不知道的每个命令创建别名。这样,当您的朋友键入内容时rm
,系统会提示他们输入密码(但是猜错密码将记录失败的尝试),您仍然可以键入rmalias
或选择任何实际删除文件的方式。
或者,您可以创建一个无法访问您的主目录的访客帐户。
sudo [user]
以及dummy user
如果要对rm进行密码保护,一种解决方案是为rm封装一个需要root特权的包装程序,否则要求输入密码。(注意:当更新或重新安装coreutils软件包时,此包装程序可能会消失。)此外,请注意,这仅能保护rm,仍然有许多其他删除文件的方法。
打开一个终端并成为root。然后运行sudo mv /bin/rm /bin/rmold
移动老RM到另一个地方。
现在运行 sudo nano /bin/rm
以创建包装器。
在Nano中,键入以下内容:
#!/bin/bash
/bin/rmold "$@"
exit "$?"
然后按住CTRL
,然后按X
退出。Y
出现提示时按,然后按ENTER
以保存文件。
最后,我们需要为此授予适当的权限:
sudo chmod a+x /bin/rm
然后你去。
$@
=> "$@"
。在这里,您建议的是原始版本和安全版本的非常危险的版本rm
:如果有一个名为foo -i -r *
(-i
添加以保护无辜用户的文件)怎么办?
"
@xhienne $@
所说的以外,我敦促您明确警告读者,由于有多种删除文件的方法,因此根本不提供安全性。一种是致电rmold
,但还有许多其他方式,如其他答案和评论中所讨论。(即便如此,这将有问题rm
会感觉像它删除文件作为当前用户-这就是所谓的没有sudo
,正常rm
运行作为来电! -但这样做的根源。如果他们最近sudo
编着,他们赢得了”请注意,即使他们知道更改也可能会删除系统文件。)