La mise en place de A à Z d'une boîte Linux pour un hébergement local sécurisé

12

Je suis en train de réinstaller le système d'exploitation sur une machine qui sera utilisée pour héberger quelques applications pour notre entreprise. Les candidatures seront locales uniquement; l'accès à partir de clients externes se fera uniquement via VPN.

La configuration précédente utilisait un panneau de contrôle d'hébergement (Plesk) pour la plupart des administrateurs, et je cherchais à utiliser un autre logiciel similaire pour la réinstallation - mais j'ai pensé que je devrais enfin apprendre comment tout cela fonctionne. Je peux faire la plupart des choses que le logiciel ferait pour moi, mais je ne suis pas sûr de la symbiose de tout cela. Tout cela est une tentative de m'éloigner davantage du pays de Configuration Programmer / Programmer , si possible.

Je ne trouve aucune solution complète pour ce que je recherche, alors j'ai pensé poser cette question, et si les gens peuvent m'aider sur le chemin, je vais modifier cela avec les réponses et documenter mes progrès / pièges. J'espère qu'un jour cela aidera quelqu'un.

Les détails:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (à mettre à niveau)
  • PHP: 5.1 (à mettre à niveau)

Les exigences:

  • SÉCURITÉ!!
    • Transfert de fichiers sécurisé
    • Accès client sécurisé (certificats SSL et CA)
    • Stockage sécurisé des données
    • Connexion sécurisée à une autre machine locale (MySQL)
  • Hôtes virtuels / sous-domaines multiples
  • L'email local serait bien, mais pas critique

