在Linux上保护Web服务器的安全

哈Ha!

很长时间以来,我们都没有在Linux上为新手出版任何新书-现在,我们正着手进行这种计划的新产品的翻译。 曼宁(Manning)出版的克林顿(Clinton)的《 Linux in Action》一书不仅介绍了Linux内部结构 ,还介绍了最常见的问题以及如何解决它们。


作者已在Hackernoon网站上发布了第9章的摘录,建议您对此进行评估。

组装LAMP服务器,如何配置它,确保可靠的数据处理,配置主题区域以及注意TLS证书只是成功的一半。 您还需要确保您的基础架构受到保护,免受Internet的许多可怕威胁。

在本文中,我们通过学习如何正确使用系统组,确保进程隔离以及定期审核系统资源来检查网站的安全性。 当然,这个故事还不是完整的(Linux实际使用的书还涵盖了其他主题,例如,安装TLS证书和使用SELinux),但是这足以作为开始。

系统组和最低特权原则


您所支持的开发人员(最终)已经开始意识到,有必要限制对位于应用程序服务器上的数据和配置文件的常规访问,但同时要使各种程序员和其他IT团队都可以使用这种访​​问权限。

解决方案的第一部分是 。 组是系统中的一个对象(很像一个用户),但要注意的是,没有用户会以组的身份登录到系统中。 组的优势在于,它们可以像用户一样被“分配”到文件或目录,从而允许组的每个成员使用为其提供的特权。 如下所示。

Developers组中的开发人员可以访问特定目录,对于不是该组成员的用户,该目录将关闭
自己尝试:在文本编辑器中创建一个新文件。 向其中写入纯文本,例如“ Hello World”,以便您可以立即看到成功访问文件的时间。 然后使用chmod 770编辑权限,以使文件的所有者和该文件所属的组的成员具有使用该文件的全部权限,而其他人则无法读取该文件。

 $ nano datafile.txt $ chmod 770 datafile.txt 

