设置 Linux 机器以实现安全本地托管的指南

设置 Linux 机器以实现安全本地托管的指南

我正在重新安装一台机器的操作系统,这台机器将用于托管我们业务的几个应用程序。这些应用程序将仅在本地运行;外部客户端只能通过 VPN 进行访问。

之前的设置使用托管控制面板 (Plesk) 进行大部分管理,我考虑使用另一个类似的软件进行重新安装 - 但我想我最终应该了解它是如何工作的。我可以做软件为我做的大部分事情,但我不清楚这一切的共生关系。这一切都是为了进一步远离配置编程器/编程器,如果可能的话。

我在任何地方都找不到我想要的完整指南,所以我想我会提出这个问题,如果有人能帮助我,我会编辑这个答案,并记录我的进展/陷阱。希望有一天这能帮助到别人。

细节:

  • 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 的管理员。事后看来,考虑到我决定尝试自己的方式,这可能不是最好的主意。

  • 基本配置:
    设置用户、网络/IP 地址等。Yum 更新/升级。

  • 升级 PHP/MySQL:
    要将 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


  • 安装 rssh(受限 shell)以提供scpsftp访问,但不允许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=yesifcfg-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
    

    这解决了那个问题。


  • DNS
  • 我通过本地 Windows Server 2003 机器处理 DNS。但是,可以在此处找到 BIND 的 CentOS 文档: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 中设置证书的位置,因此,页面被抛到浏览器,因为证书导致浏览器停止运行。

    首先,我需要建立一个加州并制作证书文件。我在这里找到了一个很棒的(虽然很旧)流程演示: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 ~/.sshchmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keys设置权限。您可以保留一份副本my_keypair~/.ssh/供连接到其他主机时使用,但您应该这样做chmod 600 ~/.ssh/my_keypair以确保没有其他人可以访问它。

    您将需要为自己添加一个普通用户帐户,并将自己添加到除 之外的其他组users,就像admins我的示例一样。

    如果尚未添加,您可能还想添加用户或组以/etc/sudoers启用使用。这可以通过命令完成,这是您编辑此文件的唯一方法。在写出配置之前,对配置进行错误和语法检查,以防止使用损失。sudovisudovisudosudo

    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-cassl-key然后ssl-cert

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

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

    相关内容