Od A do Z konfiguracji Linux-a do bezpiecznego lokalnego hostingu

12

Jestem w trakcie ponownej instalacji systemu operacyjnego na komputerze, który będzie używany do obsługi kilku aplikacji dla naszej firmy. Aplikacje będą tylko lokalne; dostęp z zewnętrznych klientów będzie możliwy tylko przez VPN.

Wcześniejsza konfiguracja korzystała z panelu kontrolnego hostingu (Plesk) dla większości administratorów i zastanawiałem się nad użyciem innego podobnego oprogramowania do ponownej instalacji - ale pomyślałem, że powinienem w końcu dowiedzieć się, jak to wszystko działa. Mogę zrobić większość rzeczy, które oprogramowanie by dla mnie zrobiło, ale nie jestem pewien, co do symbiozy tego wszystkiego. To wszystko jest próba dalszego dystansowania się od kraju programisty / programisty , jeśli to w ogóle możliwe.

Nigdzie nie mogę znaleźć pełnego przewodnika po tym, czego szukam, więc pomyślałem, że postawię to pytanie, a jeśli ludzie mogą mi pomóc w drodze, zredaguję je odpowiedziami i udokumentuję moje postępy / pułapki. Mam nadzieję, że któregoś dnia to pomoże komuś zejść na dalszy plan.

Szczegóły:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (do aktualizacji)
  • PHP: 5.1 (do aktualizacji)

Wymagania:

  • BEZPIECZEŃSTWO!!
    • Bezpieczny transfer plików
    • Bezpieczny dostęp klienta (certyfikaty SSL i urząd certyfikacji)
    • Bezpieczne przechowywanie danych
    • Bezpieczne połączenie z innym komputerem lokalnym (MySQL)
  • Virtualhosts / wiele subdomen
  • Lokalny adres e-mail byłby miły, ale nie krytyczny

