build立一个安全的本地托pipe的Linux机箱的A到Z.

我正在重新安装操作系统在一台机器上,将被用来为我们的业务主持几个应用程序。 申请将只在本地; 来自外部客户端的访问将仅通过VPN。

之前的设置对于大部分pipe理员都使用了托pipe控制面板(Plesk),而我正在考虑使用另一个类似的软件来重新安装 – 但我想我应该终于学习如何工作。 我可以做的大部分软件会为我做的事情,但我不清楚这一切的共生。 如果可能的话,这些都是为了进一步将自己从configuration程序员/程序员的土地上解放出来。

我找不到任何地方的完整演练,所以我想我会提出这个问题,如果人们可以帮助我的方式,我将编辑这个答案,并logging我的进展/陷阱。 希望有一天这会帮助某个人。

细节:

  • CentOS 5.5 x86_64
  • httpd:Apache / 2.2.3
  • MySQL:5.0.77(待升级)
  • PHP:5.1(待升级)

要求:

  • 安全!!
    • 安全的文件传输
    • 安全的客户端访问(SSL证书和CA)
    • 安全的数据存储
    • 安全连接到另一台本地机器(MySQL)
  • 虚拟主机/多个子域名
  • 本地电子邮件会很好,但不是关键

步骤:

  • 下载最新的CentOS DVD-iso (torrent对我很好)。

  • 安装CentOS:
    在进行安装时,我检查了服务器组件选项,认为我将使用另一个Plesk-likepipe理员。 事后看来,考虑到我决定尝试走自己的路,这可能不是最好的主意。

  • 基本configuration:
    设置用户,networking/ IP地址等百胜升级/升级。

  • 升级PHP / MySQL:
    为了将PHP和MySQL升级到最新版本,我必须在CentOS之外寻找另一个回购。 IUS看起来不错,我很高兴我find了!
  • 将IUS存储库添加到我们的包pipe理器

    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维基提供升级说明: http : //wiki.iuscommunity.org/Doc/ClientUsageGuide 。


  • 安装rssh(受限shell)提供scpsftp访问权限,而不允许sshlogin
  •  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以授予对SFTP用户的访问权限。

     vi /etc/rssh.conf 

    取消注释或添加:

     allowscp allowsftp 

    这允许我通过传输中的SFTP协议(我select的FTP程序;我相信它与其他FTP应用程序类似)连接到本机。

    从http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html获取(赞赏!)rssh指令。


  • 设置虚拟接口
  •  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
    networking= 192.168.1.0
    ONBOOT = YES
    NAME = ETH1:1

    通过重复添加更多的虚拟接口。 由于ifcfg-eth1:1文件中的ONBOOT=yes行,当系统引导或networking启动/重新启动时,此接口将会启动。

     service network restart 

    closureseth0接口:[OK​​]
    closureseth1接口:[OK​​]
    closures回送界面:[确定]
    打开回送界面:[OK]
    调出接口eth0:[OK]
    调出接口eth1:[OK]

     ping 192.168.1.3 

    来自192.168.1.3的64字节:icmp_seq = 1 ttl = 64时间= 0.105ms


  • Virtualhosts
  • 在上面的rssh部分中,我添加了一个用于SFTP的用户。 在这个用户的主目录中,我创build了一个名为“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] [error] [client 192.168.1.100](13)Permission denied:access to /index.html denied

    我试过chmod 777 et。 等,但无济于事。 原来,我需要chmod + x https目录及其“父目录”。

     chmod +x /home chmod +x /home/dev chmod +x /home/dev/https 

    这解决了这个问题。


  • DNS
  • 我通过我们的本地Windows Server 2003框来处理DNS。 不过,有关BIND的CentOS文档可以在这里find: http : //www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • 要使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中设置证书的位置,从而导致浏览器不能正常访问浏览器的页面。

    所以首先,我需要build立一个CA并创build证书文件。 我在这里find了一个伟大的(如果是旧的)演练: 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 

    /home/CA/ dir中创build一个openssl.cnf文件,并根据上面链接的演练进行编辑。 (作为参考,我完成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放在一个可以通过networking访问的地方,然后下载/导入到我的浏览器中。 现在我可以访问https://dev.site.local ,没有任何错误或警告。


    这就是我所在的地方。 我将继续编辑,因为我进步。 有关如何configurationSSL电子邮件和/或configuration安全连接到另一个将成为MySQL服务器的Box的任何提示将不胜感激。

    本指南提供了有关在Apache中使用SSL的很多答案,告诉您如何创build自签名证书,如何从authentication证书颁发机构(CA)获取适当的证书以及如何创build自己的不可信CA以创build完整的证书。 http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    对于虚拟主机和SSL,由于SSL证书的性质,每个主机都需要自己的IP地址,或者一个比较脏的解决scheme就是把它们放在不同的端口上,而不是标准:443 ,基于名字的虚拟主机不会相处SSL; 这就是为什么你需要另一种方法来区分; 不同的端口/ IP。

    设置SSH非常简单,它应该已经在你的服务器上运行了。 你会想要做一些事情来locking它。

     PermitRootLogin no AllowGroups admins PubkeyAuthentication yes PermitEmptyPasswords no PasswordAuthentication no 

    可以将它添加到/etc/ssh/sshd_config以限制远程root访问权限,并删除密码validation,而使用公钥/私钥对login。

    要创build您的SSH密钥对,您可以在Windows中使用puttygen ; http://putty.very.rulez.org/download.html,或者您可以在Linux环境中创build密钥对,如下所示&#xFF1A; ssh-keygen -b 2048 -t RSA -f my_keypair 。 这将创build一个my_keypair文件和一个my_keypair.pub文件(只为这个例子命名,我可能会build议命名为你的用户名或离开-f ,并让它生成~/.ssh/id_rsa )。

    my_keypair安全地转移到您的工作站,以便将来进行SSH访问,这是私钥,不应该与任何人共享。 然后,在服务器上创build$HOME/.ssh如果它尚不存在) my_keypair.pub mkdir ~/.ssh ,然后将公共密钥( my_keypair.pub )复制到~/.ssh/ ,如果您已经在~/.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 chmod 700 ~/.sshchmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keys来设置权限。 您可以在~/.ssh/保留一个my_keypair的副本, my_keypair在连接到其他主机时使用,但是您应该执行chmod 600 ~/.ssh/my_keypair以确保其他人无法访问它。

    您将需要为自己添加一个普通的用户帐户,并将自己添加到除users其他users组,如我的示例中的admins

    如果您尚未使用sudo ,则可能还需要将您的用户或组添加到/etc/sudoers中。 这是用visudo命令完成的,这是你编辑这个文件的唯一方法。 在写出之前, visudo在configuration上运行错误和语法检查,从而防止丢失sudo使用。

     username ALL=(ALL) ALL 

    添加到/etc/sudoers将允许username运行sudo yum install blah并且会提示你input你自己的密码。 如果您有其他pipe理员或临时pipe理员,这很方便,您不需要共享root密码。

    你的SSLconfiguration的问题是你没有真正启用 SSL,你需要Apache的指令:

     SSLEngine on SSLCertificateFile /path/to/cert.pem SSLCertificateKeyFile /path/to/key.pem 

    没有这个,你会得到这些logging太长的错误,这是因为,而不是你的浏览器期望的SSL头,它只是取决于大块未encryption的网页。

    原始软件包中的MySQL支持SSL。 要检查你的MySQL构build,运行

     mysqladmin variables | grep ssl 

    你应该find像have_ssl yes东西。 设置选项ssl-cassl-keyssl-cert

    创build具有SSL要求的用户帐户:

     create user@host identified by 'password' grant privilegelist on database.tables to user@host require ssl