CentOS 6 部署Web服务器

时间:2020-01-09 10:34:10  来源:igfitidea点击:

配置

我们需要执行以下操作来完成本实验。

  • 运行实验室服务器的虚拟机软件(ESX,Hyper-V,VirtualBox等)
  • 一台能够运行CentOS 6或者更高版本的服务器。
  • 服务器的Internet连接。
  • CentOS 6或者更高的ISO。

我们的Web应用程序将具有以下配置。

处理器Web服务器
2核Apache 2.2.15
1 GBMySQL服务器5.1
1 x 24 GBApache 2.2.15
1WordPress

部署服务器

现在我们已经计划了文件系统方案,是时候安装CentOS了。

  • 挂载ISO / DVD并开始安装CentOS6.X。

  • 当提示我们提供磁盘分区布局时,选择创建自定义布局并进行以下分区和卷。大小基于具有24 GB存储空间的主机,但是,我们需要匹配/ var / log和/ webapps以适应日志保留和应用程序存储要求。重要的是将路径分成自己的挂载点。

  • 当提示我们输入安装类型时,选择Basic Server。

  • 安装完成后,登录到Web服务器并进行更新。

yum update

挂载点

之所以将某些路径分成它们自己的挂载点,是为了能够保护它们免受某些活动的影响。例如,我们希望阻止用户运行来自/ webapps文件系统的恶意或者未经授权的可执行文件。

  • 例如,将fstab打开到文本编辑器(如VIM)中。
vim /etc/fstab
  • 按照上面的磁盘布局,在fstab中找到以下几行并添加突出显示的选项。
/dev/mapper/vg_webapp001-lv_home    /home     ext4    defaults,nosuid,nodev,noexec   1 2
/dev/mapper/vg_webapp001-lv_log     /var/log  ext4    defaults,nosuid,nodev   1 2
/dev/mapper/vg_webapp001-lv_webapps /webapps  ext4    defaults,nodev,noexec   1 2
防止设备文件存在于装载点的文件系统中。除非有特殊要求,否则设备文件应该只存在于/dev中
阻止可执行文件在装载点文件系统上运行。在本教程中,我们为webapp挂载设置了它。如果web应用程序需要cgi,这将破坏应用程序,我们不应该添加它
  • 保存修改后的fstab文件并退出文本编辑器。
  • 重新引导服务器或者卸载,然后重新安装修改后的安装点使更改生效。

安装所需的软件包

  • 安装Apache 2
yum install httpd
  • 安装PHP5和MySQL扩展。
yum install php php-mysql
  • 安装MySQL服务器
yum install mysql-server

创建用户和组

部署完成后,除非绝对需要,否则任何人都不应使用Root帐户。我们需要创建两个用户帐户和两个组,一个用于网络应用程序的日常维护,另一个用于系统管理。创建用户和组之后,我们将保护SSH以仅允许我们的非管理帐户远程访问。如果成功使用某人的帐户远程登录,则这种隔离将增加另一层安全性,以帮助防止黑客获得完全控制。

  • 创建日常用户帐户。
useradd jsmith
  • 设置此帐户的密码
passwd jsmith
  • 创建服务器管理员帐户。
useradd jsmith-admin
  • 设置管理员帐户密码
passwd jsmith-admin
  • 创建webadmins组。
groupadd webadmins
  • 创建系统管理员组。
groupadd sysadmins
  • 创建一个远程管理组,我们将为其授予SSH访问权限。
groupadd remoteadmins
  • 将日常帐户添加到webadmins组。
usermod -G webadmins -a jsmith
  • 将服务器管理员帐户添加到系统管理员组。
usermod -G sysadmins -a jsmith-admin
  • 将Apache帐户添加到webadmins组,以授予其对我们的/ webapps目录的访问权限,在我们对其进行安全保护后,将需要使用该帐户。
usermod -G webadmins -a apache
  • 由于我们希望jsmith作为我们能够远程访问我们的Web服务器,因此我们需要将该帐户添加到remoteadmins组。