如果您的系统除了您自己的帐户之外还没有其他用户帐户,请使用adduser (在Debian / Ubuntu中完成)或使用useradd (在CentOS中很adduser创建这样的帐户。 useradd命令也将在Ubuntu上运行。

与Debian adduser不同, useradd命令要求分别生成用户密码:

 # useradd otheruser # passwd otheruser Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully 

使用su命令,我们切换到新用户。 输入密码后,以下所有命令将代表该用户执行。 您将代表该特定用户工作; 既不多也不少。 如果您尝试读取数据文件datafile.txt (使用cat ),那么将无济于事。 您还记得,只有组成员拥有读取权限。 完成后,键入exit退出新的用户外壳程序并返回到原始外壳程序。

 $ su otheruser Password: $ cat /home/ubuntu/datafile.txt cat: /home/ubuntu/datafile.txt: Permission denied $ exit 

所有这些都是可以预期的,也是可以理解的。 如您所见,当您无法读取属于另一个用户的文件时,有时会出现问题。 让我们看看您可以通过将文件与组相关联,然后正确配置文件权限来做什么。

我们将创建一个新的组,通过它可以管理应用程序的数据,然后使用chown编辑数据文件的属性。 ubuntu参数:app-data-group将文件所有权留给Ubuntu用户,但他的组更改为一个新的用户:app-data-group。

 # groupadd app-data-group # chown ubuntu:app-data-group datafile.txt 

运行ls以获取此文件的“扩展”输出并查看其新的权限和状态。 请注意:如预期的那样,该文件由属于app-data-groupubuntu用户拥有。

 $ ls -l | grep datafile.txt -rwxrwx — — 1 ubuntu app-data-group 6 Aug 9 22:43 datafile.txt 

您可以使用usermod将用户添加到app-data-group ,然后使用su命令切换到部署了另一个用户帐户的外壳程序。 现在,即使对该文件的访问权限阻止了所有“其他”文件的访问,并且您现在绝对是“不同”用户,但您应该自由阅读此文件,因为您属于该必要组。

 # usermod -aG app-data-group otheruser $ su otheruser $ cat datafile.txt Hello World 

使用su命令,我们在用户帐户之间切换。 它们记录在我的datafile.txt文件中。 这样的组织是消除多用户系统中可能出现的各种复杂的访问权限问题的正确而有效的方法。

实际上,它不仅用于为各个用户提供必要的访问权限-如果没有为这些系统组指定必需的成员资格,许多系统进程也将无法执行其任务。 您可以对角查看/ etc / group文件-注意有多少系统进程属于您自己的组...

/ etc / group文件的内容的简短清单:

 $ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: […] 

容器过程隔离


也许您担心如果其中至少一项服务受到威胁,则同一台服务器上运行的许多服务会受到威胁吗? 消除粗心或恶意用户可能造成的损害的一种方法是隔离系统资源和进程。 因此,即使某人希望将其权限扩展到既定的限制之外,他也不会获得对数据的物理访问。

以前,决定解决此问题的方法如下:为每个服务分配自己的物理机。 但是,虚拟化使构建“网格”架构变得更加容易和便宜。 如今,这种体系结构通常被称为微服务 ,它允许您一次运行许多容器,例如在一个容器中可以运行数据库,在另一个容器中可以运行数据库-在Apache中,在第三个容器中-可以嵌入网页的媒体文件。 微服务体系结构不仅可以显着提高生产力和效率,而且还可以大大降低入侵每个单独组件的风险。

我在说的“容器”不必对LXC服从。 今天,其他容器技术(例如Docker)正变得越来越流行。

检查危险的用户标识值


当然,任何具有管理员权限的用户都可以使用sudo临时提供root用户访问权限,但只有admin是真正的管理员。 如您所知,在root用户访问权限下执行常规功能是不安全的。 但是,可能会发生这种情况-完全是偶然的或由于恶意数据欺诈造成的-普通用户将拥有管理权限而不会受到干扰。

在这种情况下,识别此类冒名顶替者并不难,这是一件好事:他们的用户和/或组ID(例如管理员)将为“ 0”。 看一下/ etc /目录中的passwd文件。 该文件包含系统中已经存在的每个常规和系统用户帐户的记录。 第一个字段包含帐户名(在这种情况下为root和ubuntu),第二个字段中可以使用x代替密码(如果存在密码,则将在/ etc / shadow文件中对其进行加密)。 但是以下两个字段包含用户和组ID。 对于本例中的ubuntu ,两个ID均为1000。如您所见,管理员的ID为零。

 $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash […] ubuntu:x:1000:1000::/home/ubuntu:/bin/bash 

如果您遇到用户或组ID = 0的普通用户,那么您可以放心,此事不是很干净,需要解决的情况。 识别此问题的一种快速简便的方法是使用awk命令检查passwd ,该命令将显示第三个字段中的所有行,其中只有0的行。在我的情况(您可以呼出)中,只有一行这样的行-根。 您可以通过将$ 4替换为$ 3来再次运行它-这将检查组ID字段。

 $ awk -F: '($3 == “0”) {print}' /etc/passwd root:x:0:0:root:/root:/bin/bash 

系统资源审核


系统中存在的内容越多,其中的某些内容损坏的可能性就越高。 因此,明智的做法是跟踪什么有效以及如何工作。 在这种情况下,我们谈论的是网络端口(如果端口为“开放”,那么从定义上来说应该是入口),服务(如果服务处于活动状态,则应该可以使用它)以及已安装的程序(如果已安装程序,则应为执行它的能力)。

为了使审核受益,它必须或多或少定期进行。 既然我们都忘记了,最好用特殊的脚本编写审核工具,该脚本不仅可以定期执行,而且理想情况下可以对结果进行分析,以使它们更具可读性。

但是,在这里,我向您介绍三个关键的审核工具,这些工具将帮助您查看打开的端口,活动的服务和不必要的软件包。 您的任务是使所有这些自动化。

端口扫描


如果主机运行的进程正在侦听此端口上的请求,则该端口被视为“开放”端口。 密切注意开放的端口,您将更好地了解服务器上到底发生了什么。

您已经知道HTTP(80)和SSH(22)端口可能应该在常规网络服务器上打开,因此它们不会令您感到惊讶。 但是,要注意其他意外结果,这一点更为重要。 netstat命令显示所有打开的端口以及有关如何使用它们的大量信息。

在此示例中,我们正在测试一个非常典型的多功能服务器,并且-n命令告诉netstat启用所有数字端口和地址。 -l仅包括侦听套接字, -p添加侦听程序的进程ID。 自然,如果您看到某些东西,请采取行动。

 # netstat -npl Active Internet connections (only servers) Proto Local Address Foreign Address State PID/Program name tcp 127.0.0.1:3306 0.0.0.0:* LISTEN 403/mysqld tcp 0.0.0.0:139 0.0.0.0:* LISTEN 270/smbd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 333/sshd tcp 0.0.0.0:445 0.0.0.0:* LISTEN 270/smbd tcp6 :::80 :::* LISTEN 417/apache2 […] 

近年来,越来越多ss使用ss代替netstat 。 以防万一:如果某个晚上您发现自己在公司中,并且有人问您有关ss的问题,那么此示例(列出了所有已安装的SSH连接)应该足够有用,以免您遇到麻烦:

 $ ss -o state established '( dport = :ssh or sport = :ssh )' Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 0 10.0.3.1:39874 10.0.3.96:ssh timer:(keepalive,18min,0) 

检查活动服务


如果您对由system管理并且当前在计算机上处​​于活动状态的服务进行快速快照,则计算机将帮助您识别任何不需要的活动。 systemctl命令可以列出所有现有服务,然后可以将它们的列表缩小到其描述包含enabled 。 因此,仅活动服务将被返回。

 # systemctl list-unit-files — type=service — state=enabled autovt@.service enabled bind9.service enabled cron.service enabled dbus-org.freedesktop.thermald.service enabled docker.service enabled getty@.service enabled haveged.service enabled mysql.service enabled networking.service enabled resolvconf.service enabled rsyslog.service enabled ssh.service enabled sshd.service enabled syslog.service enabled systemd-timesyncd.service enabled thermald.service enabled unattended-upgrades.service enabled ureadahead.service enabled 

如果发现明显不systemctl ,则可以使用systemctl命令停止该服务,并确保该服务不会在下次启动时重新启动。

 # systemctl stop haveged # systemctl disable haveged 

实际上,在此示例中,我没有停止在haveged服务中出现任何黑暗和阴沉的haveged :创建加密密钥时,我经常运行该工具来创建随机的后台系统活动。
搜索已安装的程序

有人可以在您不知情的情况下在系统中安装程序吗? 好吧,找出来-您需要看看。 yum list installed命令,或者对于Debian / Ubuntu, dpkg — list将为您提供详细的摘要,而remove命令应删除我们不需要的所有软件包。

 # yum list installed # yum remove packageName 

这是在Ubuntu中完成相同操作的方式:

 # dpkg --list # apt-get remove packageName 

跟踪对系统配置文件所做的更改也很有用-我们将在第11章中对此进行讨论。

Source: https://habr.com/ru/post/zh-CN425571/


All Articles