Kroki:

  • Pobierz najnowszą wersję DVD Cento DVD-iso (torrent działał dla mnie świetnie).

  • Zainstaluj CentOS:
    Podczas instalacji sprawdziłem opcję Składniki serwera, myśląc, że będę używał innego administratora podobnego do Pleska. Z perspektywy czasu, biorąc pod uwagę, że zdecydowałem się pójść własną drogą, prawdopodobnie nie był to najlepszy pomysł.

  • Podstawowa konfiguracja:
    skonfiguruj użytkowników, adres sieciowy / IP itp. Aktualizacja / aktualizacja Yum.

  • Uaktualnienie PHP / MySQL:
    Aby zaktualizować PHP i MySQL do najnowszych wersji, musiałem szukać innego repozytorium poza CentOS. IUS wygląda świetnie i cieszę się, że go znalazłem!
  • Dodaj repozytorium IUS do naszego menedżera pakietów

    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
    

    Usuń starą wersję PHP i zainstaluj nowszą wersję z 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)
    

    Zaktualizuj MySQL z repozytorium 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
    

    Instrukcje aktualizacji dzięki uprzejmości IUS wiki: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Zainstaluj rssh (zastrzeżoną powłokę), aby zapewnić dostęp scpi sftpdostęp bez zezwolenia na sshlogowanie
  • 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
    

    Edytuj, /etc/rssh.confaby przyznać dostęp do SFTP użytkownikom rssh.

    vi /etc/rssh.conf
    

    Odkomentuj lub dodaj:

    allowscp
    allowsftp
    

    Pozwala mi to połączyć się z maszyną za pomocą protokołu SFTP w Transmit (mój wybrany program FTP; jestem pewien, że jest podobny do innych aplikacji FTP).

    instrukcje rssh zawłaszczone (z uznaniem!) z http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Skonfiguruj interfejsy wirtualne
  • 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 | zmodyfikuj, aby wyglądało to tak:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3 NETMASK
    = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = tak
    NAZWA = eth1: 1

    W razie potrzeby dodaj więcej interfejsów wirtualnych, powtarzając. Ze względu na ONBOOT=yeswiersz w pliku ifcfg-eth1: 1 interfejs ten zostanie uruchomiony, gdy system uruchomi się lub sieć uruchomi się / uruchomi ponownie.

    service network restart
    

    Wyłączanie interfejsu eth0: [OK]
    Wyłączanie interfejsu eth1: [OK]
    Wyłączanie interfejsu sprzężenia zwrotnego: [OK]
    Uruchomienie interfejsu sprzężenia zwrotnego: [OK]
    Uruchomienie interfejsu eth0: [OK]
    Uruchomienie interfejsu eth1: [OK]

    ping 192.168.1.3
    

    64 bajty z 192.168.1.3: icmp_seq = 1 ttl = 64 czas = 0,105 ms


  • Virtualhosts
  • W powyższej sekcji rssh dodałem użytkownika do użycia dla SFTP. W katalogu domowym tego użytkownika utworzyłem folder o nazwie „https”. W tym miejscu będą istnieć dokumenty tej witryny, więc muszę dodać wirtualny host, który będzie do niego wskazywał. Będę korzystać z powyższego interfejsu wirtualnego dla tej witryny (tutaj o nazwie dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Dodaj następujące na końcu 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>  
    

    Umieszczam fikcyjny plik index.html w katalogu https, żeby wszystko sprawdzić. Próbowałem przejść do niego i napotkałem błędy odmowy uprawnień. Dzienniki zawierały jedynie niejasne odniesienie do tego, co się działo:

    [Pon 17 maja 14:57:11 2010] [błąd] [klient 192.168.1.100] (13) Odmowa dostępu: odmowa dostępu do /index.html

    Próbowałem chmod 777 et. al., ale bezskutecznie. Okazuje się, że musiałem chmod + x katalog https i jego katalogi nadrzędne.

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

    To rozwiązało ten problem.


  • DNS
  • Obsługuję DNS za pośrednictwem naszego lokalnego systemu Windows Server 2003. Jednak dokumentację CentOS dla BIND można znaleźć tutaj: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Aby SSL działał, zmieniłem następujące w 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>  
    

    Niestety wciąż próbuję uzyskać dostęp do strony za pomocą protokołu SSL (kod błędu: ssl_error_rx_record_too_long). Jak JamesHannah z wdziękiem podkreślił poniżej , nie ustawiłem lokalizacji certyfikatów w httpd.conf, w ten sposób powodowałem, że strona została rzucona na broswer, gdy certyfikat powodował niechęć przeglądarki.

    Najpierw musiałem skonfigurować urząd certyfikacji i utworzyć pliki certyfikatów. Znalazłem świetny (jeśli stary) przewodnik na temat tego procesu tutaj: http://www.debian-administration.org/articles/284 .

    Oto odpowiednie kroki, które podjąłem z tego artykułu:

    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  
    

    Utwórz openssl.cnfplik w katalogu /home/CA/i edytuj go zgodnie z powyższym opisem. (Dla porównania, mój gotowy plik openssl.cnf wyglądał tak: 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)
    

    Zmodyfikowano openssl.cnfponownie zgodnie z instrukcjami.

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

    Zmodyfikowano openssl.cnfponownie zgodnie z instrukcjami.

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

    WAŻNY!

    Przenieś pliki i odwołaj się do nich z httpd.conf w nowej lokalizacji

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

    Zaktualizowałem httpd.conf, aby odzwierciedlić certyfikaty i włączyć 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>  
    

    Umieść certyfikat CA.p.pem w miejscu dostępnym w sieci i pobierz go / zaimportuj do mojej przeglądarki. Teraz mogę odwiedzić https: //dev.site.local bez błędów i ostrzeżeń.


    I tu jestem. Będę kontynuować edycję tego, gdy będę robić postępy. Wszelkie wskazówki dotyczące konfiguracji wiadomości e-mail SSL i / lub konfigurowania bezpiecznego połączenia z innym urządzeniem Box, którym będzie serwer MySQL, będą mile widziane.

    drenażu burzowego
    źródło
    Nie rozumiem, dlaczego potrzebujesz interfejsów sieci wirtualnej?
    Milan Babuškov
    @Milan, ponieważ na tym komputerze będę mieć wiele domen / subdomen. Aby korzystać z VirtualHost i SSL Każda domena / subdomena będzie musiała mieć swój własny adres IP. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain
    Wygląda mi na marnotrawstwo adresów IP, ale ok. Alternatywnie możesz użyć różnych portów TCP / IP dla każdej domeny - wszystkie pod jednym adresem IP. W ten sposób serwer WWW jest mniej zależny od konfiguracji systemu.
    Milan Babuškov,
    1
    @Milan: Ponieważ konfiguracja jest tylko lokalna, mam luksus znacznie większej liczby dostępnych adresów IP niż kiedykolwiek będę potrzebować. Przekonałem się, że konfiguracja dodatkowych interfejsów jest stosunkowo szybkim i bezbolesnym procesem. Gdybym konfigurował ten system do użytku publicznego, dzięki aktualizacjom Apache2.2.x i TLS, VirtualHost wydaje się działać lepiej z SSL: serverfault.com/questions/109766/…
    stormdrain
    1
    Zdecydowanie poleciłbym koltsoff.com/pub/securing-centos - bardzo edukacyjny przewodnik na temat zabezpieczania CentOS (z których większość można łatwo zastosować do innych dystrybucji) - nie obejmuje hostingu, ale wszystko w nim powinno być zrozumiane i zastosowane do każdy serwer CentOS, który nie znajduje się za firewallem, który rozumiesz i kontrolujesz.
    dunxd

    Odpowiedzi:

    6

    Ten przewodnik zawiera wiele odpowiedzi na temat używania protokołu SSL z Apache, zawiera instrukcje dotyczące tworzenia certyfikatu z podpisem własnym, uzyskiwania właściwego certyfikatu od uznanego urzędu certyfikacji oraz tworzenia własnego, niezaufanego urzędu certyfikacji w celu utworzenia certyfikatu pełny certyfikat. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Jeśli chodzi o hosty wirtualne i SSL, każdy host będzie potrzebował własnego adresu IP lub brudniejszym rozwiązaniem jest hostowanie ich na innych portach niż standardowe :443ze względu na naturę certyfikatów SSL, wirtualny hosting oparty na nazwie nie dogaduje się z SSL; dlatego potrzebujesz innej metody rozróżnienia; różne porty / adresy IP.

    Konfiguracja SSH jest dość łatwa, powinna już działać na twoim serwerze. Będziesz chciał zrobić wiele rzeczy, aby to zablokować.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Można go dodać do twojego, /etc/ssh/sshd_configaby ograniczyć zdalny dostęp do roota i usunąć uwierzytelnianie za pomocą hasła, zamiast tego używając loginu publicznego / prywatnego do logowania.

    Aby utworzyć parę kluczy SSH, możesz użyć puttygenw systemie Windows; http://putty.very.rulez.org/download.html lub można utworzyć parę kluczy w środowisku Linux tak: ssh-keygen -b 2048 -t RSA -f my_keypair. Spowoduje to utworzenie my_keypairpliku i my_keypair.pubpliku (o nazwie tylko dla tego przykładu, może sugerować nazewnictwo dla twojej nazwy użytkownika lub pozostawienie -fi pozwolenie na wygenerowanie ~/.ssh/id_rsa).

    Bezpiecznie przenieś my_keypairna swoją stację roboczą, aby w przyszłości uzyskać dostęp do SSH, jest to klucz prywatny, nie należy go nikomu udostępniać. Następnie na serwerze utwórz $HOME/.sshjeśli nie istnieje, mkdir ~/.ssh, skopiuj klucz publiczny ( my_keypair.pub), aby ~/.ssh/, jeśli masz już authorized_keysw ~/.sshbo zrobiłeś to na inne rzeczy można zrobić cat my_keypair.pub >> authorized_keys, aby dołączyć swój klucz publiczny, lub cp my_keypair.pub authorized_keysjeśli to nie istnieje.

    Teraz uruchom chmod 700 ~/.sshi, chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keysaby ustawić uprawnienia. Możesz zachować kopię my_keypairw ~/.ssh/celu użycia podczas łączenia z innymi hostami, ale powinieneś zrobić, chmod 600 ~/.ssh/my_keypairaby upewnić się, że nikt inny nie może uzyskać do niej dostępu.

    Będziesz chciał dodać dla siebie zwykłe konto użytkownika i dodać się do grupy innej niż users, jak adminsw moim przykładzie.

    Prawdopodobnie będziesz również chciał dodać użytkownika lub grupę, /etc/sudoersaby umożliwić sudokorzystanie, jeśli jeszcze tego nie zrobiłeś. Dokonuje się tego za pomocą polecenia, visudoktóre jest jedynym sposobem edycji tego pliku. visudouruchamia sprawdzanie błędów i składni konfiguracji przed jej wypisaniem, zapobiegając utracie sudoużytkowania.

    username ALL=(ALL) ALL
    

    Dodane do /etc/sudoerspozwoli usernameuruchomić sudo yum install blahi poprosi o podanie własnego hasła. Jest to przydatne w przypadku, gdy masz innych administratorów lub tymczasowych administratorów, nie musisz udostępniać hasła roota.

    cpbills
    źródło
    Jeśli tworzysz parę kluczy w systemie Windows z puttygen, pamiętaj, że musisz zmienić format klucza publicznego po przesłaniu go na serwer. Nie pamiętam, jak to zrobić, ale w rzeczywistości jest film.
    ESW,
    1

    Problem z twoją konfiguracją SSL polega na tym, że tak naprawdę nie włączyłeś SSL, potrzebujesz do tego dyrektyw Apache:

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

    Bez tego dostaniesz zbyt długie błędy rekordów, ponieważ zamiast nagłówków SSL, których oczekiwała twoja przeglądarka, otrzymujesz po prostu niezaszyfrowaną stronę internetową w dużym kawałku.

    JamesHannah
    źródło
    1
    (bez tego wszystko, co stworzyłeś, to regularny
    vhost
    1

    MySQL z oryginalnego pakietu obsługuje SSL. Aby sprawdzić kompilację MySQL, uruchom

    mysqladmin variables | grep ssl
    

    Powinieneś znaleźć coś takiego have_ssl yes. Konfigurowanie opcji ssl-ca, ssl-keyi ssl-cert.

    Utwórz konta użytkowników z wymaganiami SSL:

    create user@host identified by 'password'
    grant privilegelist on database.tables to user@host require ssl
    
    sumar
    źródło
    Dzięki za odpowiedzi. Zapomniałem jednak wspomnieć, że będę również przechowywać pliki na serwerze db, więc wygląda na to, że stunnel będzie działał lepiej w tym przypadku.
    Stormdrain