Від А до Я встановлення вікна Linux для безпечного локального хостингу


12

Я зараз перевстановлюю ОС на машину, яка буде використовуватися для розміщення пари додатків для нашого бізнесу. Заявки будуть лише локальними; доступ від зовнішніх клієнтів здійснюватиметься лише через VPN.

Попередня установка використовувала панель управління хостингом (Plesk) для більшості адміністратора, і я переглядав використання іншої аналогічної програми для перевстановлення - але я зрозумів, що нарешті я повинен дізнатися, як це все працює. Я можу зробити більшість речей, які зробило б програмне забезпечення для мене, але мені не зрозуміло щодо симбіозу всього цього. Це все спроба далі відійти від землі програміста / програміста конфігурації , якщо це взагалі можливо.

Я не можу ніде знайти повну інструкцію для того, що шукаю, тому я подумав, що поставлю це питання, і якщо люди зможуть допомогти мені в дорозі, я відредагую це з відповідями та задокументую свій прогрес / підводні камені. Сподіваємось, що колись це допоможе комусь вниз.

Деталі:

  • CentOS 5.5 x86_64
  • httpd: Apache / 2.2.3
  • MySQL: 5.0.77 (оновлено)
  • PHP: 5.1 (оновлено)

Вимоги:

  • БЕЗПЕКА !!
    • Безпечна передача файлів
    • Безпечний доступ клієнта (SSL-сертифікати та CA)
    • Безпечне зберігання даних
    • Безпечне підключення до іншої локальної машини (MySQL)
  • Віртуальні хости / кілька субдоменів
  • Місцева електронна пошта буде приємною, але не критичною