usermod -G remoateadmins -a jsmith

授予系统管理权限

现在,我们将需要系统管理权限的帐户分配给sysadmins组。通过sudo,sysadmins组将具有完整的管理权限。然后,将为根用户提供一个非常复杂的密码,以防止滥用。

  • 打开sudoers文件编辑器
visudo
  • 导航到文件底部,并添加以下行:
%sysadmins     ALL=(ALL)     ALL
  • 要保存我们的设置,请按ESC,然后键入冒号(:)和'w'。
  • 输入冒号(:)和'q'退出编辑器。
  • 为根帐户设置一个复杂的密码。时间越长,越复杂越好。

锁定SSH访问

SSH是远程管理Linux服务器的好工具。但是,使用默认设置不受保护是非常危险的。暴力破解任何服务器都需要两个步骤:查找用户帐户和发现用户帐户的密码。已知每个Linux服务器上都存在哪个帐户?根。因此,最佳实践是阻止Root对服务器进行远程访问。另一个问题是"谁对服务器具有访问权限?"默认情况下,SSH将授予对所有帐户的访问权限。由于并非每个用户都应该具有SSH进入服务器的能力,因此我们希望确保只有授权用户才能这样做。为此,我们将SSH配置为仅允许remoteadmins组中的用户权限来远程访问服务器。

  • 在文本编辑器(如VIM)中打开SSH服务器配置文件。
vim /etc/ssh/sshd_config
  • 查找允许根登录的行
#PermitRootLogin yes

通过删除井号"#"并将"是"替换为"否"来取消注释。注意:尽管此选项已被注释掉,但默认情况下SSH会授予Root登录权限。这就是为什么我们取消注释该选项并将其显式设置为" no"很重要的原因。

PermitRootLogin no
  • 现在,我们只希望授权用户通过SSH访问我们的服务器。在配置文件中添加" AllowGroup"选项,然后添加我们要允许访问的组。
AllowGroups remoteadmins
  • 保存配置文件并退出编辑器。
  • 重新启动SSH守护程序以应用我们的更改。
service sshd restart

准备Webapps目录

在安装Apache并开始定义网站之前,我们需要准备我们的webapps目录。在webapps目录中,我们将为应用程序及其日志创建单独的目录(请参见下面的示例)。

/webapps
   |---/apps
   |     |---/app1
   |           |---/public_html
   |     
   |---/logs
         |---/app1
  • 创建目录
mkdir -p /webapps/apps/app1/public_html
mkdir -p /webapps/logs/app1
  • 将适当的Selinux安全上下文分配给我们的自定义Web应用程序目录。这将授予Apache访问它们的权限。
chcon -Rv --type=httpd_sys_content_t /webapps/apps/app1/public_html
chcon -Rv --type=httpd_sys_content_t /webapps/logs/app1/
  • 将/ webapps组所有权更改为我们的网络管理员。
chgrp -Rv webadmins /webapps
  • 递归设置webapps目录的guid位,以确保所有新文件和目录均由webadmins组拥有。另外,我们将授予对webadmins组和文件所有者的读/写访问权限,而不授予其他任何人的访问权限。
chmod 2770 -Rv /webapps
  • 通过public_html目录,我们将授予所有人读取权限。
chmod 2775 -Rv /webapps/apps/app1/public_html

配置Apache

  • 在文本编辑器(如VIM)中打开Apache的配置文件。
vim /etc/httpd/conf/httpd.conf
  • 通过关闭服务器签名来阻止Apache发布其版本。为此,请找到以下行
ServerSignature On

并替换为

ServerSignature Off
  • 阻止Apache发布操作系统信息。为此,请找到以下行
ServerTokens OS

并替换为

ServerTokens Prod
  • 将Web应用程序根目录的位置从/ var / www更改为我们的新位置。找到以下行
<Directory "/var/www/html">

