如何防止新用户做任何危险的事情?

我最近在我的服务器上安装了Ubuntu服务器,作为一个新用户,我想尝试一下Linux。我按照一个设置Web服务器的教程进行操作,教程中说我需要对Web服务器目录进行chmod 777操作,以便可以写入文件。
无论如何,我为一个家伙创建了一个新账户,允许他查看服务器上放置在他的主目录中的一些文件。
adduser francis

创建账户后,我查看了他所拥有的访问权限。
groups francis

它说:“弗朗西斯:弗朗西斯”,所以我觉得没有问题,ubuntu默认情况下没有将他包含在任何组中,这是有道理的,它创建他时没有额外的权限安全性,所以一切都很好。

一周后,我惊恐地发现,尽管他不能执行类似SUDO或在系统目录中乱搞的操作,但他对服务器上几乎所有其他东西都有完全访问权限。例如,他完全可以读写/var/www下的网页服务器文件(因此可以访问存储在PHP配置文件中的密码等),尽管该目录不在他的主目录中,而且我从未将他添加到能够访问该目录的任何组中,也从未授予他任何特殊访问权限。

无论如何,这是怎么回事?我该如何取消他对重要内容的访问权限呢?他不应该能够访问像/media或/var/www之类的内容。我认为新用户默认情况下应该被阻止做任何危险操作或窥探他们不应该看到的位置。

总之,我只需要允许他访问我手动指定的目录以及他正常运行所需的目录(如他的主目录、vim、nano等)。

谢谢。


4你对这些目录有什么权限?755吗? - You'reAGitForNotUsingGit
4我按照一些教程来设置Web服务器,教程说我需要将Web服务器目录的权限设置为chmod 777,以便可以进行写入。 - Askerman
3在我的服务器上,您需要使用sudo来写入/var/www。我认为您的设置存在严重的权限问题。 - Organic Marble
不是存放(Linux变种的)exe文件和其他东西的Web服务器,而是存放网页文件的/var/www目录。 - Askerman
31你正在执行chmod 777命令,然后问为什么每个人都可以读写那里?阅读chmod的man页面。 - Anwar
16是的,777 是你的问题,有很多原因。 - You'reAGitForNotUsingGit
3@Askerman 请提供这个教程的链接,以便我们尝试修复它。 - edwinksl
@edwinksl 这不是在这个网站上,而是一个YouTube视频教程,我不再有链接了。我以为chmod不是问题,因为我认为用户组的工作方式与我在Windows中使用它们的方式相同:如果你不在所有者组中,即使文件是777也无法访问它。 - Askerman
21@Askerman - 不对,当你给予777时,每个人都可以访问所有东西,请阅读这篇文章:https://www.linux.com/learn/understanding-linux-file-permissions - You'reAGitForNotUsingGit
嗯,我想到了640。 - Elder Geek
3是的,前面的7代表所有者,第二个7代表所有者组,第三个7代表“所有人”。因此,你给了该目录下的“所有人”读取、写入和执行的权限。 - Aaron
5这个链接对你有帮助吗?http://askubuntu.com/questions/386928/default-permissions-for-var-www - Zanna
1@Aaron - 没错,这就是为什么我建议他们阅读:https://www.linux.com/learn/understanding-linux-file-permissions - You'reAGitForNotUsingGit
11我们都会犯错误,尤其是在一个全新的环境中学习时。这是一个很好的教训,当使用基于Linux的操作系统时,摒弃对Windows工作方式的观念绝对是明智的。在恢复权限之后,你应该注意到用户无法更改他们不应该更改的任何内容。如果你在其他地方使用了chmod命令,可能会遇到其他问题。 - Arronical
8FYI- 我正在为这个问题点赞,因为它是一个新手可以找到的好问题。而且这种误解可能比我们想象的要普遍。这也是为什么你不应该在不知道它们的作用的情况下仅仅复制你在互联网上发现的命令的好例子(即使是在这里)。 - Aaron
4另外,为什么密码以明文的方式存储在文件中,任何人都可以读取呢? - cat
7@猫 有些密码,比如连接到SQL服务器的密码,必须明文存储,因为它们需要使用。话虽如此,你关于为什么将它们存储在任何人都可以读取的文件中的问题是一个合理的问题。我认为这个问题可以通过chmod 777问题来回答。 - Cort Ammon
问题已经编辑过了吗?我在问题中没有看到提及 chmod777 - Mawg says reinstate Monica
@Arronical 问题不在于他犯了一个错误,而是他在互联网服务器上频繁出错。人们一直想知道为什么到处都有像Krebs那样的机器人进行DDOS攻击,答案是因为有很多人试图通过不知名的YouTube教程来尝试各种东西。 - dryman
2@Mawg 在(可能默认隐藏的)评论中。 - TripeHound
5谢谢(+1)。如果楼主能更新问题就好了,否则这个讨论中的很多内容,包括答案都没有意义,对未来查阅此问题的人毫无帮助。@Askerman - 你能做到吗?请更新问题。 - Mawg says reinstate Monica
2@dryman 我知道,你也知道,但对于刚开始做这个的人来说并不清楚。我绝不是在为原帖所做的事情辩护,但我认为当别人只发表负面评论而没有尝试提供任何知识或解决方案时,并不具有建设性。另外,很多僵尸网络的成员难道不就是被入侵的路由器吗? - Arronical
@Arronical 你说得没错,但这真是令人沮丧。并不是每个新手都不知道这一点。当我刚开始接触这个领域的时候,我没有考虑过租用一个潜在的100兆比特能力的服务器,尽管我本来可以这样做。至今,我个人只有一个小盒子在家里,只能通过VPN访问。是的,现在大多数DDOS设备似乎是路由器、网络摄像头之类的东西,但它们至少没有像闲置在互联网上的幽灵船那样快速的连接和强大的能力。更不用说关于盗版IRC和其他恶心的东西了。 - dryman
1@dryman 我知道你的意思,我觉得拥有一个对外开放端口的服务器实际上是一项很重要的责任,我不会尝试这样做,直到完全了解清楚。我同意不靠谱的YouTube教程泛滥是件坏事。我有一种感觉,他们在讨论一个裸机家用服务器。 - Arronical
@Arronical 如果是这样的话,而且只是一个家庭服务器,我承认我反应过激了,但直接连接到互联网仍然是个坏主意。对于责任问题,我有同样的看法。作为一名开发者,虽然拥有一个vroot服务器很诱人,但由于我无法保证适当的维护,所以我选择不这样做。 - dryman
来到这里之后,看了那么多评论,真的不明白为什么大家都在谈论“chmod 777”。。我因此点赞了@Askerman的评论,但也许它应该作为问题的一部分。 - mwfearnley
5个回答

