Dalla A alla Z di configurare un box Linux per l'hosting locale sicuro


12

Sto reinstallando il sistema operativo su un computer che verrà utilizzato per ospitare un paio di applicazioni per la nostra attività. Le applicazioni saranno solo locali; l'accesso da client esterni avverrà solo tramite VPN.

La configurazione precedente utilizzava un pannello di controllo di hosting (Plesk) per la maggior parte dell'amministratore, e stavo cercando di utilizzare un altro software simile per la reinstallazione, ma ho pensato che avrei dovuto finalmente imparare come funziona tutto. Posso fare la maggior parte delle cose che il software farebbe per me, ma non sono chiaro sulla simbiosi di tutto ciò. Questo è tutto un tentativo di allontanarmi ulteriormente dalla terra del programmatore / programmatore di configurazione , se possibile.

Non riesco a trovare una soluzione completa da nessuna parte per quello che sto cercando, quindi ho pensato di porre questa domanda e se le persone possono aiutarmi nel modo in cui lo modificherò con le risposte e documenterò i miei progressi / insidie. Spero che un giorno questo possa aiutare qualcuno in fondo.

I dettagli:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (da aggiornare)
  • PHP: 5.1 (da aggiornare)

I requisiti:

  • SICUREZZA!!
    • Trasferimento sicuro dei file
    • Accesso client sicuro (SSL Certs e CA)
    • Archiviazione sicura dei dati
    • Connessione sicura a un altro computer locale (MySQL)
  • Host virtuali / sottodomini multipli
  • L'email locale sarebbe piacevole, ma non critica

