Das A bis Z beim Einrichten einer Linux-Box für sicheres lokales Hosting

12

Ich bin dabei, das Betriebssystem auf einem Computer neu zu installieren, auf dem einige Anwendungen für unser Unternehmen gehostet werden. Die Anwendungen sind nur lokal. Der Zugriff von externen Clients erfolgt ausschließlich über VPN.

Das vorherige Setup verwendete für die meisten Administratoren ein Hosting-Control-Panel (Plesk), und ich wollte eine andere ähnliche Software für die Neuinstallation verwenden - aber ich dachte, ich sollte endlich lernen, wie das alles funktioniert. Ich kann die meisten Dinge tun, die die Software für mich tun würde, aber ich bin mir nicht sicher, ob das eine Symbiose ist. Dies ist alles ein Versuch, mich weiter vom Land der Konfigurationsprogrammierer / Programmierer zu distanzieren , wenn dies überhaupt möglich ist.

Ich kann nirgendwo eine vollständige exemplarische Vorgehensweise für das finden, wonach ich suche. Ich dachte, ich würde diese Frage stellen, und wenn die Leute mir dabei helfen können, werde ich sie mit den Antworten bearbeiten und meine Fortschritte dokumentieren. Tücken. Hoffentlich hilft dies eines Tages jemandem auf der ganzen Linie.

Die Details:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (wird aktualisiert)
  • PHP: 5.1 (wird aktualisiert)

Die Anforderungen:

  • SICHERHEIT!!
    • Sichere Dateiübertragung
    • Sicherer Clientzugriff (SSL-Zertifikate und CA)
    • Sichere Datenspeicherung
    • Sichere Verbindung zu einem anderen lokalen Computer (MySQL)
  • Virtualhosts / mehrere Subdomains
  • Lokale E-Mail wäre nett, aber nicht kritisch