这是按设计来的。而且更糟糕的是,chmod 777 的意思是……“我希望所有者、他所在的组以及任何人都具有读取、写入和执行权限”。
这相当糟糕。
对于一个网页服务器来说,777 并不是最佳选择。755(所有者具有完全权限,组和其他人只有读取和执行权限)是常见的默认设置,但根据你所说的,你希望至少为所有者(即网页服务器用户)提供读写或读写执行权限,可能还包括组,而对用户则没有权限。关于适当的权限级别,serverfault 上有更详细的问题,但可以考虑使用类似 640 或 740 的权限设置。
话虽如此,你也可以将用户置于自己的小世界中——通过设置 chroot 来使用户保持在系统中的独立空间。有一些指南可以帮助你完成这个操作,例如 oli 在这里给出的优秀答案,根据你的需求,这可能是一个选择。

4细节: "拥有者,他所在的任何群组..." - 文件所有者不一定要属于文件群组。 - alex_d
2很好。我喜欢你提到了在Servfault上的标准答案。 - Elder Geek
3这种情况的历史行话是“全球可读/可写”。 - Kaz

基本上,它可以这样解释:
R = 4 (read)
W = 2 (write)
X = 1 (execute)

所以,只读权限是4,读写权限是6,读取和执行权限是5,而所有权限(读取、写入、执行)是7。这就是如何计算文件所有者、所有者组或其他人的权限八进制值。
当使用chmod将这些权限应用于文件或目录位置时,上述计算的数字会按照以下方式应用,每个所有者、组和其他人都有一个八进制数:
     $ chmod _ _ _ <file or directory>
             | | |
owner--------  | |
owner's group--  |
everyone---------