Сходи:

  • Завантажте найновіший CentOS DVD-iso (торрент працював для мене чудово).

  • Встановити CentOS:
    Під час встановлення я перевірив параметр Серверні компоненти, думаючи, що буду використовувати іншого адміністратора, схожого на Plesk. Заднім числом, враховуючи, що я вирішив спробувати піти власним шляхом, це, мабуть, було не найкращою ідеєю.

  • Основна конфігурація:
    налаштування користувачів, мережа / IP-адреса тощо. Оновлення / оновлення.

  • Оновлення PHP / MySQL:
    Щоб оновити PHP та MySQL до останніх версій, мені довелося звернутися до іншого репо за межами CentOS. IUS виглядає чудово, і я щасливий, що знайшов його!
  • Додайте сховище IUS до нашого менеджера пакунків

    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
    

    Видаліть стару версію PHP та встановіть нову версію з 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)
    

    Оновіть MySQL з сховища 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
    

    Оновлення інструкцій люб’язно надано вікі IUS: http://wiki.iuscommunity.org/Doc/ClientUsageGuide .


  • Встановіть rssh (обмежена оболонка) для надання scpта sftpдоступу, не дозволяючи sshвходити в систему
  • 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
    

    Редагувати, /etc/rssh.confщоб надати доступ до SFTP користувачам rssh.

    vi /etc/rssh.conf
    

    Скасувати коментар або додати:

    allowscp
    allowsftp
    

    Це дозволяє мені підключитися до машини через протокол SFTP в програмі Transmit (моя програма FTP на вибір; я впевнений, що це аналогічно з іншими програмами FTP).

    rssh інструкції, присвоєні (з вдячністю!) від http://www.cyberciti.biz/tips/linux-unix-restrict-shell-access-with-rssh.html .


  • Налаштування віртуальних інтерфейсів
  • 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 | змінити так, що це виглядає приблизно так:
    DEVICE = eth1: 1
    IPADDR = 192.168.1.3
    NETMASK = 255.255.255.0
    NETWORK = 192.168.1.0
    ONBOOT = так
    NAME = eth1: 1

    Додайте більше віртуальних інтерфейсів, якщо потрібно, повторивши. Через ONBOOT=yesрядок у файлі ifcfg-eth1: 1 цей інтерфейс буде виведений при завантаженні системи або запуску / перезапуску мережі.

    service network restart
    

    Вимкнення інтерфейс eth0: [OK]
    Вимкнення інтерфейс eth1: [OK]
    Вимкнення петлевого інтерфейсу: [OK]
    Виховати петлевий інтерфейс: [OK]
    Виховати інтерфейс eth0: [OK]
    Виховати інтерфейс eth1: [OK]

    ping 192.168.1.3
    

    64 байти з 192.168.1.3: icmp_seq = 1 ttl = 64 час = 0,105 мс


  • Віртуальні хости
  • У розділі rssh вище я додав користувача для використання для SFTP. У домашньому каталозі цього користувача я створив папку під назвою "https". Тут будуть жити документи для цього сайту, тому мені потрібно додати віртуальний хост, який буде вказувати на нього. Я буду використовувати вищевказаний віртуальний інтерфейс для цього сайту (тут називається dev.site.local).

    vi /etc/http/conf/httpd.conf
    

    Додайте наступне до кінця 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>  
    

    Я помістив фіктивний файл index.html в каталог https, щоб перевірити все. Я спробував перейти до нього, і мені було дозволено помилки, на які було відмовлено. Журнали давали лише незрозуміле посилання на те, що відбувається:

    [Пн. 17 травня 14:57:11 2010] [помилка] [клієнт 192.168.1.100] (13) Дозвіл відхилено: доступ до /index.html відхилений

    Я спробував chmod 777 et. ін., але безрезультатно. Виявляється, мені потрібно було chmod + x каталог https та його "батьківські каталоги".

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

    Це вирішило цю проблему.


  • DNS
  • Я обробляю DNS через наш локальний вікно Windows Server 2003. Однак документацію CentOS для BIND можна знайти тут: http://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-bind.html


  • SSL
  • Щоб працювати з SSL, я змінив наступне в 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>  
    

    На жаль, я постійно намагаюся отримувати (код помилки: ssl_error_rx_record_too_long) помилки під час спроби отримати доступ до сторінки з SSL. Як вишукано зазначив Джеймс Ханна нижче , я не встановлював розташування сертів у httpd.conf, і, таким чином, отримував сторінку, викинуту на браузер, як cert, що змушує браузер працювати.

    Тому спочатку мені потрібно було створити ЦС і зробити файли сертифікатів. Тут я знайшов чудовий посібник (якщо він старий): http://www.debian-administration.org/articles/284 .

    Ось відповідні кроки, які я зробив із цієї статті:

    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  
    

    Створіть openssl.cnfфайл у /home/CA/dir та відредагуйте його відповідно до вищевказаної інструкції. (Для довідки, мій готовий файл openssl.cnf виглядав так: 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.cnfзнову за інструкціями.

    #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.cnfзнову за інструкціями.

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

    ВАЖЛИВО!

    Перемістіть файли та посилайте їх на httpd.conf у новому місці

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

    Я оновив httpd.conf, щоб відобразити certs і включити 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>  
    

    Помістіть CA cert.pem у доступне для Інтернету місце та завантажте / імпортуйте його у свій браузер. Тепер я можу відвідувати https: //dev.site.local без помилок чи попереджень.


    І ось я тут. Я буду продовжувати редагувати це, коли я прогресую. Будемо вдячні будь-які поради щодо налаштування SSL-електронної пошти та / або налаштування безпечного з'єднання з іншим вікном, на якому буде MySQL-сервер.


    Я не розумію, для чого потрібні інтерфейси віртуальної мережі?
    Мілан Бабушків

    @Milan, тому що у мене буде кілька доменів / субдоменів на цій машині. Для використання VirtualHost та SSL Кожен домен / піддомен повинен мати власну IP-адресу. httpd.apache.org/docs/2.0/ssl/ssl_faq.html#vhosts
    stormdrain

    Схоже, марно тратити IP-адреси, але добре. Крім того, ви можете використовувати різні порти TCP / IP для кожного домену - все на одному IP. Таким чином веб-сервер менш залежить від конфігурації системи.
    Мілан Бабушков

    1
    @Milan: Оскільки налаштування є лише локальним, я маю розкіш способів отримати більше доступних IP-адрес, ніж мені коли-небудь знадобиться. Налаштування додаткових інтерфейсів, я виявив, порівняно досить швидкий і безболісний процес. Якщо я налаштовував цю систему для громадського використання, завдяки оновленням Apache2.2.x та TLS, схоже, VirtualHost
    stormdrain

    1
    Настійно рекомендую koltsoff.com/pub/securing-centos - дуже навчальний посібник із забезпечення CentOS (більшість з яких легко застосовно до інших дистрибутивів) - він не охоплює хостинг, але все, що там, слід розуміти і застосовувати до будь-який сервер CentOS, який не знаходиться за брандмауером, який ви розумієте та контролюєте.
    dunxd

    Відповіді:


    6

    У цьому посібнику є багато відповідей щодо використання SSL з Apache, розповідається про те, як створити самопідписаний сертифікат, як отримати відповідний сертифікат від визнаного органу сертифікації (CA) та як створити свій власний, недовірений ЦС для створення повний сертифікат. http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

    Що стосується віртуальних хостів та SSL, то кожному хосту знадобиться власна IP-адреса або більш брудним рішенням є розміщення їх на різних портах, ніж стандартне :443за характером SSL-сертифікатів, віртуальний хостинг на основі імен не поєднується з SSL; саме тому вам потрібен інший метод для диференціації; різні порти / IP-адреси.

    Налаштувати SSH досить просто, він уже повинен працювати на вашому сервері. Вам потрібно буде зробити ряд речей, щоб заблокувати це.

    PermitRootLogin no
    AllowGroups admins
    PubkeyAuthentication yes
    PermitEmptyPasswords no
    PasswordAuthentication no
    

    Він може бути доданий до вашого, /etc/ssh/sshd_configщоб обмежити віддалений доступ до кореня та видалити автентифікацію пароля, замість цього використовуючи загальнодоступні / приватні ключові пари для входу.

    Щоб створити ключ SSH, ви можете використовувати puttygenв Windows; http://putty.very.rulez.org/download.html або ви можете створити пару ключів в середовищі Linux наступним чином: ssh-keygen -b 2048 -t RSA -f my_keypair. Це створить my_keypairфайл і my_keypair.pubфайл (названий лише для цього прикладу, я б запропонував назвати ім’я користувача або залишити його -f, і дозволити його генерувати ~/.ssh/id_rsa).

    Безпечно переносьте my_keypairна свою робочу станцію, для майбутнього доступу до SSH це приватний ключ, не слід ділитися ним ні з ким. Потім на сервері, створити , $HOME/.sshякщо він вже не існує, mkdir ~/.sshі скопіюйте відкритий ключ ( my_keypair.pub) , щоб ~/.ssh/, якщо у вас вже є authorized_keysв ~/.sshтому , що ви зробили це для інших речей, ви можете зробити , cat my_keypair.pub >> authorized_keysщоб додати свій відкритий ключ, або cp my_keypair.pub authorized_keysякщо його не існує.

    Тепер запустіть chmod 700 ~/.sshі chmod 644 ~/.ssh/my_keypair.pub ~/.ssh/authorized_keysвстановіть дозволи. Ви можете зберегти копію my_keypairв ~/.ssh/для використання при підключенні до інших комп'ютерів, але ви повинні зробити chmod 600 ~/.ssh/my_keypair, щоб переконатися , що ніхто більше доступу може його.

    Ви хочете додати звичайний обліковий запис користувача і додати себе до іншої групи, ніж users, наприклад, adminsу моєму прикладі.

    Ви, ймовірно, також захочете додати свого користувача або групу, /etc/sudoersщоб дозволити їх sudoвикористання, якщо ви ще цього не зробили. Це виконується командою, visudoяка є єдиним способом редагування цього файлу. visudoзапускає перевірку помилок та синтаксису у вашій конфігурації, перш ніж виписати її, запобігаючи втраті sudoвикористання.

    username ALL=(ALL) ALL
    

    Додано до /etc/sudoersдозволить usernameзапустити sudo yum install blahі запропонує ввести власний пароль. Це зручно, якщо у вас є інші адміністратори чи тимчасові адміністратори, вам не потрібно ділитися кореневим паролем.


    Якщо ви створюєте ключове виправлення у Windows з puttygen, пам’ятайте, що вам потрібно змінити формат відкритого ключа, як тільки ви завантажите його на сервер. Я не пам'ятаю, як, але youtube це насправді відео.
    ESW

    1

    Проблема вашого конфігурації SSL полягає в тому, що ви фактично не ввімкнули SSL, для цього вам знадобляться директиви Apache:

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

    Без цього ви отримаєте ці записи занадто довгі помилки, тому що замість заголовків SSL, який очікував ваш браузер, він отримує натомість просто незашифровану веб-сторінку у великому шматку.


    1
    (без цього все, що ви створили, - це регулярне прослуховування без порту SSL в порту 443)
    JamesHannah

    1

    MySQL з оригінального пакета підтримує SSL. Щоб перевірити збірку MySQL, запустіть

    mysqladmin variables | grep ssl
    

    Ви повинні знайти щось подібне have_ssl yes. Налаштування параметрів ssl-ca, ssl-keyі ssl-cert.

    Створення облікових записів користувачів з вимогами SSL:

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

    Дякуємо за відповідь. Я забув зазначити, що я також буду зберігати файли на db-сервері, так що схоже, що в цьому випадку оглушення буде працювати краще.
    штормовий
    Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
    Licensed under cc by-sa 3.0 with attribution required.