设置用于安全本地托管的Linux机器的A到Z


12

我正在将计算机重新安装操作系统的过程中,该计算机将用于为我们的业务托管几个应用程序。这些应用程序将仅在本地;来自外部客户端的访问将仅通过VPN。

先前的设置使用了主机控制面板(Plesk)来管理大多数管理员,而我当时正在考虑使用另一种类似的软件进行重新安装-但我认为我应该最终了解其所有工作原理。我可以做软件可以为我做的大部分事情,但是我对这一切的共生性还不清楚。这是所有尝试,如果可能的话,进一步使自己远离Configuration Programmer / Programmer

我在任何地方都找不到完整的演练,因此我想我要提出这个问题,并且如果有人可以在我的帮助下帮助我编辑答案并记录进度/陷阱。希望有一天这将帮助某人。

细节:

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

要求:

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

步骤:

  • 下载最新的CentOS DVD-iso(种子对我来说很棒)。

  • 安装CentOS:
    在安装过程中,我检查了Server Components选项,以为我将要使用另一个类似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
    

    从IUS删除旧版本的PHP并安装新版本

    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(受限外壳程序)以提供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中的SFTP协议连接到计算机(我选择的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
    NETWORK = 192.168.1.0
    ONBOOT =是
    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 ms


  • 虚拟主机
  • 在上面的rssh部分中,我添加了一个用于SFTP的用户。在此用户的主目录中,我创建了一个名为“ https”的文件夹。这是该站点文档所在的位置,因此我需要添加一个指向它的虚拟主机。我将在网站上使用上面的虚拟界面(在这里称为dev.site.local)。

    vi /etc/http/conf/httpd.conf
    

    将以下内容添加到httpd.conf的末尾:

    <VirtualHost 192.168.1.3:80>  
        ServerAdmin dev@site.local  
        DocumentRoot /home/dev/https  
        ServerName dev.site.local  
        ErrorLog /home/dev/logs/error_log  
        TransferLog /home/dev/logs/access_log  
    </VirtualHost>  
    

    我将虚拟的index.html文件放在https目录中只是为了检查所有内容。我尝试浏览到它,并遇到权限被拒绝的错误。日志仅给出了模糊的参考:

    [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-zh-CN/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 dev@site.local  
        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中设置证书的位置,因此,由于证书使浏览器不受欢迎,因此该页面被扔到了浏览器中。

    因此,首先,我需要设置一个CA并制作证书文件。我在这里找到了一个很好的(如果很旧的话)过程: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 dev@site.local  
        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的安全连接的技巧,将不胜感激。


    我不明白为什么需要虚拟网络接口?
    米兰·巴布斯科夫(MilanBabuškov)2010年

    @Milan,因为我将在此计算机上拥有多个域/子域。为了使用VirtualHost和SSL,每个域/子域都需要有自己的IP地址。httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain

    看起来对我来说是IP地址的浪费,但是还可以。另外,您可以为每个域使用不同的TCP / IP端口-全部在单个IP上。这样,Web服务器就较少依赖于系统配置。
    米兰·巴布斯科夫,2010年

    1
    @米兰:由于设置仅在本地进行,因此我拥有比我需要的更多可用IP地址的方法。我发现,相对而言,设置其他接口是一个相当快速且轻松的过程。如果我要设置该系统以供公众使用,
    则要

    1
    强烈建议koltsoff.com/pub/securing-centos-关于确保CentOS安全的非常有教育意义的演练(其中大多数内容很容易适用于其他发行版)-它不涉及托管,但是其中的所有内容都应理解并应用于您不了解和控制的不在防火墙后面的任何CentOS服务器。
    dunxd 2012年

    Answers:


    6

    本指南提供了许多有关将SSL与Apache结合使用的答案,告诉您如何创建自签名证书,如何从公认的证书颁发机构(CA)获取正确的证书以及如何创建自己的不受信任的CA来创建证书。完整证书。http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    对于虚拟主机和SSL,:443由于SSL证书的性质,每个主机将需要自己的IP地址,或者较标准的解决方案是将它们托管在不同的端口上,基于名称的虚拟主机无法与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文件(仅在此示例中命名,我建议您为用户名命名或保留off -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_keypairin 的副本,以~/.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密码。


    如果您是从puttygen在Windows中创建密钥对的,请注意,一旦将公钥上载到服务器,就必须更改其格式。我不记得如何,但在YouTube上实际上有一个视频。
    ESW 2010年

    1

    SSL配置的问题是您实际上尚未启用 SSL,因此需要Apache指令:

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

    没有这个,您将得到那些记录时间过长的错误,这是因为浏览器没有获得预期的SSL标头,而是获得了很大一部分的未加密网页。


    1
    (没有这些,您创建的只是在端口443上侦听的常规非SSL vhost)
    JamesHannah,2010年

    1

    原始软件包中的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
    

    感谢您的回复。不过,我忘记提及了,我还将文件存储在db服务器上,因此在这种情况下,stunnel看起来会更好。
    2010年
    By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
    Licensed under cc by-sa 3.0 with attribution required.