并替换为

<Directory "/webapps/apps/app1/public_html">
  • 通过删除索引选项,防止目录在Web浏览器中显示其内容。为此,请在我们上面修改的行下方找到以下内容。
Options Indexes FollowSymLinks

并替换为

Options FollowSymLinks
  • 通过找到以下行来更改错误日志的位置
ErrorLog logs/error_log

并替换为

ErrorLog /webapps/logs/app1/error_log
  • 通过找到以下行来更改访问日志的位置
CustomLog logs/access_log combined

并替换为

CustomLog /webapps/logs/app1/access_log combined
  • 保存更改并退出文本编辑器。
  • 启动Apache守护程序。
service httpd start
  • 将Apache守护程序配置为在引导后自动启动。
chkconfig httpd on

配置MySQL服务器

  • 将MySQL Server的守护程序设置为在每次启动后自动启动。
chkconfig mysqld on
  • 启动MySQL服务器守护程序。
service mysqld start
  • 要设置Root的MySQL密码,删除匿名用户访问权限并禁止Root进行远程连接,请运行以下命令。当提示重新加载特权表时,请记住输入" y";否则,帐户更改将不会应用。
/usr/bin/mysql_secure_installation
  • 登录到MySQL的控制台
mysql -u root -p
  • 为自己创建一个用户帐户
CREATE USER 'jsmith'@'localhost' IDENTIFIED BY 'mypassword';
  • 为帐户授予管理权限。
GRANT ALL ON *.* TO 'jsmith'@'localhost' WITH GRANT OPTION;

授予自己所有特权可能非常危险。帐户只能用于管理目的。

  • 为Web应用程序创建数据库。我们的示例将针对使用名为MyWPSite的数据库的WordPress网站。
CREATE DATABASE MyWPSite;
  • 我们的Web应用程序将需要一个允许其查询,添加和删除数据库中项目的帐户。我们将命名为mywpsite_service帐户,并为其分配一个相当复杂的密码。
CREATE USER 'mywpsite_service'@'localhost' IDENTIFIED BY '2qrYzFrxcXctsHq66erd9NYBuwq4enbX';
  • 现在,我们将仅向Web应用程序的服务帐户授予其实际需要的特权。
GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,CREATE ON MyWPSite.* TO 'mywpsite_service'@'localhost';
  • 重命名MySQL Root帐户。这将防止大多数行车记录脚本命中和一些恶意用户闯入我们的数据库服务器。
RENAME USER 'root'@'localhost' TO 'new_user_name'@'localhost';
  • 刷新特权表以强制应用新特权。
FLUSH PRIVILEGES;

配置PHP

  • 将PHP的配置文件打开到文本编辑器(如VIM)中。
vim /etc/php.ini
  • 出于安全原因,应禁用一些功能,除非我们确定Web应用程序需要这些功能。找到以下行。
disable_functions =

并替换为

disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
  • 找到包含选项display_errors的行,并确保将其设置为``关闭''。
display_errors = Off
  • 找到包含选项register_globals的行,并确保将其设置为``off''。
register_globals = Off
  • 找到包含选项magic_quotes_gpc''的行,并确保将其设置为off''。
magic_quotes_gpc = Off
  • 保存更改并退出文本编辑器。
  • 重新启动Apache以应用新的PHP设置。
service httpd restart

打开端口80以允许访问我们的应用程序

在用户可以通过Web浏览器访问我们的Web应用程序之前,必须打开80端口。默认情况下,Linux防火墙服务IPtables会阻止此端口。

  • 运行以下命令以通过类似于GUI的基本界面配置IPTable。
system-config-firewall-tui
  • 确保已启用防火墙。
  • 按Tab键导航到自定义,然后按Enter键。
  • 向下滚动受信任的服务列表,直到看到WWW(HTTP)。
  • 通过按空格键启用对它的访问。
  • 按Tab键导航到``关闭''按钮,然后按Enter键。
  • 按Tab导航到OK按钮,然后按Enter。