I passi:

  • Scarica l'ultimo CentOS DVD-iso (il torrent ha funzionato benissimo per me).

  • Installa CentOS:
    Durante l'installazione, ho controllato l'opzione Componenti server pensando che avrei usato un altro amministratore simile a Plesk. Col senno di poi, considerando che ho deciso di provare a seguire la mia strada, questa probabilmente non era la migliore idea.

  • Configurazione di base:
    impostazione utenti, rete / indirizzo IP, ecc. Yum update / upgrade.

  • Aggiorna PHP / MySQL:
    per aggiornare PHP e MySQL alle ultime versioni, ho dovuto cercare un altro repository esterno a CentOS. IUS ha un bell'aspetto e sono felice di averlo trovato!
  • Aggiungi repository IUS al nostro gestore di pacchetti

    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
    

    Rimuovi la vecchia versione di PHP e installa la versione più recente da 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)
    

    Aggiorna MySQL dal repository 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
    

    Istruzioni per l'aggiornamento fornite da IUS wiki: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Installa rssh (shell limitata) per fornire scpe sftpaccedere, senza consentire il 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
    

    Modifica /etc/rssh.confper consentire l'accesso a SFTP agli utenti rssh.

    vi /etc/rssh.conf
    

    Rimuovi commento o aggiungi:

    allowscp
    allowsftp
    

    Questo mi permette di collegarmi alla macchina tramite protocollo SFTP in Transmit (il mio programma FTP preferito; sono sicuro che è simile con altre applicazioni FTP).

    istruzioni rssh appropriate (con apprezzamento!) da http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Imposta interfacce virtuali
  • 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 | modificare in questo modo:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = eth1: 1

    Aggiungi più interfacce virtuali secondo necessità ripetendo. A causa della ONBOOT=yeslinea nel file ifcfg-eth1: 1, questa interfaccia verrà visualizzata all'avvio del sistema o all'avvio / riavvio della rete.

    service network restart
    

    Chiusura dell'interfaccia eth0: [OK]
    Chiusura dell'interfaccia eth1: [OK]
    Chiusura dell'interfaccia loopback: [OK] Visualizzazione
    dell'interfaccia loopback: [OK] Visualizzazione
    dell'interfaccia eth0: [OK] Visualizzazione
    dell'interfaccia eth1: [OK]

    ping 192.168.1.3
    

    64 byte da 192.168.1.3: icmp_seq = 1 ttl = 64 tempo = 0.105 ms


  • VirtualHosts
  • Nella sezione rssh sopra ho aggiunto un utente da utilizzare per SFTP. Nella home directory di questo utente, ho creato una cartella chiamata 'https'. Questo è dove vivranno i documenti per questo sito, quindi ho bisogno di aggiungere un host virtuale che lo indicherà. Userò l'interfaccia virtuale sopra per questo sito (qui chiamato dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Aggiungi quanto segue alla fine di 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>  
    

    Ho messo un file index.html fittizio nella directory https solo per controllare tutto. Ho provato a cercarlo e ho riscontrato errori di autorizzazione negati. I registri davano solo un oscuro riferimento a ciò che stava succedendo:

    [Lun 17 maggio 14:57:11 2010] [errore] [client 192.168.1.100] (13) Autorizzazione negata: accesso a /index.html negato

    Ho provato chmod 777 et. al., ma inutilmente. A quanto pare, avevo bisogno di chmod + x la directory https e le sue 'directory principali.

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

    Questo ha risolto quel problema.


  • DNS
  • Sto gestendo DNS tramite la nostra casella locale di Windows Server 2003. Tuttavia, la documentazione CentOS per BIND è disponibile qui: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Per far funzionare SSL, ho modificato quanto segue in 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>  
    

    Sfortunatamente, continuo a ricevere errori (Codice errore: ssl_error_rx_record_too_long) quando provo ad accedere a una pagina con SSL. Come JamesHannah ha indicato con garbo di seguito , non avevo impostato le posizioni dei certificati in httpd.conf, e quindi la pagina veniva lanciata al broswer mentre il certificato rendeva il browser inutilizzato.

    Quindi, prima, avevo bisogno di impostare una CA e creare file di certificati. Ho trovato una grande (se vecchia) procedura dettagliata sul processo qui: http://www.debian-administration.org/articles/284 .

    Ecco i passaggi rilevanti che ho preso da quell'articolo:

    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  
    

    Creare un openssl.cnffile nella directory /home/CA/e modificarlo per la procedura dettagliata collegata sopra. (Per riferimento, il mio file openssl.cnf finito sembrava così: 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)
    

    Modificato di openssl.cnfnuovo per le istruzioni dettagliate.

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

    Modificato di openssl.cnfnuovo per le istruzioni dettagliate.

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

    IMPORTANTE!

    Spostare i file e consultarli da httpd.conf nella nuova posizione

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

    Ho aggiornato httpd.conf per riflettere i certificati e accendere 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>  
    

    Inserisci CA cert.pem in un luogo accessibile dal Web e scaricato / importato nel mio browser. Ora posso visitare https: //dev.site.local senza errori o avvisi.


    E questo è dove sono io. Continuerò a modificarlo mentre faccio progressi. Tutti i suggerimenti su come configurare la posta elettronica SSL e / o la configurazione della connessione sicura a un altro Box che sarà il server MySQL sarebbero apprezzati.


    Non capisco perché hai bisogno delle interfacce di rete virtuale?
    Milano Babuškov,

    @Milano perché avrò più domini / sottodomini su questa macchina. Per utilizzare VirtualHost e SSL Ogni dominio / sottodominio dovrà avere il proprio 'indirizzo IP. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain

    Mi sembra uno spreco di indirizzi IP, ma ok. In alternativa, è possibile utilizzare porte TCP / IP diverse per ciascun dominio, tutte su un singolo IP. In questo modo il web server è meno dipendente dalla configurazione del sistema.
    Milano Babuškov,

    1
    @Milano: poiché l'installazione è solo locale, ho il lusso di disporre di più indirizzi IP disponibili di quanti ne avrò mai bisogno. La configurazione di interfacce aggiuntive, ho scoperto, è relativamente un processo piuttosto rapido e indolore. Se avessi installato questo sistema per uso pubblico, grazie agli aggiornamenti Apache2.2.xe TLS, VirtualHost sembra funzionare meglio con SSL: serverfault.com/questions/109766/…
    stormdrain

    1
    Consiglio vivamente koltsoff.com/pub/securing-centos - una guida molto istruttiva sulla protezione di CentOS (la maggior parte delle quali è facilmente applicabile ad altre distro) - non copre l'hosting, ma tutto ciò che c'è dentro dovrebbe essere compreso e applicato a qualsiasi server CentOS che non è protetto da un firewall che capisci e controlli.
    Dunxd,

    Risposte:


    6

    Questa guida contiene molte risposte sull'uso di SSL con Apache, spiega come creare un certificato autofirmato, come ottenere un certificato adeguato da un'autorità di certificazione riconosciuta e come creare la propria CA non affidabile per creare un certificato completo. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Per quanto riguarda gli host virtuali e SSL, ogni host avrà bisogno del proprio indirizzo IP o una soluzione più sporca è quella di ospitarli su porte diverse, rispetto allo standard a :443causa della natura dei certificati SSL, l'hosting virtuale basato sul nome non va d'accordo con SSL; ecco perché hai bisogno di un altro metodo per differenziare; porte / IP diversi.

    Configurare SSH è piuttosto semplice, dovrebbe già essere in esecuzione sul tuo server. Ti consigliamo di fare una serie di cose per bloccarlo.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Può essere aggiunto al tuo /etc/ssh/sshd_configper limitare l'accesso root remoto e rimuovere l'autenticazione con password, usando invece le coppie di chiavi pubbliche / private per accedere.

    Per creare la tua coppia di chiavi SSH, puoi usare puttygenin Windows; http://putty.very.rulez.org/download.html oppure è possibile creare la coppia di chiavi in un ambiente Linux in questo modo: ssh-keygen -b 2048 -t RSA -f my_keypair. Questo creerà un my_keypairfile e un my_keypair.pubfile (chiamato solo per questo esempio, potrei suggerire di nominare il tuo nome utente o lasciarlo -fe lasciarlo generare ~/.ssh/id_rsa).

    Trasferisci in modo sicuro my_keypairsulla tua workstation, per futuri accessi SSH, questa è la chiave privata, non dovresti condividerla con nessuno. Poi, sul server, creare $HOME/.sshse non esiste già, mkdir ~/.sshe poi copiare la chiave pubblica ( my_keypair.pub) per ~/.ssh/, se già avete authorized_keysin ~/.sshquanto hai fatto questo per le altre cose, si può fare cat my_keypair.pub >> authorized_keysper aggiungere la propria chiave pubblica, o cp my_keypair.pub authorized_keysse non esiste.

    Ora esegui chmod 700 ~/.sshe chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keysper impostare le autorizzazioni. È possibile conservare una copia di my_keypairin ~/.ssh/per l'utilizzo durante la connessione ad altri host, ma è necessario chmod 600 ~/.ssh/my_keypairassicurarsi che nessun altro possa accedervi.

    Ti consigliamo di aggiungere un normale account utente per te stesso e di aggiungerti a un gruppo diverso da users, come adminsnel mio esempio.

    Probabilmente vorrai anche aggiungere il tuo utente o gruppo /etc/sudoersper consentire l' sudoutilizzo, se non l'hai già fatto. Ciò si ottiene con il comando visudoche è l'unico modo per modificare questo file. visudoesegue il controllo degli errori e della sintassi sulla configurazione prima di scriverlo, prevenendo la perdita di sudoutilizzo.

    username ALL=(ALL) ALL
    

    aggiunto a /etc/sudoersconsentirà usernamel'esecuzione sudo yum install blahe richiederà la tua password. Questo è utile nel caso in cui tu abbia altri amministratori o amministratori temporanei, non è necessario condividere la password di root.


    Se si crea una coppia di chiavi in ​​Windows da Puttygen, tenere presente che è necessario modificare il formato della chiave pubblica una volta caricata sul server. Non ricordo come, ma su YouTube c'è in realtà un video.
    ESW,

    1

    Il problema con la tua configurazione SSL è che non hai effettivamente abilitato SSL, per questo avresti bisogno delle direttive Apache:

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

    Senza questo otterrai quegli errori di registrazione troppo lunghi, è perché invece delle intestazioni SSL che il tuo browser si aspettava, sta ottenendo invece solo la pagina Web non crittografata in un grosso pezzo.


    1
    (senza questo, tutto ciò che hai creato è un normale vhost non SSL in ascolto sulla porta 443)
    JamesHannah,

    1

    MySQL dal pacchetto originale supporta SSL. Per controllare la tua build MySQL, esegui

    mysqladmin variables | grep ssl
    

    Dovresti trovare qualcosa del genere have_ssl yes. Impostare le opzioni ssl-ca, ssl-keye ssl-cert.

    Crea account utente con requisiti SSL:

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

    Grazie per la risposta. Ho dimenticato di menzionare, tuttavia, che memorizzerò anche i file sul server db, quindi sembra che stunnel funzionerà meglio in questo caso.
    Stormdrain
    Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
    Licensed under cc by-sa 3.0 with attribution required.