Die Schritte:

  • Laden Sie die neueste CentOS-DVD-ISO herunter (Torrent hat bei mir großartig funktioniert).

  • CentOS installieren:
    Während der Installation habe ich die Option "Serverkomponenten" aktiviert und angenommen, dass ich einen anderen Plesk-ähnlichen Administrator verwenden würde. Im Nachhinein war dies wahrscheinlich nicht die beste Idee, wenn man bedenkt, dass ich mich entschlossen habe, meinen eigenen Weg zu gehen.

  • Grundkonfiguration:
    Benutzer einrichten, Netzwerk / IP-Adresse usw. Yum Update / Upgrade.

  • Upgrade von PHP / MySQL:
    Um PHP und MySQL auf die neuesten Versionen zu aktualisieren, musste ich auf ein anderes Repo außerhalb von CentOS schauen. IUS sieht gut aus und ich bin froh, dass ich es gefunden habe!
  • Fügen Sie unserem Paketmanager das IUS-Repository hinzu

    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
    

    Alte Version von PHP entfernen und neuere Version von IUS installieren

    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)
    

    Aktualisieren Sie MySQL vom IUS-Repository

    /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
    

    Upgrade-Anweisungen mit freundlicher Genehmigung des IUS-Wikis: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Installieren Sie rssh (eingeschränkte Shell) für die Bereitstellung scpund den sftpZugriff, ohne die sshAnmeldung zuzulassen
  • 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
    

    Bearbeiten /etc/rssh.conf, um rssh-Benutzern Zugriff auf SFTP zu gewähren.

    vi /etc/rssh.conf
    

    Kommentar entfernen oder hinzufügen:

    allowscp
    allowsftp
    

    Auf diese Weise kann ich über das SFTP-Protokoll in Transmit (dem FTP-Programm meiner Wahl) eine Verbindung zum Gerät herstellen.

    rssh Anweisungen (mit Anerkennung!) von http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Richten Sie virtuelle Schnittstellen ein
  • 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 | Ändern Sie, damit es so aussieht:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = yes
    NAME = eth1: 1

    Fügen Sie nach Bedarf weitere virtuelle Schnittstellen hinzu, indem Sie diesen Vorgang wiederholen. Aufgrund der ONBOOT=yesZeile in der Datei ifcfg-eth1: 1 wird diese Schnittstelle beim Systemstart oder beim Starten / Neustarten des Netzwerks aufgerufen.

    service network restart
    

    Schnittstelle eth0 herunterfahren: [OK]
    Schnittstelle eth1 herunterfahren: [OK]
    Loopback-Schnittstelle herunterfahren: [OK]
    Loopback-
    Schnittstelle hochfahren: [OK]
    Interface eth0 hochfahren: [OK] Interface eth1 hochfahren: [OK]

    ping 192.168.1.3
    

    64 Bytes von 192.168.1.3: icmp_seq = 1 ttl = 64 time = 0.105 ms


  • Virtualhosts
  • Im obigen rssh-Abschnitt habe ich einen Benutzer hinzugefügt, der für SFTP verwendet werden soll. In diesem Benutzerverzeichnis habe ich einen Ordner mit dem Namen "https" erstellt. Hier werden die Dokumente für diese Site gespeichert. Daher muss ein virtueller Host hinzugefügt werden, der darauf verweist. Ich werde die oben genannte virtuelle Schnittstelle für diese Site verwenden (hier dev.site.local genannt).

    vi /etc/http/conf/httpd.conf
    

    Fügen Sie am Ende von httpd.conf Folgendes hinzu:

    <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>  
    

    Ich habe eine Dummy-Datei index.html in das https-Verzeichnis gelegt, um alles zu überprüfen. Ich habe versucht, darauf zuzugreifen, und wurde mit der Erlaubnis empfangen, Fehler zu verweigern. Die Protokolle gaben nur einen undurchsichtigen Hinweis darauf, was vor sich ging:

    [Mo 17 Mai 14:57:11 2010] [Fehler] [Client 192.168.1.100] (13) Berechtigung verweigert: Zugriff auf /index.html verweigert

    Ich habe versucht, chmod 777 et. al., aber ohne Erfolg. Es stellte sich heraus, dass ich das https-Verzeichnis und dessen übergeordnete Verzeichnisse mit chmod + x bearbeiten musste.

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

    Dies löste das Problem.


  • DNS
  • Ich verwalte DNS über unsere lokale Windows Server 2003-Box. Die CentOS-Dokumentation für BIND finden Sie jedoch hier: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Damit SSL funktioniert, habe ich in httpd.conf Folgendes geändert:

    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>  
    

    Leider erhalte ich immer wieder Fehler (Fehlercode: ssl_error_rx_record_too_long), wenn ich versuche, auf eine Seite mit SSL zuzugreifen. Wie JamesHannah anmutig unten wies darauf hin , ich hatte nicht die Positionen der certs in httpd.conf einrichten und auf diese Weise wurde immer die Seite am broswer als cert geworfen , um den Browser balk machen.

    So zuerst, ich brauchte ein einzurichten CA und Zertifikatsdateien zu machen. Ich habe hier eine großartige (wenn auch alte) Anleitung gefunden: http://www.debian-administration.org/articles/284 .

    Hier sind die relevanten Schritte, die ich in diesem Artikel unternommen habe:

    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  
    

    Erstellen Sie eine openssl.cnfDatei im /home/CA/Verzeichnis und bearbeiten Sie sie gemäß der oben verlinkten exemplarischen Vorgehensweise. (Als Referenz sah meine fertige Datei openssl.cnf folgendermaßen aus: 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.cnfErneut geändert gemäß Anleitung.

    #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.cnfErneut geändert gemäß Anleitung.

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

    WICHTIG!

    Verschieben Sie die Dateien und verweisen Sie sie von httpd.conf an den neuen Speicherort

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

    Ich habe httpd.conf aktualisiert, um die Zertifikate wiederzugeben und SSLEngine einzuschalten:

    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>  
    

    Legen Sie das CA-Zertifikat "cert.pem" an einem über das Internet zugänglichen Ort ab und laden Sie es herunter bzw. importieren Sie es in meinen Browser. Jetzt kann ich https: //dev.site.local ohne Fehler oder Warnungen besuchen .


    Und hier bin ich. Ich werde das weiter bearbeiten, wenn ich Fortschritte mache. Alle Tipps zum Konfigurieren von SSL-E-Mail und / oder zum Konfigurieren einer sicheren Verbindung zu einer anderen Box, die der MySQL-Server sein wird, sind willkommen.

    Stormdrain
    quelle
    Ich verstehe nicht, warum Sie die virtuellen Netzwerkschnittstellen benötigen?
    Milan Babuškov
    @Milan weil ich mehrere Domains / Subdomains auf diesem Rechner haben werde. Um VirtualHost und SSL nutzen zu können, muss jede Domain / Subdomain ihre eigene IP-Adresse haben. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    Sieht für mich nach einer Verschwendung von IP-Adressen aus, ist aber in Ordnung. Alternativ können Sie für jede Domäne unterschiedliche TCP / IP-Ports verwenden - alle auf einer einzigen IP-Adresse. Auf diese Weise ist der Webserver weniger abhängig von der Systemkonfiguration.
    Milan Babuškov
    1
    @Milan: Da das Setup nur lokal ist, habe ich den Luxus, mehr IP-Adressen zur Verfügung zu haben, als ich jemals brauchen werde. Das Einrichten zusätzlicher Schnittstellen ist vergleichsweise schnell und problemlos. Wenn ich dieses System für die öffentliche Nutzung eingerichtet habe, scheint VirtualHost dank Apache2.2.x- und TLS-Upgrades besser mit SSL zu funktionieren: serverfault.com/questions/109766/…
    stormdrain
    1
    Kann koltsoff.com/pub/securing-centos nur empfehlen - eine sehr lehrreiche Anleitung zum Sichern von CentOS (von denen die meisten leicht auf andere Distributionen anwendbar sind) - es deckt nicht das Hosting ab, aber alles darin sollte verstanden und angewendet werden Jeder CentOS-Server, der sich nicht hinter einer Firewall befindet, die Sie verstehen und steuern.
    Dunxd

    Antworten:

    6

    In diesem Handbuch finden Sie viele Antworten zur Verwendung von SSL mit Apache. Außerdem erfahren Sie, wie Sie ein selbstsigniertes Zertifikat erstellen, ein ordnungsgemäßes Zertifikat von einer anerkannten Zertifizierungsstelle erhalten und eine eigene, nicht vertrauenswürdige Zertifizierungsstelle erstellen volles Zertifikat. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Bei virtuellen Hosts und SSL benötigt jeder Host eine eigene IP-Adresse, oder es ist eine schmutzigere Lösung, sie an anderen Ports als dem Standard zu hosten. :443Aufgrund der Art der SSL-Zertifikate kommt das namensbasierte virtuelle Hosting mit SSL nicht zurecht. Aus diesem Grund benötigen Sie eine andere Methode zur Unterscheidung. unterschiedliche Ports / IPs.

    Das Einrichten von SSH ist ziemlich einfach. Es sollte bereits auf Ihrem Server ausgeführt werden. Sie werden einige Dinge tun wollen, um es zu sperren.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Es kann hinzugefügt werden, um den /etc/ssh/sshd_configRemotestammzugriff einzuschränken und die Kennwortauthentifizierung zu entfernen, anstatt sich mit öffentlichen / privaten Schlüsselpaaren anzumelden.

    Zum Erstellen Ihres SSH-Schlüsselpaars können Sie puttygenWindows verwenden. http://putty.very.rulez.org/download.html oder Sie können das Schlüsselpaar in einer Linux-Umgebung wie folgt erstellen:ssh-keygen -b 2048 -t RSA -f my_keypair . Dies erstellt eine my_keypairDatei und eine my_keypair.pubDatei (nur für dieses Beispiel benannt, ich würde vorschlagen, Ihren Benutzernamen zu benennen oder wegzulassen -fund es generieren zu lassen ~/.ssh/id_rsa).

    Sichere Übertragung my_keypairauf Ihre Workstation für zukünftigen SSH-Zugriff. Dies ist der private Schlüssel. Sie sollten ihn nicht an Dritte weitergeben. Erstellen $HOME/.sshSie dann auf dem Server einen mkdir ~/.sshöffentlichen Schlüssel ( my_keypair.pub) , sofern dieser noch nicht vorhanden ist , und kopieren Sie ihn nach~/.ssh/ , wenn Sie bereits authorized_keysin , ~/.sshweil Sie diese für andere Dinge getan haben, können Sie cat my_keypair.pub >> authorized_keysIhren öffentlichen Schlüssel anhängen, oder cp my_keypair.pub authorized_keyswenn es existiert nicht.

    Jetzt renn chmod 700 ~/.sshundchmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keys , um Berechtigungen festzulegen. Sie können eine Kopie von my_keypairin ~/.ssh/für die Verbindung mit anderen Hosts aufbewahren, aber Sie sollten chmod 600 ~/.ssh/my_keypairsicherstellen, dass niemand anderes darauf zugreifen kann.

    Sie möchten ein normales Benutzerkonto für sich selbst hinzufügen und sich einer anderen Gruppe als users, wie adminsin meinem Beispiel , hinzufügen .

    Sie möchten wahrscheinlich auch Ihren Benutzer oder Ihre Gruppe hinzufügen /etc/sudoers, um die sudoVerwendung zu aktivieren , falls Sie dies noch nicht getan haben. Dies geschieht mit dem Befehl visudo, mit dem Sie diese Datei nur bearbeiten sollten. visudoFührt eine Fehler- und Syntaxprüfung für Ihre Konfiguration durch, bevor Sie diese ausschreiben, um sudoNutzungsverluste zu vermeiden.

    username ALL=(ALL) ALL
    

    hinzugefügt, /etc/sudoersum usernamedie Ausführung zu ermöglichen sudo yum install blahund Sie zur Eingabe Ihres eigenen Passworts aufzufordern. Dies ist praktisch, wenn Sie andere Administratoren oder temporäre Administratoren haben und das Root-Passwort nicht weitergeben müssen.

    cpbills
    quelle
    Wenn Sie in Windows ein Schlüsselpaar aus puttygen erstellen, müssen Sie das Format des öffentlichen Schlüssels ändern, sobald Sie ihn auf den Server hochladen. Ich kann mich nicht erinnern, wie, aber auf YouTube gibt es tatsächlich ein Video.
    ESW
    1

    Das Problem mit Ihrer SSL-Konfiguration ist, dass Sie SSL nicht aktiviert haben. Dafür benötigen Sie die Apache-Direktiven:

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

    Andernfalls erhalten Sie zu lange Fehler, da Ihr Browser anstelle der von ihm erwarteten SSL-Header nur die unverschlüsselte Webseite in einem großen Block abruft.

    JamesHannah
    quelle
    1
    (ohne dies ist alles, was Sie erstellt haben, ein regulärer Nicht-SSL-Host, der Port 443
    abhört
    1

    MySQL aus dem Originalpaket unterstützt SSL. Führen Sie Folgendes aus, um Ihren MySQL-Build zu überprüfen

    mysqladmin variables | grep ssl
    

    Du solltest sowas finden have_ssl yes. Richten Sie Optionen ssl-ca, ssl-keyund ssl-cert.

    Erstellen Sie Benutzerkonten mit SSL-Anforderungen:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    
    sumar
    quelle
    Danke für die Antwort. Ich habe jedoch vergessen zu erwähnen, dass ich auch Dateien auf dem Datenbankserver speichern werde, so dass es so aussieht, als würde stunnel in diesem Fall besser funktionieren.
    Stormdrain