安装我们的Web应用程序

如前所述,我们将使用WordPress作为我们的Web应用程序。使用它可以使我们对应用程序安装后必须考虑的事项有一些了解。

  • 将最新的WordPress版本下载到主目录中
wget http://wordpress.org/latest.zip
  • 解压下载文件。
unzip latest.zip
  • 将未压缩的文件复制到我们应用程序目录的public_html文件夹中。不要移动文件。需要复制以确保继承适当的权限。
cp -R ./wordpress/* /webapps/apps/app1/public_html/
  • 在桌面上打开Web浏览器,然后导航到Web服务器。
  • 点击``创建配置文件''按钮开始安装。
  • 点击``开始吧!按钮。
  • 在数据库字段中,输入我们为较早的MyWPSite应用程序创建的数据库的名称。
  • 输入我们为数据库创建的服务帐户mywpsite_service
  • 输入服务帐户的密码2qrYzFrxcXctsHq66erd9NYBuwq4enbX
  • 使用默认的数据库主机字段值。
  • 将表前缀更改为默认值以外的任何值。
  • 点击提交。
  • 如果一切顺利,请单击运行安装。
  • 在网站标题字段中输入网站的名称。
  • 出于安全原因,请将"用户名"值从"管理员"更改为其他名称。
  • 输入用户帐户的密码。
  • 输入电子邮件地址。
  • 点击``安装WordPress''按钮。

保护我们的Web应用程序

无论是WordPress还是其他Web应用程序,都将需要保护公众免受攻击的领域。任何管理页面都是一个很好的例子。而且,如果网站是面向公众的,则可能我们不希望某些部分被搜索引擎索引。 "到"部分将引导我们确保这些区域不受访问和被索引。

保护管理页面

我们需要确定Web应用程序的根目录中的哪些目录托管管理页面文件。对于单词,按该目录为/ wp-admin。我们只希望访问授权IP地址或者地址范围进入管理页面,并希望阻止所有其他访问尝试。

  • 在文本编辑器(如VIM)中打开Apache配置文件。
vim /etc/httpd/conf/httpd.conf
  • 找到定义网站的部分。它包含在<directory>指令中,在本实验中,该指令类似于以下内容。
<Directory "/webapps/apps/app1/public_html">
  • 在此目录指令内,插入以下行。用要启用访问的IP地址替换突出显示的IP地址。
<Directory "/webapps/app1/public_html/wp-admin/">
      Order deny,allow
      deny from all
      allow from 192.168.10.200 192.168.10.201
</Directory>

这将仅允许从192.168.10.200和192.168.10.201进行的连接从Web浏览器访问WordPress管理控制台。

  • 保存更改并退出编辑器。
  • 重新加载Apache配置文件
service httpd reload

使用Apache配置文件而不是HTACCESS

出于安全原因的最佳实践是不使用HTACCESS文件,因为通过Web管理员帐户或者利用网站漏洞来控制服务器的人可以轻松操纵这些文件。也可以由未经授权的用户在没有HTACCESS文件的目录中创建它们,以设置允许他们进入通常无法访问的区域的规则。 WordPress使用HTACCESS文件编写重写规则,以启用更友好的URL(称为永久链接)。这些实际上应该写在Apache配置文件中,在那里它们更加安全。

  • 在文本编辑器中打开Apache的配置文件。
vim /etc/httpd/conf/httpd.conf
  • 找到定义网站的部分。它包含在<directory>指令中,在本实验中,该指令类似于以下内容。
<Directory "/webapps/apps/app1/public_html">
  • 要禁用Apache的HTACCESS文件解析,请在<directory>指令内添加以下行。
AllowOverride None
  • 要启用WordPress永久链接,请在我们上面添加的AllowOverride选项下添加以下几行。
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
  • 保存更改并退出编辑器。
  • 重新加载Apache配置文件
service httpd reload