所以,如果我想要给自己和我的团队对一个我拥有的文件夹进行读取、写入和执行的权限,但又不希望所有人甚至能够读取它,我会使用以下命令:
$ chmod 770 myDirectory

更多信息,请查看chmod的man页面
$ man chmod

如果你记不住要添加在一起以正确顺序获得正确权限的位,你也可以使用更容易阅读的 chmod ugo+rwx <...>。这些字符代表用户其他读取写入执行。你可以使用'-'来移除(例如:chmod go-wx <...>)。只需注意,这仅会添加或移除你输入的内容。chmod ugo+rwx <file>; chmod u+rwx <file> 不会移除组/其他的访问权限。 - ReactiveRaven
@ReactiveRaven 这是一个很好的观点。但是,楼主显然对chmod 777的作用感到困惑,所以我把解释重点放在了这里。 - Aaron
@Zanna 好主意! - Aaron

正如其他人提到的那样,你不应该将权限设置为777。
这是我使用的一张有用的参考表。
+-----+---+--------------------------+
| rwx | 7 | Read, write and execute  |
| rw- | 6 | Read, write              |
| r-x | 5 | Read, and execute        |
| r-- | 4 | Read,                    |
| -wx | 3 | Write and execute        |
| -w- | 2 | Write                    |
| --x | 1 | Execute                  |
| --- | 0 | no permissions           |
+------------------------------------+
You can use the octal notation, where the three digits correspond to the user, then group, then other. 
Perhaps this might help 
+------------+------+-------+
| Permission | Octal| Field |
+------------+------+-------+
| rwx------  | 700  | User  |
| ---rwx---  | 070  | Group |
| ------rwx  | 007  | Other |
+------------+------+-------+

1太棒了!这对于像我这样的视觉学习者来说是一个很大的帮助。 - Aaron

为了与您提供登录的人共享文件,您不需要做任何特殊操作。在默认的Debian安装中,用户可以访问彼此的主目录。
例如,
$ ls -ld ~
drwxr-xr-x 65 zwets zwets 4096 Sep 29 12:06 /home/zwets

我的主目录权限是系统上任何用户都可以读取(r)和访问(x)。只有我额外拥有写入(w)权限。
此外,Ubuntu的默认umask设置是,用户创建的文件和目录默认情况下是全局可读的。如果你不想要这样,可以将umask设置为077。
这意味着在默认设置中,如果用户“you”想与我共享文档“~/README.txt”,那么“you”无需做任何操作。我可以直接查看它。
$ who am i
zwets    pts/26       2016-09-29 08:05 (:pts/19:S.6)
$ ls -l ~you/README.txt
-rw-r--r-- 1 you you 24 Sep  8 11:23 /home/you/README.txt
$ cat ~you/README.txt
You's shared thoughts.

我无法编辑或删除该文件,但我可以将其复制到一个我有写入权限的位置。然后我就拥有了这个副本。
$ echo "Adding my thoughts." >> ~you/README.txt
bash: /home/you/README.txt: Permission denied
$ rm ~you/README.txt
rm: remove write-protected regular file '/home/you/README.txt'? yeah!
rm: cannot remove '/home/you/README.txt': Permission denied
$ cp ~you/README.txt ~zwets
$ ls -l ~/README.txt
-rw-r--r-- 1 zwets zwets 24 Sep  29 14:09 /home/zwets/README.txt

大多数系统默认情况下都是可读的,这是有充分理由的,我在AskUbuntu上的另一个回答中已经解释过了。然而,在共享系统中,让非所有者无法访问个人目录可能是有意义的。
$ chmod o-rwx ~
$ ls -l ~
drwxr-x--- 65 zwets zwets 4096 Sep 29 12:06 /home/zwets

...因为许多用户显然不知道默认设置 - QED ;-). 不过,更明智的做法是让用户意识到文件权限不能保护机密信息。

在Ubuntu中,任何被添加到'sudo'组的用户都拥有超级用户权限,请检查以确保没有其他用户被添加到该组中。
为了保护您的文件和目录不被其他用户访问,您可以按照Journeyman Geek先生在上面的答案中建议的方式设置权限。
您还可以使用特殊权限来保护您的文件和目录免受他人的访问。