A à Z de configurar uma caixa Linux para hospedagem local segura

12

Estou no processo de reinstalar o sistema operacional em uma máquina que será usada para hospedar alguns aplicativos para nossos negócios. Os aplicativos serão apenas locais; o acesso de clientes externos será apenas via VPN.

A configuração anterior usava um painel de controle de hospedagem (Plesk) para a maioria dos administradores, e eu estava usando outro software semelhante para a reinstalação - mas achei que deveria finalmente aprender como tudo funciona. Posso fazer a maioria das coisas que o software faria por mim, mas não estou claro sobre a simbiose disso tudo. Tudo isso é uma tentativa de me distanciar mais da terra do Configuration Programmer / Programmer , se possível.

Não consigo encontrar uma explicação completa para o que estou procurando, então pensei em fazer essa pergunta e, se as pessoas puderem me ajudar no caminho, editarei isso com as respostas e documentarei meu progresso / armadilhas. Espero que algum dia isso ajude alguém na linha.

Os detalhes:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (a ser atualizado)
  • PHP: 5.1 (a ser atualizado)

Os requisitos:

  • SEGURANÇA!!
    • Transferência segura de arquivos
    • Acesso seguro ao cliente (SSL Certs e CA)
    • Armazenamento seguro de dados
    • Conexão segura com outra máquina local (MySQL)
  • Virtualhosts / vários subdomínios
  • O email local seria bom, mas não crítico