Les marches:

  • Téléchargez la dernière version de CentOS DVD-iso (le torrent a très bien fonctionné pour moi).

  • Installer CentOS:
    lors de l'installation, j'ai vérifié l'option Composants du serveur en pensant que j'allais utiliser un autre administrateur de type Plesk. Avec le recul, étant donné que j'ai décidé d'essayer de suivre mon propre chemin, ce n'était probablement pas la meilleure idée.


  • Configuration de base: configuration des utilisateurs, mise en réseau / adresse IP, etc. Mise à jour / mise à niveau Yum.


  • Mettre à jour PHP / MySQL: Pour mettre à jour PHP et MySQL vers les dernières versions, j'ai dû chercher un autre dépôt en dehors de CentOS. IUS est superbe et je suis heureux de l'avoir trouvé!
  • Ajouter le référentiel IUS à notre gestionnaire de packages

    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
    

    Supprimer l'ancienne version de PHP et installer la nouvelle version d'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)
    

    Mettre à niveau MySQL à partir du référentiel 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
    

    Instructions de mise à niveau fournies par IUS wiki: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Installez rssh (shell restreint) pour fournir scpet sftpaccéder, sans autoriser la sshconnexion
  • 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
    

    Modifier /etc/rssh.confpour accorder l'accès à SFTP aux utilisateurs rssh.

    vi /etc/rssh.conf
    

    Décommentez ou ajoutez:

    allowscp
    allowsftp
    

    Cela me permet de me connecter à la machine via le protocole SFTP dans Transmit (mon programme FTP de choix; je suis sûr que c'est similaire avec d'autres applications FTP).

    Instructions rssh appropriées (avec appréciation!) sur http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Configurer des interfaces virtuelles
  • 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 | modifier pour qu'il ressemble à ceci:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = oui
    NAME = eth1: 1

    Ajoutez plus d'interfaces virtuelles au besoin en répétant. En raison de la ONBOOT=yesligne du fichier ifcfg-eth1: 1, cette interface sera affichée au démarrage du système ou au démarrage / redémarrage du réseau.

    service network restart
    

    Arrêt de l'interface eth0: [OK]
    Arrêt de l'interface eth1: [OK]
    Arrêt de l'interface de bouclage: [OK]
    Affichage de l'interface de bouclage: [OK]
    Affichage de l'interface eth0: [OK]
    Affichage de l'interface eth1: [OK]

    ping 192.168.1.3
    

    64 octets de 192.168.1.3: icmp_seq = 1 ttl = 64 temps = 0,105 ms


  • Virtualhosts
  • Dans la section rssh ci-dessus, j'ai ajouté un utilisateur à utiliser pour SFTP. Dans le répertoire personnel de cet utilisateur, j'ai créé un dossier appelé «https». C'est là que vivront les documents de ce site, je dois donc ajouter un hôte virtuel qui le pointera. J'utiliserai l'interface virtuelle ci-dessus pour ce site (appelé ici dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Ajoutez ce qui suit à la fin de 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>  
    

    J'ai mis un fichier fictif index.html dans le répertoire https juste pour tout vérifier. J'ai essayé d'y accéder et j'ai rencontré des erreurs d'autorisation refusée. Les journaux ne donnaient qu'une référence obscure à ce qui se passait:

    [Lun 17 mai 14:57:11 2010] [erreur] [client 192.168.1.100] (13) Autorisation refusée: accès à /index.html refusé

    J'ai essayé chmod 777 et. al., mais en vain. Il s'avère que j'avais besoin de chmod + x le répertoire https et ses répertoires parents.

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

    Cela a résolu ce problème.


  • DNS
  • Je gère le DNS via notre boîte Windows Server 2003 locale. Cependant, la documentation CentOS pour BIND est disponible ici: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Pour faire fonctionner SSL, j'ai changé ce qui suit dans 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>  
    

    Malheureusement, je continue de recevoir des erreurs (code d'erreur: ssl_error_rx_record_too_long) lorsque j'essaie d'accéder à une page avec SSL. Comme JamesHannah l'a gracieusement souligné ci - dessous , je n'avais pas configuré les emplacements des certificats dans httpd.conf, et je recevais donc la page lancée sur le navigateur en tant que certificat faisant reculer le navigateur.

    Donc, d'abord, je devais configurer une autorité de certification et créer des fichiers de certificat. J'ai trouvé une grande (si ancienne) procédure pas à pas sur le processus ici: http://www.debian-administration.org/articles/284 .

    Voici les étapes pertinentes que j'ai prises à partir de cet article:

    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  
    

    Créez un openssl.cnffichier dans le répertoire /home/CA/et modifiez-le selon la procédure pas à pas liée ci-dessus. (Pour référence, mon fichier openssl.cnf terminé ressemblait à ceci: 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)
    

    Modifié à openssl.cnfnouveau selon les instructions pas à pas.

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

    Modifié à openssl.cnfnouveau selon les instructions pas à pas.

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

    IMPORTANT!

    Déplacez les fichiers et référencez-les depuis httpd.conf dans le nouvel emplacement

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

    J'ai mis à jour httpd.conf pour refléter les certificats et activer 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>  
    

    Placez le CA cert.pem dans un endroit accessible sur le Web et téléchargez / importez-le dans mon navigateur. Maintenant, je peux visiter https: //dev.site.local sans erreurs ni avertissements.


    Et c'est là que j'en suis. Je continuerai de le modifier au fur et à mesure de mes progrès. Tous les conseils sur la configuration de la messagerie SSL et / ou la configuration d'une connexion sécurisée à une autre Box qui sera le serveur MySQL seraient appréciés.

    tempête
    la source
    Je ne comprends pas pourquoi avez-vous besoin des interfaces réseau virtuelles?
    Milan Babuškov
    @Milan car j'aurai plusieurs domaines / sous-domaines sur cette machine. Pour utiliser VirtualHost et SSL, chaque domaine / sous-domaine devra avoir sa propre adresse IP. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    On dirait un gaspillage d'adresses IP pour moi, mais ok. Alternativement, vous pouvez utiliser différents ports TCP / IP pour chaque domaine - le tout sur une seule IP. De cette façon, le serveur Web dépend moins de la configuration du système.
    Milan Babuškov
    1
    @Milan: Étant donné que la configuration est locale uniquement, j'ai le luxe de disposer de beaucoup plus d'adresses IP disponibles que je n'en aurai jamais besoin. La mise en place d'interfaces supplémentaires, j'ai trouvé, est un processus relativement rapide et indolore comparativement. Si je configurais ce système pour un usage public, grâce aux mises à jour Apache2.2.x et TLS, VirtualHost semble mieux fonctionner avec SSL: serverfault.com/questions/109766/…
    stormdrain
    1
    Je recommanderais vivement koltsoff.com/pub/securing-centos - une procédure très éducative sur la sécurisation de CentOS (dont la plupart est facilement applicable à d'autres distributions) - il ne couvre pas l'hébergement, mais tout ce qu'il contient doit être compris et appliqué à tout serveur CentOS qui n'est pas derrière un pare-feu que vous comprenez et contrôlez.
    dunxd

    Réponses:

    6

    Ce guide contient de nombreuses réponses sur l'utilisation de SSL avec Apache, vous explique comment créer un certificat auto-signé, comment obtenir un certificat approprié auprès d'une autorité de certification reconnue et comment créer votre propre autorité de certification non fiable pour créer un certificat complet. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Quant aux hôtes virtuels et SSL, chaque hôte aura besoin de sa propre adresse IP ou une solution plus sale consiste à les héberger sur des ports différents, que la norme :443 raison de la nature des certificats SSL, l'hébergement virtuel basé sur le nom ne s'entend pas avec SSL; c'est pourquoi vous avez besoin d'une autre méthode pour différencier; ports / IP différents.

    La configuration de SSH est assez facile, elle devrait déjà être exécutée sur votre serveur. Vous voudrez faire un certain nombre de choses pour le verrouiller.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Il peut être ajouté à votre /etc/ssh/sshd_configpour restreindre l'accès root à distance et supprimer l'authentification par mot de passe, à la place, en utilisant des paires de clés publiques / privées pour vous connecter.

    Pour créer votre paire de clés SSH, vous pouvez utiliser puttygensous Windows; http://putty.very.rulez.org/download.html ou vous pouvez créer la paire de clés dans un environnement Linux comme ceci: ssh-keygen -b 2048 -t RSA -f my_keypair. Cela va créer un my_keypairfichier et un my_keypair.pubfichier (uniquement nommé pour cet exemple, je pourrais suggérer de nommer votre nom d'utilisateur ou de le laisser -f, et de le laisser générer ~/.ssh/id_rsa).

    Transférez en toute sécurité my_keypairsur votre poste de travail, pour un futur accès SSH, c'est la clé privée, vous ne devez la partager avec personne. Ensuite, sur le serveur, créez $HOME/.sshsi elle n'existe pas déjà, mkdir ~/.sshpuis copier la clé publique ( my_keypair.pubà) ~/.ssh/, si vous avez déjà authorized_keysen ~/.sshparce que vous avez fait pour d' autres choses, vous pouvez fairecat my_keypair.pub >> authorized_keys pour ajouter votre clé publique, ou cp my_keypair.pub authorized_keyssi ça n'existe pas.

    Maintenant, exécutez chmod 700 ~/.sshet chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keyspour définir les autorisations. Vous pouvez conserver une copie my_keypairdans~/.ssh/ pour l'utiliser lors de la connexion à d'autres hôtes, mais vous devez vous chmod 600 ~/.ssh/my_keypairassurer que personne d'autre ne peut y accéder.

    Vous voudrez ajouter un compte d'utilisateur normal pour vous-même et vous ajouter à un groupe autre que users , comme adminsdans mon exemple.

    Vous souhaiterez probablement également ajouter votre utilisateur ou groupe /etc/sudoerspour activer l' sudoutilisation, si vous ne l'avez pas déjà fait. Ceci est accompli avec la commande visudoqui est le seul moyen de modifier ce fichier. visudoexécute une vérification des erreurs et de la syntaxe sur votre configuration avant de l'écrire, empêchant la perte d' sudoutilisation.

    username ALL=(ALL) ALL
    

    ajouté à /etc/sudoerspermettra usernamed'exécuter sudo yum install blahet vous demandera votre propre mot de passe. C'est pratique dans le cas où vous avez d'autres administrateurs ou administrateurs temporaires, vous n'avez pas besoin de partager le mot de passe root.

    cpbills
    la source
    Si vous créez une paire de clés dans Windows à partir de puttygen, sachez que vous devez changer le format de la clé publique une fois que vous l'avez téléchargée sur le serveur. Je ne me souviens pas comment mais youtube il y a en fait une vidéo.
    ESW
    1

    Le problème avec votre configuration SSL est que vous n'avez pas réellement activé SSL, vous auriez besoin des directives Apache pour cela:

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

    Sans cela, vous obtiendrez ces erreurs d'enregistrement trop longues, c'est parce qu'au lieu des en-têtes SSL que votre navigateur attendait, il obtient à la place juste la page Web non chiffrée dans un gros morceau.

    JamesHannah
    la source
    1
    (sans cela, tout ce que vous avez créé est une écoute vhost non SSL régulière sur le port 443)
    JamesHannah
    1

    MySQL du package d'origine prend en charge SSL. Pour vérifier votre build MySQL, exécutez

    mysqladmin variables | grep ssl
    

    Vous devriez trouver quelque chose comme have_ssl yes. Configurer les options ssl-ca, ssl-keyet ssl-cert.

    Créez des comptes d'utilisateurs avec des exigences SSL:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    
    sumar
    la source
    Merci pour la réponse. J'ai oublié de mentionner, cependant, que je vais également stocker des fichiers sur le serveur db, il semble donc que Stunnel fonctionnera mieux dans ce cas.
    stormdrain