精通-CentOS7-Linux-服务器-全-
精通 CentOS7 Linux 服务器(全)
原文:
zh.annas-archive.org/md5/9720AF936D0BA95B59108EAF3F9811A7
译者:飞龙
前言
CentOS 7 Linux 是最可靠的 Linux 操作系统之一,可用于计算机基础设施中的多种功能。对于任何系统管理员来说,它就像潘多拉魔盒,因为他可以塑造它来执行环境中的任何任务。
在任何基础设施中拥有 CentOS 7 服务器可以帮助部署许多有用的服务,以智能和自动化的方式维护、保护和管理基础设施。
本书涵盖的内容
第一章,“高级用户管理”,教您如何在 CentOS 7 上管理用户和组,以更好地了解其组织结构。
第二章,“安全”,展示了保护您的 CentOS 7 和一些宝贵服务免受可能禁用服务或暴露一些关键数据的攻击的最佳实践。
第三章,“用于不同目的的 Linux”,列举并介绍了一步一步的教程,说明如何设置计算机基础设施应具有的一系列非常有用的服务。
第四章,“使用 Postfix 的邮件服务器”,介绍了 Postfix 作为常见的开源邮件服务器,以便安装和配置以进行高级使用。
第五章,“监控和日志记录”,通过用户友好的监控和日志记录工具监控您的基础设施,并跟踪您的机器问题。
第六章,“虚拟化”,启动您的虚拟环境,并探索所有虚拟技术可以提供的可能性和好处。
第七章,“云计算”,通过使用 OpenStack 及其令人惊叹的组件构建自己的云环境,探索云计算。
第八章,“配置管理”,将您的基础设施提升到一个高级水平,使一切都在使用 Puppet 进行配置管理,因为它是这个领域中最著名的配置管理工具之一。
第九章,“一些额外的技巧和工具”,教您在管理 CentOS 7 服务器时可以使生活更轻松的一些小技巧和工具。
您需要什么
要正确地遵循本书,我们建议您拥有一个 CentOS 7 服务器,以满足大多数这些服务的以下特征:
-
CPU:4 核 3.00 GHz
-
内存:6 GB RAM
-
硬盘:150 GB
-
网络:1 Gbit/s
此外,您需要一些具有以下特征的机器来测试服务:
-
CPU:2 核 3.00 GHz
-
内存:2 GB RAM
-
硬盘:50 GB
-
网络:1Gbit/s
还需要良好的互联网连接和千兆网络交换机。
这本书适合谁
如果您是具有中级管理水平的 Linux 系统管理员,那么这是您掌握全新的 CentOS 发行版的机会。如果您希望拥有一个完全可持续的 Linux 服务器,具有所有新工具和调整,为用户和客户提供各种服务,那么这本书非常适合您。这是您轻松适应最新变化的通行证。
惯例
本书中,您将找到许多文本样式,用于区分不同类型的信息。以下是这些样式的一些示例以及它们的含义解释。
文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄显示如下:“我们可以通过使用include
指令包含其他上下文。”
代码块设置如下:
<html>
<title>
Test page
</title>
<body>
<h1>This is a test page</h1>
</body>
</html>
任何命令行输入或输出都以以下形式编写:
testuser:x:1001:1001::/home/testuser:/bin/bash
新术语和重要单词以粗体显示。屏幕上看到的单词,例如菜单或对话框中的单词,会以这样的方式出现在文本中:"然后我们定义要填写的字段国家名称,州或省名称,地点名称,组织名称,组织单位名称,通用名称和电子邮件地址"。
注意
警告或重要说明会出现在这样的框中。
提示
技巧和窍门会出现在这样。
读者反馈
我们始终欢迎读者的反馈。请告诉我们您对本书的看法——您喜欢或不喜欢什么。读者的反馈对我们很重要,因为它可以帮助我们开发您真正能够充分利用的标题。
要向我们发送一般反馈,只需发送电子邮件至<feedback@packtpub.com>
,并在主题中提及书名。
如果您在某个专题上有专业知识,并且有兴趣撰写或为一本书做出贡献,请参阅我们的作者指南www.packtpub.com/authors。
客户支持
现在您是 Packt 书籍的自豪所有者,我们有很多东西可以帮助您充分利用您的购买。
下载本书的彩色图片
我们还为您提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图片。彩色图片将帮助您更好地理解输出中的变化。您可以从www.packtpub.com/sites/default/files/downloads/MasteringCentOS7LinuxServer_ColorImages.pdf
下载此文件。
勘误
尽管我们已经尽一切努力确保内容的准确性,但错误是难免的。如果您在我们的书籍中发现错误——也许是文本或代码中的错误——我们将不胜感激,如果您能向我们报告。通过这样做,您可以帮助其他读者避免挫折,并帮助我们改进本书的后续版本。如果您发现任何勘误,请访问www.packtpub.com/submit-errata
报告,选择您的书籍,点击勘误提交表链接,并输入您的勘误详情。一旦您的勘误经过验证,您的提交将被接受,并且勘误将被上传到我们的网站或添加到该标题的勘误部分的任何现有勘误列表中。
要查看先前提交的勘误,请访问www.packtpub.com/books/content/support
,并在搜索框中输入书名。所需信息将出现在勘误部分下。
盗版
互联网上侵犯版权材料的盗版是所有媒体持续存在的问题。在 Packt,我们非常重视版权和许可的保护。如果您在互联网上发现我们作品的任何非法副本,请立即向我们提供位置地址或网站名称,以便我们采取补救措施。
请通过<copyright@packtpub.com>
与我们联系,并附上涉嫌盗版材料的链接。
我们感谢您帮助保护我们的作者和我们提供有价值内容的能力。
问题
如果您对本书的任何方面有问题,可以通过<questions@packtpub.com>
与我们联系,我们将尽力解决问题。
第一章:高级用户管理
在本章中,我们将介绍一些高级用户和组管理场景,以及如何处理高级选项(如密码过期、管理 sudoers 等)的示例,以及如何在日常工作中处理这些选项。在这里,我们假设我们已经成功安装了 CentOS 7,并且像传统格式中一样拥有 root 和用户凭据。此外,在本章中的命令示例中,假设您已登录或切换到 root 用户。
将涵盖以下主题:
-
从 GUI 和命令行管理用户和组
-
配额
-
密码寿命
-
Sudoers
从 GUI 和命令行管理用户和组
我们可以使用命令行使用useradd
将用户添加到系统中,命令如下:
useradd testuser
这将在/etc/passwd
文件中创建一个用户条目,并在/home
中自动创建用户的home
目录。/etc/passwd
条目如下所示:
testuser:x:1001:1001::/home/testuser:/bin/bash
但是,众所周知,用户处于锁定状态,除非我们使用命令为用户添加密码,否则无法登录系统:
passwd testuser
这将反过来修改/etc/shadow
文件,同时解锁用户,用户将能够登录系统。
默认情况下,上述一系列命令将在系统上为testuser
用户创建用户和组。如果我们想要一组特定的用户成为一个公共组的一部分怎么办?我们将使用useradd
命令以及-g
选项来为用户定义组,但是我们必须确保该组已经存在。因此,要创建用户(例如testuser1
、testuser2
和testuser3
)并使它们成为名为testgroup
的公共组的一部分,我们将首先创建该组,然后使用-g
或-G
开关创建用户。所以,我们将这样做:
# To create the group :
groupadd testgroup
# To create the user with the above group and provide password and unlock
user at the same time :
useradd testuser1 -G testgroup
passwd testuser1
useradd testuser2 -g 1002
passwd testuser2
在这里,我们同时使用了-g
和-G
。它们之间的区别是:使用-G
,我们创建用户并将其分配到其默认组以及公共testgroup
,但使用-g
,我们只将用户创建为testgroup
的一部分。在这两种情况下,我们可以使用gid
或从/etc/group
文件中获取的组名。
我们可以用于高级用户创建的其他一些选项;例如,对于uid
小于 500 的系统用户,我们必须使用-r
选项,这将在系统上创建一个用户,但uid
将小于 500。我们还可以使用-u
来定义特定的uid
,它必须是唯一的,并且大于 499。我们可以与useradd
命令一起使用的常见选项有:
-
-c:此选项用于注释,通常用于定义用户的真实姓名,例如
-c“John Doe”
。 -
-d:此选项用于定义
home-dir
;默认情况下,home
目录创建在/home
中,例如-d /var/<user name>
。 -
-g:此选项用于用户的默认组的组名或组号。该组必须已经在之前创建过。
-
-G:此选项用于附加的组名或组号,用逗号分隔,用户是该组的成员。同样,这些组也必须已经创建过。
-
-r:此选项用于创建一个 UID 小于 500 且没有
home
目录的系统帐户。 -
-u:此选项是用户的用户 ID。它必须是唯一的,并且大于 499。
有一些我们与passwd
命令一起使用的快速选项。这些是:
-
-l:此选项是锁定用户帐户的密码
-
-u:此选项是解锁用户帐户的密码
-
-e:此选项是为用户设置密码过期
-
-x:此选项是定义密码寿命的最大天数
-
-n:此选项是定义密码寿命的最小天数
配额
为了控制 Linux 文件系统中使用的磁盘空间,我们必须使用配额,这使我们能够控制磁盘空间,从而帮助我们在很大程度上解决低磁盘空间问题。为此,我们必须在 Linux 系统上启用用户和组配额。
在 CentOS 7 中,默认情况下未启用用户和组配额,因此我们必须首先启用它们。
检查配额是否启用,我们发出以下命令:
mount | grep ' / '
该图显示了根文件系统未启用配额,如输出中的noquota
所述。
现在,我们必须在根(/
)文件系统上启用配额,为此,我们必须首先编辑文件/etc/default/grub
并将以下内容添加到GRUB_CMDLINE_LINUX
中:
rootflags=usrquota,grpquota
在文件GRUB_CMDLINE_LINUX
中应该读取如下:
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos/root crashkernel=auto vconsole.keymap=us rhgb quiet rootflags=usrquota,grpquota"
cat /etc/default/grub
命令的输出应该如下屏幕截图所示:
由于我们必须反映刚刚做出的更改,我们应该使用以下命令备份 grub 配置:
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.original
现在,我们必须使用以下命令重新构建 grub 以应用刚刚做出的更改:
grub2-mkconfig -o /boot/grub2/grub.cfg
接下来,重新启动系统。一旦启动,登录并使用我们之前使用的命令验证配额是否已启用:
mount | grep ' / '
现在应该显示配额已启用,并将显示以下输出:
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)
在图像之前添加以下引导,并将 CIT 样式应用于mount | grep ' / '
现在,由于配额已启用,我们将使用以下命令进一步安装配额,以便为不同用户和组操作配额等:
yum -y install quota
安装配额后,我们使用以下命令检查用户的当前配额:
repquota -as
上述命令将以人类可读的格式报告用户配额。
从上述屏幕截图中,我们可以限制用户和组的配额的两种方式;一种是为使用的磁盘空间设置软限制和硬限制,另一种是通过限制用户或组创建的文件数量来限制用户或组。在这两种情况下,都使用软限制和硬限制。软限制是在达到软限制时警告用户的东西,而硬限制是他们无法绕过的限制。
我们将使用以下命令修改用户配额:
edquota -u username
上述命令的输出应该如下屏幕截图所示:
现在,我们将使用以下命令修改组配额:
edquota -g groupname
如果您有其他分区单独挂载,您必须修改/etc/fstab
文件命令,通过在特定分区的默认值后添加usrquota
和grpquota
来启用文件系统的配额,如下面的屏幕截图所示,在那里我们已经为/var
分区启用了配额:
一旦您完成了启用配额,重新挂载文件系统并运行以下命令:
To remount /var :
mount -o remount /var
To enable quota :
quotacheck -avugm
quotaon -avug
配额是所有系统管理员用来处理用户或组在服务器上消耗的磁盘空间并限制空间过度使用的东西。因此,它有助于他们管理系统上的磁盘空间使用。在这方面,应该注意在安装之前进行规划并相应地创建分区,以便正确使用磁盘空间。通常建议使用多个单独的分区,如/var
和/home
等,因为这些通常是 Linux 系统上占用最多空间的分区。因此,如果我们将它们放在单独的分区上,它将不会占用根(/
)文件系统空间,并且比仅使用根文件系统挂载更加安全。
密码过期
设置密码过期是一个很好的策略,这样用户被迫在一定的时间间隔内更改他们的密码。这反过来也有助于保持系统的安全性。
我们可以使用chage
配置密码,在用户首次登录系统时过期。
注意
注意:如果用户使用 SSH 登录系统,则此过程将无法工作。
使用chage
的这种方法将确保用户被强制立即更改密码。
提示
如果我们只使用chage <username>
,它将显示指定用户的当前密码过期值,并允许交互式更改它们。
需要执行以下步骤来完成密码过期:
- 锁定用户。如果用户不存在,我们将使用
useradd
命令创建用户。但是,我们不会为用户分配任何密码,以便保持锁定。但是,如果用户已经存在于系统中,我们将使用usermod
命令锁定用户:
Usermod -L <username>
- 使用以下命令强制立即更改密码:
chage -d 0 <username>
- 解锁帐户。可以通过两种方式实现。一种是分配初始密码,另一种是分配空密码。我们将采用第一种方法,因为第二种方法虽然可能,但在安全方面不是一个好的做法。因此,我们要做的是分配初始密码:
- 使用 Python 命令启动命令行 Python 解释器:
import crypt; print
crypt.crypt("Q!W@E#R$","Bing0000/")
-
在这里,我们使用了带有字母数字字符的盐组合
Bing0000
后跟/
字符的Q!W@E#R$
密码。输出是加密密码,类似于BiagqBsi6gl1o
。 -
按下Ctrl + D退出 Python 解释器。
- 在 shell 中,输入以下命令以 Python 解释器的加密输出:
usermod -p "<encrypted-password>" <username>
因此,在我们的情况下,如果用户名是testuser
,加密输出是" BiagqBsi6gl1o"
,我们将执行:
usermod -p "BiagqBsi6gl1o" testuser
现在,使用Q!W@E#R$
密码首次登录后,用户将被提示输入新密码。
设置密码策略
这是一组规则,定义在某些文件中,必须在设置系统用户时遵循。这是安全性的一个重要因素,因为许多安全漏洞历史始于黑客攻击用户密码。这就是为什么大多数组织为其用户设置密码策略的原因。所有用户和密码必须符合此策略。
密码策略通常由以下定义:
-
密码过期
-
密码长度
-
密码复杂性
-
限制登录失败
-
限制先前密码重用
配置密码过期和密码长度
密码过期和密码长度在/etc/login.defs
中定义。过期基本上是指密码可以使用的最大天数,允许更改密码之间的最小天数,以及密码过期前的警告次数。长度是指创建密码所需的字符数。要配置密码过期和长度,我们应该编辑/etc/login.defs
文件,并根据组织设置的不同PASS
值。
注意
注意:此处定义的密码过期控件不会影响现有用户;它只影响新创建的用户。因此,我们必须在设置系统或服务器时设置这些策略。我们修改的值是:
-
PASS_MAX_DAYS
:密码可以使用的最大天数 -
PASS_MIN_DAYS
:允许更改密码之间的最小天数 -
PASS_MIN_LEN
:最小可接受的密码长度 -
PASS_WARN_AGE
:密码过期前要提前多少天的警告
让我们看一下login.defs
文件的示例配置:
配置密码复杂性和限制重复使用的密码
通过编辑/etc/pam.d/system-auth
文件,我们可以配置密码复杂性和要拒绝的重复使用密码的数量。密码复杂性是指密码中使用的字符的复杂性,而重复使用密码拒绝是指拒绝用户过去使用的密码的数量。通过设置复杂性,我们强制密码中使用所需数量的大写字符、小写字符、数字和符号。除非符合规则设置的复杂性,否则系统将拒绝密码。我们使用以下术语来实现这一点:
-
强制密码中的大写字符:
ucredit=-X
,其中X
是密码中所需的大写字符数量。 -
强制密码中的小写字符:
lcredit=-X
,其中X
是密码中所需的小写字符数量。 -
强制密码中的数字:
dcredit=-X
,其中X
是密码中所需的数字数量。 -
强制密码中使用符号:
ocredit=-X
,其中X
是密码中所需的符号数量。例如:
password requisite pam_cracklib.so try_first_pass retry=3 type= ucredit=-2 lcredit=-2 dcredit=-2 ocredit=-2
- 拒绝重复使用的密码:
remember=X
,其中X
是要拒绝的过去密码的数量。例如:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
现在让我们来看一下/etc/pam.d/system-auth
的一个示例配置:
配置登录失败
我们在/etc/pam.d/password-auth
、/etc/pam.d/system-auth
和/etc/pam.d/login
文件中设置了用户允许的登录失败次数。当用户的失败登录尝试次数高于此处定义的数字时,帐户将被锁定,只有系统管理员才能解锁帐户。要进行配置,请向文件添加以下内容。以下的deny=X
参数配置了这一点,其中X
是允许的失败登录尝试次数。
将这两行添加到/etc/pam.d/password-auth
和/etc/pam.d/system-auth
文件中,只将第一行添加到/etc/pam.d/login
文件中:
auth required pam_tally2.so file=/var/log/tallylog deny=3 no_magic_root unlock_time=300
account required pam_tally2.so
以下是一个/etc/pam.d/system-auth
文件的示例截图:
以下是一个/etc/pam.d/login
文件的示例:
要查看失败,请使用以下命令:
pam_tally2 –user=<User Name>
要重置失败尝试并允许用户再次登录,请使用以下命令:
pam_tally2 –user=<User Name> --reset
Sudoers
在 Linux 操作系统中,用户权限的分离是主要特点之一。普通用户在有限的权限会话中操作,以限制他们对整个系统的影响范围。Linux 上存在一个我们已经知道的特殊用户root
,具有超级用户权限。此帐户没有任何适用于普通用户的限制。用户可以以多种不同的方式执行具有超级用户或 root 权限的命令。
主要有三种不同的方法可以在系统上获得 root 权限:
-
以
root
身份登录系统。 -
以任何用户身份登录系统,然后使用
su -
命令。这将要求您输入root
密码,一旦验证,将为您提供 root shell 会话。我们可以使用Ctrl + D或使用exit
命令断开此 root shell。退出后,我们将回到我们的普通用户 shell。 -
使用
sudo
以 root 权限运行命令,而不生成root
shell 或以 root 身份登录。此sudo
命令的工作方式如下:
sudo <command to execute>
与su
不同,sudo
将要求调用命令的用户密码,而不是 root 密码。
sudo
默认情况下不起作用,需要在其正确运行之前进行设置。
在接下来的部分中,我们将看到如何配置sudo
并修改/etc/sudoers
文件,以使其按我们的意愿工作。
visudo
sudo
是使用/etc/sudoers
文件进行修改或实现的,visudo
是使我们能够编辑该文件的命令。
注意
注意:为了避免在更新文件时出现潜在的竞争条件,不应使用普通文本编辑器编辑此文件。应该使用visudo
命令。
visudo
命令通常会打开文本编辑器,然后在保存时验证文件的语法。这可以防止配置错误阻止sudo
操作。
默认情况下,visudo
会在 vi 编辑器中打开/etc/sudoers
文件,但我们可以配置它使用nano
文本编辑器。为此,我们必须确保nano
已安装,或者我们可以使用以下命令安装nano
:
yum install nano -y
现在,我们可以通过编辑~/.bashrc
文件将其更改为使用nano
:
export EDITOR=/usr/bin/nano
然后,使用以下命令源文件:
. ~/.bashrc
现在,我们可以使用visudo
和nano
编辑/etc/sudoers
文件。所以,让我们用visudo
打开/etc/sudoers
文件并学习一些东西。
我们可以为不同的命令、软件、服务、用户、组等创建不同类型的别名。例如:
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
我们可以使用这些别名为用户或组分配一组命令执行权限。例如,如果我们想要将NETWORKING
命令集分配给netadmin
组,我们将定义:
%netadmin ALL = NETWORKING
否则,如果我们想要允许wheel
组的用户运行所有命令,我们将执行以下操作:
%wheel ALL=(ALL) ALL
如果我们想要特定用户john
获得对所有命令的访问权限,我们将执行以下操作:
john ALL=(ALL) ALL
我们可以创建不同的用户组,其成员可能有重叠的权限。
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
组名必须以大写字母开头。然后,我们可以允许GROUPTWO
的成员更新yum
数据库和前述软件分配的所有命令,通过创建如下规则:
GROUPTWO ALL = SOFTWARE
如果我们不指定要运行的用户/组,sudo
默认为 root 用户。
我们可以允许GROUPTHREE
的成员关闭和重新启动机器,通过创建一个命令别名
并在GROUPTHREE
的规则中使用它:
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
我们创建了一个名为POWER
的命令别名,其中包含关闭电源和重新启动机器的命令。然后,我们允许GROUPTHREE
的成员执行这些命令。
我们还可以创建Runas
别名,它可以替换规则的部分,指定用户以其身份执行命令:
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
这将允许GROUPONE
的任何成员以www-data
用户或apache
用户的身份执行命令。
请记住,稍后的规则将覆盖先前的规则,当两者之间存在冲突时。
有许多方法可以更好地控制sudo
如何处理命令。以下是一些例子:
与mlocate
软件包相关联的updatedb
命令相对无害。如果我们希望允许用户以 root 权限执行它而无需输入密码,我们可以制定如下规则:
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
NOPASSWD
是一个标签,表示不会请求密码。它有一个伴随命令叫做PASSWD
,这是默认行为。标签对于规则的其余部分是相关的,除非在后面被其双胞胎
标签覆盖。
例如,我们可以有如下行:
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
在这种情况下,用户可以作为 root 用户运行updatedb
命令而无需密码,但运行kill
命令将需要输入 root 密码。另一个有用的标签是NOEXEC
,它可以用于防止某些程序中的一些危险行为。
例如,一些程序,如less
,可以通过在其界面内输入以下内容来生成其他命令:
!command_to_run
这基本上会以less
正在运行的相同权限执行用户给出的任何命令,这可能非常危险。
为了限制这一点,我们可以使用以下行:
username ALL = NOEXEC: /usr/bin/less
现在你应该清楚了sudo
是什么,以及我们如何使用visudo
修改和提供访问权限。这里还有很多事情。你可以使用visudo
命令检查默认的/etc/sudoers
文件,其中包含很多示例,或者你也可以阅读sudoers
手册。
要记住的一点是,常规用户通常不会被赋予 root 权限。当您以 root 权限执行这些命令时,了解这些命令的作用非常重要。不要轻视这份责任。学习如何最好地为您的用例使用这些工具,并锁定任何不需要的功能。
参考
现在,让我们来看一下本章中使用的主要参考资料:
摘要
在本章中,您了解了一些高级用户管理知识,以及如何通过命令行管理用户,包括密码过期、配额、暴露给 /etc/sudoers
,以及如何使用 visudo
修改它们。用户和密码管理是系统管理员在服务器上经常执行的任务,它在系统的整体安全中起着非常重要的作用。
在下一章中,我们将研究称为安全增强型 Linux(SELinux)的高级安全功能,它与 CentOS 或 RedHat Linux 操作系统集成在一起。
第二章:安全
在本章中,我们将找到不同的工具和实用程序,可以用来保护我们正在使用的 CentOS 系统。安全是系统或服务器最重要的部分,因此,系统管理员的工作始终是保持系统最新和安全,以防止服务器上定期发生的各种攻击。
我们将从 SELinux 到其他安全工具和措施开始讨论这里的几个工具,并逐一深入了解它们。
在本章中,我们将研究:
-
SELinux 及其工具
-
安装 SELinux
-
域转换
-
SELinux 用户
-
SELinux 审计日志和故障排除
介绍 SELinux
安全增强型 Linux(SELinux)是一组内核修改和用户空间工具,已经在 CentOS 中存在了相当长的时间。它是一种支持强制访问控制安全策略的机制,最初由美国国家安全局开发,后来在公共领域发布,以保护计算机系统免受恶意侵入和篡改。
并不是很多系统管理员使用 SELinux。通常,人们不愿意学习 SELinux,而是直接禁用它。然而,一个正确配置的 SELinux 系统可以在很大程度上减少安全风险。
SELinux 实现强制访问控制(MAC),它建立在 CentOS 7 上已有的自主访问控制(DAC)之上。 DAC 是我们在 Linux 系统上拥有的传统安全模型,其中有三个实体:用户、组和其他人可以对文件和目录拥有读、写和执行权限的组合。默认情况下,如果用户在他的主目录中创建任何文件,用户和他的组将具有读取访问权限,用户将具有写访问权限,但其他实体也可能具有读取访问权限。
拥有文件的用户可以更改此访问策略,并授予或撤销文件的访问权限以及所有权。这可能会使关键文件暴露给不需要访问这些文件的帐户,从而对正在运行的系统构成安全威胁。它将每个进程限制在自己的域中,并确保它只能与一种定义的文件和进程类型进行交互,从而保护系统免受黑客通过劫持脚本或进程并通过它获得系统范围控制的威胁。
要检查系统上安装了哪些 SELinux 软件包,请运行以下命令:
rpm -qa | grep selinux
该命令将显示以下输出:
安装 SELinux
使用以下命令安装所有软件包;这将安装系统上剩余的软件包并更新已安装的软件包:
yum install policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans
现在,我们将在系统上安装 SELinux 所需的所有软件包。让我们在系统上安装另外两个服务 apache(httpd
)用于 Web 服务器和 FTP(vsftpd
)服务器,以便我们可以测试它们的 SELinux:
yum install httpd vsftpd
现在使用以下命令运行 apache 服务:
systemctl start httpd
service httpd start
使用以下命令之一检查 httpd 的状态:
service status httpd
systemctl status httpd
这些命令将显示它正在运行,如下面的截图所示:
还可以使用以下命令之一启动 vsftpd,然后以相同的方式检查vsftp
的状态:
systemctl start vsftpd
service vsftpd start
使用以下命令之一检查 ftpd 的状态:
service status ftpd
systemctl status ftpd
SELinux 模式
有三种类型的 SELinux 模式,它们如下:
-
强制执行:在此模式下,SELinux 强制执行其策略到系统,并确保未经授权的用户或进程的所有访问都被拒绝。这些访问拒绝事件也会记录在系统中,我们稍后将在本章中进行讨论。
-
宽容:这类似于半启用模式状态,其中 SELinux 不会拒绝任何访问,因为策略处于宽容模式。这是测试 SELinux 策略的最佳模式。
-
禁用:在此模式下,SELinux 处于完全禁用状态,不会创建日志或拒绝权限。
我们可以运行以下命令来获取当前的 SELinux 状态:
getenforce
sestatus
当系统启用 SELinux 时,前述命令的输出显示在以下图像中:
主要的 SELinux 配置文件是/etc/selinux/config
。我们现在将通过在该文件中设置SELINUX=permissive
来启用 SELinux,然后保存并重新启动系统。
config
文件中的SELINUXTYPE
参数也有三个选项,如下所示:
-
Targeted:这是允许您自定义和微调策略的默认值。
-
最小:在此模式下,只有选定的进程受到保护。
-
MLS:多级安全是一种高级的保护模式,您需要安装额外的软件包。
我们将保持SELINUXTYPE
为默认值(即,targeted)。
第一次运行时,有必要将 SELinux 设置为宽容模式,因为需要为系统上的所有文件打标签。否则,在受限域下运行的进程可能会失败,因为它们无法访问具有正确上下文的文件。
一旦我们设置并重新启动系统,它将为所有文件打标签,这将根据具有 SELinux 上下文的系统而需花费一些时间。由于它处于宽容模式,只会报告失败和访问拒绝。
一旦系统启动,我们必须使用以下命令检查是否有任何错误:
grep 'SELinux' /var/log/messages
如果 SELinux 以宽容模式运行,将显示以下输出:
May 25 01:54:46 localhost kernel: SELinux: Disabled at runtime.
May 25 03:06:40 localhost kernel: SELinux: Initializing.
May 25 03:06:58 localhost systemd[1]: Successfully loaded SELinux policy in 2.863609s.
May 27 06:31:39 localhost kernel: SELinux: Initializing.
May 27 06:31:55 localhost systemd[1]: Successfully loaded SELinux policy in 1.944267s.
现在,由于所有规则都已加载并且文件已被标记,我们必须启用 SELinux 强制模式,而不是宽容模式。因此,再次编辑SELinux 配置
文件,并将以下内容设置为强制:
SELINUX=enforcing
现在再次重新启动服务器。
一旦系统恢复,使用sestatus
命令检查 SELinux 状态,它将显示类似以下内容的输出:
现在,如果在/var/log/messages
中使用grep
查找 SELinux,将找到以下内容:
May 27 11:18:21 localhost kernel: SELinux: Initializing.
May 27 11:18:34 localhost systemd[1]: Successfully loaded SELinux policy in 715.664ms.
要检查 SELinux 强制状态,请运行getenforce
命令,它将显示状态为enforcing
。
sestatus
命令将显示有关操作中的 SELinux 配置的更多详细信息,如下所示:
如果我们想在运行 SELinux 时临时更改 SELinux 模式,可以使用setenforce
命令,如下所示:
setenforce permissive
现在,sestatus
将显示以下屏幕:
使用以下命令切换回强制模式:
setenforce enforcing
SELinux 策略
你一定已经注意到了之前在/var/log/messages
中的 SELinux 输出是基于策略的。策略意味着一组规则,定义了与以下内容的关系、安全性和访问权限:
-
用户:所有常规 Linux 用户都由一个或多个 SELinux 用户定义。但请注意,SELinux 用户与 Linux 用户不同。还要注意,运行的进程或程序在 SELinux 中被定义为主题。
-
角色:它们类似于定义哪个用户可以访问进程等的过滤器。它就像用户和进程之间的网关。只有在角色授予访问权限并且用户有权访问角色时,用户才能运行特定进程。SELinux 基于基于角色的访问控制(RBAC)。
-
主题和对象:主题类似于进程或程序,对象是可以被操作的任何东西;如文件、端口、目录等。主题对对象执行的操作取决于主题的权限。
-
域:这类似于主体(进程)的包装器,告诉进程它可以或不能做什么。例如,域将定义进程可以访问的目录、文件夹、文件、端口等。域与 SELinux 中的主体相关。
-
类型:文件的上下文称为其类型。例如,文件的上下文描述了它是否仅对本地 Web 服务器进程可访问,或者对任何其他目录中的任何进程可访问,比如
/
等等,或者文件的特定 SELinux 用户是文件的所有者。类型与 SELinux 中的对象相关。
在 SELinux 中,策略定义了用户访问角色的规则,角色访问域的规则,以及域访问类型的规则。
SELinux 中由/etc/selinux/config
文件中的SELINUXTYPE
定义的三种访问控制形式:
-
类型强制(TE):这是定向策略中使用的访问控制的主要机制
-
基于角色的访问控制(RBAC):这是基于 SELinux 用户(不一定与 Linux 用户相同)的,但在默认的定向策略中不使用。
-
多级安全(MLS):这不常用,通常在默认的定向策略中隐藏。
定向策略是 SELinux 中默认使用的策略,我们将在此基础上继续讨论。
还要记住,SELinux 不会取代 Linux 系统中的传统 DAC 策略。相反,如果 DAC 策略禁止文件访问,SELinux 策略将不会被评估,并且不会授予文件访问权限,即使 SELinux 允许。
SELinux 策略以模块化格式加载到内存中,并可以使用以下命令查看:
semodule -l | more
semodule
命令可用于安装、删除、重新加载、升级、启用和禁用 SELinux 策略模块。
模块文件位于/etc/selinux/targeted/modules/active/modules/
目录中,具有.pp
扩展名,不是人类可读的。但是,如果你仔细查看它们,你肯定会发现它们实际上与 Linux 中的不同应用程序相关。
这些策略模块被合并为一个活动策略,然后加载到内存中。这个合并的二进制策略可以在/etc/selinux/targeted/policy/
目录中找到:
我们不能直接修改这些规则,但可以使用semanage boolean
命令来管理它们。semanage boolean -l | less
命令的输出将显示给我们这些信息。
在前面输出的第二行清楚地表明,FTP 服务访问用户主目录目前已关闭。我们还可以使用以下命令管道查看ftpd
服务策略的状态:
semanage boolean -l | grep ftpd
现在,为了允许 FTP 用户访问他们的主目录并允许读写访问,我们必须发出以下命令。首先使用以下命令检查ftp_home_dir
策略的状态:
getsebool ftp_home_dir
这将显示以下输出:
ftp_home_dir --> off
现在,使用setsebool -P
永久启用对用户主目录的访问:
setsebool -P ftp_home_dir on
现在,再次检查状态:
getsebool ftp_home_dir
这将显示以下输出:
ftp_home_dir --> on
现在,用户将被允许通过 FTP 访问其主目录;防火墙中允许 FTP 协议。
SELinux 文件和进程
到目前为止,我们已经了解了 SELinux 的基础知识,以及如何允许vsftpd
等服务允许用户从 ftp 访问其文件。让我们深入了解文件的上下文以及它们在 SELinux 中的定义。在 SELinux 中,上下文是与安全相关的信息集合,它帮助 SELinux 确定访问控制策略。在 Linux 中,一切都可以有安全上下文,如文件、目录、服务或端口,但是安全上下文对不同的对象意味着不同类型的事物。
我们可以使用ls –Z
参数显示任何文件的 SELinux 文件上下文,如下所示:
ls -laZ /home/test/*
在前面的输出中,这部分是特定文件的 SELinux 上下文:
system_u:object_r:user_home_t:s0
有四个部分,每个部分由冒号(:
)分隔。第一部分是 SELinux 用户上下文,在这里显示为system_u
。正如您已经知道的,每个 Linux 系统用户都映射到一个 SELinux 用户,这里是system_u
。
第二部分是 SELinux 角色,在这里是object_r
。
这里最重要的部分是第三部分,即user_home_t
。这是定义文件类型的部分,从中我们可以理解它属于用户的主目录。
第四部分(s0)实际上解释了文件的敏感性,它实际上与多级安全性一起工作。前三部分更重要,所以我们只会处理它们。
现在,让我们使用之前安装的httpd
文件查看 SELinux 进程上下文。首先使用以下命令启动httpd
进程:
systemctl httpd start
现在让我们运行带有额外-Z
标志的ps
命令来查看进程上下文:
ps -efZ | grep httpd
前面输出中的安全上下文如下:
system_u:system_r:httpd_t:s0
在 SELinux 中,用户后缀为_u
,角色后缀为_r
,类型后缀为_t
。
对于像httpd
这样的进程,它需要访问其文件并执行操作。我们已经看到每个进程只能访问特定类型(文件、目录、端口等)。
SELinux 在策略中定义了这些访问规则。这些访问规则遵循标准的allow
语句,如下所示:
allow <domain> <type>:<class> { <permissions> };
通用的allow
语句表示:
-
进程是否属于某个域
-
进程正在尝试访问的资源对象是某个类和类型
-
它是否允许访问或拒绝访问
让我们看看这如何与我们已经查看过的 https 进程的安全上下文相结合。
文档根目录或httpd
的默认目录是/var/www/html
。现在,让我们在那里创建一个文件并检查其安全上下文:
touch /var/www/html/index.html
ls -Z /var/www/html/*
我们创建的index.html
文件的文件上下文显示为httpd_sys_content_t
。
我们将以以下方式使用sesearch
命令来检查httpd
守护程序允许的访问类型:
sesearch --allow --source httpd_t --target httpd_sys_content_t --class file
在前面的命令中使用的标志很容易理解;源域是httpd_t
,这是 apache 正在其中运行的域。我们想列出目标资源,这些资源是文件,并且具有类型上下文httpd_sys_content_t
。
请注意前面截图中上下文输出的第一行是:
allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
现在,如果您将其与之前的通用 allow 语句联系起来,我们将清楚地了解到httpd
服务对httpd_sys_content_t
类型的文件具有 I/O 控制、读取、获取属性、锁定和打开访问权限。而且,在我们的情况下,我们创建的index.html
文件也是相同类型的,这意味着httpd
服务将可以访问这个index.html
文件。
让我们创建一个测试网页,修改index.html
文件,以便我们可以从浏览器中检查其输出。使用您喜欢的编辑器将以下行添加到index.html
文件中,并保存:
<html>
<title>
Test page
</title>
<body>
<h1>This is a test page</h1>
</body>
</html>
我们将使用以下命令更改/var/www
文件夹的权限,然后使用httpd restart
:
chmod -R 755 /var/wwwsystemctl restart httpd
如果您是第一次这样做,可能需要在防火墙中允许 http 端口,使用以下命令:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-service=http
firewall-cmd –reload
现在尝试从浏览器中访问它。它将显示以下截图中的输出:
现在,让我们看看如果我们更改index.html
文件的类型上下文,我们是否仍然能够访问它。我们将使用chcon
命令更改类型上下文,并将使用-type
标志进行此操作,如下所示:
chcon --type var_t /var/www/html/index.html
如果我们使用ls -Z
检查文件的上下文,它会显示:
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0 /var/www/html/index.html
在这里可以看到类型已更改为var_t
。
现在,如果您再次尝试访问网页,它将显示错误,或者您可能会看到一个默认页面,但不是我们之前看到的同一个页面。这是因为我们已经更改了index.html
文件的类型上下文。
要恢复它,我们将使用以下命令:
restorecon -v /var/www/html/index.html
现在,如果我们再次访问该站点,我们将看到它再次像以前一样工作。
SELinux 强制执行模式保证,除非策略另有规定,否则进程和文件将以与其父级相同的上下文创建。这意味着如果进程 A 生成进程 B,生成的进程 B 将在与进程 A 相同的域中运行,除非 SELinux 策略另有规定,同样,如果我们有一个带有一些context_t
类型的目录,除非另有规定,其下的文件或目录将继承相同的context_t
类型。
在 CentOS 7 中,系统中存在的所有文件的上下文都列在/etc/selinux/targeted/contexts/files/file_contexts
文件中,新目录和文件的上下文记录在/etc/selinux/targeted/contexts/files/file_contexts.local
文件中。由于chcon
用于临时更改上下文,restorecon
用于恢复上下文,restorecon
实际上会查看此文件以恢复文件的原始上下文。
让我们创建/www/html
:
mkdir -p /www/html
现在,我们使用以下命令将/var/www/html
的内容复制到/www/html
:
cp /var/www/html/index.html /www/html/
如果我们检查文件的上下文,我们会发现它与/var/www/html/index.html
及其default_t
的上下文不同,因为那是其父目录的上下文。
此外,即使我们将httpd
配置文件更改为从这个新位置打开index.html
文件,我们仍然会遇到错误,因为上下文还不正确。在从/var/www/html
复制index.html
文件到/www/html
时,它继承了其父目录的上下文,即default_t
。
为了解决这个问题,我们将不得不更改它的上下文。
要永久更改之前在/www/html
下创建的index.html
文件的上下文,我们将遵循两个步骤:
semanage fcontext --add --type httpd_sys_content_t "/www(/.*)?"
semanage fcontext --add --type httpd_sys_content_t "/www/html(/.*)?"
现在,我们从/etc/selinux/targeted/contexts/files/file_contexts.local
文件检查上下文数据库:
现在,我们将运行restorecon
命令,将文件或目录重新标记为前一步记录的内容:
restorecon -Rv /www
这将在三个级别上起作用;首先它将重新标记/www
目录,然后是/www/html
目录,最后是/www/html/index.html
文件。
现在,如果我们尝试访问网页,它应该可以正常工作。
还有一个名为matchpathcon
的命令,非常方便用于解决与上下文相关的问题。它可以将当前资源的上下文与 SELinux 上下文数据库中的内容进行比较并报告回来。如果匹配不同,它会建议所需的更改。我们可以使用以下方式使用-V
标志为/www/html/index.html
运行该命令:
matchpathcon -V /www/html/index.html
域转换
现在,让我们找出一个进程如何访问其他进程。
假设vsftpd
进程正在运行;如果它没有启动,我们可以使用以下命令启动它:
systemctl start vsftpd
vsftpd
进程是由systemd
进程启动的;这是Sys V init
进程的替代品,并在init_t
的上下文中运行:
ps -eZ | grep init
在init_t
域下运行的systemd
进程的生命周期非常短暂;它调用/usr/sbin/vsftpd
,其类型上下文为ftpd_exec_t
,当这个二进制可执行文件启动时,它就成为vsftpd
服务本身,并在ftpd_t
域中运行。
因此,这里的systemd
进程在init_t
域下执行一个具有ftpd_exec_t
类型的二进制文件。然后二进制文件在ftpd_t
域内启动一个服务。
域转换遵循三个严格的规则:
-
源域的父进程必须有权限在两个域之间执行应用程序
-
该应用程序的文件上下文必须被识别为目标域的入口点
-
原始域必须被允许转换到目标域
让我们运行sesearch
命令来检查vsftpd
服务是否遵循这些规则:
- 首先,源域
init_t
必须有权限在ftpd_exec_t
上下文中执行应用程序。所以我们运行:
sesearch -s init_t -t ftpd_exec_t -c file -p execute -Ad
我们找到了以下输出:
allow init_t ftpd_exec_t : file { read getattr execute open } ;
因此,init_t
可以读取、获取属性、执行和打开ftpd_exec_t
上下文的文件。
- 接下来,我们检查二进制文件是否是目标域
ftpd_t
的入口点:
sesearch -s ftpd_t -t ftpd_exec_t -c file -p entrypoint -Ad
我们发现它是:
allow ftpd_t ftpd_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
- 最后,源域
init_t
需要有权限转换到目标ftpd_t
域:
sesearch -s init_t -t ftpd_t -c process -p transition –Ad
我们可以看到源域也有这个权限:
allow init_t ftpd_t : process transition ;
SELinux 还支持在未受限制的域下运行的进程;例如,unconfined_t
。这是已登录用户默认运行其进程的域。
SELinux 用户
如前所述,SELinux 用户与普通 Linux 用户不同。SELinux 用户在引导时加载到内存中的策略中定义,而且这些用户很少。
在启用 SELinux 之后,每个常规用户帐户都映射到一个 SELinux 用户帐户。可以将多个用户帐户映射到同一个 SELinux 用户。这使得普通用户帐户能够继承其 SELinux 对应帐户的权限。
要查看映射,我们将运行以下命令:
semanage login -l
在这里,我们会发现在前面的屏幕截图中只有三个登录名,代表 Linux 用户帐户。任何 Linux 用户都映射到此处显示的__default__
。根用户没有映射到默认值,而是有自己的条目,正在运行的进程或服务有system_u
。第二列表示它们映射到的 SELinux 用户。普通用户帐户和根用户映射到unconfined_u
,而进程和服务映射到system_u
SELinux 用户。暂时忽略第三列,它显示用户的多级安全(MLS)多类别安全(MCS)类,以及最后一列(服务)。
要查看系统中可用的 SELinux 用户,使用semanage
用户命令如下:
semanage user -l
在前面的屏幕截图中,表格显示了系统中可用的 SELinux 用户以及他们可以访问的角色。我们已经讨论过 SELinux 角色就像用户和进程之间的网关。我们还将它们比作过滤器,用户可以进入一个角色,前提是该角色授予了权限。如果一个角色被授权访问一个进程域,与该角色相关联的用户将能够进入该进程域。
现在,以根用户身份运行id -Z
命令。它将显示根用户的 SELinux 安全上下文:
因此,根用户映射到unconfined_t
SELinux 用户,该用户被授权unconfined_r
角色,该角色又被授权在unconfined_t
域中运行进程。
我们已经看到系统中有几个 SELinux 用户可用。让我们在这里讨论其中一些:
-
guest_u
:这种类型的用户无法访问 X Windows 系统或网络,也无法执行su
或sudo
命令 -
xguest_u
:这种类型的用户只能通过浏览器访问 GUI 和网络 -
user_u
:这种类型的用户可以访问 GUI 和网络,但不能运行su
或sudo
-
staff_u
:与user_u
相同,只是他们可以运行sudo
。 -
system_u
:这是为系统服务而设计的,不与常规用户帐户映射
限制对 su 或 sudo 的访问
我们可以通过更改用户的 SELinux 用户映射来限制用户运行su
或sudo
命令,如下所示:
semanage login -a -s user_u test
上述命令将更改 Linux test
用户的映射为user_u
,并且不允许su
或sudo
命令的访问。
注意
这只有在用户未登录时才会生效。
限制运行脚本的权限
要限制 Linux test
用户运行脚本的能力,我们必须做两件事。首先,我们将用户的映射更改为guest_u
,与之前的操作方式相同:
semanage login -a -s guest_u test
默认情况下,SELinux 允许映射到guest_t
的用户从其主目录执行脚本。我们可以使用以下命令确认相同的情况:
getsebool allow_guest_exec_content
它将显示guest_exec_content
已启用。因此,第二步是我们使用以下命令禁用guest_exec_content
:
setsebool allow_guest_exec_content off
现在,我们更改了映射的测试用户将无法执行任何脚本,即使他对自己的主目录和在那里创建的文件有完全访问权限。
如果我们使用 grep 查看 SELinux 正在阻止/var/log/messages
,它将向我们显示访问拒绝以及警报 ID。我们可以记录警报 ID 并运行:
sealert -l <alert id>
它将向我们显示有关访问拒绝的详细信息以及一些建议来删除它。
限制对服务的访问
假设我们有一个名为 admin 的用户,具有sudo
访问权限,因此可以使用sudo
运行命令来启动和停止httpd
等服务。现在,即使用户具有sudo
访问权限,我们也可以通过将其用户映射更改为user_u
来阻止他管理对服务的访问,与之前的操作方式相同:
semanage login -a -s user_u admin
这将限制用户 admin 重新启动或停止服务。
我们可以通过以 root 身份运行seinfo
命令来验证user_u
的访问信息:
seinfo -uuser_u -x
此输出显示user_u
可以访问的角色;它们是object_r
和user_r
。
让我们再进一步,并运行相同的命令来查找user_r
角色被授权进入哪些域:
seinfo -ruser_r -x
角色可以进入的域有一个很长的列表。现在,让我们通过使用 grep 过滤输出来找出角色是否可以进入域httpd_t
:
seinfo -ruser_r -x | grep httpd_t
这将返回空,这意味着user_r
角色未被授权进入httpd_t
域,因此无法启动httpd
进程或守护程序。
SELinux 审计日志
在 CentOS 7 中,我们应该查看两个与 SELinux 相关的错误和警报文件;它们如下:
-
/var/log/audit/audit.log
-
/var/log/messages
SELinux 故障排除
SELinux 配备了一些非常有用的工具,用于检查错误和故障排除。我们已经看到其中一个,sealert -l <alert id>
,我们通过查看/var/log/messages
来收集警报 ID。还有另一个命令叫做ausearch
,如果auditd
服务正在运行,它也非常有助于检查错误,如下所示:
ausearch -m avc -c httpd
总结
在本章中,我们研究了 SELinux 的各个方面以及如何配置它;我们还演示了如何根据我们的需求使用它。然而,要小心,永远不要在生产系统上测试 SELinux。最好使用生产副本并首先在那里测试所有内容。当系统正确配置时,SELinux 设施将增强系统的安全性,但最好在需要严格安全控制时使用,并且只有在小心部署时才使用。
在下一章中,我们将看看 Linux 如何用于各种目的。
第三章:不同用途的 Linux
我们制定的设置服务器基础设施或数据中心的计划通常是相同的。我们总是尝试在运行的服务器之间组织服务,以满足我们的需求。在 Linux 系统上运行的服务器可以同时运行多个服务,也可以根据服务所需的处理能力和其在网络中的位置而选择只运行一个服务。根据用户的需求,系统管理员应始终准备好在其基础设施中设置或关闭服务。通常,对于基本系统安装,已经安装了一些服务,但配置不佳。
本章将涵盖大多数用户需要的一些主要 Linux 服务,以及如何设置、配置和操作它们。然后,我们将探讨这些服务的一些方面,如何保护它们,以及如何以最佳方式操作它们。
在本章中,我们将学习:
-
使用 iptables 和 IP 伪装配置网关服务器
-
安装 VPN 服务器
-
实施 BIND 作为 DNS 服务器
-
使用 Apache-MySQL-PHP 和 ModSecurity 设置和使用 Web 服务器
-
安装 FTP 服务器
-
在 Apache 和 FTP 中实施 OpenSSL
配置网关服务器
在许多网络基础设施中,系统管理员需要将他们的服务器和工作站分隔在多个子网络中。其他人使用可以使用网络地址转换(NAT)技术将私有网络地址与公共地址关联起来。Linux 网关服务器是可以帮助设置这种配置的常见解决方案之一。以下屏幕截图是一个架构示例,其中网关服务器用于通过本地和外部网络:
根据要求,我们需要至少两个网络接口的 Linux 服务器(作为最佳实践)。然后我们需要在它们之间建立一个桥接。在本节中,我们将设置在公共(外部)和私有(本地)地址之间建立网关,使用 IP 转发和 NAT 规则将流量从私有网络路由到公共网络。我们将称外部网络为广域网(WAN),本地网络为局域网(LAN)。
注意
从本地网络生成的流量将看起来是从网关服务器到外部网络发出的。在这个例子中,我们将需要另一台机器在 LAN 网络中提供服务器。
首先,我们将设置WAN
接口的网络配置。为此,有两个选项:要么接口将通过 DHCP(自动)获取其 IP 配置,要么我们手动设置它(静态)。在我们的情况下,我们将进行自动配置,因为我们的 WAN 网络由提供 DHCP 配置的路由器提供。
我们将首先编辑指定接口eth0
的配置文件:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
文件将包含以下行:
HWADDR="XX:XX:XX:XX:XX:XX"
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
DEVICE="eth0"
UUID="01f7dbb3-7ac8-406d-a88b-76082e0fa6eb"
ONBOOT="yes"
我们应该关注BOOTPROTO
所写的行,这是用于网络配置的协议,我们需要确保它设置为dhcp
。
默认安装将所有接口设置为 DHCP 配置,除非它们在安装期间或以后已被修改。
此外,我们需要确保DEVICE
设置为我们将用于提供 DHCP 服务器的接口名称,并且与我们服务器中的命名相同(对于我们的情况,它是eth0
)。然后,选项ONBOOT
设置为yes
。
注意
编辑文件后,如有需要,请确保在离开文本编辑器之前保存修改。
确保所有更改都已成功设置后,我们需要重新启动网络管理器,以便机器可以接受 DHCP 配置:
$ sudo systemctl restart network.service
在执行此步骤期间,可能会丢失网络连接。我们需要确保在此期间不需要它。
现在我们可以继续配置连接到 LAN 的网关服务器的第二个网络接口。对于此配置,我们需要使用静态 IP 地址。
与第一个接口类似,我们将编辑此接口eth1
的配置文件:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
此文件还将包含一些配置文件,但我们只对其中的一些感兴趣:
HWADDR="XX:XX:XX:XX:XX:XX"
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
DEVICE="eth1"
UUID=" b3fcc00e-a7d9-4b55-a32c-1e88e394aaf6"
ONBOOT="yes"
这是默认配置,因此我们需要将其从动态配置更改为静态配置。
修改将包括修改一些行和添加其他行。
我们首先将配置协议从dhcp
更改为static
,看起来像这样:
BOOTPROTO="static"
然后我们添加静态 IP 地址这一行:IPADDR="10.0.1.1"
。
然后网络掩码,NETMASK="255.255.255.0"
。
最后,我们确保选项DEVICE
设置为eth1
,选项ONBOOT
设置为yes
。
同样,为了确保此配置成功应用,我们需要重新启动网络服务:
$ sudo systemctl restart network.service
注意
如果在输入ifconfig
时配置没有生效,要检查接口的配置,我们需要运行此命令:
$ sudo systemctl restart network.service
$ sudo systemctl status network.service
现在我们继续配置客户端,即将使用网关服务器的机器。因此,我们需要为其 LAN 网络配置接口。由于我们不限于一个特定的客户端,如果我们有图形界面,我们可以直接转到连接的接口并输入这些配置:
IP 地址:10.0.1.2
网络掩码:255.255.255.0
网关:10.0.1.1
对于 DNS 服务器,我们将选择非常可靠的 Google DNS。
DNS 服务器:8.8.8.8
注意
输入 Google DNS 服务器地址并不是义务。有些网站可能会阻止它,其他网站可能会使用他们的本地 DNS 服务器。根据需要,如果我们没有任何需求,Google DNS 就可以了。
如果我们需要使用另一台 CentOS 7 服务器,可能需要在静态服务器配置期间执行相同的步骤。
我们编辑接口的配置文件:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
通过将配置协议更改为static
并添加这两行:
IPADDR="10.0.1.2"
NETMASK="255.255.255.0"
我们还确保ONBOOT=yes
和DEVICE=eth0
。
要使用 Google DNS 服务器,我们可以编辑/etc/resolv.conf
文件:
$ nano /etc/resolv.conf
添加这两行:
nameserver 8.8.8.8
nameserver 8.8.4.4
然后重新启动网络服务:
$ sudo systemctl restart network.service
我们回到我们的网关服务器,然后开始进行 IP 转发的配置。首先,我们需要启用 IPv4 数据包转发:
$ sudo sysctl -w net.ipv4.ip_forward=1
为了在每次系统重启时保持配置,我们需要对 IP 转发配置文件进行修改:
$ sudo nano /etc/sysctl.conf
然后添加这一行并保存:
net.ipv4.ip_forward = 1
要重新加载对文件所做的配置,我们需要运行此命令:
$ sudo sysctl –w
可以通过此命令可视化当前配置:
$ sudo cat /proc/sys/net/ipv4/ip_forward
现在我们开始启用 NAT 配置。使用iptables
,我们需要启用 IP 伪装。 firewalld
是一个允许轻松配置iptables
的服务。要使用firewalld
,我们将依赖于命令firewalld-cmd
,然后输入所需的配置。
我们首先在firewalld
中配置 NAT。首先,我们将 LAN 网络设置为受信任的区域:
$ sudo firewall-cmd --permanent --zone=trusted --add-source=10.0.1.0/24
然后我们将 LAN 接口eth1
集成到一个名为internal
的区域中:
$ sudo firewall-cmd --change-interface=eth1 --zone=internal --permanent
我们也对 WAN 接口eth0
进行相似的操作,将其设置为名为external
的区域:
$ sudo firewall-cmd --change-interface=eth0 --zone=external --permanent
然后我们为外部 WAN 配置masquerade
选项:
$ sudo firewall-cmd --zone=external --add-masquerade --permanent
对于可选的 DNS 配置,我们可以通过internal
区域进行传递:
$ sudo firewall-cmd --zone=internal --add-service=dns –-permanent
在完成之前,我们确保 NAT 已配置为将 LAN 上的流量传递到 WAN 接口:
$ sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -I POSTROUTING -o eth0 -j MASQUERADE -s 10.0.1.0/24
最后,我们需要重新加载防火墙服务,以使配置生效:
$ sudo firewall-cmd –reload
在此点之后,网关服务器应该正常运行。要测试配置,我们需要从 LAN 网络上的任何机器上 ping 任何网站:
$ ping www.google.com
然后我们需要查看以下类型的输出,以知道我们的网关服务器是否正常工作:
PING www.google.com (216.58.210.196): 56 data bytes
64 bytes from 216.58.210.196: seq=0 ttl=50 time=55.799 ms
64 bytes from 216.58.210.196: seq=1 ttl=50 time=65.751 ms
64 bytes from 216.58.210.196: seq=2 ttl=50 time=54.878 ms
64 bytes from 216.58.210.196: seq=3 ttl=50 time=54.186 ms
64 bytes from 216.58.210.196: seq=4 ttl=50 time=93.656 ms
--- www.google.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 54.186/64.854/93.656 ms
如果我们使用台式机并且不需要静态配置,我们建议使用 DHCP 服务器为所有客户端设置配置。即使对于更高级的 DHCP 配置,我们也可以通过它们的接口 MAC 地址将特定 IP 地址与服务器关联起来。
设置 VPN 服务器
OpenVPN 是一种开源软件应用程序,实现了虚拟专用网络(VPN)技术,用于创建路由或桥接配置和远程访问设施中的安全点对点或站点到站点连接。
作为本节的要求,我们需要一个 CentOS 7 服务器,具有安装一些软件包和对网络配置文件(Internet 和 root 访问)进行一些更改的能力。在以后的阶段,我们可能需要创建一些身份验证证书。我们也将介绍如何执行此操作。
首先,我们将开始安装所需的软件包。在执行此操作之前,OpenVPN 不在默认的 CentOS 标准存储库中,因此我们需要添加包含流行附加软件包的 EPEL 存储库:
$ sudo yum install epel-release
完成此命令后,我们可以启动 OpenVPN。我们还需要安装 RSA 生成器来生成我们将用于保护 VPN 连接的 SSL 密钥对:
$ sudo yum install openvpn easy-rsa
在执行该命令结束时,OpenVPN 和 easy-rsa 已成功安装在系统上。
现在我们转移到 OpenVPN 的配置部分。由于 OpenVPN 在其文档目录中有一个配置文件的示例,我们将使用server.conf
文件作为我们的初始配置并在此基础上构建。为此,我们需要将其复制到/etc
目录:
$ sudo cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn/
然后我们可以编辑它以满足我们的需求:
$ sudo nano /etc/openvpn/server.conf
打开文件后,我们需要删除一些注释行并进行一些小的更改,如下所示(使用nano
查找要更改的行,我们应该使用Ctrl + w,然后输入我们要查找的单词)。
首先,我们需要将 RSA 加密长度设置为 2048 字节,因此我们需要确保指示文件名的选项行将以以下方式使用。
dh dh2048.pem
注意
一些文章建议使用 1024 字节的 DH 密钥是有漏洞的,因此我们建议使用 2048 字节或更多的 DH 密钥以获得更好的安全性。这种漏洞称为 Logjam,有关更多详细信息,您可以在以下网址阅读更多内容:sourceforge.net/p/openvpn/mailman/message/34132515/
然后我们需要取消注释push redirect-gateway def1 bypass-dhcp""
这一行,告诉客户端将所有流量重定向到 OpenVPN。
接下来,我们需要为客户端设置 DNS 服务器,因为它将无法使用 ISP 提供的 DNS。同样,我将使用 Google DNS 8.8.8.8
和8.8.4.4
:
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
最后,为了使 OpenVPN 顺利运行,我们需要首先以无特权运行它。为此,我们需要通过名为nobody
的用户和组运行它:
user nobody
group nobody
然后保存文件并退出。
到目前为止,OpenVPN 服务的配置部分已经完成。我们将继续进行证书和密钥生成部分,需要使用 Easy RSA 创建一些脚本。我们首先需要在 OpenVPN 的配置文件夹中创建一个 Easy RSA 的目录:
$ sudo mkdir -p /etc/openvpn/easy-rsa/keys
然后我们需要使用 Easy RSA 的预定义脚本填充文件夹,以生成密钥和证书:
$ sudo cp -rf /usr/share/easy-rsa/2.0/* /etc/openvpn/easy-rsa/
为了执行简单的 VPN 设置,我们将首先在vars
文件中输入我们的信息一次并永久保存:
$ sudo nano /etc/openvpn/easy-rsa/vars
我们基本上正在更改以export KEY_
开头的行,以更新它们的值以匹配所需组织的值,并且在某些时候我们可能需要取消注释它们:
export KEY_COUNTRY="UK"
export KEY_PROVINCE="GL"
export KEY_CITY="London"
export KEY_ORG="City-Center"
export KEY_EMAIL="user@packt.co.uk"
export KEY_OU="PacktPublishing"
# X509 Subject Field
export KEY_NAME="server"
export KEY_CN="openvpn.packt.co.uk"
然后保存文件并退出。
KEY_NAME
字段代表文件.key
和.crt
的名称。
KEY_CN
字段是我们应该放置指向 VPN 服务器的域或子域的地方。
为了确保在使用 OpenSSL 配置文件时不会出现由于版本更新而引起的问题,我们将从文件名中删除版本:
$ sudo cp /etc/openvpn/easy-rsa/openssl-1.0.0.cnf /etc/openvpn/easy-rsa/openssl.cnf
现在我们转到证书和密钥的创建。我们需要在/etc/openvpn/easy-ras
文件夹中运行脚本:
$ cd /etc/openvpn/easy-rsa
然后我们在变量中启动源:
$ sudo source ./vars
之后,清除任何旧生成的密钥和证书:
$ sudo ./clean-all
然后我们构建认证机构,其信息已经定义为默认选项:
$ sudo ./build-ca
现在我们为 VPN 服务器创建密钥和证书。我们通过按Enter跳过挑战密码阶段。然后我们确保通过在最后一步输入Y
来验证:
$ sudo ./build-key-server server
运行此命令时,如果它运行正确,我们应该看到以下消息:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'UK'
stateOrProvinceName :PRINTABLE:'GL'
localityName :PRINTABLE:'London'
organizationName :PRINTABLE:'City-Center'
organizationalUnitName:PRINTABLE:'PacktPublishing'
commonName :PRINTABLE:'server'
name :PRINTABLE:'server'
emailAddress :IA5STRING:'user@packt.co.uk'
此外,我们需要生成 Diffie-Hellman(dh
)密钥交换。与其他命令相比,这可能需要更长的时间:
$ sudo ./build-dh
完成此步骤后,我们将准备好所有的密钥和证书。我们需要复制它们,以便它们可以被我们的 OpenVPN 服务使用:
$ cd /etc/openvpn/easy-rsa/keys
$ sudo cp dh2048.pem ca.crt server.crt server.key /etc/openvpn
这个 VPN 服务器的所有客户端都需要证书进行身份验证。因此,我们需要与所需的客户端共享这些密钥和证书。最好为需要连接的每个客户端生成单独的密钥。
在这个例子中,我们只为一个客户端生成密钥:
$ cd /etc/openvpn/easy-rsa
$ sudo ./build-key client
通过这一步,我们可以说我们已经完成了证书。
现在是路由步骤。我们将使用iptables
直接进行路由配置,而无需使用firewalld
。
如果我们只想使用iptables
配置,我们首先要确保其服务已安装:
$ sudo yum install iptables-services
然后禁用firewalld
服务:
$ sudo systemctl mask firewalld
$ sudo systemctl enable iptables
$ sudo systemctl stop firewalld
$ sudo systemctl start iptables
$ sudo iptables --flush
然后我们添加规则到iptables
,进行路由到 OpenVPN 子网的转发:
$ sudo iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o eth0 -j MASQUERADE
$ sudo iptables-save > /etc/sysconfig/iptables
然后我们需要通过编辑文件sysctl.conf
在sysctl
中启用 IP 转发:
$ sudo nano /etc/sysctl.conf
然后添加以下行:
net.ipv4.ip_forward = 1
最后,重新启动网络服务,使此配置生效:
$ sudo systemctl restart network.service
现在我们可以启动 OpenVPN 服务,但在这之前,我们需要将其添加到systemctl
:
$ sudo systemctl -f enable openvpn@server.service
然后我们可以启动服务:
$ sudo systemctl start openvpn@server.service
如果我们想要检查服务是否正在运行,可以使用命令systemctl
:
$ sudo systemctl status openvpn@server.service
我们应该看到这条消息的活动状态为active (running)
:
openvpn@server.service - OpenVPN Robust And Highly Flexible Tunneling Application On server
Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; enabled)
Active: active (running) since Thu 2015-07-30 15:54:52 CET; 25s ago
经过这个检查,我们可以说我们的 VPN 服务器配置已经完成。现在我们可以去客户端配置,不论操作系统如何。我们需要从服务器复制证书和密钥。我们需要复制这三个文件:
/etc/openvpn/easy-rsa/keys/ca.crt
/etc/openvpn/easy-rsa/keys/client.crt
/etc/openvpn/easy-rsa/keys/client.key
有各种工具可以将这些文件从服务器复制到任何客户端。最简单的是scp
,这是两台 Unix 机器之间的 shell 复制命令。对于 Windows 机器,我们可以使用文件夹共享工具,如 Samba,或者我们可以使用另一个等效于 SCP 的工具WinSCP。
从客户端机器开始,我们首先复制所需的文件:
$ scp user@openvpn.packt.co.uk:/etc/openvpn/easy-rsa/keys/ca.crt /home/user/
$ scp user@openvpn.packt.co.uk:/etc/openvpn/easy-rsa/keys/client.crt /home/user/
$ scp user@openvpn.packt.co.uk:/etc/openvpn/easy-rsa/keys/client.key /home/user/
复制完成后,我们应该创建一个名为client.ovpn
的文件,这是 OpenVPN 客户端的配置文件,可以帮助设置客户端连接到服务器提供的 VPN 网络。文件应包含以下内容:
client
dev tun
proto udp
remote server.packt.co.uk 1194
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
ca /home/user/ca.crt
cert /home/user/client.crt
key /home/user/client.key
我们需要确保第一行包含在密钥和证书中输入的客户端名称。之后,远程应该是服务器的公共 IP 地址或其域地址。最后,应该从服务器复制三个客户端文件的正确位置。
文件client.ovpn
可以与多个 VPN 客户端(Linux 的 OpenVPN 客户端,MAC OS X 的 Tunnelblick,Windows 的 OpenVPN Community Edition Binaries)一起使用,以便配置它们连接到 VPN。
在 CentOS 7 服务器上,我们将使用 OpenVPN 客户端。要使用此配置,我们使用命令openvpn --config
:
$ sudo openvpn --config ~/path/to/client.ovpn
通过将客户端连接到 VPN 服务器,我们可以确认我们的 VPN 服务运行良好。
实施 BIND 作为 DNS 服务器
BIND 是最广泛使用的开源名称服务器应用程序。它帮助实现互联网的域名系统(DNS)协议。它提供了一个强大而稳定的平台,用于构建分布式计算系统,确保这些系统完全符合已发布的 DNS 标准。它通过将这些问题发送到适当的服务器并对服务器的回复做出适当的响应来帮助解决有关名称的查询。
作为 BIND 实现的示例,我们将设置一个内部 DNS 服务器来解析网络内部的一些公共 IP 地址,以简化大型环境中的映射。
我们需要以下先决条件来实现 BIND:
-
一个服务器上安装和配置 BIND
-
两台机器,可以是服务器也可以是简单的工作站,用来测试 DNS 服务
-
需要 root 权限才能设置 BIND 并配置网络以从我们的内部 DNS 服务器解析
首先,我们将在我们的 DNS 服务器上安装 BIND:
$ sudo yum install bind bind-utils
安装完 BIND 后,我们开始配置我们的 DNS 服务器。
BIND 服务有一堆配置文件,这些文件从它的主配置文件named.conf
中包含,这个文件与 BIND 运行的进程相关联:
$ sudo nano /etc/named.conf
在文件的开头,我们需要在options
块之前添加一个块,名为acl "trusted"
,在这里我们将定义允许进行递归 DNS 查询的客户端列表。由于我们的服务器将为两个子网提供服务,我们将添加它的两个地址:
acl "trusted" {
192.168.8.12; # Our DNS server inside the subnet 192.168.8.0/24
10.0.1.1; # Our DNS server inside the subnet 10.0.1.0/24
192.168.8.5; # Webserver
10.0.1.2; # client host
};
我们需要在options
内进行一些修改。由于我们只使用 IPv4,我们需要注释掉 IPv6 行:
# listen-on-v6 port 53 { ::1; };
为了确保 DNS 服务器将在两个子网中监听,我们将添加以下两个地址:
listen-on port 53 { 127.0.0.1; 192.168.8.12; 10.0.1.1; };
使用 IP 地址192.168.8.12
作为 DNS 服务器的 IP 地址。
然后我们将allow-query
行从指向localhost
改为指向trusted
客户端 ACL:
allow-query { trusted; };
注意
如果我们不完全依赖我们的 DNS 服务器来响应所有查询,我们可以通过在options
中输入以下命令来使用辅助 DNS 服务器:
allow-transfer { localhost; 192.168.8.1; };
最后,在文件的末尾,我们需要添加包含本地文件配置的行:
include "/etc/named/named.conf.local";
然后我们保存文件,转到本地文件配置以设置 DNS 区域:
$ sudo nano /etc/named/named.conf.local
由于我们是创建它的人,所以文件将是空的,因此我们需要用必要的区域填充它。
首先,我们将添加正向区域。为此,我们需要输入以下行:
zone "packt.co.uk" {
type master;
file "/etc/named/zones/db.packt.co.uk"; # The location of the zone configuration file.
};
现在我们将添加反向区域。由于我们的第一个 LAN 在192.168.8.0/24
,我们从反向区域名称开始,它将是8.168.192
,即192.168.8
的反向:
zone "8.168.192.in-addr.arpa" {
type master;
file "/etc/named/zones/db.8.168.192"; # The subnet of 192.168.8.0/24
};
现在我们对10.0.1.0/24
上的第二个 LAN 做同样的操作,所以它的反向区域名称是1.0.10
:
zone "1.0.10.in-addr.arpa" {
type master;
file "/etc/named/zones/db.1.0.10"; # The subnet of 10.0.1.0/24
};
我们需要对网络中的所有子网做同样的操作,然后保存文件。
完成设置区域和反向区域后,我们继续创建并填写它们对应的文件。
我们首先创建转发文件,这是我们为正向 DNS 查找定义 DNS 记录的地方。我们创建一个文件夹,用来放置所有区域文件。然后我们开始在其中创建我们的区域文件:
$ sudo chmod 755 /etc/named
$ sudo mkdir /etc/named/zones
然后我们创建正向区域文件并填写它:
$ sudo nano /etc/named/zones/db.packt.co.uk
我们需要添加以下行。首先是 SOA 记录,通过添加 DNS 服务器的域名,我们需要每次编辑区域文件时增加序列值,以便在重新启动服务后生效:
$TTL 604800
@ IN SOA server.packt.co.uk. admin.packt.co.uk. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
对于序列号,我们可以通过使其看起来像一个日期:{yyyymmmdddss} yyyy = 年
,mm = 月
,dd = 日
,ss = 一个
序列号来使其更易理解。
然后我们添加名称服务器记录:
; name servers - NS records
IN NS server.packt.co.uk.
然后我们为属于该区域的主机添加A 记录
,其中将包括我们希望使用我们的 DNS 服务器寻址的每台机器,无论是服务器还是工作站:
; name servers - A records
server.packt.co.uk. IN A 192.168.8.12
; 192.168.8.0/24 - A records
server2.packt.co.uk. IN A 192.168.8.5
; 10.0.1.0/24 - A records
client1.packt.co.uk. IN A 10.0.1.2
server.packt.co.uk. IN A 10.0.1.1
现在我们创建反向区域文件。这是我们为反向 DNS 查找定义 DNS PTR 记录的地方。
我们从第一个反向区域db.1.0.10
开始:
$ sudo nano /etc/named/zones/db.1.0.10
与第一个区域文件一样,我们需要定义 SOA 域:
$TTL 604800
@ IN SOA server.packt.co.uk. admin.packt.co.uk. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
然后是名称服务器记录:
; name servers - NS records
IN NS server.packt.co.uk.
最后,我们添加列出子网区域上具有 IP 地址的所有机器的 PTR 记录:
; PTR Records
1 IN PTR server.packt.co.uk. ; 10.0.1.1
2 IN PTR client1.packt.co.uk. ; 10.0.1.2
然后我们做第二个反向区域文件db.8.168.192
:
$ sudo nano /etc/named/zones/db.8.168.192
我们添加 SOA 域:
$TTL 604800
@ IN SOA server.packt.co.uk. admin.packt.co.uk. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
然后我们添加名称服务器记录:
; name servers - NS records
IN NS server.packt.co.uk.
最后我们完成 PTR 记录:
; PTR Records
12 IN PTR server.packt.co.uk. ; 192.168.8.12
5 IN PTR webserver.packt.co.uk. ; 192.168.8.5
我们保存所有文件。然后通过检查文件named.conf*
的语法来检查 BIND 配置:
$ sudo named-checkconf
如果没有显示错误,这意味着所有配置文件都写得很好,没有语法错误。否则,请尝试跟踪错误并使用错误消息进行修复。
然后使用命令named-checkzone
在每个区域中检查区域文件(如果有多个):
$ sudo named-checkzone packt.co.uk /etc/named/zones/db.packt.co.uk
如果区域成功设置,我们应该看到这种消息:
zone packt.co.uk/IN: loaded serial 3
OK
我们应该看到反向区域的相同内容:
$ sudo named-checkzone 1.0.10.in-addr.arpa /etc/named/zones/db.1.0.10
$ sudo named-checkzone 8.168.192.in-addr.arpa /etc/named/zones/db.8.168.192
如果一切配置正确,我们也应该看到相同的消息。否则,我们需要排除以下错误消息:
zone 8.168.192.in-addr.arpa/IN: loaded serial 3
OK
在检查所有配置后,我们现在准备启动 BIND 服务。
在此之前,我们需要确保我们的防火墙允许我们这样做。我们需要使用Firewalld
服务打开端口 53:
$ sudo firewall-cmd --permanent --add-port=53/tcp
$ sudo firewall-cmd --permanent --add-port=53/udp
$ sudo firewall-cmd --reload
重新加载防火墙后,更改将生效,现在我们可以启动 DNS 服务:
$ sudo systemctl start named
然后启用它,以便它可以在系统启动时启动:
$ sudo systemctl enable named
通过这一步,DNS 服务器现在已准备好接收和响应 DNS 查询。
现在让我们进行客户端配置以测试 DNS 服务器。在 Linux 服务器上,我们只需要通过添加名称服务器 IP 地址和搜索域来修改resolv.conf
文件:
$ sudo nano /etc/resolv.conf
通过添加以下行,然后保存:
search nyc3.example. # Our domain
nameserver 10.0.1.1 # The DNS server IP address
现在我们可以开始测试。我们将使用简单的 ping 和命令nslookup
。ping 只会测试我们是否能够通过其域名到达该机器:
$ ping webserver.packt.co.uk
PING webserver.packt.co.uk (192.168.8.5): 56 data bytes
64 bytes from 192.168.8.5: icmp_seq=0 ttl=64 time=0.046 ms
64 bytes from 192.168.8.5: icmp_seq=1 ttl=64 time=0.092 ms
64 bytes from 192.168.8.5: icmp_seq=2 ttl=64 time=0.117 ms
64 bytes from 192.168.8.5: icmp_seq=3 ttl=64 time=0.092 ms
--- webserver.packt.co.uk ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.046/0.087/0.117/0.026 ms
还有其他工具可以在测试 DNS 服务时提供更详细的结果,例如dig
和nslookup
进行简单的 DNS 查找:
$ nslookup webserver.packt.co.uk
Server: 10.0.1.1
Address: 10.0.1.1#53
Name: webserver.packt.co.uk
Address: 192.168.8.5 webserver.packt.co.uk
运行 DNS 查找后,我们将尝试进行反向 DNS 查找:
$ nslookup webserver.packt.co.uk
Server: 10.0.1.1
Address: 10.0.1.1#53
5.8.168.192.in-addr.arpa name = webserver.packt.co.uk.
在运行所有这些测试后,我们应该检查所有值是否为true
,以确认我们拥有一个完全正常工作的 DNS 服务器。
使用 Apache-MySQL-PHP 设置 Web 服务器
Linux 服务器提供的常见服务之一是作为 Web 服务器,使其用户能够在安全、快速和可靠的位置托管其 Web 内容,可从世界各地浏览。在本节中,我们将向您展示如何在 CentOS 7 服务器上设置可靠的 Web 服务器,并使用一些安全模块来保护网站,并实施内容管理系统(CMS):Joomla。
我们的 Web 服务器将托管动态网站和 Web 应用程序。因此,我们将安装一个 LAMP(堆栈)服务器,代表一个具有 Apache Web 服务器的 Linux 操作系统,其中站点数据将存储在 MySQL 数据库中(使用 MariaDB,这是 MySQL 关系数据库管理系统的社区开发分支,旨在在 GNU GPL 下保持免费),并且动态内容由 PHP 处理。
我们将从安装 Apache Web 服务器开始,这是世界上最流行的 Web 服务器:
$ sudo yum install httpd
在命令结束时,Apache Web 服务器已成功安装。我们可以使用systemctl
命令启动它:
$ sudo systemctl start httpd.service
在测试服务之前,我们需要确保服务器防火墙允许 Web 访问。因此,我们需要打开 Apache 正在提供的端口,HTTP(80)和 HTTPS(443):
$ sudo firewall-cmd --permanent --add-service=http
$ sudo firewall-cmd --permanent --add-service=https
$ sudo firewall-cmd --reload
现在我们可以通过在同一网络内的任何其他机器的 Web 浏览器中键入服务器的 IP 地址(http://Server_IP_Address
)来测试 Web 服务器。我们应该看到类似于这样的东西:
确认服务正常运行后,我们需要将其添加到系统启动服务中:
$ sudo systemctl enable httpd.service
现在我们将在 Apache 上设置两个虚拟主机,以展示 Apache 支持多个网站的能力。
接下来,我们将对 Apache 配置文件进行一些更改,因此我们将创建一个备份文件:
$ sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup
Apache 有能力将其功能和组件分离为可以独立定制和配置的单元。这些单元称为虚拟主机。虚拟主机允许我们托管多个域。每个配置的域将访问者引导到指定给网站的特定文件夹,其中包含其信息。只要服务器能够处理吸引网站的流量,这种技术就是可扩展的。
首先,我们需要创建我们将存储网站的文件夹。目录/var/www/
是我们的 Web 服务器根目录:
$ sudo mkdir –p /var/www/packt.co.uk/home
$ sudo mkdir –p /var/www/packt2.co.uk/home
然后我们授予这些文件夹权限,通过将所有权从根用户(刚刚创建它们的用户)更改为$USER
(当前登录的用户):
$ sudo chown –R $USER:$USER /var/www/packt.co.uk/home
$ sudo chown –R $USER:$USER /var/www/packt2.co.uk/home
为了完全测试虚拟主机,我们需要创建一个示例 HTML 页面,以在客户端 Web 浏览器中打开:
$ nano /var/www/packt.co.uk/home/index.html
然后我们添加一些 HTML 代码来填充页面:
<html>
<head>
<title>Packt Home Page</title>
</head>
<body>
<h1>Welcome to the home page of the Packt Publishing 1st example web server </h1>
</body>
</html>
同样地,对于第二个主机,我们需要创建相同的文件,但内容不同以区分:
$ nano /var/www/packt2.co.uk/home/index.html
然后我们放入以下 HTML 代码:
<html>
<head>
<title>Packt2 Home Page</title>
</head>
<body>
<h1>Welcome to the home page of the Packt Publishing 2nd example web server </h1>
</body>
</html>
现在我们需要在 Apache 配置文件夹中创建虚拟主机文件。我们首先创建需要放置文件的文件夹:
$ sudo mkdir /etc/httpd/sites-available
$ sudo mkdir /etc/httpd/sites-enabled
然后我们需要告诉 Apache 服务使用sites-enabled
目录中提供的配置,方法是编辑 Apache 主配置文件。此配置也可以作为配置目录/etc/httpd/conf.d
获得。
$ sudo nano /etc/httpd/conf/httpd.conf.
然后我们在文件末尾添加以下行:
IncludeOptional sites-enabled/*.conf
我们保存文件,然后移动到sites-available
文件夹中创建虚拟主机文件。文件名应该以.conf
结尾,这样 Apache 服务才能使用它:
$ sudo nano /etc/httpd/sites-available/packt.co.uk.conf
然后我们在其中放入以下配置:
<VirtualHost *:80>
ServerName www.packt.co.uk
ServerAlias packt.co.uk
DocumentRoot /var/www/packt.co.uk/home
ErrorLog /var/log/httpd/packt.co.uk_error.log
CustomLog /var/log/httpd/packt.co.uk_requests.log combined
</VirtualHost>
我们保存文件,然后对第二个虚拟主机做同样的操作:
$ sudo nano /etc/httpd/sites-available/packt2.co.uk.conf
然后我们在其中放入以下命令:
<VirtualHost *:80>
ServerName www.packt2.co.uk
ServerAlias packt2.co.uk
DocumentRoot /var/www/packt2.co.uk/home
ErrorLog /var/log/httpd/packt2.co.uk_error.log
CustomLog /var/log/httpd/packt2.co.uk_requests.log combined
</VirtualHost>
在配置两个站点之后,我们现在可以激活虚拟主机以供使用:
$ sudo ln -s /etc/httpd/sites-available/packt.co.uk.conf /etc/httpd/sites-enabled/packt.co.uk.conf
$ sudo ln -s /etc/httpd/sites-available/packt2.co.uk.conf /etc/httpd/sites-enabled/packt2.co.uk.conf
为了确保我们所做的所有配置都会生效,我们需要使用以下命令之一重新启动 Apache 服务:
$ sudo apachectl restart
$ sudo systemctl restart httpd.service
注意
如果我们遇到与服务器主机名相关的任何错误,请尝试使用此命令进行更改并消除错误:
$ sudo hostnamectl set-hostname --static packt.co.uk
在我们的情况下,这些域名不是公共的,也没有被任何 DNS 服务器定义。因此,我们可以将它们添加到我们的本地 DNS 服务器,或者只需将它们添加到我们客户端机器(我们将在其中打开 Web 浏览器的机器)的/etc/hosts
文件中。此步骤仅用于测试。通常,我们应该在 ISP 的 DNS 服务器或本地 DNS 服务器上定义它们:
$ sudo nano /etc/hosts
然后我们添加两行,将我们的 Web 服务器 IP 地址与我们创建的两个域关联起来:
Server_IP_Address packt.co.uk
Server_IP_Address packt2.co.uk
然后我们转到客户端 Web 浏览器,输入域名到地址栏中:
http://packt.co.uk
我们应该看到与第一个域关联的页面。我们对第二个域做同样的操作。如果测试有效,我们确认我们的虚拟主机已正确创建。
现在我们可以开始保护 Apache 免受影响世界网站的最常见攻击之一。暴力攻击或分布式拒绝服务(DDoS)攻击是一种向同一 Web 服务器发送多个请求以使其超载并使其无法访问的攻击。现在我们将设置模块来帮助保护我们的 Web 服务器免受此类攻击。Mod_Security
和Mod_evasive
是基本模块,将帮助检测和防止入侵,并帮助加强 Web 服务器对暴力或 DDoS 攻击的保护。首先,我们需要使用软件包管理器安装这些模块。我们要求系统已经安装了 EPEL 存储库:
$ sudo yum install mod_security mod_evasive
因此,为了验证安装是否完成,我们需要查看/etc/httpd/conf.d/
文件夹中是否创建了两个文件:
$ sudo ls /etc/httpd/conf.d/mod_*
/etc/httpd/conf.d/mod_evasive.conf
/etc/httpd/conf.d/mod_security.conf
为了确保 Apache 在启动时加载这两个模块,我们需要向两个配置文件添加一些配置选项,这些选项在安装后已经创建:
$ sudo nano /etc/httpd/conf.d/mod_evasive.conf
$ sudo nano /etc/httpd/conf.d/mod_security.conf
然后我们分别添加以下行,或者确保它们是取消注释的:
LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so
现在我们可以重新启动 Apache,以便配置生效:
$ sudo service httpd restart
我们首先要配置Mod_Security
模块。因此,我们需要设置一个核心规则集(CRS)。我们将下载一个免费的 CRS(OWASP)来为我们的 Web 服务器配置它。在下载其包之前,我们需要创建一个目录来放置规则:
$ sudo mkdir /etc/httpd/crs-tecmint
$ cd /etc/httpd/crs-tecmint
$ sudo wget https://github.com/SpiderLabs/owasp-modsecurity-crs/tarball/master
之后,我们可以在那里提取包,并将其名称更改为合适的名称:
$ sudo tar –xzvf master
$ sudo mv SpiderLabs-owasp-modsecurity-crs-c63affc/ owasp-modsecurity-crs
现在我们可以开始配置Mod_Security
模块。我们需要将示例文件配置复制到另一个没有.example
扩展名的文件中:
$ cd owasp-modsecurity-crs
$ sudo cp modsecurity_crs_10_setup.conf.example modsecurity_crs_10_setup.conf
然后告诉 Apache 使用这个模块,通过将以下行插入到 Apache 主配置文件中:
$ sudo nano /etc/httpd/conf/httpd.conf
<IfModule security2_module>
Include crs-tecmint/owasp-modsecurity-crs/modsecurity_crs_10_setup.conf
Include crs-tecmint/owasp-modsecurity-crs/base_rules/*.conf
</IfModule>
现在我们需要在/etc/httpd/modsecurity.d/
目录中创建一个配置文件,以便在有新版本时更容易升级 CRSs:
$ sudo nano /etc/httpd/modsecurity.d/tecmint.conf
创建新文件后,我们需要添加以下行并保存文件:
<IfModule mod_security2.c>
SecRuleEngine On
SecRequestBodyAccess On
SecResponseBodyAccess On
SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream
SecDataDir /tmp
</IfModule>
通过这一步,我们可以说Mod_Security
模块已经成功安装和配置。现在我们可以转移到下一个模块Mod_Evasive
。要配置这个模块,我们需要确保主配置文件中的一些行没有被注释掉:
$ sudo nano /etc/httpd/conf.d/mod_evasive.conf
然后检查IfModule
选项是否成功设置:
<IfModule mod_evasive24.c>
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
</IfModule>
让我们详细了解一下之前的代码:
-
DOSHashTableSize
:此选项指定用于跟踪 IP 活动的哈希表的大小 -
DOSPageCount
:来自一个 IP 地址对一个资源的相同请求的合法数量 -
DOSSiteCount
:与DOSPageCount
相同,但适用于所有可能发生的请求 -
DOSBlockingPeriod
:排除顶部选项的 IP 的黑名单期限
这些数字是配置的示例。我们可以根据需要进行更改。
一个额外的有用选项是DOSSystemCommand
,它有助于运行一些可以阻止 IP 地址的脚本。为此,我们需要将其添加到配置文件中。
DOSSystemCommand "sudo /etc/httpd/scripts/ban_ip.sh %s".
并且我们需要在适当的位置创建脚本:
$ sudo nano /etc/httpd/scripts/ban_ip.sh
我们应该在其中添加以下代码:
#!/bin/sh
IP=$1
IPTABLES="/sbin/iptables"
MOD_EVASIVE_LOGDIR=/tmp
$IPTABLES -I INPUT -s $IP -j DROP
echo "$IPTABLES -D INPUT -s $IP -j DROP" | at now + 2 hours
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"
这个脚本需要一些系统修改才能正常运行。让我们将其设置为可执行:
$ sudo chmod +x /etc/httpd/scripts/ban_ip.sh
我们需要在Sudoers
规则文件中添加一行:
$ sudo nano /etc/Sudoers
apache ALL=NOPASSWD: /usr/local/bin/scripts/ban_ip.sh
Defaults:apache !requiretty
出于安全原因,直接编辑文件可能会有害。我们建议使用以下命令:
$ sudo visudo
其次,这个脚本与iptables
一起工作,所以我们需要停用Firewalld
并安装并激活iptables
:
$ sudo yum update && yum install iptables-services
$ sudo systemctl enable iptables
$ sudo systemctl start iptables
$ sudo systemctl status iptables
然后应用新配置,我们需要重新启动 Apache 服务:
$ sudo systemctl restart httpd
最后,我们的 Web 服务器已经得到了很好的安全和配置。
作为一个小提示,默认情况下,Apache 服务器显示它所运行的操作系统和版本。有时它会显示安装的模块。这些信息对攻击者来说可能非常有价值,因此我们需要禁用显示这些信息:
$ sudo nano /etc/httpd/conf/httpd.conf
然后我们将以下两行更改为如下所示:
ServerSignature Off
ServerTokens Prod
现在我们可以开始数据库安装。服务器中的数据库对于执行动态网站并用作存储其数据的媒介是至关重要的。通常,在旧的 Linux 版本上,我们将 MySQL 安装为默认数据库服务器,但最近大多数 Linux 发行版已经迁移到了 MariaDB 数据库服务器。为此,我们需要使用软件包管理器进行安装:
$ sudo yum install mariadb-server mariadb
我们将安装一些默认存储库中不可用的模块。因此,我们需要安装 EPEL 存储库,以确保我们在这一部分得到覆盖:
$ sudo yum install epel-release
然后我们启动服务并启用它以便下次启动:
$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb.service
为了拥有一个良好安全的数据库服务器,我们需要使用 MariaDB 安全安装命令。这个命令非常有用,可以通过各种选项自定义数据库服务器的安全级别:
$ sudo mysql_secure_installation
注意
在执行命令时,我们应该确保为数据库指定一个强大的根密码。
为了确保我们的数据库服务器正常工作,我们可以运行 CLI 界面并运行一些基本的 SQL 命令:
$ sudo mysql -u root -p
我们输入已在安全安装期间设置的密码,然后就可以进入 MariaDB CLI 了。要退出,只需输入quit
。
为了不必每次输入密码,我们可以将密码写入位于我们的主目录~/.my.cnf
中的文件,并添加以下行:
[mysql]\npassword=password
现在我们可以开始安装 PHP5。将来,我们将添加phpmyadmin
,这是一个允许通过网页浏览器访问的图形界面管理 MariaDB 数据库的程序。首先,我们开始安装 PHP5 和支持 MySQL 的库:
$ sudo yum install php php-mysql
我们可以编辑/etc/php/php.ini
以配置错误消息的放置位置,上传文件到网站的最大大小(对于处理文件的动态网站非常有用),等等。
我们可以进行一些小的配置,使 PHP 更安全。首先,我们可以删除信息和错误消息,并将它们记录到日志文件中。然后关闭远程代码执行。此外,如果我们不需要在网站上上传文件,我们可以禁用它。我们需要使用安全的 SQL 模式。最后,我们禁用危险的 PGP 函数:
$ sudo nano /etc/php.d/secutity.ini
然后更改以下行:
expose_php=Off
display_errors=Off
log_errors=On
error_log=/var/log/httpd/php_scripts_error.log
allow_url_fopen=Off
allow_url_include=Off
sql.safe_mode=On
magic_quotes_gpc=Off
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
为了保护 PHP 免受已知和未知的漏洞,我们考虑安装 Suhosin 高级保护系统:
$ sudo yum install php-devel
$ sudo cd /usr/local
$ sudo wget –c https://download.suhosin.org/suhosin-0.9.38.tar.gz
$ sudo tar -xzvf suhosin-0.9.38.tar.gz
$ sudo cd suhosin-0.9.38
$ sudo phpize
$ sudo ./configure
$ sudo make
$ sudo make install
现在我们配置 Apache 以使用它:
$ sudo echo 'extension=suhosin.so' > /etc/php.d/suhosin.ini
然后我们重新启动 Apache:
$ sudo systemctl restart httpd
现在,我们开始安装phpmyadmin
所需的软件包:
$ sudo yum install php-gd php-pear php-mbstring
安装它们后,我们安装phpmyadmin
软件包:
$ sudo yum install phpMyAdmin
我们需要进行一些配置,以便在服务器之外启用对phpmyadmin
界面的访问。我们需要编辑它的配置文件:
$ sudo nano /etc/httpd/conf.d/phpMyAdmin.conf
然后我们需要注释掉旧的配置:
#<Directory /usr/share/phpMyAdmin/>
# <IfModule mod_authz_core.c>
# # Apache 2.4
# <RequireAny>
# Require ip 127.0.0.1
# Require ip ::1
# </RequireAny>
# </IfModule>
# <IfModule !mod_authz_core.c>
# # Apache 2.2
# Order Deny,Allow
# Deny from All
# Allow from 127.0.0.1
# Allow from ::1
# </IfModule>
#</Directory>
并添加授予访问权限的新配置:
<Directory /usr/share/phpMyAdmin/>
Options none
AllowOverride Limit
Require all granted
</Directory>
最后,我们需要将身份验证从cookie
更改为http
:
$ sudo nano /etc/phpMyAdmin/config.inc.php
并将此行更改为以下内容:
$cfg['Servers'][$i]['auth_type'] = 'http';
为了使更改生效,我们需要重新启动 Apache:
$ sudo systemctl restart httpd.service
要测试它是否起作用,我们只需要在与 Web 服务器位于同一网络的任何 Web 浏览器中输入http://Server_IP_Addr
ess/phpmyadmin
。然后我们需要提供数据库根用户及其密码以登录。我们可以通过编辑其配置文件来保护phpMyAdmin
,例如限制可以访问该服务的源 IP 地址。
为了能够安装内容管理系统(CMS)如 Wordpress、Joomla 或 Drupal,我们需要安装一些 PHP 模块:
$ sudo yum -y install php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel
安装这些模块后,我们可以继续进行 CMS 安装。在我们的情况下,我们将安装 Joomla。首先,我们需要访问 Joomla 网站并将最新版本下载到/var/www
或任何虚拟主机
文件夹中。使用 Wget 我们将下载 Joomla 软件包:
$ cd /var/www/packt2.co.uk/home/
$ get -c https://github.com/joomla/joomla-cms/releases/download/3.4.3/Joomla_3.4.3-Stable-Full_Package.zip
然后我们需要使用unzip
命令提取软件包:
$ unzip Joomla_3.4.3-Stable-Full_Package.zip
注意
我们需要确保我们将要提取软件包的文件夹是空的,以确保安装过程中没有错误。
之后,我们可以在任何客户端 Web 浏览器中打开我们提取 CMS 软件包的域:
http://packt2.co.uk
然后我们需要按照网站上提供的安装步骤进行操作。以下是我们应该提供以完成安装的简要描述:
-
我们需要提供网站名称和一些站点管理员信息(邮件、姓名、密码):
-
在数据库部分,我们需要提供我们正在使用的数据库(
MySQL
),然后是服务器主机名(localhost
),以及数据库的用户和密码(root
),最后是用于存储站点信息的数据库名称: -
如果需要,我们可以通过提供 FTP 用户及其密码来启用 FTP 服务器,并验证服务以检查它是否正在运行。
-
然后我们将有一个概述,我们可以检查我们输入的配置,并可以通过电子邮件发送给管理员。
-
最后,我们点击安装,让网站安装和配置。
正如这个屏幕截图所显示的,我们可以确定我们的 CMS 的先决条件的状态:
- 安装站点会提醒我们删除安装文件夹,因为它可能对网站造成漏洞。因此,为了加强安全性,我们需要手动删除它:
$ sudo rm -rf installation/
- 然后我们需要复制网站上提供的配置,并将其放入我们在站点文件夹中创建的文件中,然后保存它:
$ sudo nano configuration.php
我们可以访问网站并导航到它,或者我们可以打开管理面板对网站进行一些调整或管理设置:
http://packt2.co.uk/administator
现在我们可以说我们已经安装并保护了我们的 Web 服务器,它已经可以使用了。
设置 FTP 服务器
众所周知,多个客户端需要文件交换,其中一个常见的服务是 FTP 技术,它允许轻松快速地进行文件交换。在本节中,我们将讨论如何设置 FTP 服务器,以帮助在同一网络中的两台计算机或来自不同网络的计算机之间传输数据。
首先,我们需要使用默认的软件包管理器安装 FTP 服务器:
$ sudo yum install vsftpd ftp
安装服务器后,我们可以通过编辑VSFTPD
配置文件开始配置服务:
$ sudo nano /etc/vsftpd/vsftpd.conf
我们需要找到以下行并按照所示更改它们:
anonymous_enable=NO # Disable anonymous login
ftpd_banner=Welcome to The Packt FTP Service. # Banner message
use_localtime=YES # Make the server use the local machine time
local_enable=YES # Allow local users to login
write_enable=YES # Allow Local users to write to directory
然后我们应该重新启动服务,并将其添加到系统启动项,以在下次启动时自动启动:
$ sudo systemctl enable vsftpd
$ sudo systemctl start vsftpd
注意:
基本上,大多数导致服务无法启动的错误都与配置文件中的拼写错误有关。如果我们遇到任何错误,我们应该首先检查文件中是否有任何拼写错误的选项。
之后,为了确保服务可以从除本机之外的其他机器访问,我们需要在防火墙中打开 FTP 端口:
$ sudo firewall-cmd --permanent --add-port=21/tcp
$ sudo firewall-cmd --permanent --add-port=20/tcp
$ sudo firewall-cmd --permanent --add-service=ftp
$ sudo firewall-cmd --reload
然后更新 FTP 服务的 SELinux 布尔值:
$ sudo setsebool -P ftp_home_dir on
最后,我们应该创建一些 FTP 用户,以便客户端可以使用它们进行登录:
$ sudo useradd packt
$ sudo passwd packt
现在我们可以开始测试服务,方法是转到同一网络或外部的客户端之一,然后执行以下操作:
$ ftp Server_IP_Address
或者:
$ ftp domain_name
然后我们输入我们已经定义的用户及其密码。如果我们能访问 FTP 服务,那就意味着我们的 FTP 服务器已经成功设置好了。
使用 OpenSSL 保护 Apache 和 FTP
全球提供的大多数服务都非常吸引黑客攻击和窃取有价值的信息,或者阻止其活动。在本节中,我们将提出一个解决方案,帮助保护两个最常用的服务(HTTPFTP
)。这个解决方案是 OpenSSL,它是一个实现安全套接字层(SSL)和传输层安全(TLS)协议以及强大的加密库的开源工具包。
我们将从实施 OpenSSL 开始进行 FTP 文件传输,以使其更加安全。首先,我们需要确保 OpenSSL 已安装在我们的系统上:
$ sudo yum install openssl
然后我们开始配置服务以与我们的 FTP 服务器 VSFTPD 一起工作。因此,我们需要创建一个 SSL 证书以与 TLS 一起使用,因为它是最新的最安全的技术。为此,我们需要创建一个文件夹来存储使用 SSL 生成的文件:
$ sudo mkdir /etc/ssl/private
然后我们使用密钥创建证书:
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -sha256
在执行命令时,我们需要填写所需的详细信息:
-
openssl
:管理 SSL 证书和密钥的基本 SSL 命令 -
req –x509
:指定 SSL 和 TLS 的公钥基础设施标准 -
-node
:告诉 OpenSSL 跳过密码安全选项 -
-days 365
:设置此证书的有效时间 -
-newkey rsa:1024
:创建一个新的 1024 位长的 RSA 密钥 -
-keyout
:告诉 OpenSSL 在哪里生成私钥文件 -
-out
:告诉 OpenSSL 在哪里生成证书文件
然后我们将 SSL 详细信息添加到我们的 FTP 服务器主配置文件中:
$ sudo nano /etc/vsftpd/vsftpd.conf
我们指定证书和密钥文件的位置:
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
然后我们启用 SSL 的使用:
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
然后我们限制连接到 TLS:
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
然后我们添加一些可选的配置来加强站点安全性:
require_ssl_reuse=NO
ssl_ciphers=HIGH
然后我们重新启动 FTP 服务以启用更改:
$ sudo systemctl restart vsftpd
然后我们可以通过具有连接到 FTPS 的能力的 FTP 客户端(Filezilla)进行测试,以查看连接/传输是否已经安全。
现在我们进入本节的第二部分,我们将保护我们的 Web 服务器 Apache。我们将安装 Apache 的 OpenSSL 模块,然后配置它来保护 Apache。
首先,我们需要确保 Apache 已成功安装,同样的事情也适用于 OpenSSL。然后我们可以开始安装Mod_ssl
模块:
$ sudo yum install mod_ssl
安装完成后,我们进入配置部分。我们需要创建一个文件夹,用于存储我们的密钥和证书文件:
$ sudo mkdir /etc/httpd/ssl
然后,我们使用 OpenSSL 创建我们的密钥和证书:
$ sudo sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/httpd/ssl/apache.key -out /etc/httpd/ssl/apache.crt –sha256
我们需要填写所有必需的细节来完成文件的创建。
注意
Apache 中的 SSL 密钥必须没有密码,以免在每次服务器重新启动时引起手动重新配置。
创建所有文件后,我们需要设置一个虚拟主机以与新证书一起使用。为此,我们需要首先编辑 Apache 的 SSL 配置文件:
$ sudo nano /etc/httpd/conf.d/ssl.conf
我们需要找到以<VirtualHost _default_:443>
开头的部分,对其进行一些更改,以确保 SSL 证书设置正确。
首先,我们需要取消注释DocumentRoot
行,并将位置更改为需要保护的站点所需的位置:
DocumentRoot "/var/www/packt.co.uk/home"
我们对ServerName
行执行相同的操作,并将域更改为所需的域:
ServerName packt.co.uk:443
最后,我们需要找到SSLCertificateFile
和SSLCertificateKeyFile
行,并将它们更改为指向我们创建 SSL 证书和密钥的位置:
SSLCertificateFile /etc/httpd/ssl/apache.crt
SSLCertificateKeyFile /etc/httpd/ssl/apache.key
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
然后我们保存文件并重新启动 Apache 以启用更改:
$ sudo systemctl restart httpd
为了测试这个配置,我们需要使用客户机的 Web 浏览器,并输入www.packtpub.com/
uk
。然后接受证书并访问该站点。
参考资料
现在我们已经完成了本章,让我们来看一下使用的参考资料:
-
Firewalld 配置指南:
www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-firewalld-on-centos-7
-
OpenVPN 服务器概述:
openvpn.net/index.php/access-server/overview.html
-
BIND DNS 服务器页面:
www.isc.org/downloads/bind/
-
Web 服务器(LAMP)维基页面:
en.wikipedia.org/wiki/LAMP_(software_bundle)
-
FTP 服务器维基页面:
en.wikipedia.org/wiki/File_Transfer_Protocol
-
FTPS vs SFTP:
www.eldos.com/security/articles/4672.php?page=all
-
Apache 的
Mod_SSL
文档:www.modssl.org/docs/
-
OpenSSL 网页:
www.openssl.org/
总结
本章是对 CentOS Linux 系统为用户提供的一系列服务的描述。这一描述是对如何在 CentOS 7 上安装这些服务以及如何配置它们以实现最佳实践的逐步解释。我们已经讨论了在本地网络中使用 Firewalld 实现网关服务器。然后我们建立了一个使用 OpenVPN 的 VPN 服务器,以便客户端可以从世界各地访问网络。之后,我们使用 BIND 服务设置了一个 DNS 服务器。然后我们安装了必要的软件包,建立了一个完全运行的 Web 服务器,可以支持动态网站,并进行了一些调整以使其更安全、易于管理和可扩展,使用 Apache 及其模块、MariaDB 和 PHP。我们继续设置了一个 FTP 服务器,以便客户端可以访问并传输数据。最后,我们使用 OpenSSL 自签名证书和密钥对我们的 Web 服务器和 FTP 服务器进行了安全保护。
我们还没有完成 CentOS 7 可以提供的功能。查看我们接下来的第四章,使用 PostFix 的邮件服务器,深入探讨如何设置、配置和保护使用 Postfix 的邮件服务器。
第四章:使用 Postfix 的邮件服务器
如今,许多人已经在使用配置和可靠的基于 Web 的邮件服务,如 Gmail,Yahoo 等。大多数人都在质疑是否需要在他们的服务器环境中安装本地电子邮件服务器。好吧,服务器也需要发送电子邮件,不仅仅是人类;当通知管理员服务器处于临界状态时,它对许多其他需求也是有用的。
Postfix是 Linux 系统的高性能开源邮件传输代理(MTA)。它快速,易于管理和安全。它有助于路由和传递电子邮件。Postfix 支持加密和虚拟域,其配置文件清晰,易于理解和编辑。
Postfix 的安装将分为多个部分。由于本章是关于使用 Postfix 设置电子邮件服务器并添加一些工具使其完全合格,然后对其进行安全设置,我们将逐步进行安装,每次添加新工具或新调整时,我们将在不同的章节部分中进行拉伸。
在本章中,我们将学习以下内容:
-
使用 CentOS 7 Linux 设置和配置 Postfix 电子邮件服务器
-
将其配置为在 MySQL 数据库上存储用户和虚拟域
-
设置邮件工具(Dovecot)来获取电子邮件
-
配置 OpenLDAP 活动目录
-
使用 SSL/TLS 安全两种邮件服务
设置和配置 Postfix 邮件服务器
众所周知,作为 MTA 的 Postfix 充当 SMTP 服务器。它接受传入邮件并将其传递给负责检索邮件的服务。然后将出站邮件转发到下一个负责的 SMTP 服务器。对于 SMTP 服务,我们需要在系统防火墙中打开端口 25/TCP。Postfix 非常容易设置和配置。我们只需要确保已完成一些预安装步骤,以便进行清洁设置。
首先,我们需要使用Firewalld
为邮件服务器的所有所需服务打开防火墙所需的端口。我们将要打开的端口来自以下服务:
-
简单邮件传输协议(SMTP):25 on TCP
-
Secure SMTP (SMTPS): 465 on TCP
-
邮件提交代理(MSA):587 on TCP
-
邮局协议 3(POP3):110 on TCP
-
Secure POP3: 995 on TCP
-
Internet Message Access Protocol (IMAP): 143 on TCP
-
Secure IMAP (IMAP SSL): 993 on TCP
这是如何使用 Firewalld 在系统本地防火墙中应用更改的方法:
$ sudo firewall-cmd --permanent --add-port=25/tcp
$ sudo firewall-cmd --permanent --add-port=465/tcp
$ sudo firewall-cmd --permanent --add-port=587/tcp
$ sudo firewall-cmd --permanent --add-port=995/tcp
$ sudo firewall-cmd --permanent --add-port=993/tcp
$ sudo firewall-cmd --permanent --add-port=143/tcp
$ sudo firewall-cmd --permanent --add-port=110/tcp
$ sudo firewall-cmd --reload
之后,我们需要为服务器设置准确的时间,因此我们需要安装一个NTP客户端,将机器时间与全球范围内的许多可用的 NTP 服务器之一同步。我们需要使用yum
软件包管理器安装 NTP 客户端服务:
$ sudo yum install ntpd
通常,安装 NTP 客户端时,已经配置了一些默认的 NTP 服务器来与其同步时间。但是,如果我们有一个本地 NTP 服务器并且想要使用它,我们可以随时转到 NTP 的配置文件并添加它。作为最佳实践,建议始终至少有三个 NTP 服务器:
$ sudo nano /etc/ntp.conf
我们寻找以server
开头的行,并注释掉不需要的服务器,然后添加我们想要的服务器(在下面的片段中显示为LOCAL_NTP_SERVER_IP_ADDRESS
):
#server 0.centos.pool.ntp.org iburst
server LOCAL_NTP_SERVER_IP_ADDRESS iburst
我们需要启动 NTP 服务并将其添加到系统启动服务中:
$ sudo systemctl start ntpd
$ sudo systemctl enable ntpd
要验证 NTP 客户端是否与定义的服务器同步,我们需要使用命令ntpq -p
。让我们看一下以下输出:
在使服务器时间准确之后,我们需要确保服务器的主机名配置正确,因为外国邮件服务器可能不接受来自我们服务器的邮件,因为其名称可疑。我们可以使用以下命令进行验证:
$ hostname -f
如果我们收到一个完全合格的域名server.domain
,我们可以继续,其中server
是我们服务器的主机名,domain
是它所属的地方。否则,我们需要通过编辑主机名配置文件来设置一个:
$ sudo nano /etc/hosts
$ sudo nano /etc/hostname
或者您也可以使用以下命令:
$ sudo hostnamectl set-hostname
我们应该确保编写一个写得很好的域地址。然后我们保存文件。
最后,我们需要检查我们的 DNS 解析。我们的服务器应该使用完全合格的 DNS,这意味着它可以解析来自 Web 的所有地址。我们需要检查/etc/resov.conf
文件:
$ sudo cat /etc/resolv.conf
如果我们不确定配置的 DNS 服务器是否已经更新以处理我们所有的查询,我们可以编辑文件并添加一些我们确定合格的 DNS 服务器(Google DNS:8.8.8.8
,8.8.4.4
)。我们可以使用nslookup
命令测试我们的 DNS 服务器:
$ sudo nano /etc/resolv.conf
我们现在准备在我们的服务器上安装 Postfix。正如我们之前提到的,安装和配置将继续为每个部分添加和配置到同一台服务器。
在本节中,我们将首先安装和配置我们的 Postfix 作为 SMTP 服务器。首先,我们需要使用yum
安装postfix
软件包。我们需要计划接下来的部分。由于yum
软件包管理器中的 Postfix 的默认版本不支持MariaDB(MySQL 的替代品),我们需要从CentOSPlus 存储库安装 Postfix。在开始安装之前,我们需要在一些存储库中添加排除以防止覆盖 Postfix 软件包更新:
$ sudo nano /etc/yum.repos.d/CentOS-Base.repo
然后我们需要确保在[base]
和[updates]
存储库源的末尾添加exclude=postfix
行,看起来像这样:
[base]
name=CentOS-$releasever - Base
exclude=postfix
#released updates
[updates]
name=CentOS-$releasever - Updates
exclude=postfix
保存文件后,我们可以开始安装软件包。我们将安装必要的软件包,以拥有一个完全运行的邮件服务器:Postfix 作为 SMTP 的 MTA 邮件服务器,Dovecot 用于 IMAP 和 POP 守护程序,以及一些支持身份验证服务的软件包:
$ sudo yum --enablerepo=centosplus install postfix
$ sudo yum install dovecot mariadb-server dovecot-mysql
在这里,我们将合并工具的安装,但配置将分别放在本章的每个部分中。
安装了 Postfix 邮件服务器后,我们可以开始配置。Postfix 几乎所有的选项都是作为注释或不完全适用的。因此,为了完全配置 Postfix,我们需要转到其主配置文件并进行一些更改。首先,我们使用任何文本编辑器打开文件:
$ sudo nano /etc/postfix/main.cf
然后我们开始更改取消注释的行,并添加关于所需邮件服务器的信息。由于我们将在一个大文件中进行许多单独的更改,因此我们不应添加任何不必要的行,因为我们将一次指向应更改的行。在任何时候,如果我们使用nano作为文本编辑器,我们可以始终使用搜索选项使用Ctrl + W的组合,并键入行的第一部分来查找所需的行。
接下来,我们需要定义我们的邮件服务器主机名。我们转到选项myhostname
的行,并取消注释该行,并将其更改为所需的信息,如以下示例所示:
myhostname = server.packt.co.uk
然后,我们需要在选项mydomain
的行上设置域名,如下例所示:
mydomain = packt.co.uk
接下来是源,它与域具有相同的值,在选项myorigin
的行上:
myorigin = $mydomain
然后,我们定义我们的服务器将提供其服务(监听)的网络接口。在我们的情况下,我们将使用所有这些接口。为了设置,我们要么注释掉第116
行并取消注释第113
行,要么只需将第116
行更改为以下代码:
inet_interfaces = all
然后我们移动到选项mydestination
的行,将域地址添加到目标域的行的末尾:
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
然后我们跳到选项mynetworks
的行,取消注释并添加我们将用于与服务器相关的网络的其他网络:
mynetworks = 127.0.0.0/8, 192.168.8.0/24, 10.0.1.0/24
然后,我们跳到选项home_mailbox
的行,取消注释邮箱文件夹位置选项,并将其更改为适合我们需求的内容:
home_mailbox = maildir/
通过转到选项smtpd_banner
的行并取消注释它并更改它以看起来像以下代码,结束行计数:
smtpd_banner = $myhostname ESMTP
然后我们转到文件的末尾,添加以下行并限制服务器处理的电子邮件大小(10 兆字节= 10485760):
message_size_limit = 10485760
此外,我们需要限制邮箱文件夹的大小(1 千兆字节= 1073741824):
mailbox_size_limit = 1073741824
最后,我们设置 SMTP 服务器身份验证配置选项行:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject
此配置被视为初始配置。设置完成后,我们可以随时使用命令postconf -e
来更改选项或设置新选项。如果我们需要更改服务器主机名,我们需要按以下方式编写:
$ sudo postconf -e 'myhostname = mailserver.packt.co.uk'
确保所有配置都设置好后,我们可以启动我们的 Postfix 服务并将其添加到系统启动服务中:
$ sudo systemctl restart postfix
$ sudo systemctl enable postfix
只是为了验证一切是否正常,我们需要对 Postfix 服务进行小测试。有许多方法可以进行此测试。我们将使用使用命令mail
发送邮件,然后验证位于/var/log/maillog
的邮件日志文件:
$ echo "Testing the Postfix mail service" | mail -s "This is a test mail" user2@server.packt.co.uk && tail -f /var/log/maillog
然后我们应该在邮件日志文件中看到以下消息,告诉我们以下消息以知道邮件已经发送成功,Postfix 服务正常工作:
server postfix/local[28480]: 98E2F61B6365: to=<user2@server.packt.co.uk>, relay=local, delay=0.02, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
通过这一步,我们可以说我们已成功将 Postfix 配置为 MTA。但这可能不是一个设置良好的邮件服务器。我们需要添加和配置一些工具来帮助使其合格和安全。我们将在接下来的部分开始添加和配置必要的工具。这是我们的邮件服务器在安装和运行所有组件后的样子:
为虚拟域和用户设置 MariaDB
由于我们在安装 Postfix 时已经安装了MariaDB(MySQL 的可替代品),我们可以继续进行配置。但是,如果我们需要再次安装该软件包,我们可以随时使用yum
:
$ sudo yum install mariadb-server
开始 MariaDB 配置的第一件事是启动服务。此外,我们需要将其添加到系统启动服务中:
$ sudo systemctl enable mariadb.service
$ sudo systemctl start mariadb.service
然后,我们通过设置安全安装模式来开始配置,我们可以在其中设置或更改 MariaDB 根密码,删除匿名用户帐户,禁用本地主机以外的根登录等:
$ sudo mysql_secure_installation
我们应该确保在最后回答是以完成配置。
现在我们已经很好地配置了 MariaDB 服务,并准备好使用。我们将开始设置新数据库以便与 Postfix 一起使用。要添加新数据库,我们需要打开 MariaDB shell:
$ sudo mysql -u root -p
然后我们创建一个新数据库:
> CREATE DATABASE mail;
接下来,我们切换到该数据库以开始对其进行更改:
> USE mail;
然后我们创建一个数据库用户,授予他们对邮件数据库的权限,成为邮件管理员:
> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';
> GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';
管理员密码mail_admin_password
应该是一个非常强大的密码,以更好地保护邮件服务器数据库。
然后我们提交更改:
> FLUSH PRIVILEGES;
现在我们开始在我们的数据库中创建必要的表。首先,我们创建虚拟域表:
> CREATE TABLE domains (domain varchar(50) NOT NULL, PRIMARY KEY (domain) );
然后我们创建处理邮件转发的表:
> CREATE TABLE forwardings (source varchar(80) NOT NULL, destination TEXT NOT NULL, PRIMARY KEY (source) );
接下来,我们创建一个表,用于存储邮件服务器用户:
> CREATE TABLE users (email varchar(80) NOT NULL, password varchar(20) NOT NULL, PRIMARY KEY (email) );
最后,我们创建传输表:
> CREATE TABLE transport ( domain varchar(128) NOT NULL default '', transport varchar(128) NOT NULL default '', UNIQUE KEY domain (domain) );
我们已经成功设置了邮件服务器数据库表的初始配置。现在我们可以离开 MariaDB shell:
> quit
为了使 Postfix 能够与 MariaDB 服务器通信,我们需要设置 MariaDB 监听 IP 地址127.0.0.1
的本地主机。要设置此配置,我们需要编辑/etc/my.cnf
并添加以下部分[mysql]
:
bind-address=127.0.0.1
然后我们重新启动 MariaDB 服务:
$ sudo systemctl restart mariadb.service
我们的邮件服务器数据库配置还没有完成。现在我们回到 Postfix 配置,以设置与之前在 MariaDB 中创建的数据库代码的通信。因此,我们需要告诉 Postfix 应该使用哪个数据库的哪个表来存储特定信息(用户、虚拟域等)。
我们首先为每个表创建配置文件。对于虚拟域配置,我们创建一个名为/etc/postfix/mysql-virtual_domains.cf
的文件:
$ sudo nano /etc/postfix/mysql-virtual_domains.cf
然后我们在其中放入以下代码并保存:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT domain AS virtual FROM domains WHERE domain='%s'
hosts = 127.0.0.1
再次,mail_admin_password
应该被我们之前创建的强密码替换。这适用于我们将要创建的所有以下文件。
然后我们在/etc/postfix/mysql-virtual_forwardings.cf
中创建虚拟转发的配置文件:
$ sudo nano /etc/postfix/mysql-virtual_forwardings.cf
我们在其中添加以下代码:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT destination FROM forwardings WHERE source='%s'
hosts = 127.0.0.1
我们为虚拟邮箱创建另一个配置文件,名为/etc/postfix/mysql-virtual_mailboxes.cf
:
$ sudo nano /etc/postfix/mysql-virtual_mailboxes.cf
然后我们插入以下代码:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s'
hosts = 127.0.0.1
最后,我们通过创建文件/etc/postfix/mysql-virtual_email2email.cf
来为虚拟电子邮件映射创建配置文件:
$ sudo nano /etc/postfix/ mysql-virtual_email2email.cf
然后在其中添加以下代码并保存:
user = mail_admin
password = mail_admin_password
dbname = mail
query = SELECT email FROM users WHERE email='%s'
hosts = 127.0.0.1
现在我们设置文件的权限和所有权,以使 Postfix 能够处理新的配置文件:
$ sudo chmod o= /etc/postfix/mysql-virtual_*.cf
$ sudo chgrp postfix /etc/postfix/mysql-virtual_*.cf
然后我们创建一个用于处理邮件的用户和组。虚拟邮箱将全部存储在此用户的主目录下。我们选择组 5000 以保持与系统为常规用户创建的组的距离:
$ sudo groupadd -g 5000 vmail
$ sudo useradd -g vmail -u 5000 vmail -d /home/vmail -m
要完成配置,我们需要对 Postfix 配置进行一些微小的更改。我们不会打开配置文件并编辑它,我们只会使用命令postconf -e
来添加它们。
我们首先找到新创建的配置文件,以解决数据库表的问题:
$ sudo postconf -e 'virtual_alias_domains ='
$ sudo postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'
$ sudo postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'
$ sudo postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'
然后我们设置邮箱文件夹将被创建的位置:
$ sudo postconf -e 'virtual_mailbox_base = /home/vmail'
最后,我们看到将控制配置文件并添加邮箱文件夹的用户 UID:
$ sudo postconf -e 'virtual_uid_maps = static:5000'
$ sudo postconf -e 'virtual_gid_maps = static:5000'
要完成邮件服务器数据库配置,我们需要重新启动 Postfix 服务以提交更改:
$ sudo systemctl restart postfix.service
我们可以说我们已经完成了邮件服务器数据库服务。但是,如果我们需要配置 Postfix 与虚拟域一起使用,以便使用与系统默认域名不同的域名发送电子邮件,我们需要对 Postfix 主配置文件进行一些微小的修改。此外,我们可以随时使用命令postconf -e
进行快速更改:
$ sudo nano /etc/postfix/main.cf
然后我们在文件末尾添加以下代码:
virtual_alias_domains = packtmail2.co.uk
virtual_alias_maps = hash:/etc/postfix/virtual
然后我们需要将新域添加到虚拟域文件/etc/postfix/virtual
中:
$ sudo nano /etc/postfix/virtual
然后我们在任何地方添加以下片段:
user1@mail.packtmail2.co.uk user1
然后我们通过刷新 Postfix 映射并重新启动服务来应用更改:
$ sudo postmap /etc/postfix/virtual
$ sudo systemctl reload postfix
设置邮件工具(Dovecot)以检索邮件
正如我们之前所说,Dovecot 是一个开源的 IMAP 和 POP3 服务器。它运行速度快,易于设置和配置,并且使用的内存很少。在本节中,我们将安装它以与 Postfix 一起工作作为 MDA(POP/IMAP 服务),并使用筛选器在邮件服务器 POP/IMAP 服务中对邮件进行分类。正如这个图像所示,Dovocot 位于用户邮箱和 Postfix 之间:
由于我们已经安装了 Dovecot,现在我们只需要配置它与 Postfix 一起工作。如果我们错过了安装,我们可以随时使用yum
软件包管理器进行重新安装:
$ sudo yum install dovecot
然后,我们需要向 Postfix 配置文件添加 Dovecot 支持。再次强调,我们不会打开配置文件并编辑它,我们只会使用命令postconf -e
。首先,我们需要启用 Dovecot 以使用 SMTP 并启用服务身份验证:
$ sudo postconf -e 'smtpd_sasl_type = dovecot'
$ sudo postconf -e 'smtpd_sasl_path = private/auth'
$ sudo postconf -e 'smtpd_sasl_auth_enable = yes'
$ sudo postconf -e 'broken_sasl_auth_clients = yes'
$ sudo postconf -e 'smtpd_sasl_authenticated_header = yes'
然后我们启用 Postfix 以根据需要创建和扩展邮件目录:
$ sudo postconf -e 'virtual_create_maildirsize = yes'
$ sudo postconf -e 'virtual_maildir_extended = yes'
最后,我们设置邮件传输参数:
$ sudo postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'
$ sudo postconf -e 'virtual_transport = dovecot'
$ sudo postconf -e 'dovecot_destination_recipient_limit = 1'
对于本节,我们将使用 Dovecot 提供的默认安全选项,因此我们需要告诉 Postfix 使用 Dovecot 提供的 SSL 证书和密钥:
$ sudo postconf -e 'smtpd_use_tls = yes'
$ sudo postconf -e 'smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem'
$ sudo postconf -e 'smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem'
然后我们转到 Postfix 的服务配置文件/etc/postfix/master.cf
:
$ sudo nano /etc/postfix/master.cf
将 Dovecot 服务添加到文件底部,然后保存并退出:
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}
然后我们转到 Dovecot 服务配置。在开始配置之前,我们需要备份初始配置文件的副本:
$ sudo cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf-backup
对于此示例,我们将创建自己的新配置文件,在其中我们将逐个指定每个参数。我们将创建一个与原始配置文件同名的新文件:
$ sudo nano /etc/dovecot/dovecot.conf
然后我们添加以下代码,不包括描述:
# We define the protocols that we want to be serving
protocols = imap pop3
# Enable Dovecot to listen to all domains
listen = *
# Define the time format to be shown at the log file
log_timestamp = "%Y-%m-%d %H:%M:%S "
# Define the location of the received mails
mail_location = maildir:/home/vmail/%d/%n/Maildir
# Locate the files to be used for the SSL authentication
ssl_cert = /etc/pki/dovecot/certs/dovecot.pem
ssl_key = /etc/pki/dovecot/private/dovecot.pem
# Define Mailbox main domain setting
namespace {
type = private
separator = .
prefix = INBOX.
inbox = yes
}
# Define the service users option
service auth {
unix_listener auth-master {
mode = 0600
user = vmail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
user = root
}
service auth-worker {
user = root
}
# Configure the protocol LDA
protocol lda {
log_path = /home/vmail/dovecot-deliver.log
auth_socket_path = /var/run/dovecot/auth-master
postmaster_address = postmaster@packt.co.uk
}
# Configure the protocol POP3
protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}
# Database configuration
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = static
args = uid=5000 gid=5000 home=/home/vmail/%d/%n allow_all_users=yes
}
我们保存文件以保存配置。然后我们需要创建已分配给 Dovecot 配置文件的数据库文件:
$ sudo nano /etc/dovecot/dovecot-sql.conf.ext
然后我们添加以下代码,将邮件管理员密码mail_admin_password
更改为在早期设置 MariaDB 数据库的部分中已设置的密码:
driver = mysql
connect = host=127.0.0.1 dbname=mail user=mail_admin password=mail_admin_password
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM users WHERE email='%u';
然后我们安排文件权限和所有权以限制对文件的访问:
$ sudo chgrp dovecot /etc/dovecot/dovecot-sql.conf.ext
$ sudo chmod o= /etc/dovecot/dovecot-sql.conf.ext
然后我们开始配置 Dovecot 认证参数,位于其配置文件夹/etc/dovecot/conf.d/
中。我们从认证过程配置文件开始:
$ sudo nano /etc/dovecot/conf.d/10-auth.conf
我们需要定位以下行并更改它们:
# Line 10: needs to uncommented and changed
disable_plaintext_auth = no
# Line 100: We need to add it login at the end
auth_mechanisms = plain login
然后我们转到邮箱配置文件:
$ sudo nano /etc/dovecot/conf.d/10-mail.conf
然后取消注释以下行,并将其结尾与以下代码匹配:
# Line 30: Define the mailbox directory location
mail_location = maildir:~/maildir
类似地,我们需要编辑主配置文件以定义将使用 SMTP 身份验证的 Postfix 用户:
$ sudo nano /etc/dovecot/conf.d/10-master.conf
取消注释unix_listener /var/spool/postfix/private/auth
部分,并将其添加到用户和组行中:
# Line 96-100: Set the user and group for the Unix listener section
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
最后,我们配置 SSL 认证配置文件:
$ sudo nano /etc/dovecot/conf.d/10-ssl.conf
并将 SSL 选项从no
更改为yes
:
# Line 8: change it yes
ssl = yes
在开始测试之前,我们需要确保在我们的/etc/aliases
配置文件中定义了两个变量:
$ sudo nano /etc/aliases
然后我们检查以下代码:
postmaster: root
root: postmaster@packt.co.uk
然后我们更新别名列表:
$ sudo newaliases
最后,为了完成 Dovecot 配置,我们需要重新启动 Postfix 和 Dovecot 服务。此外,我们需要将 Dovecot 添加到系统启动服务中:
$ sudo systemctl restart postfix.service
$ sudo systemctl restart dovecot.service
$ sudo systemctl enable dovecot.service
要验证服务是否正常运行,并且配置文件没有问题,我们需要检查邮件日志文件:
$ sudo tail /var/log/maillog
我们应该看到类似以下代码的东西,以知道 Dovecot 是否正常运行:
dovecot: master: Dovecot v2.2.10 starting up for imap, pop3 (core dumps disabled)
注意
有时,SELinux 会阻止 Dovecot 使用系统资源,因此我们需要授予 Dovecot 对系统资源的访问权限,或者如果我们有另一种方式来保护服务器,我们可以禁用 SELinux 或将其设置为宽松模式。
此时,我们的邮件服务器已经完全具备作为发件人和收件人工作的条件,具有组织良好的数据库和中等安全级别。我们可以开始测试我们的邮件服务器。
首先,我们将使用Telnet服务来检查Postfix SMTP-AUTH和TLS是否正常工作。我们需要安装 Telnet,如果系统上不存在,运行以下命令:
$ sudo yum install telnet
然后我们运行测试:
$ telnet localhost 25
Telnet 将连接,我们将看到 Telnet shell,在其中我们键入以下命令:
> ehlo localhost
要知道我们的测试是积极的,我们需要看到以下消息:
250-server.packt.co.uk
250-PIPELINING
250-SIZE 10485760
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN
250-AUTH=PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
然后我们退出 Telnet shell:
> quit
现在我们将测试邮件服务。为此,我们需要首先使用测试域和用户填充我们的数据库。首先,我们进入 MariaDB 数据库 shell:
$ sudo mysql -u root -p
然后我们切换到我们的邮件数据库:
> USE mail;
然后我们在域表中创建一个新的域:
> INSERT INTO domains (domain) VALUES ('packtmail.co.uk');
我们为该域添加一个新用户。我们需要为真实用户输入一个良好的密码:
> INSERT INTO users (email, password) VALUES ('user1@packtmail.co.uk', ENCRYPT('user_password'));
然后我们退出 MariaDB shell。
现在我们需要向我们新创建的用户发送一封测试邮件。我们需要使用Mailx,因此如果尚未安装,我们需要在测试之前安装它:
$ sudo yum install mailx
然后我们发送我们的测试邮件:
$ mailx user1@packtmail.co.uk
我们需要输入Subject
然后按Enter。如果我们需要插入一个复制的地址,我们需要输入Cc:
然后添加复制的地址。然后我们输入消息并按Enter,然后发送它,我们需要在末尾输入.
并按Enter。
要检查邮件是否已发送,我们需要查看邮件日志文件;
$ sudo tail /var/log/maillog
然后我们应该看到类似以下代码的内容以确认它是正常的:
to=<user1@packtmail.co.uk>, relay=dovecot, delay=0.11, delays=0.07/0.01/0/0.03, dsn=2.0.0, status=sent (delivered via dovecot service)
现在我们通过可视化 Dovecot 交付日志来检查 Dovecot 交付:
$ sudo tail /home/vmail/dovecot-deliver.log
我们应该看到类似以下行的内容以确保它正在工作:
lda(user1@packtmail.co.uk): Info: msgid=<20150822073408.6537761B3936@server.packt.co.uk>: saved mail to INBOX
现在我们可以通过邮件客户端测试我们的邮箱。在这个例子中,我们将使用Mutt,这是一个简单的邮件客户端。但在使用之前,我们需要先安装它:
$ sudo yum install mutt
然后我们需要进入存储新用户邮箱的位置并运行 Mutt:
$ sudo cd /home/vmail/packtmail.co.uk/user1/Maildir/
现在我们运行 Mutt:
$ sudo mutt –f .
显示需要创建根邮箱的消息是不需要的,所以我们可以跳过它。要退出 Mutt,输入q
。
然后我们将会有一个相当清晰的界面,我们可以使用键盘方向键进行导航,并按Enter键查看邮件内容。为了确认我们的邮件服务器已经配置好并正在运行,我们应该看到我们使用 Mailx 发送的测试邮件:
使用 Postfix 配置 OpenLDAP Active Directory
在本节中,我们将使用 OpenLDAP 作为我们的 Postfix(作为 MTA)和 Dovecot(作为 POP3/IMAP 服务器)用户的后端,以便它们相互连接,并帮助进行地址查找和别名。
注意
OpenLDAP 是轻量级目录访问协议(LDAP)的开源实现。本节不涵盖如何安装 OpenLDAP 服务器。我们假设我们已经在我们的网络中配置了一个。
我们的 OpenLDAP 服务器有以下信息如下:
dn: uid=user,ou=people,dc=packtldap,dc=co,dc=uk
objectClass: posixAccount
objectClass: inetOrgPerson
uid: user1
homeDirectory: /home/user1
userPassword: <passwordhash>
对于我们的两项服务的 LDAP 设置,我们需要编辑和添加一些选项到它们的配置文件中。我们将从 Dovecot 开始。首先我们会用文本编辑器打开 Dovecot 主配置文件,然后进行必要的更改:
$ sudo nano /etc/dovecot/dovecot.conf
然后我们检查以下选项是否需要任何更改,或者如果它们不存在,我们需要添加它们:
# Define the mail user and group UID and GID
mail_uid = 5000
mail_gid = 5000
# Define the default Authentication method
auth default {
mechanisms = plain
# Define the LDAP database password file
passdb ldap {
args = /etc/dovecot/dovecot-ldap.pass
}
# Define the LDAP database user file
userdb ldap {
args = /etc/dovecot/dovecot-ldap.user
}
# Define the socket Listening parameters
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
然后我们需要创建 LDAP 数据库文件并填充它们:
$ sudo nano /etc/dovecot/dovecot-ldap.user
接下来,我们添加以下代码并进行必要的更改,然后保存:
hosts = packtldap.co.uk:389
sasl_bind = no
auth_bind = yes
ldap_version = 3
deref = never
base = uid=%n,ou=people,dc=packtldap,dc=co,dc=uk
scope = base
user_attrs = homeDirectory=home
dn = uid=manager,dc=packtldap,dc=co,dc=uk
dnpass = password
以下图片显示,OpenLDAP 提供收件箱和发件箱邮件服务:
我们对第二个 LDAP 数据库文件做同样的操作:
$ sudo nano /etc/dovecot/dovecot-ldap.pass
然后我们添加以下代码并进行必要的更改,保存文件并退出:
hosts = packtldap.co.uk:389
sasl_bind = no
auth_bind = yes
ldap_version = 3
deref = never
base = uid=%n,ou=people,dc=packtldap,dc=co,dc=uk
scope = base
dn = uid=manager,dc=packtldap,dc=co,dc=uk
dnpass = password
通过这一步,我们可以说 Dovecote 已成功配置为使用我们的 LDAP 服务器。我们继续进行 Postfix 配置。通常情况下,我们可以使用文本编辑器编辑主配置文件/etc/postfix/main.cf
,或者我们可以使用快速配置设置命令:
$ sudo postconf -e 'accounts_server_host = packtldap.co.uk'
$ sudo postconf -e 'accounts_search_base = ou=people,dc=packtldap,dc=co,dc=uk'
$ sudo postconf -e 'accounts_query_filter = (&(objectClass=inetOrgPerson)(mail=%s))'
$ sudo postconf -e 'accounts_result_attribute = homeDirectory'
$ sudo postconf -e 'accounts_result_format = %s/Mailbox'
$ sudo postconf -e 'accounts_scope = sub'
$ sudo postconf -e 'accounts_cache = yes'
$ sudo postconf -e 'accounts_bind = yes'
$ sudo postconf -e 'accounts_bind_dn = uid=manager,dc=packtldap,dc=co,dc=uk'
$ sudo postconf -e 'accounts_bind_pw = password'
$ sudo postconf -e 'accounts_version = 3'
$ sudo postconf -e 'virtual_transport = virtual'
$ sudo postconf -e 'virtual_uid_maps = static:5000'
$ sudo postconf -e 'virtual_gid_maps = static:5000'
$ sudo postconf -e 'virtual_mailbox_base = /'
$ sudo postconf -e 'virtual_mailbox_maps = ldap:accounts'
$ sudo postconf -e 'virtual_mailbox_domains = packtldap.co.uk'
然后要提交更改,我们需要重新启动两项服务:
$ sudo systemctl restart postfix.service
$ sudo systemctl restart dovecot.service
使用 SSL/TLS 保护邮件服务器
对于 Postfix 的 SSL/TLS 加密,我们的邮件服务器不仅可以验证远程 SMTP 服务器,还可以加密我们发送的邮件和接收者服务器之间的邮件。
要配置 SSL 以加密连接,我们首先需要创建我们自己的个性化和特定的 SSL 证书。
我们需要进入 TLS 证书目录以在那里创建我们的新证书:
$ cd /etc/pki/tls/certs/
然后我们创建我们的第一个密钥文件:
$ sudo openssl genrsa -des3 -out mailserver.key 2048
然后工具会要求输入密码。我们应该输入一个强密码,并在工具要求重新输入时重新输入。
之后我们需要开始使用 OpenSSL 工具;如果没有安装,我们需要先安装它:
$ sudo yum install openssl
然后我们使用 OpenSSL 来编写 RSA 密钥:
$ sudo openssl rsa -in server.key -out server.key
然后输入已经定义的密码,然后继续生成密钥。
现在我们继续进行证书创建。在同一文件夹中,我们运行以下命令:
$ sudo make mailserver.csr
然后我们按照每个字段要求填写信息:国家名称,州或省名称,地点名称,组织名称,组织单位名称,通用名称和电子邮件地址,对于最后两个条目(挑战密码和可选公司名称),我们可以跳过它们。
然后我们使用 OpenSSL 创建一个私钥:
$ sudo openssl x509 -in mailserver.csr -out server.crt -req -signkey mailserver.key -days 3650 –sha256
然后我们转到配置 Postfix 和 Dovecot 以使用 SSL/TLS 加密。
首先,我们将从设置 Postfix 使用 SSL/TLS 开始,通过对其主配置文件/etc/postfix/main.cf
进行一些修改。我们可以使用文本编辑器编辑文件并更改参数,或者我们可以使用命令postconf -e
以更快的方式设置它们。
我们将向 Postfix 配置文件添加一些行,以保护它免受针对 OpenSSL 的一些最近攻击:
$ sudo nano "/etc/postfix/main.cf
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA
smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
我们创建证书文件:
$ cd /etc/ssl/private/
$ sudo openssl dhparam -out dhparams.pem 2048
$ sudo chmod 600 dhparams.pem
然后我们需要确保 TLS 已启用以用于 SMTP:
$ sudo postconf -e 'smtpd_use_tls = yes'
然后我们需要重新定义证书和密钥文件的位置:
$ sudo postconf -e 'smtpd_tls_cert_file = /etc/pki/tls/certs/mailserver.crt'
$ sudo postconf -e 'smtpd_tls_key_file = /etc/pki/tls/certs/mailserver.key'
然后我们设置 TLS 会话数据库缓存的位置:
$ sudo postconf -e 'smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache'
这就是主配置文件的全部内容。现在我们将配置/etc/postfix/master.cf
:
$ sudo nano /etc/postfix/master.cf
我们需要取消注释原始文件的第 16 到 35 行之间的Submission
和SMTPS
选项,使其看起来像以下取消注释的内容:
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
我们已经完成了 Postfix 配置以使用 SSL。现在我们可以为 Dovecot 配置 SSL。我们只需要在/etc/dovecot/conf.d/10-ssl.conf
文件中进行一些更改:
$ sudo nano /etc/dovecot/conf.d/10-ssl.conf
首先,我们需要确保 SSL 选项已激活:
# Line8: change it to yes
ssl = yes
然后我们更改 SSL 证书和密钥的位置:
# Line 14, 15: change the files location to the new one
ssl_cert = </etc/pki/tls/certs/mailserver.crt
ssl_key = </etc/pki/tls/certs/mailserver.key
最后,我们需要重新启动服务以提交更改:
$ sudo systemctl restart postfix.service
$ sudo systemctl restart dovecot.service
参考资料
既然我们已经完成了这一章,让我们来看一下使用的参考资料:
-
Postfix 主页:www.postfix.org
-
Postfix MySQL 支持:
www.postfix.org/MYSQL_README.html
-
Dovecot 主页概述:
www.dovecot.org
-
Postfix 虚拟主机概述:
www.akadia.com/services/postfix_separate_mailboxes.html
-
Dovecot 配置文件:
wiki.dovecot.org/MainConfig
-
Postfix 中的 LDAP 支持:
www.postfix.org/LDAP_README.html
-
Postfix TLS 支持:
www.postfix.org/TLS_README.html
总结
本章以逐步教程的形式描述了如何从使用 Postfix 发送服务 SMTP 开始设置一个完全合格的邮件服务器。然后,我们开始组织邮件服务器,重点是通过安全数据库服务 MariaDB 发送/接收邮件和虚拟域管理。接下来,我们了解了使用 MDA Dovecot 进行邮件接收服务,该服务本身提供了中等级别的安全性。然后开始扩展部分,当服务器可以连接到 LDAP 服务器并收集有关用户的有用信息并用于发送和接收邮件时,这一部分就会显示出来。最后,我们通过使用 OpenSSL 生成新证书和密钥来完成自定义安全级别,以确保邮件的身份验证和加密的安全性。
在下一章中,我们将学习如何在 CentOS 上设置和配置诸如 Nagios 和 syslog-ng 之类的工具,以监视不同的服务,并收集和处理日志。
第五章:监控和日志
在大型计算基础设施中,系统管理员无法轻松处理每台机器的所有系统服务和硬件问题的监控。应该有一个工具帮助收集基础设施中每台机器的状态,并以全面的方式呈现给系统管理员。因此,监控系统已经被开发出来满足监控各种计算基础设施的需求,并帮助防止系统或硬件损坏。
本章是对监控和日志工具世界的探索,以及更好地实施正确工具和配置正确参数来保护和监督个性化计算基础设施所需的方法。
通过本章,您将学习以下主题:
-
最常见的开源监控工具
-
如何设置 Nagios 作为监控服务器,并监控一些客户端
-
作为日志服务器使用的各种工具
-
如何设置和配置 syslog-ng 作为日志服务器
开源监控工具
监控工具可以显示关于系统、服务和硬件状态的实时信息。通过这些信息,系统管理员可以判断是否有异常情况或显示出弱点。然后,他们可以采取行动,尝试在问题恶化之前解决问题。
本节介绍了最常见的开源监控工具。监控工具通常根据其主要需求来选择。一些监控工具专门用于监控一组机器的特性。其他工具帮助存储并生成历史图表,以供将来的系统分析使用。
许多组织依赖他们的监控工具来输出,不仅是为了维护他们的系统和防止潜在问题,还为了确定他们的系统的高峰时段以及系统更空闲状态。这有助于他们加强系统容量,并节省电力和资源。
Ganglia
我们将从讨论最常见的监控系统工具之一开始。Ganglia 是一个可扩展的分布式监控系统,适用于高性能计算基础设施。它广泛用于集群和网格架构。这是一个基于 Web 的工具,允许用户可视化机器的统计历史,如 CPU 负载平均值,网络使用等。它已经被开发成具有低节点开销和高并发性。目前全球数千个集群正在使用它。
Ganglia 基于两个基本服务,一个安装在客户端机器上,一个安装在服务器上。在客户端,服务称为gmond。gmond 是在我们想要监视的客户机器上运行的多线程守护程序。其服务基本上与以下相关:
-
监控机器状态的变化
-
宣布相关变化
-
监听其他 Ganglia 节点的状态
-
响应对其正在运行的机器的 XML 描述的请求
然后,我们有 Ganglia PHP Web 前端,它安装在监控服务器上。它通过实时、动态的网页提供了收集信息的视图。这些页面是 Ganglia 提供给用户(包括系统管理员)的仪表板。它们以有意义的方式组织,以向系统管理员呈现机器的状态,使诊断部分对他们来说更加容易。Ganglia Web 前端存储有关机器的数据长达 1 年,并且有许多可自定义的参数,用于查看机器的状态历史。
Ganglia 是一个非常有用的工具,用于监控机器的状态,并具有非常可靠的历史管理仪表板和各种故障排除相关问题。然而,在服务器环境中工作时,它并不是一个可以轻松监控每一个服务的工具,特别是当系统管理员将服务管理置于机器本身之上时。
来源:bezha.od.ua
OpenNMS
OpenNMS是一个开源的、企业级的网络监控和管理平台。它是一个分布式和可扩展的管理应用程序,涵盖网络管理的各个方面。它被设计为高度可定制,以创建独特的、集成的管理解决方案。
OpenNMS 支持四个主要的功能领域:
-
事件管理和通知
-
发现和配置
-
服务监控
-
数据收集
OpenNMS 可以通过一个智能而有组织的基于 Web 的界面访问,从数据库和收集的性能数据中创建高级报告。它非常适用于使用 SNMP 协议进行监控、警报/通知、报告、升级以及其组织良好、清晰的仪表板。然而,学习如何使用它并通过制作个性化脚本来个性化它是相当困难的。此外,大多数高级功能都是付费的,还包括其他成本。要使其完美运行,可能需要花费大量时间进行设置和配置,但结果总是令人满意的。
Zabbix
Zabbix是一款用于实时监控网络和应用程序的开源企业级软件。它被设计用于监控和跟踪各种网络服务、服务器和其他网络硬件的状态。它有能力监控主要协议(HTTP、FTP、SSH、POP3、SMTP、SNMP、MySQL 等)。
Zabbix 具有处理数十万台设备的高性能能力。此外,它具有自动发现的能力,可以识别同一网络中的机器。Zabbix 配备了一个基于 Web 的界面,用于显示监控仪表板。这个界面可以通过安全的用户认证访问,并且具有集中式 Web 管理,可以可视化和比较其监控的任何值。此仪表板可以根据用户的需求进行定制。
Zabbix 有能力监控网络上的任何事件,从网络流量到打印机中剩余的纸张数量。
然而,与其他监控工具相比,Zabbix 设置和配置更复杂,需要良好的文档才能按照最佳实践进行安装。
Zenoss
Zenoss,有时被称为Zenoss Core,是一个基于 Zope 应用服务器的免费开源应用程序、服务器和网络管理平台。它为系统管理员提供了一个基于 Web 的界面,具有监控可用性、库存/配置、性能和事件的能力。
Zenoss 具有以下特点:
-
通过一个漂亮的地图(如 Google Maps)监控全球范围内的远程位置
-
一个非常用户友好的美丽的 Web 界面
-
自动发现客户端系统参数
-
使用简单明了的 SNMP
Zenoss 看起来非常先进和花哨,但它的 Web 界面稍微慢一些。它不支持实时通知。我们必须等待它处理信息,才能清楚地了解环境中发生了什么。它只有一个仪表板,这使得对许多系统管理员来说监控有些困难。此外,它是一个有限的开源解决方案;对于更高级的功能,我们需要支付更多。然而,对于愿意支付和投资的人来说,我们可以说这是一个非常不错的选择。
Nagios
Nagios是一个用于监控系统、网络和基础设施的开源应用程序。它为大型计算机基础设施上的服务器、网络设备、应用程序和服务提供监控和警报服务。它有两种类型的警报,一种是用于通知问题,另一种是用于通知问题是否已解决。
Nagios 通过网络插件和远程运行脚本来监控网络服务、主机资源和探针。它有一个庞大的社区,这使得开发了一些非常强大的插件。它被认为是最容易设置和使用的监控工具之一,通过其 Web 界面。但是,它也有一些缺点,与第三方插件的质量以及一些复杂的编写和配置自定义插件有关。最后,它会触发大量的通知和警报,因此我们可能需要使用适当的插件来帮助监控基础设施中的所有内容。
Icinga
Icinga是一个开源的系统和网络监控工具。它最初是作为 Nagios 监控系统的一个分支创建的。它在 Web 界面方面得到了很好的发展,提供了比 Nagios 更美观和更交互式的东西。
Icinga 的有效性在于它能够实现非常强大的插件。它实现了许多著名的图形工具,如 PNP4Nagios、inGraph 和 Graphite。Icinga 最著名的功能是它的轻量性,在运行时不会过载系统,并且能够实时生成信息图。对于非常大的基础设施,Icinga 被设计为多线程运行,每秒运行数千次检查而不会对系统资源造成任何过载。
Icinga 有一个相当大的社区,他们能够很快地帮助集成补丁。Icinga有两个官方版本:一个是Web 1 Icinga,另一个是Web 2 Icinga2。但它仍在不断发展中。
设置 Nagios 作为监控服务器
对于本章,我们将选择 Nagios 作为最佳选择,考虑到其性能和设置配置的简单性。正如我们已经提到的,Nagios 是可以安装在多个 Linux 发行版上的开源软件。在我们的案例中,我们将在 CentOS 7 上安装它。它是一个网络、基础设施和服务器监控工具。它将监控交换机、应用程序和服务。它具有警报功能,可以帮助通知用户在监控基础设施时发生的所有问题。它还会在问题得到解决时通知用户。除了监控,Nagios 还具有识别可能导致问题的系统或网络问题的能力,并进行实时问题通知。此外,它还具有一些安全功能,可以识别基础设施中的安全漏洞。
在本节中,我们将在一台机器上安装 Nagios。它将充当我们的监控服务器。我们需要一个测试客户端来进行监控。客户端将具有一些常见的服务;我们将尝试对它们进行一些操作,以测试 Nagios 的通知服务。
在开始监控服务器安装之前,让我们先谈谈我们需要的东西。
首先,我们需要在我们的机器上安装Linux Apache MySQL PHP(LAMP)服务。由于 Nagios 将通过 Web 界面访问,安装 Web 服务器是显而易见的。对于更详细和安全的 Web 服务器安装,您可以返回并查看第三章,不同用途的 Linux。
Nagios 不会从 CentOS 7 软件包管理器中安装。我们必须下载它,然后编译它,因此我们需要基本的编译工具和一个下载工具来下载 Nagios 源代码存档。我们将使用 CentOS 软件包管理器 Yum 来安装这些:
$ sudo yum install gcc cpp glibc glibc-common glibc-devel glibc-headers gd gd-devel kernel-headers libgomp libmpc mpfr make net-snmp openssl-devel xinetd
我们等待安装完成,然后继续准备的下一步。
为了运行 Nagios 进程,我们需要创建一个 Nagios 用户并为其设置密码:
$ sudo useradd nagios
$ sudo passwd Really_Secure_Password
我们需要确保在创建任何密码时使用安全的密码。
接下来,我们创建一个名为nagcmd
的新组,以允许通过 Web 界面提交外部命令一旦它运行起来。然后,我们需要将 Nagios 和 Apache 都添加到这个组中:
$ sudo groupadd nagcmd
$ sudo usermod -a -G nagcmd nagios
$ sudo usermod -a -G nagcmd apache
我们继续进行最后一步,即下载最新版本的 Nagios 源存档。为了进行下载,我们将使用已经安装的工具Wget。
在本教程中,我们将使用 Nagios 4:
$ wget http://prdownloads.sourceforge.net/sourceforge/nagios/nagios-4.1.1.tar.gz
在下载最新的 Nagios 稳定版本之后,我们需要进行解压。由于 Nagios 将安装在我们要提取其源代码的位置,我们需要将其放在一个合适的位置。我们可以选择在/usr/local
和/opt
之间,所以我们需要将源包文件复制到那里,然后进行解压。在这个例子中,我们将选择/usr/local
:
$ sudo cp nagios-4.1.1.tar.gz /usr/local/
$ cd /usr/local/
$ sudo tar xzvf nagios-4.1.1.tar.gz
在解压存档之后,将创建一个新的文件夹,其中包含名为 Nagios 的文件夹和相应的版本。我们需要进入文件夹开始编译:
$ cd nagios-4.1.1/
在开始编译过程之前,我们需要运行配置脚本,以便使用之前安装的可用编译工具来运行编译过程,以避免错误:
$ sudo ./configure --with-command-group=nagcmd
这个配置过程有一个选项,可以将最新创建的组设置为运行内部命令的组。
现在,我们实际上可以开始编译过程:
$ sudo make all
这个命令可能需要很长时间,取决于机器的处理能力。
完成此操作后,我们继续进行安装阶段。我们需要安装 Nagios、它的初始化脚本、一些示例配置文件和 Nagios Web 界面:
$ sudo make install
$ sudo make install-commandmode
$ sudo make install-init
$ sudo make install-config
$ sudo make install-webconf
在进行下一步之前,我们需要设置 Nagios 管理员用户和密码以访问 Web 界面:
$ sudo htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
然后,我们需要两次输入密码,以便创建和配置我们的 Web 界面管理员。
Nagios 安装完成后,我们可以添加一些有用的插件。首先,我们需要下载这些插件的最新稳定源版本。我们需要进入/usr/local
文件夹,并在那里下载插件的源存档。这一步将为未来的诊断安装好一切:
$ cd /usr/local
然后,我们使用Wget开始下载:
$ sudo wget http://nagios-plugins.org/download/nagios-plugins-2.1.1.tar.gz
注意
我们使用了sudo
命令,因为在下载过程中,文件是写入一个没有用户访问权限的文件夹中的。
下载完成后,我们可以使用相同的命令开始解压存档:
$ sudo tar xzvf nagios-plugins-2.1.1.tar.gz
然后,我们进入刚刚创建的目录:
$ cd nagios-plugins-2.1.1/
再次,我们需要编译源文件。在编译之前,我们需要使用一些有用的选项运行配置脚本,如下所示:
$ sudo ./configure --with-nagios-user=nagios --with-nagios-group=nagios --with-openssl
对于配置选项,我们将用户和组 Nagios 设置为访问和使用插件的默认值。此外,我们使用 OpenSSL 来保护插件的使用。
然后,我们开始编译插件:
$ sudo make
之后,我们可以开始安装:
$ sudo make install
一旦这个命令被执行且没有错误,我们就可以说我们的 Nagios 插件已经成功安装。我们可以继续设置Nagios 远程插件执行器(NRPE)。这是一个简化远程系统监控的 Nagios 代理,使用托管在远程系统上的脚本。我们需要以相同的方式下载、配置、编译和安装它。首先,我们需要找到源包的最新稳定版本,然后将其下载到/usr/local
:
$ cd /usr/local/
$ sudo wget http://downloads.sourceforge.net/project/nagios/nrpe-2.x/nrpe-2.15/nrpe-2.15.tar.gz
接下来,我们在相同位置解压它,并进入文件夹开始编译:
$ sudo tar xzvf nrpe-2.15.tar.gz
$ cd nrpe-2.15/
我们首先运行 NRPE 配置脚本。我们使用 Nagios 进程和安全工具来定义用户和组:
$ sudo ./configure --enable-command-args --with-nagios-user=nagios --with-nagios-group=nagios --with-ssl=/usr/bin/openssl --with-ssl-lib=/usr/lib/x86_64-linux-gnu
然后,我们运行编译命令,然后是安装命令:
$ sudo make all
$ sudo make install
$ sudo make install-xinetd
$ sudo make install-plugin
$ sudo make install-daemon
$ sudo make install-daemon-config
接下来,我们配置xinetd
启动脚本:
$ sudo nano /etc/xinetd.d/nrpe
我们需要查找以only_from
开头的行,然后添加监视服务器的 IP 地址。它可以是公共地址或私有地址,取决于我们希望从哪里让服务器可访问:
only_from = 127.0.0.1 10.0.2.1
然后,我们保存文件,只允许我们的 Nagios 服务器与 NRPE 通信。之后,我们添加以下行来定义 NRPE 服务的端口号:
$ sudo echo "nrpe 5666/tcp # NRPE" >> /etc/services
为了使这个配置生效并运行,我们需要重新启动xinetd
来启动NRPE:
$ sudo service xinetd restart
现在,我们的 Nagios 监控服务器已经正式安装。我们可以继续配置步骤。我们进入 Nagios 主配置文件并激活将存储所有配置文件的文件夹:
$ sudo nano /usr/local/nagios/etc/nagios.cfg
然后,我们取消注释以下行,保存文件并退出:
cfg_dir=/usr/local/nagios/etc/servers
注意
这只是一个服务器的示例。它也可以用于网络设备、工作站或任何其他类型的网络连接机器。
我们创建一个配置文件夹,用于存储将要被监视的每台机器的配置文件:
$ sudo mkdir /usr/local/nagios/etc/servers
然后,我们继续配置 Nagios 联系人文件,以设置与 Nagios 管理员关联的电子邮件地址。通常用于接收警报:
$ sudo nano /usr/local/nagios/etc/objects/contacts.cfg
现在,我们需要更改管理员的电子邮件地址。为此,我们需要在email
选项后输入正确的电子邮件地址:
email packtadmin@packt.co.uk ; <<***** CHANGE THIS TO YOUR EMAIL ADDRESS ******
然后,我们保存文件并退出。
现在,我们进行check_nrpe
命令配置。我们首先向 Nagios 服务器添加一个新命令:
$ sudo nano /usr/local/nagios/etc/objects/commands.cfg
我们在末尾添加以下行:
define command{
command_name check_nrpe
command_line $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
我们保存文件并退出,以使新命令可用。
现在,我们继续配置访问限制,以允许访问 Nagios Web 界面的 IP 地址:
$ sudo nano /etc/httpd/conf.d/nagios.conf
我们需要注释掉这两行:
Order allow,deny
Allow from all
然后,我们取消注释以下三行:
# Order deny,allow
# Deny from all
# Allow from 127.0.0.1
注意
这些行在配置文件中出现两次,因此我们需要在同一个文件中执行两次相同的操作。这一步只是为了加强 Nagios 的安全性。
我们总是可以添加任何网络或地址以允许其访问监视服务器:
Allow from 127.0.0.1 10.0.2.0/24
我们总是可以检查 Nagios 配置文件中是否存在任何配置错误,使用以下命令:
$ /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
在启动 Nagios 之前,我们需要通过将 SELinux 操作从强制模式更改为宽松模式来使 Nagios CGI 可访问:
$ sudo nano /etc/selinux/config
然后,我们将这一行修改成以下的样子:
SELINUX=permissive
现在,我们可以重新启动 Nagios 服务并将其添加到启动菜单中。我们还需要重新启动 Apache 服务:
$ sudo systemctl start nagios.service
$ sudo systemctl enable nagios.service
$ sudo systemctl restart httpd.service
现在,我们可以访问 Nagios 服务器,但是我们仍然需要被允许尝试从服务器本身访问它,或者从连接到允许访问服务器的网络的机器上访问它。因此,我们打开网页浏览器,输入http://Nagios_server_IP_Address/nagios
。然后,我们输入管理员用户名nagiosadmin
和之前已经定义好的密码,以便访问 Nagios 界面。
现在,我们转向我们的客户服务器 - 我们想要使用 Nagios 进行监视的服务器。首先,我们需要安装所需的软件包。对于 CentOS 7,我们需要安装 EPEL 存储库以获取所需的软件包:
$ sudo yum install epel-release
现在,我们可以安装 Nagios 插件和 NRPE:
$ sudo yum install nrpe nagios-plugins-all openssl
让我们从更新 NRPE 配置文件开始:
$ sudo nano /etc/nagios/nrpe.cfg
我们必须找到以allowed_hosts
开头的行,并添加我们监视服务器的 IP 地址:
allowed_hosts=127.0.0.1,10.0.2.1
然后,我们保存并退出文件。要完成配置,我们需要启动NRPE服务并将其添加到启动菜单中:
$ sudo systemctl start nrpe.service
$ sudo systemctl enable nrpe.service
一旦我们完成配置要监视的主机,我们转到 Nagios 服务器将其添加到配置文件夹中。
在 Nagios 服务器上,我们需要创建一个以机器名称命名的文件。我们可以使用机器主机名或放置一些指示机器角色或任何其他指示的内容:
$ sudo nano /usr/local/nagios/etc/servers/packtserver1.cfg
然后,我们添加以下行,将host_name
替换为客户端主机名,将别名值替换为服务器主要工作的简短描述,最后将地址替换为服务器 IP 地址:
define host {
use linux-server
host_name packtserver1
alias Packt Apache server
address 10.0.2.12
max_check_attempts 5
check_period 24x7
notification_interval 30
notification_period 24x7
}
保存此配置后,Nagios 将仅监视主机是启动还是关闭。要使其更多功能,我们需要添加一些要监视的服务,例如 HTTP 和 SSH。此外,我们正在添加检查服务器是否活动的选项。我们需要打开相同的文件,并为要监视的每个服务定义一个服务块:
$ sudo nano /usr/local/nagios/etc/servers/packtserver1.cfg
define service {
use generic-service
host_name packtserver1
service_description SSH
check_command check_ssh
command_line $USER1$/check_ssh $ARG1$ $HOSTADDRESS$
notifications_enabled 0
}
define service {
use generic-service
host_name packtserver1
service_description HTTP
check_command check_http
command_line $USER1$/check_http -I $HOSTADDRESS$ $ARG1$
notifications_enabled 0
}
define service {
use generic-service
host_name packtserver1
service_description PING
check_command check_ping!100.0,20%!500.0,60%
}
然后,我们保存文件并重新加载 Nagios 服务:
$ sudo systemctl reload nagios.service
我们将在主机列表上看到新服务器及其服务。为了测试 Nagios 是否在正常工作,我们禁用 SSH 服务:
$ sudo systemctl stop sshd.service
然后,在 Web 界面上,我们可以看到服务将从绿色变为红色。红色信号意味着该服务的测试失败或返回空值,这意味着服务被禁用或无法访问。Nagios 管理员将收到错误通知电子邮件。
来源:thenullterminator.wordpress.com/
之后,我们尝试第二个测试,启动服务:
$ sudo systemctl start sshd.service
要指示服务已恢复,将收到另一封电子邮件,其中包含新状态,其中所有信息将变为绿色,如下面的屏幕截图所示:
现在,在设置第一台服务器之后,我们可以继续添加所有机器,包括我们需要监视的交换机、打印机和工作站。此外,为了更加实用,我们应该只添加我们关心的那些服务。因此,如果我们有一台运行多个服务的服务器,而我们只会使用其中两个,那么添加所有这些服务并使服务器仪表板和管理员的邮箱超载是没有意义的,因为我们不关心的东西后来会被视为垃圾邮件。
现在,我们将配置 NRPE 守护程序以从客户端接收有关其状态的信息。首先,在 Nagios 服务器上,我们编辑 Xinetd NRPE 配置文件以添加服务器应从中侦听的 IP 地址:
$ sudo nano /etc/xinetd.d/nrpe
我们需要在only_from
选项后添加 IP 地址:
only_from = 127.0.0.1 10.0.2.1
然后,我们需要将 NRPE 服务添加到系统服务中:
$ sudo nano /etc/services
我们在文件末尾添加以下行:
nrpe 5666/tcp # NRPE
为了提交它,我们重新启动Xinetd
服务:
$ sudo systemctl restart Xinetd
然后,我们转到客户端并进行以下修改:
$ sudo /usr/lib/nagios/plugins/check_users -w 5 -c 10
$ sudo /usr/lib/nagios/plugins/ check_load -w 15,10,5 -c 30,25,20
$ sudo /usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/sda1
这三个命令用于激活 Nagios 代理以发送有关服务器负载和磁盘存储的信息。在我们的情况下,我们的磁盘被定义为sda1
。我们可以使用lsblk
命令检查磁盘的命名。
设置日志服务器的工具
日志记录意味着收集系统和服务输出信息。它可以是简单的信息、警告或错误,用于告知相关守护程序的状态。对于系统管理员来说,日常工作负载可能非常沉重。因此,他们一直在采用最佳的日志记录工具来监视其基础设施的行为。此外,相关信息应该是可读的并且能够快速理解。
许多系统管理员主要使用两种开源解决方案:Syslog-ng和Rsyslog。
Rsyslog
Rsyslog 是一个快速的日志处理系统。它具有高性能、良好的安全性和模块化设计。它发展迅速,并已发展成为日志领域中被认为是瑞士军刀的工具。它具有强大的企业重点,也适用于较小的系统。它支持 MySQL、PostgreSQL、故障转移日志目的地、syslog/tcp 传输、精细粒度的输出格式控制、高精度时间戳、排队操作以及过滤任何消息的部分的能力。
Rsyslog 有监听 TCP/UDP 连接的能力,但由于其对日志速率的限制,可能会在过载时丢失一些日志信息。它可以加载相当数量的模块。它还可以通过程序、来源、消息、PID 等进行日志过滤。
Syslog-ng
Syslog-ng 是 Linux 和类 Unix 系统的 syslog 协议的开源实现。它具有基于内容的过滤、丰富的过滤兼容性和灵活的配置。它还为syslog
添加了一些重要的功能,例如:
-
使用 TCP 传输日志信息
-
使用类似 Unix shell(bash)变量扩展的能力格式化日志消息
-
将日志消息发送到本地应用程序的能力
-
将日志信息直接保存到数据库中的能力
-
对传入的日志消息进行分类,并同时从非结构化的 syslog 消息中提取结构化信息
-
处理通过 syslog 传输的结构化消息格式
-
将多个传入的消息相关联以形成更复杂的相关事件的能力
Syslog-ng 是 syslog 的下一代继任者。它是管理日志的最佳工具之一;它将日志实体视为对象(来源、目的地、过滤器等),其语法易于理解。它是一个高度可移植的应用程序,适用于更多的平台,非常适合平台多样性的站点。它有能力将日志消息的内容与预定义消息模式的数据库进行比较。因此,Syslog-ng 能够识别消息的确切类型并将其分类为消息类别。然后,它可以用于分类日志消息中描述的事件类型。
在这里,我们将在 CentOS 7 中安装和配置 Syslog-ng 作为我们的日志服务器。
设置和配置 Syslog-ng
默认情况下,在安装 CentOS 7 时,系统和应用程序的日志将安装Rsyslog
进行存储。幸运的是,我们将按照 syslog 的要求存储和组织所有系统日志文件。我们将在安装Syslog-ng
时使用这些日志文件,并以更合适的方式进行组织:
首先,在开始安装之前,我们需要设置 EPEL 存储库:
$ sudo yum install epel-release
提示
所有即将到来的软件包存储库检查和应用程序可用性都是可选的。我们可以随时继续安装 Syslog-ng。
要验证 EPEL 存储库是否已添加,我们可以使用以下命令:
$ sudo yum repolist
这个命令显示了 YUM 软件包管理器可用于下载和安装软件包的存储库列表。现在,在添加了 EPEL 存储库后,我们需要检查是否需要进行任何更改。因此,我们需要输入以下命令:
$ sudo yum check-update
注意
这个命令并不是必需的;我们想用它来额外了解如何检查 Yum 存储库更新。
最后,要检查新添加的 EPEL 存储库中syslog-ng
应用程序的可用性,我们需要输入以下内容:
$ sudo yum list *syslog-ng*
现在,我们回到安装阶段。我们将使用yum
,因为我们已经正确验证了应用程序包的存在:
$ sudo yum install syslog-ng syslog-ng-libdbi
我们需要确认这些软件包的安装。然后,我们等待直到完成。
要激活syslog-ng
并将其设置为默认日志记录工具,我们需要首先禁用 rsyslog:
$ sudo systemctl stop rsyslog
$ sudo systemctl disable rsyslog
然后,我们转到其配置文件,使其以正确的方式工作。我们可以使用任何文本编辑器打开文件:
$ sudo nano /etc/syslog-ng/syslog-ng.conf
接下来,我们进行所需的更改,使其看起来像下面这样:
@version:3.5
@include "scl.conf"
#----------------------------------------------------------------------------
# /etc/syslog-ng/syslog-ng.conf: configuration file
# $Revision: 0.3-r5 (CentOS Edition by Wakko Warner) $
# $Comment: Any comments please send to wakko@acmelabs.spb.ru $
#----------------------------------------------------------------------------
# Note: it also sources additional configuration files (*.conf)
# located in /etc/syslog-ng/conf.d/
# Global Options
options {
# Enable or disable the chained hostname format
chain_hostnames (off);
# The number of lines buffered before written to file
flush_lines (0);
log_fifo_size (1000);
# The default action of syslog-ng is to log a STATS line
# to the file every 10 minutes. That's pretty ugly after a while.
# Change it to every 12 hours so you get a nice daily update of
# how many messages syslog-ng missed (0).
stats_freq (43200);
time_reopen (10);
# The default action of syslog-ng is to log a MARK line
# to the file every 20 minutes. That's seems high for most
# people so turn it down to once an hour. Set it to zero
# if you don't want the functionality at all.
mark_freq(3600);
# Enable or disable hostname rewriting
keep_hostname (yes);
# Enable or disable directory creation for destination files
create_dirs (yes);
# userid/groupid/permission value for files
owner ("root");
group ("adm");
perm (0640);
# userid/groupid/permission value for directories
dir_owner ("root");
dir_group ("adm");
dir_perm (0750);
# Enable or disable DNS usage
use_dns (no);
# Add Fully Qualified Domain Name instead of short hostname
use_fqdn (no);
long_hostnames (off);
};
source s_sys {
system();
internal();
# udp(ip(0.0.0.0) port(514));
};
# Sources of syslog messages (both local and remote messages on the server)
source s_local {
system();
internal();
};
source s_tcp { tcp (ip ("127.0.0.1") port (514) max-connections (1) ); };
source s_udp { udp (ip ("0.0.0.0") port (514)); };
# By default messages are logged to tty12...
#destination d_console_all { file("/dev/tty12"); };
# ...if you intend to use /dev/console for programs like xconsole
# you can comment out the destination line above that references /dev/tty12
# and uncomment the line below.
#destination d_console_all { file("/dev/console"); };
#destination d_console_all { file("/dev/null"); };
destination d_console_all { program("/bin/cat >/dev/null"); };
# Destinations
destination d_usertty { usertty("*"); };
destination d_everything {
file("/var/log/syslog-$HOST/$YEAR-$MONTH/$FACILITY.$PRIORITY.log"
template("$FULLDATE $MSGHDR$MSG\n")
template_escape(no)
);
};
# Filters
filter f_emergency { level(emerg); };
filter f_fetchmail_warnings {
not(match("fetchmail" value("PROGRAM"))
and match("Warning: the connection is insecure, continuing anyways." value("MESSAGE")));
};
log {
source(s_local);
filter(f_emergency);
destination(d_usertty);
};
log {
source(s_local);
filter(f_fetchmail_warnings);
destination(d_everything);
};
log {
source(s_local);
filter(f_fetchmail_warnings);
destination(d_console_all);
};
log {
source(s_tcp);
destination(d_everything);
};
log {
source(s_tcp);
destination(d_console_all);
};
log {
source(s_udp);
destination(d_everything);
};
log {
source(s_udp);
destination(d_console_all);
};
# Source additional configuration files (.conf extension only)
@include "/etc/syslog-ng/conf.d/*.conf"
# vim:ft=syslog-ng:ai:si:ts=4:sw=4:et:
在这一点上,我们可以启动syslog-ng
服务并启用它在系统启动时启动:
$ sudo systemctl start syslog-ng.service
$ sudo systemctl enable syslog-ng.service
通过这一步,我们已经使用syslog-ng
配置了我们的日志服务器,以进行组织良好且有用的日志记录。
参考资料
现在,让我们看一下本章中使用的参考资料:
-
Ganglia 主页,
ganglia.sourceforge.net/
-
OpenNMS 主页,
www.opennms.org/
-
Zabbix 主页,
www.zabbix.com/
-
Zenoss 主页,
zenoss.com/
-
Icinga 主页,
www.icinga.org/
-
Nagios 主页,
www.nagios.org/
-
Rsyslog 主页,
www.rsyslog.com/doc/master/index.html
-
Syslog-ng 主页,
syslog-ng.org/
摘要
在本章中,我们介绍了各种选择的开源监控和日志记录工具,用于 CentOS 7 服务器。然后,我们讨论了如何设置和配置 Nagios 和 Syslog-ng 日志记录作为我们的日志服务器的逐步教程。我们还谈到了一些工具的主要特点,这些特点有助于简化我们的选择。
在下一章中,我们将简要介绍各种虚拟化技术。此外,我们将借此机会为您提供建立小型虚拟机的逐步教程。
第六章:虚拟化
如今,计算基础设施在许多方面发生了变化。我们不再看到一个房间里放满了服务器,每个服务器负责根据其强大程度提供多种服务。在这些时代,我们只看到一些由多个单元组成的大型服务器,以增强它们的容量。这种类型的服务器托管了几个虚拟服务器,以满足基础设施要求。
在我们的时代,成为裸机系统管理员已经不够了。虚拟机正在兴起;我们应该承认这一点。大公司不再使用旧的架构;这已经不再是一个好选择。需要大量资金和巨大的管理工作来维持它们。
在这一章中,我们将解释虚拟化的概念,我们将看到如何设置几种虚拟化技术,然后举例说明如何为每种技术创建一些虚拟机。最后,我们将简要解释 Docker 是什么,以及如何添加镜像和访问 Docker 容器。
通过本章,您将学习以下主题:
-
虚拟化基础
-
全虚拟化的概念
-
半虚拟化的概念
-
了解 Xen 以及如何使用它
-
使用 KVM 设置一些 Linux 虚拟机
-
使用 OpenVZ 创建虚拟机
-
在 VirtualBox 上设置和配置虚拟机
-
了解 Docker 以及如何创建容器和访问它
-
使用 HAProxy 建立服务的高可用性
Linux 上的虚拟化基础
虚拟化是创建一个类似机器的程序的能力,模拟真实机器通过虚拟硬件运行,包括 CPU、RAM、硬盘、网络卡等,这些资源都来自运行虚拟机的物理机器。
早些时候,管理服务的方式是部署新服务器或升级旧服务器以满足新服务的要求,进行长时间复杂的迁移以应对硬件故障。一直以来,内存太少,磁盘太少,或者处理能力不足。管理者们厌倦了试图修复现有系统,同时支付大量资金来帮助维护不再受支持的旧服务器。然而,他们没有太多选择,因为运行在这些机器上的服务非常重要和必不可少。公司部署了无法在其高峰容量上运行的服务器,没有更好的方法来控制每台服务器的容量,以满足正确的硬件设备的正确服务。所有这些原因使得虚拟化这一新生解决方案迅速增长。虚拟化部署后不久,就已经在许多领域,特别是在计算机科学领域得到了整合。虚拟化允许对物理硬件进行抽象,以在单个共享资源(CPU、内存、网络和存储)上运行多个虚拟机:
现在,这种新技术正在蓬勃发展。我们每天都在见证新的虚拟化服务诞生。虚拟化已经分为许多类型:
-
我们有网络虚拟化,它涉及虚拟网络的创建和管理,以将一组机器与另一组机器分开。它们连接到同一个交换机和一组交换机。
-
我们还有应用虚拟化,其中我们将一个应用程序或一组应用程序放入容器中,然后让应用程序相信它是在其原始支持的系统上运行。因此,它相信它可以访问所需的资源。
-
最后,我们有完整的机器虚拟化。这是一种虚拟化,它创建一个完整的虚拟机(桌面、服务器),具有其虚拟硬件和按需的专用服务。这种虚拟化涉及将基于服务器的工作负载(虚拟机用户要求的工作负载)与底层硬件分离。只要硬件满足其服务对资源(存储数据、网络访问其他机器等)的需求,虚拟机就不会注意到它是在物理硬件上还是在虚拟硬件上运行。
在本章中,我们将重点关注应用虚拟化和桌面虚拟化。
一种名为 hypervisor 的软件在物理机器上执行,以帮助数据中心的虚拟化,目标是为虚拟机提供平台。 Hypervisor 的主要工作是在其控制下运行的不同虚拟机之间动态组织物理资源。这使它们能够独立于物理机器运行,系统管理员可以将虚拟机从一个主机重新定位到另一个主机而不会影响它。 Hypervisor,也称为虚拟机管理器,是一种允许多个操作系统共享单个硬件主机的程序。
在使用虚拟机或容器时,我们期望提供可以托管应用程序或服务并简化其与硬件通信的操作系统。由于这些机器实际上并未在物理硬件上运行,虚拟化允许它们根据需要动态和灵活地访问 CPU、内存、存储和网络资源。
虚拟化可以增加灵活性和管理,并提供更好的可扩展性,大大节省成本。服务的工作负载部署速度更快,性能按需可见增加,同时自动化可扩展性功能,简化了 IT 支持人员的基础设施管理。
让我们列举一些在服务器基础设施上安装虚拟化解决方案的主要优势:
-
减少硬件和运营成本
-
提供高可用性的应用程序和服务
-
最小化或消除停机时间(采用最佳实践方法)
-
提高 IT 团队的生产力、效率、灵活性和响应能力
-
加快应用和资源配置的速度和简化
-
支持业务连续性和灾难恢复,增加系统安全性
-
实现集中管理
-
构建真正的软件定义数据中心
-
充分利用多核处理器机器的优势
下图显示了在一个 Linux 服务器上运行的三个 Linux 虚拟机的示例。这些机器由根据所选择的虚拟化类型控制和管理:
利用 Linux 上虚拟化的基础知识
虚拟机实际上只是主机机器上特定位置存储的一些文件。对于某些技术,它也可以是 LVM 逻辑卷或直接设备。虚拟机使用的虚拟磁盘只是其中封装的另一个文件。在虚拟机内部,管理操作系统和应用程序可以简化(在某些方面;在其他方面则很复杂)。
但好处在于,将虚拟机作为一个充满文件的文件夹,可以复制和移动,这样在物理机器发生硬件故障时更容易备份。在这种情况下,管理者只需购买一台新服务器,将备份的虚拟机加载到其中,并再次运行整个环境,就好像从未发生过一样。
使用 CentOS 存储库,我们可以在Xen和KVM之间选择两种虚拟化技术。要了解这些虚拟化技术,您需要了解虚拟化的两种不同方法:完全虚拟化和半虚拟化。
注意
已经创建了半虚拟化和完全虚拟化的组合,称为混合虚拟化。在其中,客户操作系统的某些部分使用半虚拟化来进行某些硬件驱动程序,而主机使用完全虚拟化来进行其他功能。这通常会在客户机上产生更好的性能,而无需客户机完全进行半虚拟化。
完全虚拟化
完全虚拟化是一种完全模拟虚拟机下的虚拟硬件的虚拟化技术,与物理硬件没有任何交互。它要求虚拟机下的整个硬件变得不可察觉。这项技术可以根据系统在虚拟机上运行的需求模拟任何类型的物理硬件,以满足特定裸机硬件的任何服务或应用需求。换句话说,完全虚拟化是一种完全运行客户机而不让其意识到它在虚拟环境中运行的虚拟化能力。在这种情况下,虚拟机具有完全虚拟化的硬件来运行其服务。它们与物理硬件没有任何交互。
以下图表显示了在完全虚拟化期间,底层平台运行客户操作系统而不被修改或知道它正在虚拟化上运行:
有一种特定类型的完全虚拟化称为硬件辅助虚拟化。在这种情况下,CPU 架构通过一些特殊指令帮助执行硬件虚拟化,这些指令可能允许客户机直接在 CPU 上执行特权指令,尽管它是虚拟化的。
使用 CentOS 7 服务器,我们可以使用 Xen 或 KVM 进行完全虚拟化或硬件辅助完全虚拟化。我们将在为 CentOS 7 设置 Xen部分中看到如何做到这一点。
在更大的范围内,可以实现完全虚拟化的解决方案包括 VMware 的一系列 hypervisors、Xen 和 XenServer、VirtualBox、QEMU 和 KVM。
半虚拟化
半虚拟化是虚拟化技术的一种新型增强。它具有在为虚拟机提供服务的垂直机器上安装客户操作系统之前重新编译的能力,以区分虚拟和物理硬件。通过使用这种虚拟化,我们可以通过保留计算资源来更好地优化系统性能。这是因为我们不需要为虚拟机专门分配资源,只有在需要时才会使用。与需要创建虚拟资源并将其分配给虚拟机的完全虚拟化不同,它只是被使用或不被使用。
在半虚拟化中,客户操作系统由 hypervisor 管理,作为位于物理机器和虚拟机之间的一层,以有效地启用和共享物理设备访问。虽然通常不需要完全设备仿真或动态重新编译来执行特权指令,但半虚拟化通常以接近本机速度运行。
前述架构显示了半虚拟化虚拟机如何通过直接与修改器 OS 通信的特殊 hypervisor 与物理硬件交互以优化通信。
Paravirtualization 是 IBM 发明的一种技术的扩展。Xen 是一个开源软件项目,它包含了 paravirtualization。Xen hypervisor 是带来术语paravirtualization的东西。今天,大多数虚拟化解决方案都支持 paravirtualization 作为一种规范。一些 Linux 开发供应商合作开发了一种新形式的 paravirtualization,最初由 Xen 小组开发,并为 hypervisor 和客户操作系统内核之间提供了一个与 hypervisor 无关的接口。
在 CentOS 7 上设置 Xen
Xen 是一个开源解决方案,用于在一台机器上运行多个虚拟系统。它支持 paravirtualization 和硬件辅助的全虚拟化。Xen 是一个非常强大的虚拟化解决方案。它提供了同时使用两种虚拟化技术以始终满足用户需求的能力。
为了使用 Xen 创建我们的虚拟化环境,我们需要确保 Xen Hypervisor 将在机器自己的内核之前启动,以便尽可能多地访问物理硬件,因此可以用来为我们的环境的虚拟机提供服务。
在本节中,我们将为 CentOS 7 设置 Xen4。默认的 CentOS 7 仓库不支持 Xen4,因此我们需要添加 CentOS Xen 仓库。但首先,我们需要确保安装了一些软件包。这些将在安装 Xen 时稍后需要:
$ sudo yum install bridge-utils SDL net-tools
然后,我们使用 YUM 添加最新的 Xen 仓库:
$ sudo yum install centos-release-xen
在本教程中,我们将安装 Xen 4.5 版本,因此我们需要运行安装命令如下:
$ sudo yum install xen
要验证安装是否完成,我们需要列出 Xen 内核存档,它位于/boot
文件夹中:
$ ls –l /boot/xen.gz
我们应该看到以下代码:
lrwxrwxrwx. 1 root root 12 Aug 23 02:10 /boot/xen.gz -> xen-4.5.1.gz
现在,我们继续安装kernel-xen
软件包。此安装应该单独执行,安装 Xen 之后,以便系统引导加载程序 grub 可以检测到新内核并正确配置:
$ sudo yum install kernel-xen
安装了新内核后,我们应该解决 SELinux 问题。我们可以尝试通过确定 SELinux 正在阻止哪些模块并解决问题来解决问题,或者如果我们有更好的方法来保护我们的服务器,我们可以直接禁用它。要禁用 SELinux,我们只需要进入其配置文件并禁用它:
$ sudo nano /etc/sysconfig/selinux
然后,考虑这一行:
SELINUX=enforcing
将其更改为以下内容:
SELINUX=disabled
否则,如果我们需要检查问题,我们可以按照这个步骤。首先,我们检查问题的日志文件:
$ sudo cat /var/log/messages
然后,我们激活阻塞:
$ sudo grep xend /var/log/audit/audit.log | audit2allow -M custom_xen
$ sudo semodule -i custom_xen.pp
这应该解决问题。最后,我们可以重新启动系统并引导新的 Xen 内核。重新启动后,我们需要检查 Xen 内核是否正确安装:
$ sudo xl info
要使用 Xen,我们需要安装一些工具和软件包,以确保虚拟机运行良好。首先,我们需要确保安装了基本的使用软件包:
$ sudo yum install bridge-utils tunctl wget vim-enhanced rsync openssh-clients libvirt python-virtinst libvirt-daemon-xen
然后,我们需要配置网络。但在此之前,我们必须创建桥接接口:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-brid0
接下来,我们在刚刚使用 nano 打开的文件中添加以下行并保存:
DEVICE=brid0
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes
然后,我们对默认网络接口配置文件进行微小更改,以使用桥接接口:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=XX:XX:XX:XX:XX:XX
ONBOOT=yes
TYPE=Ethernet
IPV6INIT=no
USERCTL=no
BRIDGE=brid0
注意
我们需要用以太网接口的 MAC 地址更改 MAC 地址。我们可以使用ifconfig
来检查。
之后,我们重新启动系统。这样,桥接网络就准备好使用了。然后,我们下载任何 Linux 系统进行测试。接下来,我们需要使用dd
命令将其制作为 IMG 文件:
$ sudo dd if=/dev/zero of=Centos.img bs=4K count=0 seek=1024K
qemu-img create -f raw Centos.img 8G
然后,我们下载任何 Linux 系统进行测试。此外,我们必须创建一个 kick-start 文件并将其放在相同的位置:
$ sudo nano ks.cfg
然后,我们添加以下代码并进行必要的修改:
kernel = "/boot/vmlinuz-xen-install"
ramdisk = "/boot/initrd-xen-install"
extra = "text"
name = "mailserver"
memory = "256"
disk = [ 'tap:aio:/srv/xen/mailserver.img,xvda,w', ]
vif = [ 'bridge=brid0', ]
vcpus=1
on_reboot = 'destroy'
on_crash = 'destroy'
最后,我们使用virt-install
来创建虚拟机:
$ sudo virt-install -d -n CentOS7VM1 -r 1024 --vcpus=2 \
--bridge=brid0 --disk ./Centos.img \
--nographics -p -l "./Centos" \
--extra-args="text console=com1 utf8 console=hvc0 ks=./ks.cfg"
现在虚拟机应该启动并能够从 DHCP 服务器获取 IP;因此我们可以继续调整它并添加所需的服务。
对于 Xen 的使用,我们需要使用以下命令(我们将介绍最常见的命令。更多信息,请访问此链接www.centos.org/docs/5/html/Virtualization-en-US/virt-task-xm-create-manage-doms.html
):
- 连接到虚拟机:
$ sudo xm console CentOS7VM1
- 关闭或重启一个机器:
$ sudo xm shutdown CentOS7VM1
$ sudo xm reboot CentOS7VM1
- 要删除(终止)一个机器:
$ sudo xm destroy CentOS7VM1
- 暂停和恢复一个机器:
$ sudo xm suspend CentOS7VM1
$ sudo xm resume CentOS7VM1
- 重命名一个机器
$ sudo xm rename CentOS7VM1 CentOS7VM2
- 暂停,然后取消暂停一个机器:
$ sudo xm pause CentOS7VM1
$ sudo xm unpause CentOS7VM1
在 CentOS 7 上设置 KVM 进行完全虚拟化
KVM 只能支持硬件辅助的完全虚拟化。目前还在支持半虚拟化方面进行工作。KVM 是一个内核模块,只能与默认的 Linux 内核一起使用(不应该安装在 Xen 上)。KVM 使用一个名为Qemu-kvm的个性化版本的 Qemu 来创建虚拟机。
KVM 具有许多有用的功能和优势,由其 hypervisor 支持:
-
薄配置:这是分配灵活存储空间和管理虚拟机可用空间的能力
-
过度承诺:这是分配更多的 CPU 和内存资源的能力,超过了物理机上可用的资源
-
自动 NUMA 平衡:这是对在 NUMA 硬件上运行的应用程序的改进
-
磁盘 I/O 限制:这是管理虚拟机发送的物理系统磁盘输入和输出请求的限制的能力
-
虚拟 CPU 热添加功能:这是在没有任何停机时间的情况下调整虚拟机的处理能力的能力
在开始 KVM 安装之前,我们需要检查一些预安装步骤。首先,我们检查机器的 CPU 是否能够处理虚拟化技术:
$ sudo grep -e '(vmx|svm)' /proc/cpuinfo
要知道是否正确,我们需要查看命令输出中是否突出显示了vmx
或svm
字样:
然后,我们确保系统软件包都已更新:
$ sudo yum update
接下来,我们将 SELinux 的工作模式更改为宽松模式,以确保它不会干扰 KVM 的执行:
$ sudo nano /etc/sysconfig/selinux
然后,考虑这一行:
SELINUX=enforcing
将其更改为以下内容:
SELINUX=permissive
现在我们可以开始安装了。首先,我们将安装Qemu
软件包,以提供 KVM 的用户级和其磁盘映像管理器:
$ sudo yum install qemu-img qemu-kvm
然后,我们需要安装虚拟机管理的 GUI,命令行工具来管理虚拟环境,帮助从 CLI 创建虚拟机的工具,以及 hypervisor 库:
$ sudo yum install virt-manager libvirt libvirt-python libvirt-client xauth dejavu-lgc-sans-fonts
最后,对于 CentOS 7,我们添加了虚拟化客户端、虚拟化平台和虚拟化工具:
$ sudo yum groupinstall virtualization-client virtualization-tools virtualization-platform
完成了这一步,我们可以说我们已经安装了所需的工具和软件包。现在,我们进入配置部分。首先,我们需要重新启动虚拟化守护程序,以确保整个配置设置正确:
$ sudo systemctl restart libvirtd
然后,我们检查它是否运行良好:
$ sudo systemctl status libvirtd
我们应该看到这个输出:
现在,我们继续进行网络配置。我们需要创建一个桥接口,以允许客户系统访问外部网络。为此,我们必须启用 IP 转发:
$ sudo echo "net.ipv4.ip_forward = 1"|sudo tee /etc/sysctl.d/99-ipforward.conf
然后,我们检查它是否设置正确:
$ sudo sysctl -p /etc/sysctl.d/99-ipforward.conf
之后,我们需要通过保持原始接口不变来更改网络配置,但是我们将把其 IP 地址分配给桥接口:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
接下来,我们在文件末尾添加以下行并保存:
BRIDGE=virbrid0
然后,我们创建桥接口配置文件:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-brid0
之后,我们将以下代码放入我们刚刚打开进行编辑的文件中,并保存:
DEVICE="brid0"
TYPE=BRIDGE
ONBOOT=yes
BOOTPROTO=static
IPADDR="10.0.0.2"
NETMASK="255.255.255.0"
GATEWAY="10.0.0.1"
DNS1="8.8.8.8"
重新启动系统后,我们可以说网络配置已经设置好了。
在完成 KVM 安装和配置后,是时候开始使用主机了。我们需要做的第一件事是创建一个新的域或虚拟机。为此,使用 CLI,我们将使用virt-install
命令。首先,我们需要查看已知于我们的 KVM 安装的模板列表:
$ sudo virt-install --os-variant=list
我们需要一个 Linux OS 的 ISO 文件来用于安装。然后,我们可以开始设置新的虚拟机:
$ sudo virt-install --name=CentOS7guest --ram=1024 --vcpus=2 --cdrom=./CentOS-7.1-x86_64-minimal.iso --os-type=linux --os-variant=rhel7 --network bridge=brid0 --graphics=spice --disk path=/var/lib/libvirt/images/CentOS7.dsk,size=10
前述命令中的选项如下:
-
name
:这是虚拟机的名称 -
ram
:这是内存大小(以 MB 为单位) -
vcpus
:这是虚拟 CPU 的数量 -
cdrom
:这是 ISO 镜像的位置 -
os-type
:这是操作系统类型,如 Linux、Windows 或 Unix -
os-variant
:这是 OS 变体,如 rhel 6 或 Solaris -
network
:这是网络接口和连接 -
graphics
:这是客户端显示设置 -
disk path
:这是具有 10GB 大小的磁盘的位置
一旦我们发出了前述命令,virt-install
将创建一个虚拟机,并启动 OS 安装的virt
查看器控制台。
注意
总是有一个图形模式执行前面的处理。图形工具称为系统工具中的 virt-manager。
以下命令旨在更好地管理部署后的 KVM 虚拟机:
- 列出在 KVM 上运行的虚拟机:
$ sudo virsh --connect qemu:///system list
- 要获取有关虚拟机的更多信息:
$ sudo virsh dominfo CentOS7guest
- 停止运行的客户机:
$ sudo virsh --connect qemu:///system shutdown CentOS7guest
- 启动虚拟机:
$ sudo virsh --connect qemu:///system start CentOS7guest
- 要删除客户机:
$ sudo virsh --connect qemu:///system destroy CentOS7guest
$ sudo virsh --connect qemu:///system undefineCentOS7guest
$ sudo rm -f /var/lib/libvirt/images/CentOS7guest.img
- 最后,用于在主机系统启动时自动启动虚拟机的代码:
$ sudo virsh --connect qemu:///system autostart CentOS7guest
$ sudo virsh --connect qemu:///system dominfo CentOS7guest | grep Auto
在 CentOS 7 上设置 OpenVZ 虚拟化
OpenVZ 是一种我们称之为基于容器的新型虚拟化技术。它基本上在单个 Linux 服务器上创建多个安全和隔离的 Linux 容器。这种容器技术允许更好地利用服务器,因为我们不是安装完整的虚拟机,只是一个容器来容纳其中的一些内容,并且它消除了应用程序冲突。在 OpenVZ 平台上运行的虚拟机处于独立模式,它具有在不与同一平台上运行的任何其他虚拟机发生任何冲突的能力。这些机器彼此独立。
在 OpenVZ 上运行的虚拟机有自己的操作系统、IP 地址、进程、内存或存储空间、应用程序和配置文件等。
在使用 OpenVZ 时,虚拟化是通过系统级虚拟化技术运行的,其中客户系统使用与物理机系统相同的内核,不同于 KVM 和 VirtualBox,这有助于提高物理机处理能力和存储能力的使用效率。
为了更好地使用 OpenVZ,我们可能需要使用 QEMU 和 Virtuozzo 作为管理实用程序。我们真的建议在 Virtuozzo 镜像的 OpenVZ 容器和虚拟机上使用。
对于 CentOS 7,目前还没有可用的 OpenVZ 发行版。因此,我们将安装其分支项目 Virtuozzo 7,它能够实现所有 OpenVZ 选项以及更多功能。然而,我们将仅使用 OpenVZ 工具。
要安装 Virtuozzo 7,我们需要安装基于 RPM 的发行包。首先,我们需要将virtuozzo-release
包的元信息引入 YUM 存储库:
$ sudo yum localinstall http://download.openvz.org/virtuozzo/releases/7.0/x86_64/os/Packages/v/virtuozzo-release-7.0.0-10.vz7.x86_64.rpm
然后,我们安装必需的 Virtuozzo RPM 包:
$ sudo yum install -y prlctl prl-disp-service vzkernel
现在,我们已经安装了 OpenVZ 内核。我们继续进行内核参数配置:
$ sudo nano /etc/sysctl.conf
然后,我们添加以下代码:
# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled
net.ipv4.ip_forward = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0
# Enables source route verification
net.ipv4.conf.all.rp_filter = 1
# Enables the magic-sysrq key
kernel.sysrq = 1
# We do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
之后,我们使 SELinux 处于宽松模式,以确保 OpenVZ 正常工作:
$ sudo nano /etc/sysconfig/selinux
接下来,我们需要有配置行,使其看起来像下面这样:
SELINUX=permissive
这部分是可选的。如果需要,我们可以安装 OpenVZ 使用统计工具:
$ sudo yum install vzctl vzquota ploop
现在,我们已经成功安装了 OpenVZ,我们可以重新启动系统并通过 OpenVZ 内核登录。我们需要编辑 OpenVZ 配置文件,为物理和虚拟机设置相同的子网:
$ sudo nano /etc/vz/vz.conf
然后,我们找到并取消注释以下行,并将其选项更改为这样:
NEIGHBOUR_DEVS=all
现在,我们可以为 OpenVZ 设置一个基于 Web 的界面来帮助管理它。我们需要下载安装脚本并运行它:
$ sudo wget -O - http://ovz-web-panel.googlecode.com/svn/installer/ai.sh | sh
然后,使用 Firewalld 添加从中提供 Web 界面的端口:
$ sudo firewall-cmd --zone=public --permanent --add-port=3000/tcp
然后,重新加载 Firewalld:
$ sudo firewall-cmd --reload
基于 Web 的界面将在机器主机名或 IP 地址后跟端口号3000
上提供其 Web 界面:
http://<the-hostname>:3000
现在,我们将开始使用 OpenVZ 来下载一个容器并开始使用它。首先,我们需要指定一个文件夹来放置我们的容器:
$ mkdir OpenVZCont
$ cd OpenVZCont
然后,我们下载一个示例容器:
$ wget http://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
接下来,我们解压tar
文件:
$ tar –xzvf centos-7-x86_64-minimal.tar.gz
然后,我们输入此命令来创建我们的第一个虚拟机:
$ sudo vzctl create 101 --ostemplate centos-7-x86_64-minimal
我们的容器 ID 是101
,因为它们通常从100
开始。现在,我们为容器设置一个 IP 地址:
$ sudo vzctl set 101 --ipadd 10.0.0.14 --save
然后是 DNS 服务器:
$ sudo vzctl set 101 --nameserver 8.8.8.8 --save
在网络配置准备就绪后,我们可以启动我们新创建的容器:
$ sudo vzctl start 101
我们可以通过 ping 其 IP 地址来验证它是否正在运行:
$ ping 10.0.0.14
现在,我们可以登录到我们的容器中进行探索:
$ sudo vzctl enter 101
我们现在在新创建的容器中。我们可以随心所欲地使用它。要退出虚拟机,我们只需在终端中输入 exit。此外,使用 OpenVZ Web 界面,我们可以可视化其状态并通过它进行一些管理管理。
在 CentOS 7 上设置 VirtualBox 虚拟化
Oracle VirtualBox 是一个虚拟化应用程序,可以在多个计算机架构(Intel、基于 AMD 的系统)和几乎所有可用的操作系统(OSX、Linux、Windows、Solaris 等)上运行,它允许用户在同一台物理机器上运行多个操作系统。基本上,虚拟盒是一种完全虚拟化技术。
大多数人在使用多个系统时都依赖它,并且需要导出和导入模板虚拟机,虚拟盒提供了各种选项,可以在各种基础设施之间交换虚拟机。
本节将向您展示如何在 CentOS 7 上安装 Oracle VirtualBox 5.0.2。首先,我们需要将 VirtualBox yum 存储库添加到我们的系统中。因此,我们需要在 YUM 存储库目录中创建其 repo 文件:
$ sudo nano /etc/yum.repos.d/virtualbox.repo
然后,我们需要将以下代码放入文件并保存:
[virtualbox]
name=Oracle Linux / RHEL / CentOS-$releasever / $basearch - VirtualBox
baseurl=http://download.virtualbox.org/virtualbox/rpm/el/$releasever/$basearch
enabled=1
gpgcheck=1
gpgkey=http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
我们还应该安装 EPEL 存储库:
$ sudo rpm -ivh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
在开始安装之前,我们需要安装一些必要的软件包,以确保 VirtualBox 正常工作:
$ sudo yum install gcc make kernel-headers kernel-devel fontforge binutils patch dkms glibc-headers glibc-devel qt libgomp
然后,我们设置一个名为KERN_DIR
的环境变量,VirtualBox 将从中获取内核源代码:
$ export KERN_DIR=/usr/src/kernels/3.10.0-229.14.1.el7.x86_64
提示
我的最新内核版本存储在这个目录中:3.10.0-229.14.1.el7.x86_64
。由于升级,它可能会随时间而改变。
然后,我们可以使用 YUM 开始安装 VirtualBox:
$ sudo yum install VirtualBox-5.0
安装完成后,我们需要使用以下命令重建内核模块:
$ sudo systemctl start vboxdrv
现在,我们已经安装了 VirtualBox 并准备好使用。不过,VirtualBox 只支持图形界面,所以我们需要安装一个图形界面,然后我们可以启动并使用它。
我们需要在服务器上安装一个图形界面,我们有一个很长的列表可供选择。我建议使用 Gnome,因为它是最常用的界面之一,用户友好且资源消耗低。
使用 Gnome 作为图形界面,我们可以启动 VirtualBox:
$ sudo virtualbox &
然后,我们可以继续创建一个新的虚拟机。我们给它一个名称和类型,如下所示:
接下来,我们继续配置要分配的 RAM 数量,如下截图所示:
然后是磁盘空间的数量,如下所示:
VirtualBox 提供了一些额外的服务,允许原始系统的鼠标和键盘在物理机和虚拟机之间切换。要安装这些工具,我们可以转到 VM 菜单,然后选择Guest选项,然后安装虚拟机客户端工具。安装需要一些时间,然后我们需要重新启动虚拟机,以便这些工具可以开始工作。
最后,我们的虚拟机已准备好执行,如下截图所示:
在 CentOS 7 上设置 Docker
与 OpenVZ 使用容器技术相同的技术,Docker 是基于容器的软件虚拟化的另一种选择。Docker 因其自动部署应用程序的能力而闻名。这些模板或容器分为社区容器(由 Docker 社区提供的模板)和个人用户提供的私有容器。一些用户个性化的容器可以公开使用,其他的可以存储在可以被其创建者或他想要分享的人访问的私人文件夹中。Docker 容器是可移植的、轻量级的、封装的应用程序模块。
根据行业分析公司 451 Research 的说法:
"Docker 是一个工具,可以将应用程序及其依赖项打包到一个虚拟容器中,在任何 Linux 服务器上都可以运行。这有助于实现应用程序可以运行的灵活性和可移植性,无论是在本地、公共云、私有云、裸机等。"
要安装 Docker,我们将使用 Docker 安装脚本。在这里,我们还有另一种通过 YUM 安装 Docker 的方式——传统方式:
- 首先,我们需要确保我们的系统软件包已更新:
$ sudo yum update
- 然后,我们运行 Docker 安装脚本:
$ sudo curl -sSL https://get.docker.com/ | sh
-
此脚本将把 Docker 存储库添加到系统存储库,然后安装 Docker。
-
如果我们系统中要使用 Docker 的用户太多,我们需要将他们添加到 Docker 组中:
$ sudo usermod -aG docker packt
- 然后,我们启动 Docker 守护程序。将其添加到系统启动脚本中:
$ sudo systemctl docker start
$ sudo systemctl enable docker.service
- 要验证 Docker 是否正确安装,我们有一个简单的镜像容器可以测试:
$ sudo docker run hello-world
- 要下载一个 Docker 容器,我们需要查找它的名称,然后输入以下命令:
$ sudo docker pull centos7
- 要运行容器,我们需要使用
docker run
命令,使用-i
选项将stdin
和stdout
附加到容器,使用-t
选项分配一个tty
接口。
$ sudo docker run -i -t centos7 /bin/bash
-
要使 Docker 容器保持不丢失 shell 终端,我们需要按照以下顺序操作:同时按下
Ctrl-p
和Ctrl-q
。 -
要获取更多公开可用的 Web 社区容器,我们可以始终使用以下命令:
$ sudo docker search centos7
使用 HAProxy 建立服务的高可用性
对于这一部分,我们将简要展示如何设置高可用性/负载均衡器来控制特定服务的流量;在我们的案例中,我们将使用 HTTP 作为 Web 服务器的流量。
为此工作,我们使用 HAProxy 作为负载平衡和服务高可用性的开源解决方案,通过多个服务器。它通常用于网站的流量负载平衡。HAProxy 将工作负载分布到提供相同服务的许多服务器上(基本上是 Web 服务器、数据库等),以提高服务的整体性能和可靠性。
正如我们之前所说,本节将安装和配置高可用性负载均衡器,以在三个 Web 服务器和备用服务器之间共享负载,以便在服务器或服务故障时接管。
因此,我们将拥有一个看起来像这样的基础设施:
-
HAProxy 服务器:
-
操作系统:CentOS 7
-
IP 地址:172.25.25.166 和 10.0.0.10
-
主机名:haproxy.packt.co.uk
-
Web 服务器 1:
-
操作系统:CentOS 7
-
IP 地址:10.0.0.11
-
主机名:webserver1.packt.co.uk
-
Web 服务器 2:
-
操作系统:CentOS 7
-
IP 地址:10.0.0.12
-
主机名:webserver2.packt.co.uk
-
Web 服务器 3:
-
操作系统:CentOS 7
-
IP 地址:10.0.0.13
-
主机名:webserver3.packt.co.uk
-
备用 Web 服务器:
-
操作系统:CentOS 7
-
IP 地址:10.0.0.20
-
主机名:backupwebserver.packt.co.uk
首先,我们将开始设置 Web 服务器,为此,我们将仅使用安装后由 Apache 生成的默认页面。有关如何设置 Web 服务器的更多信息,您可以随时参考第三章,不同用途的 Linux。因此,我们只需要安装和运行 Apache,并且需要配置网络和机器的主机名。
首先,我们将使用 CentOS 7 YUM 的默认软件包管理器安装 Apache Web 服务器:
$ sudo yum install httpd
然后之后,我们配置主机名:
$ sudo nano /etc/hostname
并确保它看起来像这样:
Webserver1.packt.co.uk
之后,我们进入每个主机文件并将域配置为默认的本地主机,同时添加所有服务器及其 IP 地址的列表:
$ sudo nano /etc/hosts
注意
如果基础设施内没有可靠的 DNS 服务器可以解析所有基础设施服务器,则只需要此部分。
我们更改默认的本地主机地址127.0.0.1
域名:
127.0.0.1 webserver1 Webserver1.packt.co.uk
然后,我们添加以下行:
10.0.0.10 haproxy haproxy.packt.co.uk
10.0.0.11 Webserver1 Webserver1.packt.co.uk
10.0.0.12 Webserver2 Webserver2.packt.co.uk
10.0.0.13 Webserver3 Webserver3.packt.co.uk
10.0.0.20 backupWebserver backupWebserver.packt.co.uk
在完成之前,我们需要在 Web 服务器防火墙上打开 HTTPS 和 HTTPS 端口,以使服务对访问者可用:
$ sudo firewallcmd permanent zone=public addport=80/tcp
$ sudo firewallcmd permanent zone=public addport=443/tcp
$ sudo firewallcmd reload
通过这一步,我们可以说我们所有的 Web 服务器都准备好了。现在我们可以转到我们的 HAProxy 服务器安装。首先,我们需要为 Web 服务和 HAProxy 使用的日志接收打开所需的端口:
$ sudo firewallcmd permanent zone=public addport=80/tcp
$ sudo firewallcmd permanent zone=public addport=443/tcp
$ sudo firewallcmd permanent zone=public addport=514/udp
$ sudo firewallcmd reload
然后,我们可以开始安装:
$ sudo yum install haproxy
现在,我们进入配置部分。在进行主要的 HAProxy 配置之前,我们需要为调试设置 HAProxy 日志记录功能配置:
$ sudo nano /etc/haproxy/haproxy.cfg
在#全局设置选项下,我们需要确保以下行没有被注释掉:
log 127.0.0.1 local2 info
在Rsyslog
配置文件中也需要进行一些小的修改:
$ sudo nano /etc/rsyslog.conf
这是我们需要取消注释以下两行的地方:
$ModLoad imudp
$UDPServerRun 514
在完成之前,我们需要有一个代表HAProxy
在Rsyslog 日志
文件夹中的文件:
$ sudo nano /etc/rsyslog.d/haproxy.conf
在使用 Nano 创建时,我们需要在其中放入以下行:
local2.* /var/log/haproxy.log
保存文件,然后应用更改并重新启动Rsyslog 服务
:
$ sudo systemctl restart rsyslog.service
现在,我们可以进入 HAProxy 全局设置配置:
$ sudo nano /etc/haproxy/haproxy.cfg
首先,在默认部分,我们需要设置超时以获得更个性化的解决方案。由于我们的服务器只是进行负载平衡,我们可以始终使用端口 80。因此,我们需要接管该端口,通过删除其与Httpd
服务的关联来实现:
$ sudo nano /etc/httpd/conf/httpd.conf
然后,我们将监听端口更改为除 80 之外的任何其他端口。在我们的示例中,8080
:
Listen 8080
然后,我们转到主前端部分,更改 Web 界面提供服务的端口。因此,我们需要更改整个部分,使其看起来像以下内容:
Frontend HAProxy
bind *:80
reqadd X-Forwarded-Proto:\ http
default_backend HAProxy
并且我们需要注释掉Backend部分,以替换为以下内容:
# use_backend static if url_static
backend HAProxy *:80
mode http
stats enable
stats hide-version
stats uri /stats
stats realm Haproxy\ Statistics
stats auth haproxy:password # Change "password" with a well secured password
balance roundrobin
option httpchk
option httpclose
option forwardfor
cookie LB insert
server webserver1 10.0.0.11:80 cookie webserver1 check
server webserver3 10.0.0.12:80 cookie webserver2 check
server webserver3 10.0.0.13:80 cookie webserver3 check
server backupwebserver 10.0.0.20:80 check backup
我们需要确保文件的结尾与我们的基础设施 IP 地址和主机名匹配。然后,我们可以启动 HAProxy 服务器并将其添加到启动系统服务中:
$ sudo systemctl start haproxy.service
$ sudo systemctl enable haproxy.service
要验证配置文件没有错误,我们可以随时使用以下命令检查服务状态:
$ sudo systemctl status haproxy.service -l
然后,我们获取每个 Web 服务器并放置一个测试页面,以便访问并收集测试结果。然后,我们打开 HAProxy 的 Web 界面来可视化负载平衡的状态http://10.0.0.10/stats
或http://172.25.25.166/stats
。
如果我们看到以下界面,那意味着我们的高可用服务器正在正常运行。如果我们需要启用 https 以使用 SSL 访问 HAProxy 的 Web 界面,我们可以随时安装 OpenSSL 并配置我们的服务器以使用它。
参考资料
现在,让我们看一下本章中使用的参考资料:
-
VMware Documentation Center:
pubs.vmware.com/vsphere-51/index.jsp
-
VMware Virtualization:
www.vmware.com/virtualization.html
-
Full virtualization wiki:
en.wikipedia.org/wiki/Full_virtualization
-
Paravirtualization wiki:
en.wikipedia.org/wiki/Paravirtualization
-
Xen project wiki:
wiki.xen.org/wiki/Xen_Project_Software_Overview
-
KVM home page:
www.linux-kvm.org/page/Main_Page
-
OpenVZ home page:
openvz.org/Main_Page
-
VirtualBox home page:
www.virtualbox.org
-
Docker documentation:
www.modssl.org/docs/
-
HAProxy web page:
www.haproxy.org/
总结
本章以对虚拟化基础知识的简要描述开始。然后,我们定义了完全虚拟化和半虚拟化。接下来,为了更好地通过各种开源虚拟化工具实际地解释所有这些,我们从 Xen 作为半虚拟化和完全虚拟化解决方案开始。我们转向 KVM 作为完全虚拟化解决方案,容器虚拟化,OpenVZ 和 VirtualBox 工具。这通过其美丽的图形界面实现了简单的设置。
我们在本章中介绍了 Docker 及其从 Web 使用容器的方式。在本章结束时,我们可以说我们已经看到了各种虚拟化技术以及如何使用它们创建虚拟机。
在下一章中,我们将有机会探索云计算技术,并使用开源解决方案 OpenStack 应用一些示例。
第七章:云计算
通过互联网提供的新一代服务被称为云计算。在计算机行业,许多组织使用云计算,因为他们不喜欢购买可以解决其资源问题的设备,或者雇佣所需的管理和维护人员。云计算就像第三方数据源,提供各种功能来存储和处理数据。
在建立云计算环境的最佳解决方案列表中,我们选择了 OpenStack。在本章中,我们将简要介绍云计算是什么,以及如何使用 OpenStack 设置单个节点。
在本章的过程中,我们将涉及以下主题:
-
云计算概述
-
云计算服务
-
介绍 OpenStack
-
OpenStack 的组件
-
安装和设置 OpenStack
云计算概述
云计算是在不依赖本地机器的通常方式之外执行计算的能力。云计算依赖于共享资源来处理所需的计算或处理。它与网格计算具有相同的特点,两种技术都将其处理能力聚集起来解决或处理对独立机器(服务器或个人计算机)来说过于繁重的问题。
云计算的目标是利用高超级计算能力在面向消费者的应用程序中执行高级计算,例如金融、个性化信息传递、数据存储等。
为了执行这项艰巨的任务,云计算依赖于大量超强大的服务器(刀片…)通过极快的连接(InfiniBand(IB))连接在一起,以在它们的计算单元之间共享工作负载。这种基础设施运行在特别配置的系统上,它们被连接在一起以简化任务。一些基础设施依赖于虚拟化技术来增强其云计算。
简而言之,许多公司使用云计算的最精确原因是,它使它们能够将计算资源看作是一种实用工具,可以随着时间付费,而无需在现场拥有真正的硬件并承担管理和维护的负担。此外,云计算为企业提供了许多有趣的功能,例如:
-
弹性:根据需求扩展和缩减计算资源的能力
-
自助服务供应:根据需求提供所需数量的资源的能力
-
按使用量付费:衡量用户使用的资源的能力,使他们只需为他们使用的资源付费
云计算随着时间的推移发展迅速。然而,它始终保持着主要的三个核心服务:
-
软件即服务(SaaS)
-
平台即服务(PaaS)
-
基础设施即服务(IaaS)
软件即服务
SaaS 指的是在当前用户机器之外运行的每个应用程序,用户可以通过其 Web 浏览器访问其部分或全部服务,有时也可以通过仅作为演示界面的薄客户端应用程序访问。SaaS 应用程序通常可以在全球范围内使用任何可以访问互联网的设备(计算机、移动设备等)。使 SaaS 应用程序运行良好的是它是一种可扩展的应用程序,用户可以根据需要在尽可能多的虚拟机上处理其处理以满足负载需求。大多数云计算基础设施使用负载平衡系统在虚拟机之间组织负载,应用程序可以在没有任何中断的情况下继续运行并获得更好的执行结果。
来源:icorees.com/
SaaS 的特点如下:
-
其服务可供任何连接设备访问
-
登录后即可使用易于使用的应用程序
-
一切都存储在云上,分布在数百台机器上,配置良好,可以应对磁盘崩溃等灾难,此外用户数据和服务始终可用
-
应用程序的计算能力在需要时始终是可扩展的
我们可以区分一些我们每天使用的最著名的 SaaS,比如电子邮件服务(Gmail,Yahoo…),社交媒体和通讯工具(Facebook,Skype…)。我们使用这些日常服务所需的只是互联网连接和具有 Web 浏览器或移动设备的薄客户端应用程序。
平台即服务(PaaS)
PaaS 是一种为客户提供在基于云的环境中构建和部署应用程序的能力的服务。PaaS 在为用户提供可扩展性时就像 SaaS 一样。在部署他们的应用程序时,他们可以按需访问所需的资源来运行他们的应用程序,而无需购买、维护和管理应用程序运行所需的硬件,以及其背后的所有后勤工作。PaaS 已经得到很好的发展,为其客户提供了预先准备的模板,以简化在平台上的初始化。
使用 PaaS 相比传统解决方案有一些主要好处,如下所示:
-
加快了应用程序的开发,环境已经准备好,使其准备好上市
-
消除了管理中间件的复杂性,并简化了任务
-
简化了 Web 应用程序的部署
基础设施即服务(IaaS)
第三项服务是 IaaS,一种为用户提供建立完全合格基础设施所需的服务。IaaS 提供具有不同特征的服务器、网络设备和按需存储空间。基础设施的用户拥有管理其基础设施的所有权利,具有系统和网络管理员的所有权利。该服务为用户提供的不仅仅是基础设施,还有一种资源包(小型、中型和超大型计算能力和内存)来满足工作负载要求。正如我们之前所说,用户可以作为系统和网络管理员来部署他们的应用程序。然后他们需要建立他们的网络,安装所需的操作系统,并设置他们的机器,用户还需要手动维护、管理和更新他们的系统。
IaaS 的好处可以总结如下:
-
它消除了投资硬件的任务
-
与其他云解决方案一样,IaaS 可以根据需求进行可扩展,以满足用户对资源和设备的需求
-
根据用户需求提供各种灵活和创新的服务!基础设施即服务(IaaS)
云计算服务
在解释了不同类型的云计算之后,我们现在应该看一下这些服务是如何提供的。为此,我们将它们分类为三种主要类型:公共云、私有云和混合云。
公共云
我们将首先介绍公共云。公共云,顾名思义,是公开可用的云。通常,公共云服务可以根据用户愿意支付的金额进行扩展,无论是资源还是特殊服务。由于它在云上,用户不必担心硬件购买、管理和维护。大多数作为公共云提供的服务都是 SaaS,只有少数是 PaaS。大多数这些服务都是按需提供的。通常,用户支付的是他们使用的资源(CPU、内存、存储、互联网带宽)而不是服务本身。
来源:nextgenaccess.zserver.co.uk/
在公共云上共享资源出现在多个用户访问托管在一个或多个服务器上的相同服务的情况下,也在这些服务器需要处理客户发送的任务的情况下。一些基础设施比其他基础设施更好,因为它们可以处理非常繁重的流量;其他可能会发现这有些困难。在这个阶段,客户可能会在他们的应用程序中经历速度变慢,这确实会以不好的方式影响服务。
私有云
与公共云相比,私有云是一种专门为一个用户或一个组织提供的服务。被一个客户使用并不意味着它与任何其他云有所不同。它仍然可以由第三方公司或内部团队进行管理和管理。
大多数组织倾向于使用私有云,因为它具有分配和控制资源的优势。这与公共云不同,后者在多个用户之间共享。此外,公共云具有自助服务界面,可帮助简化系统管理员的资源管理和分配,以及更快的按需方法,更先进的安全协议以更好地保护用户数据的安全,以及帮助优化工作负载的先进自动化系统。
混合云
混合云是公共云和私有云的结合。更具体地说,私有云有时可能非常昂贵且难以调整,特别是对于不需要私有云提供的优势的小型应用。而公共云的解决方案并不那么昂贵,而且具有快速部署应用程序的优势,组织倾向于根据自己的需求混合使用这两种服务,这就是混合云变得流行的原因。混合云允许组织将重要数据保存在其私有云上,并在公共云上提供诸如 SaaS 之类的轻型服务,具有在需要时切换到所需服务的能力。
来源:www8.hp.com
介绍 OpenStack
我们现在已经彻底描述了云计算、其服务以及客户如何利用这些服务。现在,我们需要谈谈我们在其中的角色。了解如何使用云计算服务,例如 IaaS 来部署基础设施,对于系统管理员来说并不是最困难的任务。但每个系统管理员都应该知道如何部署并如何向他们的客户提供这些服务。在本节中,我们将探讨如何在我们的基础设施中运行云,并如何在我们的 CentOS 7 服务器上运行这些服务。为了执行这项任务,我们将使用 Linux 最著名的开源云解决方案之一,即 OpenStack,这是一个免费的云计算解决方案,可帮助启动、管理和维护所需资源(CPU、内存、网络和存储)的大量虚拟机。该基础设施通过用户友好的 Web 界面进行管理,帮助向系统管理员呈现节点的状态,并为他们提供轻松访问以管理基础设施资源。OpenStack 根据用户的需求提供开源和企业服务,因此被多个组织广泛使用。
今天,全球数百家组织使用 OpenStack 来维护他们的云基础设施,他们使用它来使他们的云解决方案正常运行,并且它被用于公共或私有云服务。大多数提供云服务的组织,无论是公共云还是私有云,都使用 OpenStack 提供 IaaS 服务。
OpenStack 在其 API 下管理三个主要部分:计算、网络和存储。通过这个 API,OpenStack 为其管理的基础设施创建了一个可持续的环境。
OpenStack 计算
OpenStack 计算是在客户端需求时提供计算资源,并管理已请求的资源。OpenStack 计算不仅提供客户端应用程序的运行情况,还通过组织资源和应用程序来确保服务本身的良好运行。OpenStack 计算可通过 Web 界面进行管理,也可通过 API 进行开发和构建应用程序。这种架构使得物理硬件的经济使用可以横向扩展。这项技术还管理和自动化了大量的计算资源,并与各种虚拟化技术兼容。
OpenStack 网络
OpenStack 网络是管理 OpenStack 管理的云资源的网络能力。这项技术确保连接云基础设施的网络资源始终可用,并且不包含任何瓶颈,只需执行网络管理员应该做的维护基础设施网络的任务。
OpenStack 网络提供了灵活的网络模型,以满足扁平网络、VLAN 配置、GRE 和 VXLAN 等需求。它提供了与普通物理网络硬件提供的相同服务,如路由、NAT 和 DHCP,以及静态 IP 关联。它还配备了一个智能系统,可以在故障或过载的情况下帮助重定向流量,以帮助维护更好的网络容量。OpenStack 网络不仅支持自动化网络管理,还为用户提供了手动管理网络的能力,通过调整适当的连接,连接服务器和终端。用户还可以利用软件定义的网络(SDN)技术进行多租户配置和大规模配置,如 OpenFlow。它还支持来自多个常见供应商的高级网络服务架构。最后,它提供了一个集成常见网络管理技术的高级扩展,如用于私人连接的 VPN,用于加固安全性的 IDS,用于设置访问规则的负载平衡和防火墙等。
OpenStack 存储
OpenStack 存储是 OpenStack 架构内提供的数据存储服务。通过其完全分布式的 API 存储平台,云应用程序可以通过多种技术和架构(归档、备份、数据保留)访问存储空间。OpenStack 存储始终是可扩展的,以满足用户和应用程序的需求,通过允许块设备相互添加并确保更好的性能。OpenStack 存储具有与 SolidFire 和 NetApp 等企业存储平台集成的能力。
OpenStack 的组件
OpenStack 是一个非常庞大的平台,拥有许多小组件,确保其服务的完整功能。其中大多数组件都是由开源社区制作的,以帮助满足用户的需求。在本节中,我们将讨论 OpenStack 社区组件作为其核心的一部分。这些组件的特点是它们由 OpenStack 社区维护,作为解决方案的一部分呈现出来。
来源:redhatstackblog.redhat.com/
这些组件描述如下:
-
Horizon:这是负责设置 OpenStack 仪表板的组件。这是 OpenStack 管理员管理基础设施的地方。到目前为止,它是 OpenStack 唯一的图形界面。Horizon 提供了对云基础设施中发生的事情的了解,并为系统管理员提供了一些管理功能。另一方面,仪表板不支持开发人员的访问。开发人员始终可以通过应用程序编程接口(API)访问云的资源和其他方面。
-
Nova:这是 OpenStack 的主要计算引擎。它是负责部署和管理云基础设施的虚拟机的主要组件,而不仅仅是一个小型基础设施或一组超级计算机。它还管理和组织其他实例,如处理云计算任务。
-
Neutron:这是 OpenStack 的网络组件。它基本上是确保云基础架构的不同组件之间进行网络通信的一个重要部分。它还支持多种技术,以确保通信可靠。
-
Keystone:这是负责识别 OpenStack 管理的服务。它组织使用云的用户,并组织他们的访问权限。它组织他们正在使用的资源。它还对开发人员跟踪用户使用和访问方法提供了很大帮助。
-
Swift:这是负责 OpenStack 存储系统的组件。它以一种先进的方法存储数据,开发人员只需将文件指定为信息的一部分,OpenStack 决定在哪里存储,这有助于扩展并解决存储容量问题。它使大多数常见任务,如备份和安全性,成为系统而不是开发人员的责任。
-
Cinder:这是一个较小的存储组件,用于组织块存储。它有助于增强磁盘驱动器中的数据访问,并根据需要以传统方式组织数据访问速度。
-
Heat:这是 OpenStack 的编排组件。它是一种存储有关云应用程序信息的方法,其中已经定义了该应用程序所需的资源,以更好地组织云基础设施。
-
Glance:这是组织硬盘的虚拟副本,即所谓的镜像,以便稍后用作部署新虚拟机的模板的组件。
-
Ceilometer:这是帮助个人用户云使用计费服务的组件。它充当一个报告系统使用情况的计量器,用户开始使用云的期间。
这些组件非常重要,其中一些依赖于其他组件,如果其中一些组件被禁用或排除,许多基本的云服务将不可用。其中一个非常重要的组件是编排组件,它有助于组织大量的机器并执行高性能计算而无需任何困难。
安装和配置 OpenStack
在对云计算和 OpenStack 进行简要解释之后,我们现在可以继续在 CentOS 7 Linux 服务器上安装 OpenStack。首先,我们将进行一些基本的环境配置,然后进行设置。
对于这个安装,我们将把我们的云基础设施设置如下:
-
路由器/网关服务器作为eth 机器,为外部网站提供互联网访问,IP 地址为:
10.0.1.1
-
托管 OpenStack 的云服务器,IP 地址为:
10.0.1.2
-
用于云计算的主机,其 IP 地址如下:
10.0.1.4
,10.0.1.5
,10.0.1.6
为了使 OpenStack 安全可靠,社区集成了许多服务,以确保其中一些服务通过加密数据传输来保护数据访问和用户认证。为此,我们需要在我们的云服务器上安装 OpenSSL,以便 OpenStack 可以使用它来运行其服务:
$ sudo yum install openssl
为了安全安装而没有错误,如果有防火墙,我们需要禁用它,就像这样:
$ sudo systemctl stop firewalld.service
然后我们需要确保服务器连接到本地网络并具有互联网访问权限。为此,我们需要 ping 本地网络上的一台机器和一个工作正常的网页服务器(www.google.co.in/
):
$ ping –c 5 10.0.1.1
PING 10.0.1.1 (10.0.1.1) 56(84) bytes of data.
64 bytes from 10.0.1.1: icmp_seq=1 ttl=255 time=1.21 ms
64 bytes from 10.0.1.1: icmp_seq=2 ttl=255 time=4.19 ms
64 bytes from 10.0.1.1: icmp_seq=3 ttl=255 time=4.32 ms
64 bytes from 10.0.1.1: icmp_seq=4 ttl=255 time=4.15 ms
64 bytes from 10.0.1.1: icmp_seq=5 ttl=255 time=4.01 ms
--- 10.0.1.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4007ms
rtt min/avg/max/mdev = 1.214/3.580/4.324/1.186 ms
$ ping –c 5 www.google.com
测试的结果应该如下所示:
然后我们需要添加所有涉及的节点(控制节点、网络节点、计算节点、对象存储节点和块存储节点):
$ sudo nano /etc/hosts
接下来,为了使节点之间同步良好,我们需要设置一个时间服务器来为所有服务器配置时间。为此,我们将使用 NTP 服务。但首先,我们需要安装它:
$ sudo yum install ntp
然后我们需要启动它,并使其在系统启动时运行:
$ sudo systemctl enable ntpd.service
$ sudo systemctl start ntpd.service
要验证安装,我们需要使用以下命令:
$ sudo ntpq -c peers
要查看此命令的输出,请参考以下内容:
$ sudo ntpq -c assoc
要查看此命令的输出,请参考以下内容:
我们需要在任何一行的条件列中看到sys.peer
。
注意
我们需要对所有涉及的节点执行相同的操作。
现在,我们将 SELinux 设置为宽松模式:
$ sudo nano /etc/selinux/config
然后考虑这一行:
SELINUX=enforcing
将其更改为以下行:
SELINUX= permissive
然后我们应该重新启动系统,以使更改生效。
系统启动后,我们可以继续进行软件包源配置。首先,我们需要确保我们的系统软件包都已更新:
$ sudo yum update –y
然后我们安装epel
仓库:
$ sudo yum install epel-release
接下来,我们检查额外的 EPEL 仓库是否已启用:
$ sudo nano /etc/yum.repos.d/epel.repo
我们需要确保所有模块([epel] [epel-debuginfo] [epel-source])都已启用:
enabled=1
然后我们继续安装 YUM 插件优先级,以在仓库内分配相对优先级:
$ sudo yum install yum-plugin-priorities
最后,我们可以设置 OpenStack 仓库:
$ sudo yum install https://repos.fedorapeople.org/repos/openstack/openstack-juno/rdo-release-juno-1.noarch.rpm
为了让 OpenStack 自动管理其服务的安全策略,我们需要安装 OpenStack-SELinux 包:
$ sudo yum install openstack-selinux
在安装 OpenStack 服务的官方包之前,我们将安装一些用于我们云计算平台 OpenStack 的 SELinux 策略所需的工具。我们将首先安装数据库服务器。为此,我们将安装 Python MySQL 库和 MariaDB 服务器:
$ sudo yum install mariadb mariadb-server MySQL-python
在安装了 MariaDB 之后,我们需要继续配置它。首先,我们需要启动数据库服务器并将其添加到系统启动项中:
$ sudo systemctl enable mariadb.service
$ sudo systemctl start mariadb.service
默认情况下,OpenStack 安装时为 root 用户设置了无密码策略。在第一次使用时,我们需要更改它以进行安全设置。
在这一点上,我们已经正确设置了所有所需的工具和配置。我们可以开始安装 OpenStack 包。我们可以单独安装每个 OpenStack 组件,或者通过同时安装和配置它们来加快速度。为此,我们将使用yum
包管理器:
$ sudo yum install -y openstack-packstack
对于单节点 OpenStack 部署,我们应该使用以下命令进行配置:
$ sudo packstack --allinone
我们应该看到以下消息开头,以确定安装是否正确完成并且配置已经正确启动。这可能需要一些时间来完成。
如果配置正确,将出现以下屏幕:
配置完成后,将生成两个用于管理员使用的身份验证凭据。第一个是用于 Nagios 服务器的。登录名和密码将显示在屏幕上,因此我们需要保存它们以便稍后更改密码。第二个是用于 OpenStack 仪表板的,它将存储在root
目录中的一个名为keystonerc_admin
的文件中。
两个 Web 界面中的第一个应该如此,以确认节点正在运行:
第二个界面看起来像以下截图所示:
现在我们可以继续进行网络桥接配置。我们需要创建一个桥接接口:
$ sudo nano /etc/sysconfig/network-scripts/ifcfg-br-ex
创建文件后,我们需要将以下代码放入其中:
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=10.0.1.2 # Old eth0 IP
NETMASK=255.255.255.0 # the netmask
GATEWAY=10.0.1.1 # the gateway
DNS1=8.8.8.8 # the nameserver
ONBOOT=yes
Now we've got to fix the eth0 configuration file to look like the following:
BOOTPROTO="none"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
NAME="eth0"
UUID="XXXXXXXXXX"
ONBOOT="yes"
HWADDR="XXXXXXXXXXXXXX" # this is the Ethernet network Mac address
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
然后我们将以下行添加到 Neutron 配置文件中,使其在[ovs]
模块中如下所示:
$ sudo nano /etc/neutron/plugin.ini
[ovs]
network_vlan_ranges = physnet1
bridge_mappings = physnet1:br-ex
接下来,我们重新启动网络:
$ sudo systemctl restart network.service
接下来的部分是可选的,我们将详细介绍如果我们以手动方式而不是自动交互方式运行会发生什么。
如果我们想要手动部署其他节点,我们应该使用packstack
和--install-hosts
选项,然后输入其他主机的 IP 地址:
$ sudo packstack --install-hosts=10.0.1.4
如果有许多主机,我们可以在 IP 地址之间添加逗号(,):
$ sudo packstack --install-hosts=10.0.1.4,10.0.1.5,10.0.1.6
在执行此命令时,我们将被要求分别输入每个系统的 root 密码,以连接到系统,安装 OpenStack 并接管它:
root@10.0.1.4's password:
当我们看到以下消息时,我们知道安装已完成:
**** Installation completed successfully ******
包含所有选择的配置选项的答案文件将保存在我们运行packstack
的系统的磁盘上。此文件可用于自动化未来的部署:
* A new answerfile was created in: /root/packstack-answers-XXXXXXXX-XXXX.txt
包含 OpenStack 管理员用户的身份验证详细信息的文件将保存在部署 OpenStack 客户端工具的系统的磁盘上。我们将需要这些详细信息来管理 OpenStack 环境:
* To use the command line tools you need to source the file /root/keystonerc_admin created on 10.0.1.4
我们可以交互式运行packstack
来创建单节点和多节点 OpenStack 部署:
$ sudo packstack
运行此命令后,我们需要按照部署节点的步骤列表进行操作。
首先,它将要求将公钥存储在服务器中以获得自动 SSH 访问权限,因此我们需要已经生成一个:
$ ssh-keygen –t rsa
然后我们给出其位置,即~/.ssh/id_rsa.pub
:
Enter the path to your ssh Public key to install on servers:
接下来,我们选择需要部署的服务。我们可以选择任何我们需要的:
Should Packstack install Glance image service [y|n] [y] :
Should Packstack install Cinder volume service [y|n] [y] :
Should Packstack install Nova compute service [y|n] [y] :
Should Packstack install Horizon dashboard [y|n] [y] :
Should Packstack install Swift object storage [y|n] [y] :
每个选择的服务都可以部署在本地或远程系统上。将根据我们稍后在部署过程中提供的 IP 地址来确定每个服务的部署位置。
OpenStack 包括许多客户端工具。输入y
来安装客户端工具。还将创建一个包含管理员用户的身份验证值的文件:
Should Packstack install OpenStack client tools [y|n] [y] :
可选地,packstack
脚本将配置部署中的所有服务器,以使用网络时间协议(NTP)检索日期和时间信息。要使用此功能,请输入逗号分隔的 NTP 服务器池:
Enter a comma separated list of NTP server(s). Leave plain if Packstack should not install ntpd on instances.:
可选地,packstack
脚本将安装和配置 Nagios,以提供对 OpenStack 环境中节点的高级监控设施:
Should Packstack install Nagios to monitor openstack hosts [y|n] [n] :
现在我们继续配置 MySQL 实例。OpenStack 服务需要 MySQL 数据库来存储数据。要配置数据库,我们按照以下步骤进行。
我们输入要在其上部署 MySQL 数据库服务器的服务器的 IP 地址:
Enter the IP address of the MySQL server [10.0.1.1] :
输入要用于 MySQL 管理用户的密码。如果我们不输入值,它将随机生成。生成的密码将在当前用户的~/.my.cnf
文件和答案文件中都可用:
Enter the password for the MySQL admin user :
OpenStack 服务使用 Qpid 消息系统进行通信。输入要部署 Qpid 的服务器的 IP 地址:
Enter the IP address of the QPID service [10.0.1.2] :
OpenStack 使用 keystone(openstack-keystone)提供身份、令牌、目录和策略服务。如果选择了 keystone 安装,则在提示时输入要部署 keystone 的服务器的 IP 地址:
Enter the IP address of the Keystone server [10.0.1.2] :
OpenStack 使用 glance(openstack-glance-*
)来存储、发现和检索虚拟机镜像。如果选择了 glance 安装,则在提示时输入要部署 glance 的服务器的 IP 地址:
Enter the IP address of the Glance server [10.0.1.2] :
为提供卷存储服务,OpenStack 使用 Cinder(openstack-cinder-*
)。输入要在其上部署 Cinder 的服务器的 IP 地址。如果选择了卷服务的安装,则将呈现这些额外的配置提示:
Enter the IP address of the Cinder server [10.0.1.2] :
packstack
实用程序期望用于 Cinder 的存储可用于名为 cinder-volumes 的卷组。如果此卷组不存在,则将询问我们是否要自动创建它。
回答“是”意味着packstack
将在/var/lib/cinder
中创建一个原始磁盘映像,并使用回环设备挂载它供 Cinder 使用:
Should Cinder's volumes group be createdi (for proof-of-concept installation)? [y|n] [y]:
如果我们选择让 packstack 创建 cinder-volumes 卷组,那么我们将被提示输入其大小(以GB为单位):
Enter Cinder's volume group size [20G] :
OpenStack 使用 Nova 提供计算服务。Nova 本身由许多互补的服务组成,必须部署这些服务。如果选择了计算服务的安装,则将呈现这些额外的配置提示。
Nova API 服务(openstack-nova-api
)为通过 HTTP 或 HTTPS 对 OpenStack 环境进行身份验证和交互提供 Web 服务端点。我们输入要在其上部署 Nova API 服务的服务器的 IP 地址:
Enter the IP address of the Nova API service [10.0.1.3] :
Nova 包括一个证书管理服务(openstack-nova-cert
)。输入要在其上部署 Nova 证书管理服务的服务器的 IP 地址:
Enter the IP address of the Nova Cert service [10.0.1.3] :
Nova VNC 代理提供了连接 Nova 计算服务的用户与其在 OpenStack 云中运行的实例的设施。输入要在其上部署 Nova VNC 代理的服务器的 IP 地址:
Enter the IP address of the Nova VNC proxy [10.0.1.3] :
packstack
脚本能够部署一个或多个计算节点。输入一个逗号分隔的列表,包含您希望在其上部署计算服务的所有节点的 IP 地址或主机名:
Enter a comma separated list of IP addresses on which to install the Nova Compute services [10.0.1.3] :
必须配置私有接口以在 Nova 计算节点上提供 DHCP 服务。输入要使用的私有接口的名称:
Enter the Private interface for Flat DHCP on the Nova compute servers [eth1] :
Nova
网络服务(openstack-nova-network
)为计算实例提供网络服务。输入要在其上部署Nova
网络服务的服务器的 IP 地址:
Enter the IP address of the Nova Network service [10.0.1.3] :
必须配置公共接口以允许其他节点和客户端的连接。输入要使用的公共接口的名称:
Enter the Public interface on the Nova network server [eth0] :
必须配置私有接口以在 Nova 网络服务器上提供 DHCP 服务。输入要使用的私有接口的名称:
Enter the Private interface for Flat DHCP on the Nova network server [eth1] :
所有计算实例都会自动分配一个私有 IP 地址。输入必须分配这些私有 IP 地址的范围:
Enter the IP Range for Flat DHCP [10.0.2.0/24] :
计算实例可以选择分配公共可访问的浮动 IP 地址。输入将分配浮动 IP 地址的范围:
Enter the IP Range for Floating IP's [10.0.1.0/24] :
Nova 调度程序(openstack-nova-scheduler
)用于将计算请求映射到计算资源。输入要部署Nova
调度程序的服务器的 IP 地址:
Enter the IP address of the Nova Scheduler service [10.0.1.4] :
在默认配置中,Nova 允许对物理 CPU 和内存资源进行“过度承诺”。这意味着可以为运行实例提供比实际上在计算节点上物理存在的这些资源更多的资源。
允许的“过度承诺”量是可配置的。
CPU“过度承诺”的默认级别允许为每个物理 CPU 插座或核心分配 16 个虚拟 CPU。按Enter接受默认级别,或者输入其他值(如果需要):
Enter the CPU overcommitment ratio. Set to 1.0 to disable CPU overcommitment [16.0] :
默认的内存超额分配级别允许分配的虚拟内存比物理计算节点上存在的内存多 50%。按Enter接受默认值,或者如果需要,输入不同的值:
Enter the RAM overcommitment ratio. Set to 1.0 to disable RAM overcommitment [1.5] :
如果选择安装客户端工具,则在提示时输入要在其上安装客户端工具的服务器的 IP 地址:
Enter the IP address of the client server [10.0.1.4] :
OpenStack 使用 Horizon(openstack-dashboard
)提供基于 Web 的用户界面或仪表板,用于访问 OpenStack 服务,包括 Cinder、Nova、Swift 和 Keystone。如果选择安装 Horizon 仪表板,则将请求这些额外的配置值。
输入要在其上部署 Horizon 的服务器的 IP 地址:
Enter the IP address of the Horizon server [10.0.1.4] :
要启用与仪表板的HTTPS
通信,我们在提示时输入y
。启用此选项可确保用户访问仪表板时进行加密:
Would you like to set up Horizon communication over https [y|n] [n] :
如果我们已经选择安装Swift
对象存储,那么将会请求这些额外的配置值。
输入要充当 Swift 代理的服务器的 IP 地址。此服务器将充当客户端和 Swift 对象存储之间的公共链接:
Enter the IP address of the Swift proxy service [10.0.1.2] :
输入逗号分隔的设备列表,Swift 对象存储将使用这些设备来存储对象。每个条目必须以 HOST/DEVICE 格式指定,其中 Host 由设备附加到的主机的 IP 地址替换,Device 由设备的适当路径替换:
Enter the Swift Storage servers e.g. host/dev,host/dev [10.0.1.2] :
Swift
对象存储使用区域来确保给定对象的每个副本都是单独存储的。一个区域可以代表一个独立的磁盘驱动器或阵列,一个服务器,一个机架中的所有服务器,甚至整个数据中心。
在提示时,输入必须定义的 Swift 存储区域的数量。请注意,提供的数量不能大于指定的各个设备的数量,如下所示:
Enter the number of swift storage zones, MUST be no bigger than the number of storage devices configured [1] :
Swift 对象存储依赖复制来维护对象的状态,即使在一个或多个配置的存储区域中发生存储中断的情况下。在提示时输入 Swift 必须保留每个对象的副本数量。
建议至少使用三个副本来确保对象存储具有合理的容错性。但是请注意,指定的副本数量不能大于存储区域的数量,否则会导致一个或多个区域包含同一对象的多个副本:
Enter the number of swift storage replicas, MUST be no bigger than the number of storage zones configured [1] :
目前,packstack
支持使用Ext4
或XFS
文件系统进行对象存储。默认和推荐的选择是ext4
。在提示时输入所需的值:
Enter FileSystem type for storage nodes [xfs|ext4] [ext4] :
packstack
实用程序允许我们配置目标服务器以从多个来源检索软件包。我们可以将此部分留空,以依赖节点的默认软件包来源:
Enter a comma-separated list of URLs to any additional yum repositories to install:
在这一点上,我们将被要求确认我们提供的部署细节。输入 yes 并按Enter继续部署。然后,它将显示整个阶段已经提供的所有信息。在验证一切设置正确后,我们对以下问题输入 yes:
Proceed with the configuration listed above? (yes|no): yes
现在,packstack
将开始部署。请注意,当packstack
设置 SSH 密钥时,它将提示我们输入根密码,以连接到尚未配置为使用密钥身份验证的机器。
将 Puppet 清单应用于部署中涉及的所有机器需要大量时间。packstack
实用程序提供持续更新,指示正在部署哪些清单,随着部署过程的进行。一旦过程完成,将显示确认消息:
**** Installation completed successfully ******
(Please allow Installer a few moments to start up.....)
Additional information:
* A new answerfile was created in: /root/packstack-answers-xxxxx-xxxxx.txt
* Time synchronization was skipped. Please note that unsynchronized time on server instances might be a problem for some OpenStack components.
* To use the command line tools source the file /root/keystonerc_admin created on 10.0.1.2
* To use the console, browse to http://10.0.0.2/dashboard
* The installation log file is available at: /var/tmp/packstack/xxxx-xxxx-TkY04B/openstack-setup.log
You have mail in /var/spool/mail/root
You have successfully deployed OpenStack using packstack.
我们提供的配置详细信息也记录在答案文件中,可以用于将来重新创建部署。此答案文件默认存储在~/answers.txt
中。
通过这一步,我们可以说我们已经很好地安装和配置了 OpenStack 作为一个云计算解决方案,用于在 CentOS 7 Linux 服务器的小型基础设施内使用。
OpenStack 仪表板将是我们最好的方式,以更清晰的方式可视化有关云基础设施状态的有用信息。对于系统管理员来说,这非常有用,可以维护基础设施并排除任何问题。以下是一些显示仪表板概览页面的屏幕截图:
接下来的页面显示了正在运行的机器(节点)的列表,并提供了一些有关节点的有用信息,还为我们提供了一些管理它们的选项。
然后我们将看到网络页面,显示持有云节点的网络拓扑。
另外还有一个 Nova API 仪表板,具有更好设计的界面,用于展示,并且有一个特别用于监视大型网格计算基础设施的巨大仪表板屏幕。第一个仪表板屏幕显示了有关正在使用的 API 的信息:
来源:openstack-in-production.blogspot.com
第二个仪表板屏幕显示了这些 API 执行的历史以及呈现的日志:
来源:openstack-in-production.blogspot.com
参考资料
现在,让我们看一下本章中使用的参考资料:
-
什么是云计算?IBM:
www.ibm.com/cloud-computing/what-is-cloud-computing.html
-
OpenStack 主页:
www.openstack.org/
-
Redhat 的 OpenStack 平台:
access.redhat.com/documentation/en/
总结
本章描述了如何在小型或大型计算基础设施中拥有开源云计算解决方案。我们首先定义了云计算的概念,然后介绍了 OpenStack 并简要描述了其组件。我们展示了一种实际的方法来设置和配置 OpenStack 节点,选择使用其所有组件。
在下一章中,您将学习使用最近的工具之一进行自动系统配置的方法,这种方法组织得很好——Puppet。
第八章:配置管理
根据一项研究,大型 IT 系统中发生的大多数关键错误都是由于人和流程造成的。其中一半的错误是由于发布同步不足、机器之间的协调以及配置管理不足造成的。大型机械和基础设施对于任何一个团队来说都太难管理和维护了。为了让所有机器都能同步工作,需要为每台机器设置相同的配置集,这对管理团队来说是一场噩梦。因此,我们有一个叫做配置管理(CM)的流程。
在本章中,我们将描述如何使用 CM 流程来维护和管理 CentOS 7 Linux 服务器基础设施。我们将简要描述一些最常见的开源配置管理工具,并举例说明如何使用 Puppet 设置管理服务器和客户端。
通过本章,您将学习以下主题:
-
操作系统配置管理
-
开源配置管理工具
-
Puppet 服务器和客户端的安装和配置
介绍配置管理
配置管理是一个帮助组织多台机器/系统,使它们能够协调执行一个较大过程或运行多个冗余过程的流程。它被军事组织广泛使用来管理其系统,如武器系统、车辆和信息系统。在军事之外,它在 IT 服务管理中被广泛用于大型基础设施处理。
仍然有许多 IT 组织使用旧的传统工具,如定制脚本(shell 脚本、expect 脚本等)和手动流程实施来运行重复任务。我们已经充分认识到,这些技术已不再有效,特别是在大规模基础设施中使用时。即使对于小型基础设施,由于配置不断变化,很难跟踪和维护它们。所有这些可能会直接影响基础设施本身的可靠性,也可能影响组织的生产力。
自动化配置管理已经结束了手动脚本编写和配置;它还被用于执行大多数系统管理员每天都要做的其他任务(系统更新、固件补丁、发布更新和管理等)。
对于新一代系统管理员来说,一切都是自动化的。大多数机器都运行在相同的配置集上,并有一组服务器来管理它们。一切都由监控工具监视。系统管理员的工作是初始化他们基础设施的基本配置,启动他们的配置管理服务器,如果需要在其他机器上设置客户端,然后开始向客户端发送配置以应用它。配置管理服务器将充当 Puppet 的主人,并向它们发送直接命令,无论它们的架构或操作系统类型如何。
来源:flylib.com/
对于我们的情况,我们将设置一个 CentOS 7 服务器来控制一个使用配置管理的 CentOS 7 客户端,我们将向您展示手动配置是多么耗时和不可靠。在此之前,我们将向您展示一些用于配置管理的著名开源工具的列表:
开源配置管理工具
在这一部分,我们将列举世界上最著名的开源配置管理工具,介绍每个工具的描述、主要重点以及它可以发挥作用的领域。
厨师
Chef 是一个配置管理工具,帮助我们配置和维护提供各种服务的服务器。Chef 使用称为配方的东西,用于描述服务器应用程序和实用程序的所需管理(配置,安装,更改)。由于其自动提供和配置新机器的能力,Chef 被广泛用于基于云计算的基础设施(如 Rackspace,Internap,Amazon,Google,OpenStack,SoftLayer 和 Microsoft)。Chef 的可扩展性使其能够根据需求用于小型和大型基础设施。
Chef 可以作为服务器或客户端执行。客户端在我们想要使用服务器管理的服务器/机器上执行。并且 Chef 服务器代理安装在一个集中的服务器上,它根据管理员为每个节点定义的内容(Web 服务器,集群机器,存储服务器等)来管理配方。然后客户端执行服务器发送给它的配方。默认情况下,客户端每 30 分钟从服务器更新其配方,以查看是否有任何需要更改的内容。
在项目开始时,Chef 只用于管理 Linux 机器,但现在它也能够管理 Windows 机器。Chef 服务器现在受到多个 Linux 平台的支持(RHEL/CentOS,FreeBSD,OSX,Solaris 等)。
这是在安装了 Chef 之后的架构。第一张图片显示了 Chef 与各种可以管理的节点之间的交互。
来源:www.yet.org
以下截图显示了 Chef 与亚马逊网络服务之间的交互,以用于高级配置
来源:www.chef.io/
注意
有关如何设置和掌握 Chef 的更详细信息,请查看 Packt 关于 Chef 的其他图书:www.packtpub.com/all/?search=chef
SaltStack(Salt)
SaltStack 是一个基于 Python 的开源配置管理工具。它也被称为远程引擎。在某种程度上,这是基础设施管理的一种新方法。它易于运行,可扩展,可以处理数千个节点,并且可以在其节点之间(服务器,终端等)建立非常快速的通信。
由于其内部基础设施中的动态通信而闻名,Salt 能够通过其节点组织,执行和建立配置管理,以及更多。
它适用于各种操作系统(CentOS,Debian,RHEL,Ubuntu,甚至 Windows)。
Salt 被设计为非常可扩展,具有使用模块管理的能力,以便塑造成各种应用程序。Salt 提供动态模块来管理其组件的远程执行和管理。它们分为以下几类:执行模块,状态模块,颗粒,渲染器模块,返回器和运行器。
SaltStack 有一个付费产品叫做 SaltStack Enterprise。它专为 IT 组织,系统管理,站点可靠性工程和现代数据中心基础设施,应用程序和代码的开发配置和管理而设计。它在下图中简要描述了,显示了它如何涵盖各种领域,以帮助建立,管理和维护以下两个图中显示的服务:
这张图显示了三个主要服务(ITOps,DevOps,CloudOps)之间的交互,以及使用 SaltStack 来一起管理它们的能力。
SaltStack 服务按照下图所示的几个步骤运行:
注意
有关如何设置和掌握 SaltStack 的更详细信息,请查看 Packt 关于 SaltStack 的其他图书:www.packtpub.com/all/?search=saltstack
。
Ansible
Ansible 是一个免费且简单的配置管理解决方案。它以自动化配置管理而闻名,依靠 SSH 访问节点,并通过基于 Python 的解决方案对其进行配置。它使用了最少的依赖和环境工具(如客户端代理),并且是安全的。它也非常可靠,不需要非常高级的学习课程就能开始使用它。
它的配置需要编辑一些人类可读的配置文件,以确保每个人都能理解它们,如果需要更新或重新配置。它只需要 SSH 密码或 SSH 密钥来访问要管理的节点,无需安装代理。因此,绝对不需要担心由于升级、补丁或守护进程故障而导致代理未运行。
Ansible 也支持模块。基本上,大多数模块都是基于 JSON 运行的,并且它支持所有种类编程语言的标准输出。它还包括了 200 多个模块,可以用来管理和自动化服务。
它得到了 RHEL 社区(Red Hat、Fedora、CentOS 和 Scientific Linux)的良好支持。可以通过 EPEL 存储库轻松下载。它还受到 Debian 家族的其他 Linux 发行版以及其他类 Unix 系统(如 OS X、BSD)和最近的 MS Windows 的支持。
注意
有关如何设置和掌握 Ansible 的更详细信息,请查看 Packt 关于 Ansible 的其他图书:www.packtpub.com/all/?search=ansible
Puppet
Puppet 是一个开源的配置管理工具,旨在管理和配置同一基础架构内的机器,简化各种系统管理任务,用户可以使用不同的方式(Ruby DSL、Puppet 声明语言等)声明机器的状态和资源。它是在 GPL 和 Apache 许可下发布的。主要用于管理和配置基于 Unix 的机器和 Microsoft 系统。为了建立 Puppet,最佳实践是需要一个 Puppet 服务器代理来扮演配置管理服务器的角色,对于其他节点,即服务器将要管理的节点,我们需要客户端版本。Puppet 检查每个节点的配置,然后识别其配置文件中指定的旧配置和新配置之间的更改,如果有的话。然后开始进行必要的更改,以调整节点到指定的状态。这个任务不仅对建立新配置有用,而且对于在机器出现问题时恢复配置也很有用。
基本上,Puppet 的主要优势在于它自动化了软件交付过程的每一步,从物理和虚拟机器的供应到组织和报告。Puppet 被许多组织广泛使用,因为它具有以下功能:
-
它旨在在问题解决过程中防止重复
-
它具有使快速和可重复的自动配置的能力
-
它简化了对物理和虚拟设备的管理
-
它使系统管理任务变得更加容易
Puppet 提供两种服务:一种是开源免费解决方案,另一种是面向企业的付费解决方案。它们都可以帮助系统管理员自动化基础设施配置管理。Puppet Enterprise 为大型企业提供了更多的功能。
Puppet 不仅仅是一个简单的配置管理工具。它是一个简化节点安装、管理和修复的解决方案,简化了节点网格的管理。
如下图所示,要使用 Puppet 建立新的配置,需要遵循四个重要步骤:定义、模拟、执行和报告。在这里,系统管理员首先定义需要设置的配置类型。然后,Puppet 在不损害基础设施的情况下测试部署,并确保它能正常工作。之后,Puppet 开始比较新的内容和已经使用的内容,并开始执行满足用户需求的操作。最后,它在仪表板上报告每个节点的状态。
安装和配置 Puppet
对于我们的 Puppet 安装,我们将安装 Puppet 的免费开源版本。
我们选择 Puppet 作为我们的主要配置管理解决方案,因为 Puppet 是一种更具声明性的解决方案。这使得它比其他解决方案更具吸引力,用于损坏修复。
Puppet 有两种可能的架构:Agent/Master 架构或独立架构。Agent/Master 架构基于一个或多个 Puppet 主控服务器管理运行 Puppet 客户端代理的服务器/节点。在独立架构中,客户端节点同时作为主控和从属代理运行 Puppet。通常用于安排管理任务或作业到安装了 Puppet 的机器上。
在本章中,我们将使用客户端/主控架构,我们将使用两台 CentOS 7 服务器;一台将用作主 Puppet 服务器,另一台将用作 Puppet 代理运行的客户端。
在开始安装之前,我们需要确保完成一些预安装任务。我们已经决定了架构,因此我们更清楚将要安装哪些软件包。
然后我们应该确定哪台机器将充当 Puppet 服务器代理。我们应该始终从安装服务器开始,然后再转向客户端。
下图展示了 Puppet 主控和客户端之间在 Puppet 主控界面上尝试建立经理请求的更改时的交互:
来源:elatov.github.io/2014/08/setting-up-puppet-master-on-centos-7/
我们的基础设施将包括以下内容:
-
Puppet 主控服务器:
-
操作系统:
CentOS 7
-
IP 地址:
10.0.0.10
-
主机名:
masterpuppet.packt.co.uk
-
第一个客户端服务器:
-
操作系统:
CentOS 7
-
IP 地址:
10.0.0.11
-
主机名:
webserver1.packt.co.uk
-
第二个客户端服务器:
-
操作系统:
CentOS 7
-
IP 地址:
10.0.0.12
-
主机名:
webserver2.packt.co.uk
通常,我们应该检查客户端和基础设施服务器所使用的 Linux 版本和系列。在我们的情况下,我们已经定义了所有环境中的机器都使用 CentOS 7。
之后,Puppet 架构将通过网络进行管理,因此我们应该确保所有节点(服务器和客户端)都配置良好以运行 Puppet 流量。我们需要在服务器上打开默认的 Puppet 访问端口 8140,以便客户端可以访问它:
$ sudo firewall-cmd --permanent --zone=public --add-port=8140/tcp
$ sudo firewall-cmd --reload
最后,对于网络,我们应该将所有节点配置为唯一的主机名,并且每台机器的/etc/hosts
文件中都需要定义所有其他机器的 IP 地址:
$ sudo nano /etc/hosts
10.0.0.10 masterpuppet.packt.co.uk
10.0.0.11 webserver1.packt.co.uk
10.0.0.12 webserver2.packt.co.uk
为了确保所有确认在节点之间同步,我们需要建立一个网络时间服务器(使用 NTP)连接,使所有节点与相同的时间同步:
现在我们可以开始安装我们的 Puppet 服务器:
- 第一步是启用提供 Puppet、PuppetDB 和其他软件包的 Puppet 开源存储库。我们将使用 RPM 将 Puppetlabs 文件添加到系统中:
$ sudo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
- 然后我们安装 Puppet 服务器:
$ sudo yum install puppet-server
-
我们需要接受安装管理器可能询问的所有内容,例如 RPM-GPG-Key 验证,以及是否要安装软件包。
-
然后我们需要配置 Puppet 以理解这个节点是主 Puppet 服务器:
$ sudo nano /etc/puppet/puppet.conf
- 接下来,我们需要在
[main]
部分下添加这两行:
dns_alt_names = masterpuppet,masterpuppet.packt.co.uk
certname = masterpuppet.packt.co.uk
- 由于这是我们的 Puppet 服务器,我们需要创建它的证书。我们需要手动启动 Puppet 服务器,直到它创建所需的证书为止。之后,我们需要停止它,因为我们仍在运行配置:
$ sudo puppet master --verbose --no-daemonize
- 在收到以下消息后,我们需要按 Ctrl + C 停止服务:
Notice: Starting Puppet master version 3.8.4
在这一点上,我们可以启动 Puppet。但我们希望将 Puppet 服务与 Apache 集成,使其成为一个可以通过安装特殊模块同时提供服务的服务。为此,我们需要安装一些有用的软件包:
$ sudo yum install mod_passenger curl curl-devel make automake httpd httpd-devel mod_ssl ruby-devel rubygems gcc gcc-c++ pygpgme zlib-devel openssl-devel
然后我们需要安装 Passenger,这是一个开源工具,我们将使用它来安装一些 Apache 插件,以帮助开发 Puppet Web 服务器。对于安装任务,我们将使用 GEM,这是一个用于安装基于 Ruby 的软件包的 Ruby 工具:
$ sudo gem install rack passenger
从那时起,我们可以安装 Passenger Apache 模块。对于 CentOS 7,我们需要找到可执行文件。在安装过程中,它不会在 BIN 环境中设置其二进制文件。因此,我们需要从安装位置执行它:
$ sudo locate passenger-install-apache2-module
$ sudo /usr/local/share/gems/gems/passenger-5.0.21/bin/passenger-install-apache2-module
之后,我们按照最后一个命令提供的说明进行操作。
首先,我们需要输入1
来安装 Apache 2 模块:
1\. The Apache 2 module will be installed for you.
然后每当程序询问时,我们只需输入Enter。我们可以忽略警告,并希望不会出现错误。否则,我们需要确保我们之前已安装了所有所需的工具。当我们看到错误和警告摘要,并收到以下消息时,我们知道已完成:
Phusion Passenger is a registered trademark of Hongli Lai & Ninh Bui.
接下来,我们创建两个目录,Puppet 将在其中生成其公共和临时文件,并将所有权设置为其配置文件:
$ sudo mkdir -p /usr/share/puppet/rack/puppetmasterd/public /usr/share/puppet/rack/puppetmasterd/tmp
$ sudo cp /usr/share/puppet/ext/rack/config.ru /usr/share/puppet/rack/puppetmasterd/
$ sudo chown puppet:puppet /usr/share/puppet/rack/puppetmasterd/config.ru
最后,我们在 Apache2 配置目录中创建 Puppet 虚拟主机文件,如下所示:
$ sudo nano /etc/httpd/conf.d/puppetmaster.conf
我们填写以下配置选项,根据我们在不同环境中配置的内容更改红色文本:
# CentOS 7:
# Set those as the Gems and Passenger version installed on your system
LoadModule passenger_module /usr/local/share/gems/gems/passenger-5.0.21/buildout/apache2/mod_passenger.so
PassengerRoot /usr/local/share/gems/gems/passenger-5.0.21/
PassengerRuby /usr/bin/ruby
# And the passenger performance tuning settings:
PassengerHighPerformance On
PassengerUseGlobalQueue On
# Passenger Max Pool should be configured as 3/2 the number of CPU cores of the master machine:
PassengerMaxPoolSize 4
# Limit number of request before recycling
PassengerMaxRequests 1000
# Limit time for process to set as idle
PassengerPoolIdleTime 600
Listen 8140
<VirtualHost *:8140>
SSLEngine On
# Only allow high security cryptography. Alter if needed for compatibility.
SSLProtocol All –SSLv3
SSLCipherSuite HIGH:!ADH:RC4+RSA:-MEDIUM:-LOW:-EXP
SSLCertificateFile /var/lib/puppet/ssl/certs/unixmen-centos7.arnhem.chello.nl.pem
SSLCertificateKeyFile /var/lib/puppet/ssl/private_keys/unixmen-centos7.arnhem.chello.nl.pem
SSLCertificateChainFile /var/lib/puppet/ssl/ca/ca_crt.pem
SSLCACertificateFile /var/lib/puppet/ssl/ca/ca_crt.pem
SSLCARevocationFile /var/lib/puppet/ssl/ca/ca_crl.pem
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +StdEnvVars +ExportCertData
# These request headers are used to pass the client certificate
# authentication information on to the puppet master process
RequestHeader set X-SSL-Subject %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-DN %{SSL_CLIENT_S_DN}e
RequestHeader set X-Client-Verify %{SSL_CLIENT_VERIFY}e
#RackAutoDetect On
DocumentRoot /usr/share/puppet/rack/puppetmasterd/public/
<Directory /usr/share/puppet/rack/puppetmasterd/>
Options None
AllowOverride None
Order Allow,Deny
Allow from All
</Directory>
</VirtualHost>
我们将 SELinux 设置为宽松模式,以便新模块可以使用资源:
$ sudo nano /etc/selinux/config
接下来,我们将 SELINUX 选项更改为如下所示:
SELINUX=permissive
然后我们需要重新启动 Apache 服务,并将其添加到系统启动服务中,同时禁用 Puppet 服务:
$ sudo systemctl restart httpd.service
$ sudo systemctl enable httpd.service
$ sudo systemctl disable puppetmaster.service
完成了这一步,我们可以说我们已经完成了服务器的配置。现在我们可以继续设置和配置客户端。
正如我们之前所说,我们需要确保/etc/hosts
文件配置正确,并且所有节点(无论是客户端还是服务器)都在其中。此外,我们需要确保 NTP 服务正在运行,并且正在加载与我们的服务器相同的时间服务器的时间。通常,我们可以使用系统默认设置,这样就可以正常工作。
$ sudo yum install ntp ntpdate
$ sudo systemctl start ntpd
$ sudo systemctl enable ntpd
与服务器一样,我们对客户端配置 Puppet 存储库做同样的事情:
$ s
udo rpm -ivh https://yum.puppetlabs.com/puppetlabs-release-el-7.noarch.rpm
然后我们安装 Puppet 客户端代理:
$ sudo yum install puppet
接下来,在启动服务之前,我们需要将 Puppet 主服务器 ID 添加到客户端代理配置文件中。因此,我们继续编辑 Puppet 配置文件。我们在代理选项下添加服务器地址:
$ sudo nano /etc/puppet/puppet.conf
[agnet]
server = masterpuppet.packt.co.uk
report = true
pluginsync = true
然后我们保存文件,启动服务,并将其启用为系统启动服务:
$ sudo systemctl enable puppet.service
$ sudo systemctl start puppet.service
我们需要为所有客户端服务器执行相同的操作。
之后,我们返回到我们的 Puppet 服务器并检查证书是否已发送:
$ sudo puppet cert list
我们应该看到类似于这样的东西:
"webserver1.packt.co.uk" (SHA256) 04:55:E0:82:4E:AD:7F:3C:9C:C7:52:79:98:ED:5E:A6:B0:B5:85:08:DC:81:E5:2D:A6:32:ED:8B:5C:F4:3B:DA
这意味着我们有一个客户端请求服务器批准证书请求。我们可以使用以下命令签署每个服务器证书:
$ sudo puppet cert sign webserver1.packt.co.uk
现在我们可以返回到客户端检查证书是否已成功设置,使用以下命令:
$ sudo puppet agent -t
如果我们得到以下输出,就表示它已经配置好了:
此时,我们的 Puppet 主服务器和客户端基础设施运行良好。让我们尝试从 Puppet 服务器创建配置并将其发送到客户端以应用它。
我们需要在/etc/puppet/manifest
文件夹中创建一个名为site.pp
的清单文件,如下所示:
$ sudo nano /etc/puppet/manifests/site.pp
然后我们通过使客户端节点(webserver1
和webserver2
)测试服务并安装一些工具。我们需要将以下代码添加到最后打开的文件进行编辑:
node 'webserver1', 'webserver2 {
package { 'php' :
ensure => installed,
}
}
要验证 Puppet 是否正常运行,我们可以随时转到客户端并输入以下内容:
$ sudo puppet agent --test
默认情况下,Puppet 代理将每 30 分钟检查一次 Puppet 服务器,以查看是否有任何更改发生,以便应用它。因此,在测试期间,我们可以随时强制手动更新,就像我们之前做的那样。更新时间可以通过在 Puppet 配置文件中的[main]
部分进行更改来更改,如下所示:
$ sudo nano /etc/puppet/puppet.conf
runinterval = 900 # To make change every 15 minutes (60 x time in minutes)
然后我们可以更改它以安装服务并确保其运行:
node 'webserver1', 'webserver2 {
package { 'httpd' :
ensure => installed,
} -> # this to ensure that the order before it is executed before going to the order after it
service {'httpd':
ensure => running,
enable => true,
}
}
我们还可以通过在安装程序之前强制安装 EPEL 存储库来安装仅位于 EPEL 存储库中的程序:
node 'webserver1', 'webserver2 {
package { 'epel-release' :
ensure => installed,
} ->
package { 'iperf' :
ensure => installed,
}
}
然后我们可以执行一些用户操作,我们可以在所有客户端服务器上创建一个用户。首先,我们需要在同一台机器上创建它,以获取其哈希密码。然后我们编辑site.pp
文件以提供有关用户的一些信息:
node 'webserver1' {
user { "usertest":
ensure => "present",
shell => '/bin/bash',
home => '/home/usertest',
managehome => true,
password => '############################', }
}
在完成本章之前,我们想探索 Puppet Labs 提供的额外模块,我们可以在不需要创建自己的情况下使用这些模块来执行简单的日常任务。要搜索模块,我们使用以下命令:
$ sudo puppet module search ftp
然后,要安装所需的软件,我们使用install
选项:
$ sudo puppet module install puppetlabs-apache
然后,要检查安装了什么,我们转到/etc/puppet/module
文件夹,那里我们将拥有所有模块及其配置文件。我们可以根据需要随时更改它们。
来源:static.virtualizationpractice.com
注意
我们相信我们已经提供了一些关于如何在 CentOS 7 上使用 Puppet 的体面信息,但 Puppet 仍有很多可提供的。要了解更多信息,请查看 Packt 关于 Puppet 的其他图书:www.packtpub.com/all/?search=puppet
参考资料
现在,让我们看一下本章中使用的参考资料:
-
Chef 网站:
www.chef.io/
-
SaltStack 网站:
saltstack.com
-
Ansible 网站:
www.ansible.com
-
Puppet 网站:
puppetlabs.com
-
Puppet 网页是什么:
puppetlabs.com/puppet/what-is-puppet
总结
在本章中,我们介绍了配置管理及其对系统管理员的好处,特别是在大型计算机环境中工作时。我们简要介绍了一些用于在 Linux 服务器上进行配置管理的知名开源解决方案,特别是 CentOS 7。然后我们选择了 Puppet 作为我们的候选人,以逐步教程的方式展示如何设置和配置主/客户端架构。最后,我们在客户端节点上测试了一些命令。
在最后一章中,我们将向您展示一些我们认为每个使用 Linux 系统管理员,特别是 CentOS 的管理员应该知道的东西,以更好地以最佳实践方式管理和保护他们的基础设施。
第九章:一些额外的技巧和工具
对于日常的 Linux 使用,大多数系统管理员/用户必须掌握一些技巧,以帮助他们充分发挥 Linux 机器的潜力。这就像拥有一把瑞士军刀,只用它来切蔬菜。Linux 隐藏了许多有用的技巧,可以用来处理日常任务,而 CentOS 7 是最新和最可靠的操作系统之一,许多用户可以用它来解决大量问题。
通过本章,我们将展示一些我们认为任何系统管理员都应该知道如何使用的最需要的工具。我们将展示如何使用这些技巧和工具来更好地管理 CentOS 7 服务器基础架构。
在本章中,我们将介绍以下主题:
-
使用 SSH 连接到多台 Linux 机器
-
保护 SSH 和 root 登录配置
-
基于 SSH 密钥的身份验证
-
安装和配置 SpamAssassin
-
设置 Clamav 防病毒软件
-
为 MySQL 数据库配置 Mytop
-
设置 Samba 和 NFS 进行文件共享
-
介绍一些 Linux 系统和网络监控工具
远程连接的 SSH
众所周知,SSH 是我们用来远程连接到 Linux 机器的安全 Shell 连接。这是系统管理员用于远程管理基础设施的主要工具。它是 CentOS 7 基本安装中的一个基本工具,几乎所有 Linux 发行版都默认包含它。
通常,SSH 只安装为客户端,因此您只能远程连接到其他计算机;但这不适用于基本系统安装。在安装 CentOS 7 服务器时,应该已经安装并运行了 SSH 服务器。
要安装 SSH 服务器,我们可以依赖默认的软件包存储库,而无需添加任何额外的第三方存储库:
$ sudo yum install openssh-server
安装 SSH 服务器后,我们应该启动服务并将其启用为默认的系统启动服务:
$ sudo systemctl start sshd.service
$ sudo systemctl enable sshd.service
出于安全考虑,大多数机器都关闭了默认的 SSH 端口,因此我们需要从默认防火墙管理器中打开它:
$ sudo firewallcmd permanent zone=public addport=ssh/tcp
$ sudo firewallcmd reload
这就是我们需要做的一切,以使机器可以远程访问。
要访问这台机器,我们只需要输入ssh
,然后输入用户名和 IP 地址或主机名(如果该机器存储在 DNS 服务器上或列在本地/etc/hosts
文件中)。
$ ssh user1@server1.packt.co.uk
$ ssh user1@10.0.0.10
通常,如果服务器正在运行并且sshd
服务正在监听,那么在首次使用此机器连接到该服务器时,应该会交换公钥。否则,服务器将要求所需用户密码以允许登录。
当我们使用 SSH 连接到远程机器时,就像我们对该机器有一个开放的窗口,我们有点被困在那里,这是一种连接的网络消耗方式,如果我们长时间使用它,尤其是如果我们只是连接而没有真正输入任何命令。因此,我们需要关闭终端窗口以离开远程连接会话并释放保留的资源。SSH 提供了一些有用的选项,如-t
。通过这个选项,我们可以发送一个命令在远程机器上执行,并发送回输出:
$ ssh -t user1@server1.packt.co.uk cat /etc/hosts
此命令将仅显示/etc/hosts
文件的内容,而不保持窗口打开。
我们还可以使用 SSH 在两台机器之间发送文件,使用scp
命令:
$ scp user1@server1.packt.co.uk:/home/user1/Desktop/file1.txt ./Desktop/
在下一节中,我们将向您展示如何保护 SSH 并管理 root 登录。
!远程连接的 SSH
保护 SSH 和 root 登录配置
在本节中,我们将展示一些基本和高级的方法来保护 SSH 服务,以减轻更多的威胁。我们需要对/etc/ssh/sshd_config
文件进行一些微小的更改。我们将逐渐解释每一行的更改:
$ sudo nano /etc/ssh/sshd_config
取消注释 SSH 版本 2 行,只使用更新的 SSH 版本,这更安全可靠。该行应如下所示:
Protocol 2
我们可以限制用户访问以限制某些用户访问服务器。我们使用 SSH 来做到这一点:
DenyUsers Baduser1 baduser2
然后我们可以设置 SSH 连接的超时,以始终关闭一段时间内不活动的会话。我们需要从会话变为空闲开始倒计时:
ClientAliveInterval 360
ClientAliveCountMax 0
然后我们可以使用 SSH 禁用 root 登录:
PermitRootLogin no
此外,我们可以禁用空密码使用,如果用户没有密码,则无权登录:
PermitEmptyPasswords no
除此之外,我们还可以对密码身份验证执行相同的操作。我们可以强制所有登录都通过生成的密钥进行:
PasswordAuthentication no
然后警告横幅总是有用的。因此,如果需要创建一个,我们应该编辑/etc/issues
并添加任何类型的横幅:
$ sudo nano /etc/issue
然后我们应该重新启动服务,以使其生效:
$ sudo systemctl restart sshd
一些服务器是公开可访问的,因此它们可能需要对其 SSH 服务进行额外加固。为此任务,我们将安装一个名为Fail2Ban的工具,这是一个非常可靠的工具,可以帮助保护许多服务免受暴力攻击。它基本上会扫描特定服务的日志文件,并查找失败的登录尝试以阻止它们。要安装它,我们首先需要安装 EPEL 存储库:
$ sudo yum install epel-release
然后我们需要使用Rsyslog安装它,因为它会扫描从 Rsyslog 获取的日志输出:
$ sudo yum install fail2ban rsyslog
为了使其正常工作,我们可以更新它或更新 SELinux 策略。
然后我们继续配置它以保护 SSH。我们需要在Fail2Ban
的jail
文件夹中创建一个名为sshd.local
的文件:
$ sudo nano /etc/fail2ban/jail.d/sshd.local
然后我们在其中添加以下代码:
[sshd]
enabled = true
filter = sshd
#action = firewallcmd-ipset
maxretry = 8
bantime = 172800
这将禁止攻击 48 小时。然后我们启动服务并将其启用为系统启动服务:
$ sudo systemctl start fail2ban
$ sudo systemctl enable fail2ban
我们现在可以说我们已经完成了保护 SSH。让我们尝试管理 root 登录访问。我们已经展示了如何使用 SSH 禁用 root 登录。让我们稍微管理 Sudoers 文件,使用户可以执行“超级用户”命令而无需输入密码。
首先,我们需要在服务器上安装sudo
。通常,大多数 CentOS 7 服务器安装都已经安装了sudo
。
然后我们可以只使用 wheel 组。如果需要,我们可以创建一个新的:
$ sudo nano /etc/sudoers
然后我们转到描述 wheel 组的行:
%wheel ALL=(ALL) ALL
在这里,我们需要添加一个单词,使得此组下的用户可以使用sudo
获得 root 访问权限,并且他们不需要每次都使用密码:
%wheel ALL=(ALL) NOPASSWD: ALL
注意
一些系统管理员不建议此选项,因为如果输入错误,就无法回头了。根据需要,始终可以选择此选项。
基于 SSH 密钥的身份验证
正如我们每次使用 SSH 时所注意到的,我们需要输入密码,这在许多安全策略中是不推荐的。这就是我们将使用 SSH 功能使用公钥/私钥进行身份验证的地方。
SSH 提供了一个工具,用于创建用于远程连接身份验证的公钥/私钥,而无需使用密码。我们如何做到这一点?很简单。对于此测试示例,我们将创建一个新的 RSA 密钥,比通常的安全性更高(我们可以创建不同类型的密钥,如dsa
,ecdsa
,ed25519
):
$ ssh-keygen –t rsa -b 2048 -v
然后按照命令给出的步骤进行。对于默认安装,我们可以继续输入Enter。否则,我们可以始终添加某种密码来使其更安全。我们可能需要指定密钥文件名,以便以后使用它。
然后我们需要将新创建的密钥文件复制到我们要连接的主机上。有两种方法可以做到这一点。传统的方法是将密钥文件直接复制到我们要远程连接到的服务器中,而无需使用密码。我们需要将文件放在当前用户文件夹中的子文件夹.ssh
中。或者,我们可以简单地使用ssh-copy-id
命令,它可以在不痛苦的情况下完成相同的工作:
$ ssh-copy-id user1@server1.packt.co.uk
然后我们需要最后一次输入密码。
之后,任何 SSH 远程连接或文件传输都可以在不需要密码的情况下完成。
安装和配置 SpamAssassin
SpamAssassin是与 Postfix 一起工作的最强大的垃圾邮件过滤器,用于过滤可能构成威胁的所有邮件。
我们将用它来过滤我们邮件服务器上的所有 Postfix 邮件(正如我们在第四章中描述的那样,使用 Postfix 的邮件服务器,关于如何启动和运行一个)。
首先,我们需要使用默认软件包管理器进行安装:
$ sudo yum install spamassassin
然后它就安装好了。现在我们继续进行配置部分:
$ sudo nano /etc/mail/spamassassin/local.cf
我们有一些行需要确保在文件中。因此,我们宁愿写下它们或取消注释它们:
rewrite_header Subject ***SPAM***
required_hits 5.0
report_safe 0
required_score 5
接下来,我们创建一个新的用户组和一个用户来管理该服务:
$ sudo groupadd spamd
$ sudo useradd -g spamd -s /bin/false -d /var/log/spamassassin spamd
$ sudo chown spamd:spamd /var/log/spamassassin
然后我们的服务就配置好了。我们继续进行 Postfix 部分,我们需要对其主配置文件进行一些小的更改:
$ sudo nano /etc/postfix/master.cf
我们需要转到 SMTPD 配置的行并添加以下行:
-o content_filter=spamassassin
因此,它应该看起来像这样:
smtp inet n - n - - smtpd -o content_filter=spamassassin
之后,我们添加以下行:
spamassassin unix - n n - - pipe flags=R user=spamd argv=/usr/bin/spamc -e /usr/sbin/sendmail -oi -f ${sender} ${recipient}
我们保存文件并退出。现在我们需要通过输入以下内容来更新 SpamAssassin 规则:
$ sudo sa-update --nogpg
现在,为了对SpamAssassin
服务和 Postfix 服务器进行更改,我们需要重新启动它,然后我们就完成了:
$ sudo systemctl restart spamassassin
$ sudo systemctl restart postfix.service
设置 Clamav 防病毒软件
Clamav是一个开源的防病毒工具。其基本用途是在基于 Linux 的机器上检测病毒、恶意软件和恶意软件。
要安装 Clamav,我们需要安装 EPEL 存储库:
$ sudo yum install epel-release
然后我们可以安装 Clamav 及其所有有用的工具:
$ sudo yum install clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd
在开始配置之前,我们需要确保 SELinux 可以让 Clamav 无问题地工作:
$ sudo setsebool -P antivirus_can_scan_system 1
要检查选项是否激活,我们需要输入以下内容:
$ sudo getseboot –a | grep virus
然后我们移除示例配置,这样我们就可以制作我们自己的配置:
$ sudo sed -i '/^Example/d' /etc/clamd.d/scan.conf
删除示例行后,我们需要进行一些修改以定义 TCP 服务器类型并定义用户根来执行防病毒软件:
$ sudo nano /etc/clamd.d/scan.conf
我们取消注释以下行:
LocalSocket /var/run/clamd.scan/clamd.sock
我们在文件末尾添加这两行并保存:
User root
LocalSocket /var/run/clamd.<SERVICE>/clamd.sock
为了保持 Clamav 数据库的最新状态,我们需要启用一个名为Freshclam的工具。因此,我们需要从其配置文件中创建一个备份文件:
$ sudo cp /etc/freshclam.conf /etc/freshclam.conf.bak
然后我们移除示例行:
$ sudo sed -i '/^Example/d' /etc/freshclam.conf
否则,如果需要,我们可以调整选项以获得更个性化的解决方案。我们需要运行 Freshclam 手动更新数据库,并检查配置是否成功设置:
$ sudo freshclam
我们需要创建一个文件,作为运行Freshclam守护程序的服务文件:
$ sudo nano /usr/lib/systemd/system/clam-freshclam.service
然后我们将以下代码放入文件中并保存:
[Unit]
Description = freshclam scanner
After = network.target
[Service]
Type = forking
ExecStart = /usr/bin/freshclam -d -c 4
Restart = on-failure
PrivateTmp = true
[Install]
WantedBy=multi-user.target
接下来,我们应该通过运行它并检查其状态来检查服务是否配置正确:
$ sudo systemctl start clam-freshclam.service
$ sudo systemctl status clam-freshclam.service -l
如果一切正常,没有问题,我们将其添加到系统启动服务中:
$ sudo systemctl enable clam-freshclam.service
现在我们需要创建 Clamav 服务文件。我们有一个示例服务文件,需要复制到系统服务文件夹中。我们需要将其名称更改为可理解的内容。然后,我们需要对其进行一些小的修改:
$ sudo mv /usr/lib/systemd/system/clamd@.service /usr/lib/systemd/system/clamd.service
自从我们改变了名字,我们需要在使用这项服务的文件中也进行更改:
$ sudo nano /usr/lib/systemd/system/clamd@scan.service
我们通过删除@
来更改第一行,使其看起来像这样:
.include /lib/systemd/system/clamd.service
在同一位置,我们需要更改 Clamd 服务文件:
$ sudo nano /usr/lib/systemd/system/clamd.service
我们在结尾添加以下行:
[Install]
WantedBy=multi-user.target
然后我们从Description
和ExecStart
选项中删除%i
。然后我们将它们更改为以下内容:
Description = clamd scanner daemon
ExecStart = /usr/sbin/clamd -c /etc/clamd.d/scan.conf --nofork=yes
在运行任何服务之前,我们需要检查是否有任何错误。我们将手动运行 Clamd:
$ sudo /usr/sbin/clamd -c /etc/clamd.d/scan.conf –nofork=yes
然后,如果一切顺利,我们启动服务并将其添加到系统启动服务中:
$ sudo systemctl enable clamd.service
$ sudo systemctl enable clamd@scan.service
$ sudo systemctl start clamd.service
$ sudo systemctl start clamd@scan.service
对于 Clamav 服务的最终验证,我们检查其状态:
$ sudo systemctl status clamd.service -l
$ sudo systemctl status clamd@scan.service -l
对于当前文件夹的测试扫描,我们运行以下命令:
$ sudo clamscan --infected --remove --recursive ./
这是 ClamAV 应该在我们的基础架构中的位置:
来源wiki.jenkins-ci.org/display/JENKINS/Home
以下图显示了邮件服务器组件之间的更好描述,以解释 ClamAV 如何帮助保护我们的邮件服务:
来源:aphyr.com/
为 MySQL 数据库配置 Mytop
Mytop 是一个开源解决方案,可帮助监视 MySQL 数据库的活动和性能,或者我们现在所知道的 CentOS 7 的 MariaDB。它是一个非 GUI 监控工具。因此,它在 shell 命令行中提供了一种接口。
要安装 Mytop,我们应该确保安装将在安装了 MariaDB 数据库服务器的同一台服务器上进行。然后我们添加 EPEL 存储库,如下所示:
$ sudo yum install epel-release
接下来,我们使用yum
执行安装:
$ sudo yum install mytop
对于配置,我们只需要在root
文件夹中创建一个配置文件:
$ sudo nano /root/.mytop
然后我们在其中输入以下文本:
host=localhost
db=mysql
delay=3
port=3306
socket=
batchmode=0
color=1
idle=1
这是在程序执行期间将使用的个性化配置。
要运行它,我们需要输入以下命令:
$ sudo mytop --prompt
然后我们需要输入 MariaDB 根密码。否则,如果我们使用非根用户访问,我们可以随时输入:
$ sudo mytop –u user1 --prompt
或者如果我们需要一个特定的数据库,我们有以下内容:
$ sudo mytop –d packtdb--prompt
要知道它是否正常工作,您应该看到以下界面:
有关如何与 Mytop GUI 交互的更多信息,您可以随时查看其手册:
$ man mytop
来源:i.gzn.jp
设置 Samba 和 NFS 进行文件共享
Samba 是一个开源项目,旨在为多个操作系统(Windows、Linux 和 Mac OS)提供安全稳定的数据和打印机共享服务。
Samba 使用会话消息块(SMB)协议工作,这是大多数 Windows OS 和 Mac OS 支持的协议,用于为那些可以访问共享资源的客户端提供服务,如 Linux 存储介质、打印机、串行端口(硬件设备)。
在本教程中,我们将使用 CentOS 7 Samba 服务器和 Mac OS 机器来使用该服务以访问共享文件夹。
首先,我们将在我们的 CentOS 7 服务器上安装 Samba:
$ sudo yum install samba samba-client samba-common
在开始配置之前,我们需要进行一些备份、环境创建和防火墙设置。因此,首先,我们需要创建 Samba 配置文件的备份,以确保不会弄乱原始配置(这在有许多更新的配置时非常有用)。我们最好在更新过程的每个阶段保留备份:
$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup
然后我们需要创建我们需要共享的文件夹,或者准备共享它(如果已经存在)。我们需要设置用户权限以授予该文件夹的所有内容:
$ sudo mkdir /SharedFolder/
$ sudo chmod -R 755 /SharedFolder/
最后,我们需要在服务器防火墙上打开 Samba 服务端口:
$ sudo firewall-cmd --permanent --zone=public --add-service=samba
$ sudo firewall-cmd --reload
现在我们可以开始对 Samba 配置文件进行必要的配置:
$ sudo nano /etc/samba/smb.conf
我们需要确保设置适当的工作组(通常设置为WORKGROUP
):
workgroup = WORKGROUP
并且我们定义了一个共享文件夹。
[Shared Folder]
path = /SharedFolder
read only = no
guest ok = yes
browsable =yes
writable = yes
create mask = 0755
directory mask = 0755
我们保存文件并创建一些 Samba 用户:
$ sudo smbpasswd –a user1
然后我们输入密码并重试输入以创建新密码。
如果我们想要与特定用户共享一些文件夹,我们需要在文件夹定义中添加以下行,并且需要通过将guest
ok = yes
更改为guest
ok = no
来禁用访客登录:
valid users = user1
在测试阶段,我们需要启动服务:
$ sudo systemctl enable smb.service
$ sudo systemctl enable nmb.service
$ sudo systemctl start smb.service
$ sudo systemctl start nmb.service
然后我们转到客户端并在服务器连接中输入此链接:
smb://server_ip_address
这个测试是在 Mac 机器上使用的。对于 Windows 机器,我们在资源管理器地址栏中输入以下链接:
\\server_ip_address
然后我们会有一个登录屏幕,在那里我们需要输入 Samba 用户 ID 和密码,就像这样:
在输入正确的用户 ID 和密码后,应该会出现一个屏幕,显示该用户可以访问的可能文件夹,如下所示:
然后我们将以配置文件中定义的权限访问我们的文件夹。由于我们有写权限,我们可以创建一个文件夹,然后检查它是否确实出现在服务器上。
我们可以运行我们的服务器来验证客户端所做的更改是否已应用。
如果我们需要更改任何文件夹共享配置,我们必须重新启动服务以应用更改:
$ sudo systemctl restart smb.service
$ sudo systemctl restart nmb.service
Samba 非常适合多环境文件共享,但我们不应忘记 Linux 最著名的文件共享解决方案——网络文件系统(NFS)。NFS 是一个客户端服务器工具,用于在多个 Linux 系统之间共享数据,通过在网络上挂载许多远程共享文件夹和驱动器,直接在客户端访问这些文件。
我们将在 CentOS 7 上建立一个 NFS 客户端服务器测试,以展示它的工作原理。
首先,我们需要在服务器上安装服务:
$ sudo yum install nfs-utils nfs-utils-lib
然后我们启动负责确保服务功能的服务:
$ sudo systemctl enable rpcbind
$ sudo systemctl start rpcbind
$ sudo systemctl enable nfs-server
$ sudo systemctl start nfs-server
$ sudo systemctl start nfs-lock
$ sudo systemctl start nfs-idmap
我们准备一个要共享的文件夹:
$ sudo mkdir /NFSsharedFolder
$ sudo chmod –R 0755 /NFSsharedFolder
然后,为了导出这个文件夹并使其可以在客户端上挂载,我们继续编辑/etc/export
文件:
$ sudo nano /etc/export
然后我们添加以下行:
/NFSsharedFolder 172.25.0.0/16(rw,sync,no_root_squash,no_all_squash)
这一行意味着我们将这个文件夹导出到网络中的所有 IP 地址。rw
选项为文件夹提供写权限,sync
确保文件夹始终同步,no_root_squash
在客户端为文件夹提供 root 权限,最后,no_all_squash
启用用户权限。
在对导出文件进行任何更改后,我们需要重新启动 NFS 服务器:
$ sudo systemctl restart nfs-server
最后,我们需要在服务器防火墙上打开 NFS 服务的端口。重新加载防火墙以应用更改:
$ sudo firewall-cmd --permanent --add-port=111/tcp
$ sudo firewall-cmd --permanent --add-port=875/tcp
$ sudo firewall-cmd --permanent --add-port=2049/tcp
$ sudo firewall-cmd --permanent --add-port=20048/tcp
$ sudo firewall-cmd --permanent --add-port=42955/tcp
$ sudo firewall-cmd --permanent --add-port=46666/tcp
$ sudo firewall-cmd --permanent --add-port=54302/tcp
$ sudo firewall-cmd --reload
通过这一步,我们可以说我们已经完成了服务器的配置。现在我们转向客户端。就像服务器一样,我们需要安装 NFS 实用程序:
$ sudo yum install nfs-utils nfs-utils-lib
然后启动适当的服务:
$ sudo systemctl enable rpcbind
$ sudo systemctl start rpcbind
$ sudo systemctl enable nfs-server
$ sudo systemctl start nfs-server
$ sudo systemctl start nfs-lock
$ sudo systemctl start nfs-idmap
在挂载网络共享文件夹之前,我们需要确保有一个位置可以挂载:
$ sudo mkdir /NFSfolder
$ sudo chmod –R 755 /NFSfolder
要测试挂载文件夹,我们可以使用mount
命令,或者通过编辑/etc/fstab
文件使系统自动挂载它:
$ sudo mount -t nfs 172.25.22.10:/NFSsharedFolder/ /NFSfolder/
$ sudo nano /etc/fstab
此外,我们插入以下行:
172.25.22.10:/NFSsharedFolder/ /NFSfolder/ nfs defaults 0 0
为了更快的连接,我们可以始终使用 NFS 的第四个版本,输入以下内容:
172.25.22.10:/NFSsharedFolder/ /NFSfolder/ nfs4 defaults 0 0
NFS4 比 NFS3 提供更多功能。我们建议在支持 NFS4 的 Linux 服务器环境中使用它。
最后,如果我们需要检查在特定 NFS 客户端上挂载了什么,我们使用mount
:
$ sudo mount
介绍 Linux 系统和网络监控工具
在本章的最后一节中,我们将介绍一些非常有用的工具,用于监视 CentOS 7 服务器的系统和网络。
我们将首先展示一些系统监控工具。我们相信大多数这些工具需要安装 EPEL 存储库,所以我们可以在尝试安装这些工具之前先安装它:
$ sudo yum install epel-release
我们将首先讨论的工具是 Htop。它与旧的top
命令类似,但它具有非常用户友好的界面,更加交互式,有许多快捷键,以图形彩色的方式呈现进程、CPU、内存和交换内存,以显示这些资源的使用情况。要安装 Htop,我们只需要使用 Yum:
$ sudo yum install htop
要运行它,我们只需要输入htop
。无需配置:
$ htop
我们应该看到这种界面:
列表中的第二个系统监控工具是 Iotop。它看起来像旧的 top 命令,但它专门用于实时显示系统可用磁盘输入和输出访问。它显示每个进程的活动,以及它使用硬盘的情况(读/写速度和实际使用情况)。要安装它,我们需要再次使用 YUM,但通常它默认已安装在大多数 CentOS 7 服务器上:
$ sudo yum install ioptop
要使用它,我们需要键入名称:
$ ioptop
我们将有以下界面:
在进入网络监控工具之前,我们应该快速看一下这个既可以监控系统又可以监控网络的工具。Monitorix 是一个开源的轻量级系统和网络监控工具。它定期收集系统和网络活动,以便通过基于 Web 的界面以良好呈现的图表显示出来。它对于检测瓶颈和系统故障以进行更好的管理非常有帮助。
要安装 Monitorix,我们首先需要安装一些必要的软件包:
$ sudo yum install rrdtool rrdtool-perl perl-libwww-perl perl-MailTools perl-MIME-Lite perl-CGI perl-DBI perl-XML-Simple perl-Config-General perl-HTTP-Server-Simple
然后我们安装 Monitorix:
$ sudo yum install monitorix
这是一种服务,所以我们需要启动它并将其启用为登录服务的启动项:
$ sudo systemctl start monitorix
$ sudo systemctl enable monitorix
我们可能需要禁用 SELinux 或将其设置为宽松模式,以使我们的服务正常工作。此外,由于 Monitorix 在端口 8080 上提供服务,我们需要在防火墙上打开它,如下所示:
$ sudo firewall-cmd --permanent --zone=public —add-port=8080/tcp
$ sudo firewall-cmd --reload
然后我们可以通过浏览器开始使用它。我们在地址栏中键入以下内容:
http://Server_IP_address:8080/monitorix
因此,我们将有以下界面:
我们将看到各种图表,显示多种信息,如下所示:
这是关于系统负载平均使用情况的,接下来是关于网络状态的:
现在,让我们谈谈一些有用的网络监控工具。我们首先会谈论 Netstat,这是监控网络流入和流出流量的最常见工具之一。它对于网络故障排除非常有用。它通常已安装在系统上,所以我们只需要执行它:
$ netstat -a
接下来我们将会有这样的输出:
接下来是 IPTraf,这是一个实时网络监控工具。它收集关于网络流量活动的信息,如 TCP、UDP、IP 和 ICMP 统计数据,然后在其界面中呈现出来。要安装它,我们需要使用 YUM:
$ sudo yum install iptraf
然后我们只需键入其名称来运行它。
最后,还有 IfTop,这是一个实时报告网络活动的开源工具。它对于故障排除与外部服务器的连接非常有用,因为它使用Pcap
库来捕获所需网络接口上的传入和传出数据包。要安装它,我们再次使用 yum:
$ sudo yum install iptop
然后,要使用它,我们需要键入带有所需接口的命令来监听:
$ sudo iptop -i eth0
参考资料
现在,让我们看一下本章中使用的参考资料:
-
OpenSSH 网站:
www.openssh.com
-
SpamAssassin 网站:
spamassassin.apache.org/
-
Clamav 网站:
www.clamav.net/
-
Mymap 手册:
jeremy.zawodny.com/mysql/mytop/
-
Samba 网站:
www.samba.org/
-
Trafshow 维基:
www.freshports.org/net/trafshow/
-
Monitorix 主页:
www.monitorix.org/
总结
本章是我们认为应该提到任何愿意管理 CentOS 7 的系统管理员的主题的总结。我们首先介绍了一种可以轻松访问多台机器的方法。我们看到了如何保护服务,这是确保服务器配置和安全的一种最佳实践。然后我们介绍了一种在多台服务器之间共享数据的方法,这对安装阶段和日常使用都非常有用。最后,我们介绍了如何监视我们的服务在系统和网络上的活动。
系统管理员的工作有时会有所不同。有时会变得更容易,有时会变得更困难,特别是在新安装时。因此,我们已经涵盖了那些有助于缓解困难时期并使其更易管理的工具。
我们认为这本书相当于精通红帽或科学 Linux,这些资源在 Linux 系统管理领域非常受欢迎。作为系统管理员和开源用户,我们认为精通这个领域需要的不仅仅是阅读这本书。您需要探索我们简要讨论的部分,制定自己的测试场景并尝试使其更加复杂。毕竟,我们总是从职业生涯中的艰难经历中学到东西,而不是从容易的经历中学到东西。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)