Os passos:

  • Baixe o último CentOS DVD-iso (torrent funcionou bem para mim).

  • Instale o CentOS:
    Durante a instalação, verifiquei a opção Componentes do servidor pensando que eu usaria outro administrador semelhante ao Plesk. Em retrospectiva, considerando que decidi tentar seguir meu próprio caminho, essa provavelmente não foi a melhor idéia.

  • Configuração básica:
    usuários de configuração, rede / endereço IP, etc. Yum update / upgrade.

  • Atualizar o PHP / MySQL:
    Para atualizar o PHP e o MySQL para as versões mais recentes, tive que procurar outro repositório fora do CentOS. O IUS parece ótimo e estou feliz por encontrá-lo!
  • Adicione o repositório IUS ao nosso gerenciador de pacotes

    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
    

    Remova a versão antiga do PHP e instale a versão mais recente do 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)
    

    Atualize o MySQL do repositório IUS

    /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
    

    Instruções de atualização, cortesia do wiki do IUS: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Instale o rssh (shell restrito) para fornecer scpe sftpacessar, sem permitir o 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
    

    Edite /etc/rssh.confpara conceder acesso ao SFTP aos usuários rssh.

    vi /etc/rssh.conf
    

    Remova o comentário ou adicione:

    allowscp
    allowsftp
    

    Isso me permite conectar-me à máquina via protocolo SFTP no Transmit (meu programa FTP de escolha; tenho certeza de que é semelhante a outros aplicativos FTP).

    Instruções rssh apropriadas (com reconhecimento!) de http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Configurar interfaces virtuais
  • 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 | modifique para que fique assim:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = eth1: 1

    Adicione mais interfaces virtuais conforme necessário, repetindo. Devido à ONBOOT=yeslinha no arquivo ifcfg-eth1: 1, essa interface será exibida quando o sistema inicializar ou a rede iniciar / reiniciar.

    service network restart
    

    Desligando a interface eth0: [OK]
    Desligando a interface eth1: [OK]
    Desligando a interface de loopback: [OK]
    Apresentando a interface de loopback: [OK]
    Apresentando a interface eth0: [OK]
    Apresentando a interface eth1: [OK]

    ping 192.168.1.3
    

    64 bytes de 192.168.1.3: icmp_seq = 1 ttl = 64 time = 0,105 ms


  • Virtualhosts
  • Na seção rssh acima, adicionei um usuário para usar no SFTP. No diretório inicial desse usuário, criei uma pasta chamada 'https'. É aqui que os documentos deste site estarão disponíveis, então eu preciso adicionar um host virtual que aponte para ele. Usarei a interface virtual acima para este site (aqui chamada dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Adicione o seguinte ao final do 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>  
    

    Coloquei um arquivo index.html fictício no diretório https apenas para verificar tudo. Tentei navegar até ele e recebi erros de permissão negada. Os logs apenas deram uma referência obscura ao que estava acontecendo:

    [Seg 17 de maio 14:57:11 2010] [erro] [cliente 192.168.1.100] (13) Permissão negada: acesso ao /index.html negado

    Eu tentei chmod 777 et. al., mas sem sucesso. Acontece que eu precisava chmod + x o diretório https e seus 'diretórios pai.

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

    Isso resolveu esse problema.


  • DNS
  • Estou lidando com o DNS através da nossa caixa local do Windows Server 2003. No entanto, a documentação do CentOS para BIND pode ser encontrada aqui: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Para que o SSL funcione, alterei o seguinte no 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>  
    

    Infelizmente, continuo recebendo erros (Código de erro: ssl_error_rx_record_too_long) ao tentar acessar uma página com SSL. Como JamesHannah apontou graciosamente abaixo , eu não havia configurado os locais dos certificados no httpd.conf e, portanto, estava recebendo a página lançada no broswer como o certificado que fazia o navegador recusar.

    Então, primeiro, eu precisava configurar uma CA e criar arquivos de certificado. Encontrei um ótimo passo a passo (se antigo) sobre o processo aqui: http://www.debian-administration.org/articles/284 .

    Aqui estão as etapas relevantes que tomei desse artigo:

    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  
    

    Crie um openssl.cnfarquivo no /home/CA/diretório e edite-o de acordo com o passo a passo vinculado acima. (Para referência, meu arquivo openssl.cnf final era assim: 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)
    

    Modificado openssl.cnfnovamente por instruções passo a passo.

    #generates certificate request, and key.pem which I renamed dev.key.pem.
    openssl req -sha1 -new -nodes -out dev.req.pem -config ./openssl.cnf 
    

    Modificado openssl.cnfnovamente por instruções passo a passo.

    #create and sign certificate.
    openssl ca -out dev.cert.pem -md sha1 -config ./openssl.cnf -infiles dev.req.pem 
    

    IMPORTANTE!

    Mova os arquivos e faça referência a eles no httpd.conf no novo local

    cp dev.cert.pem /home/dev/certs/cert.pem
    cp dev.key.pem /home/certs/key.pem
    

    Atualizei o httpd.conf para refletir os certificados e ativar o 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>  
    

    Coloque o CA cert.pem em um local acessível pela Web e faça o download / importe para o meu navegador. Agora posso visitar https: //dev.site.local sem erros ou avisos.


    E é aqui que estou. Continuarei editando isso à medida que progredir. Serão apreciadas quaisquer dicas sobre como configurar o email SSL e / ou configurar a conexão segura com outra caixa que será o servidor MySQL.

    stormdrain
    fonte
    Não entendo por que você precisa das interfaces de rede virtual?
    Milan Babuškov
    @ Milan, porque terei vários domínios / subdomínios nesta máquina. Para usar o VirtualHost e SSL Cada domínio / subdomínio precisará ter seu próprio endereço IP. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    Parece um desperdício de endereços IP para mim, mas tudo bem. Como alternativa, você pode usar portas TCP / IP diferentes para cada domínio - tudo em um único IP. Dessa forma, o servidor web é menos dependente da configuração do sistema.
    Milan Babuškov
    1
    @ Milan: Como a instalação é apenas local, tenho o luxo de ter mais endereços IP disponíveis do que precisarei. A configuração de interfaces adicionais, eu descobri, é um processo relativamente rápido e indolor comparativamente. Se eu fosse a criação deste sistema para uso público, graças a Apache2.2.x e TLS upgrades, VirtualHost parece funcionar melhor com SSL: serverfault.com/questions/109766/...
    stormdrain
    1
    Recomendaria vivamente koltsoff.com/pub/securing-centos - uma explicação muito educativa sobre como proteger o CentOS (a maioria é facilmente aplicável a outras distros) - não cobre a hospedagem, mas tudo deve ser entendido e aplicado a ele qualquer servidor CentOS que não esteja atrás de um firewall que você entende e controla.
    dunxd

    Respostas:

    6

    Este guia tem muitas respostas sobre o uso do SSL com o Apache, mostra como criar um certificado autoassinado, como obter um certificado adequado de uma CA (autoridade de certificação reconhecida) e como criar sua própria CA não confiável para criar uma certificado completo. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Quanto aos hosts virtuais e SSL, cada host precisará de seu próprio endereço IP ou uma solução mais suja é hospedá-los em portas diferentes do que o padrão :443 devido à natureza dos certificados SSL, a hospedagem virtual baseada em nome não se dá bem com SSL; é por isso que você precisa de outro método para se diferenciar; portas / IPs diferentes.

    A configuração do SSH é bastante fácil, já deve estar em execução no seu servidor. Você vai querer fazer várias coisas para travá-lo.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Pode ser adicionado ao seu /etc/ssh/sshd_config para restringir o acesso remoto à raiz e remover a autenticação de senha, em vez disso, usando pares de chaves públicos / privados para efetuar login.

    Para criar seu par de chaves SSH, você pode usar puttygenno Windows; http://putty.very.rulez.org/download.html ou você pode criar o par de chaves em um ambiente Linux assim: ssh-keygen -b 2048 -t RSA -f my_keypair. Isso criará um my_keypairarquivo e um my_keypair.pubarquivo (nomeado apenas para este exemplo, eu sugiro nomear seu nome de usuário ou deixá-lo de fora -fe deixá-lo gerar ~/.ssh/id_rsa).

    Transfira my_keypaircom segurança para sua estação de trabalho, para acesso futuro ao SSH, esta é a chave privada, você não deve compartilhá-la com ninguém. Em seguida, no servidor, crie $HOME/.sshse ele ainda não existir e mkdir ~/.ssh, em seguida, copie a chave pública ( my_keypair.pub) para ~/.ssh/, se você já tiver authorized_keysentrado ~/.sshporque já fez isso por outras coisas, pode fazer cat my_keypair.pub >> authorized_keyspara anexar sua chave pública oucp my_keypair.pub authorized_keys se isso não existe.

    Agora execute chmod 700 ~/.sshe chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keyspara definir permissões. Você pode manter uma cópia do my_keypairin ~/.ssh/para uso ao se conectar a outros hosts, mas deve fazer isso chmod 600 ~/.ssh/my_keypairpara garantir que ninguém mais possa acessá-lo.

    Você deseja adicionar uma conta de usuário normal e adicionar-se a um grupo que não seja users, como adminsno meu exemplo.

    Você provavelmente também desejará adicionar seu usuário ou grupo /etc/sudoerspara ativar o sudouso, caso ainda não o tenha feito. Isso é realizado com o comando, visudoque é a única maneira de editar este arquivo. visudoexecuta a verificação de erros e sintaxe na sua configuração antes de escrevê-la, evitando a perda de sudouso.

    username ALL=(ALL) ALL
    

    adicionado ao /etc/sudoerspermitirá usernameexecutar sudo yum install blahe solicitará sua própria senha. Isso é útil no caso de você ter outros administradores ou administradores temporários, não precisar compartilhar a senha root.

    cpbills
    fonte
    Se você criar um par de chaves no Windows a partir do puttygen, lembre-se de alterar o formato da chave pública depois de carregá-la no servidor. Não me lembro como, mas no youtube, na verdade, há um vídeo.
    ESW
    1

    O problema com a sua configuração SSL é que você não ativou o SSL, você precisaria das diretivas Apache para isso:

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

    Sem isso, você obterá esses erros por muito tempo, porque, em vez dos cabeçalhos SSL que seu navegador estava esperando, está recebendo apenas a página da Web não criptografada em um grande pedaço.

    JamesHannah
    fonte
    1
    (sem isso, tudo o que criamos é um não-SSL vhost audição normal na porta 443)
    JamesHannah
    1

    O MySQL do pacote original suporta SSL. Para verificar sua compilação do MySQL, execute

    mysqladmin variables | grep ssl
    

    Você deve encontrar algo parecido have_ssl yes. Configurar as opções ssl-ca, ssl-keye ssl-cert.

    Crie contas de usuário com requisitos de SSL:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    
    sumar
    fonte
    Obrigado pela resposta. Esqueci de mencionar, no entanto, que também armazenarei arquivos no servidor db, para que pareça que o stunnel funcionará melhor nesse caso.
    Stormdrain