我正在重新安装一台机器的操作系统,这台机器将用于托管我们业务的几个应用程序。这些应用程序将仅在本地运行;外部客户端只能通过 VPN 进行访问。
之前的设置使用托管控制面板 (Plesk) 进行大部分管理,我考虑使用另一个类似的软件进行重新安装 - 但我想我最终应该了解它是如何工作的。我可以做软件为我做的大部分事情,但我不清楚这一切的共生关系。这一切都是为了进一步远离配置编程器/编程器,如果可能的话。
我在任何地方都找不到我想要的完整指南,所以我想我会提出这个问题,如果有人能帮助我,我会编辑这个答案,并记录我的进展/陷阱。希望有一天这能帮助到别人。
细节:
- CentOS 5.5 x86_64
- httpd:Apache/2.2.3
- MySQL:5.0.77(待升级)
- PHP:5.1(待升级)
要求:
- 安全!!
- 安全文件传输
- 安全客户端访问(SSL 证书和 CA)
- 安全数据存储
- 与另一台本地机器的安全连接(MySQL)
- 虚拟主机/多个子域名
- 本地电子邮件很好,但并不重要
步骤:
在安装过程中,我选中了“服务器组件”选项,以为我会使用另一个类似 Plesk 的管理员。事后看来,考虑到我决定尝试自己的方式,这可能不是最好的主意。
设置用户、网络/IP 地址等。Yum 更新/升级。
要将 PHP 和 MySQL 升级到最新版本,我不得不寻找 CentOS 之外的另一个存储库。IUS 看起来很棒,我很高兴找到了它!
将 IUS 存储库添加到我们的包管理器
cd /tmp
wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/epel-release-1-1.ius.el5.noarch.rpm
rpm -Uvh epel-release-1-1.ius.el5.noarch.rpm
wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1-4.ius.el5.noarch.rpm
rpm -Uvh ius-release-1-4.ius.el5.noarch.rpm
yum list | grep -w \.ius\. # list all the packages in the IUS repository; use this to find PHP/MySQL version and libraries you want to install
删除旧版本的 PHP 并从 IUS 安装新版本
rpm -qa | grep php # to list all of the installed php packages we want to remove
yum shell # open an interactive yum shell
remove php-common php-mysql php-cli #remove installed PHP components
install php53 php53-mysql php53-cli php53-common #add packages you want
transaction solve #important!! checks for dependencies
transaction run #important!! does the actual installation of packages.
[control+d] #exit yum shell
php -v
PHP 5.3.2 (cli) (built: Apr 6 2010 18:13:45)
从 IUS 存储库升级 MySQL
/etc/init.d/mysqld stop
rpm -qa | grep mysql # to see installed mysql packages
yum shell
remove mysql mysql-server #remove installed MySQL components
install mysql51 mysql51-server mysql51-devel
transaction solve #important!! checks for dependencies
transaction run #important!! does the actual installation of packages.
[control+d] #exit yum shell
service mysqld start
mysql -v
Server version: 5.1.42-ius Distributed by The IUS Community Project
升级说明由 IUS wiki 提供:http://wiki.iuscommunity.org/Doc/ClientUsageGuide。
scp
和sftp
访问,但不允许ssh
登录cd /tmp
wget http://dag.wieers.com/rpm/packages/rssh/rssh-2.3.2-1.2.el5.rf.x86_64.rpm
rpm -ivh rssh-2.3.2-1.2.el5.rf.x86_64.rpm
useradd -m -d /home/dev -s /usr/bin/rssh dev
passwd dev
编辑/etc/rssh.conf
以授予 rssh 用户对 SFTP 的访问权限。
vi /etc/rssh.conf
取消注释或者添加:
allowscp
allowsftp
这使我能够通过 Transmit(我选择的 FTP 程序;我确信它与其他 FTP 应用程序类似)中的 SFTP 协议连接到机器。
rssh 说明摘自(非常感谢!)http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html。
ifconfig eth1:1 192.168.1.3 up #start up the virtual interface
cd /etc/sysconfig/network-scripts/
cp ifcfg-eth1 ifcfg-eth1:1 #copy default script and match name to our virtual interface
vi ifcfg-eth1:1 #modify eth1:1 script
#ifcfg-eth1:1 | 修改如下:
DEVICE=eth1:1
IPADDR=192.168.1.3
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
NAME=eth1:1
重复添加所需的更多虚拟接口。由于ONBOOT=yes
ifcfg-eth1:1 文件中的行,此接口将在系统启动或网络启动/重新启动时启动。
service network restart
关闭接口 eth0:[确定]
关闭接口 eth1:[确定]
关闭环回接口:[确定]
启动环回接口:[确定]
启动接口 eth0:[确定]
启动接口 eth1:[确定]
ping 192.168.1.3
来自 192.168.1.3 的 64 字节:icmp_seq=1 ttl=64 时间=0.105 毫秒
在上面的 rssh 部分中,我添加了一个用于 SFTP 的用户。在这个用户的主目录中,我创建了一个名为“https”的文件夹。这是此站点的文档所在的位置,因此我需要添加指向它的虚拟主机。我将为此站点使用上述虚拟接口(此处称为 dev.site.local)。
vi /etc/http/conf/httpd.conf
在httpd.conf末尾添加以下内容:
<VirtualHost 192.168.1.3:80>
ServerAdmin [email protected]
DocumentRoot /home/dev/https
ServerName dev.site.local
ErrorLog /home/dev/logs/error_log
TransferLog /home/dev/logs/access_log
</VirtualHost>
我在 https 目录中放置了一个虚拟的 index.html 文件,只是为了检查所有内容。我尝试浏览它,但遇到了权限被拒绝的错误。日志只给出了一个模糊的参考,说明了发生了什么:
[2010 年 5 月 17 日星期一 14:57:11] [错误] [客户端 192.168.1.100] (13)权限被拒绝:访问 /index.html 被拒绝
我尝试了 chmod 777 等,但无济于事。结果,我需要 chmod+x https 目录及其父目录。
chmod +x /home
chmod +x /home/dev
chmod +x /home/dev/https
这解决了那个问题。
我通过本地 Windows Server 2003 机器处理 DNS。但是,可以在此处找到 BIND 的 CentOS 文档:http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html
为了使 SSL 正常工作,我在 httpd.conf 中更改了以下内容:
NameVirtualHost 192.168.1.3:443 #make sure this line is in httpd.conf
<VirtualHost 192.168.1.3:443> #change port to 443
ServerAdmin [email protected]
DocumentRoot /home/dev/https
ServerName dev.site.local
ErrorLog /home/dev/logs/error_log
TransferLog /home/dev/logs/access_log
</VirtualHost>
不幸的是,当我尝试使用 SSL 访问页面时,我不断收到(错误代码:ssl_error_rx_record_too_long)错误。正如 JamesHannah 优雅地下面指出,我没有在 httpd.conf 中设置证书的位置,因此,页面被抛到浏览器,因为证书导致浏览器停止运行。
首先,我需要建立一个加州并制作证书文件。我在这里找到了一个很棒的(虽然很旧)流程演示:http://www.debian-administration.org/articles/284。
以下是我从该文章中采取的相关步骤:
mkdir /home/CA
cd /home/CA/
mkdir newcerts private
echo '01' > serial
touch index.txt #this and the above command are for the database that will keep track of certs
在目录中创建一个openssl.cnf
文件/home/CA/
,并按照上面链接的演练对其进行编辑。(作为参考,我完成的 openssl.cnf 文件如下所示:http://pastebin.com/raw.php?i=hnZDij4T)
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 3650 -config ./openssl.cnf #this creates the cacert.pem which gets distributed and imported to the browser(s)
openssl.cnf
根据演练说明再次进行修改。
#generates certificate request, and key.pem which I renamed dev.key.pem.
openssl req -sha1 -new -nodes -out dev.req.pem -config ./openssl.cnf
openssl.cnf
根据演练说明再次进行修改。
#create and sign certificate.
openssl ca -out dev.cert.pem -md sha1 -config ./openssl.cnf -infiles dev.req.pem
重要的!
移动文件并从新位置的 httpd.conf 引用它们
cp dev.cert.pem /home/dev/certs/cert.pem
cp dev.key.pem /home/certs/key.pem
我更新了 httpd.conf 以反映证书并打开 SSLEngine:
NameVirtualHost 192.168.1.3:443
<VirtualHost 192.168.1.3:443>
ServerAdmin [email protected]
DocumentRoot /home/dev/https
SSLEngine on
SSLCertificateFile /home/dev/certs/cert.pem
SSLCertificateKeyFile /home/dev/certs/key.pem
ServerName dev.site.local
ErrorLog /home/dev/logs/error_log
TransferLog /home/dev/logs/access_log
</VirtualHost>
将 CA cert.pem 放在可通过网络访问的地方,然后将其下载/导入到我的浏览器中。现在我可以访问https://dev.site.local没有错误或警告。
这就是我目前的情况。我会在取得进展时继续编辑。任何有关如何配置 SSL 电子邮件和/或配置与另一个将作为 MySQL 服务器的 Box 的安全连接的提示都将不胜感激。
答案1
本指南包含大量有关在 Apache 中使用 SSL 的解答,告诉您如何创建自签名证书、如何从公认的证书颁发机构 (CA) 获取正确的证书以及如何创建您自己的不受信任的 CA 来创建完整证书。http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html
至于虚拟主机和 SSL,每个主机都需要自己的 IP 地址,或者更肮脏的解决方案是将它们托管在不同的端口上,而不是标准,:443
由于 SSL 证书的性质,基于名称的虚拟托管与 SSL 不兼容;这就是为什么您需要另一种方法来区分不同的端口/IP。
设置 SSH 非常简单,它应该已经在您的服务器上运行了。您需要做很多事情来锁定它。
PermitRootLogin no
AllowGroups admins
PubkeyAuthentication yes
PermitEmptyPasswords no
PasswordAuthentication no
它可以添加到您的/etc/ssh/sshd_config
远程根访问中以限制远程根访问,并删除密码验证,而是使用公钥/私钥对登录。
要创建 SSH 密钥对,您可以puttygen
在 Windows 中使用;http://putty.very.rulez.org/download.html或者您可以在 Linux 环境中创建密钥对,如下所示:ssh-keygen -b 2048 -t RSA -f my_keypair
。这将创建一个my_keypair
文件和一个my_keypair.pub
文件(仅为此示例命名,我可能会建议以您的用户名命名或省略-f
,并让它生成~/.ssh/id_rsa
)。
安全地传输my_keypair
到您的工作站,以供将来的 SSH 访问,这是私钥,您不应与任何人共享。然后,在服务器上,$HOME/.ssh
如果尚不存在,则创建mkdir ~/.ssh
,然后将公钥(my_keypair.pub
)复制到~/.ssh/
,如果您已经拥有authorized_keys
,~/.ssh
因为您已经为其他事情执行了此操作,您可以cat my_keypair.pub >> authorized_keys
执行附加公钥,或者cp my_keypair.pub authorized_keys
如果它不存在。
现在运行chmod 700 ~/.ssh
并chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keys
设置权限。您可以保留一份副本my_keypair
以~/.ssh/
供连接到其他主机时使用,但您应该这样做chmod 600 ~/.ssh/my_keypair
以确保没有其他人可以访问它。
您将需要为自己添加一个普通用户帐户,并将自己添加到除 之外的其他组users
,就像admins
我的示例一样。
如果尚未添加,您可能还想添加用户或组以/etc/sudoers
启用使用。这可以通过命令完成,这是您编辑此文件的唯一方法。在写出配置之前,对配置进行错误和语法检查,以防止使用损失。sudo
visudo
visudo
sudo
username ALL=(ALL) ALL
添加到/etc/sudoers
将允许username
运行sudo yum install blah
并提示您输入自己的密码。如果您有其他管理员或临时管理员,这很方便,您不需要共享 root 密码。
答案2
您的 SSL 配置存在问题,因为您实际上并没有已启用SSL,您需要 Apache 指令:
SSLEngine on
SSLCertificateFile /path/to/cert.pem
SSLCertificateKeyFile /path/to/key.pem
如果没有这个,你会得到那些记录太长的错误,这是因为你的浏览器没有得到所期望的 SSL 标头,而是得到了一大块未加密的网页。
答案3
原始软件包中的 MySQL 支持 SSL。要检查您的 MySQL 版本,请运行
mysqladmin variables | grep ssl
您应该会发现类似的内容have_ssl yes
。设置选项ssl-ca
,ssl-key
然后ssl-cert
。
创建具有 SSL 要求的用户帐户:
create user@host identified by 'password'
grant privilegelist on database.tables to user@host require ssl